import AsyncStorage from "@react-native-async-storage/async-storage"; import { createContext, createRef, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { Appearance, Platform, StyleSheet, Vibration, View, } from "react-native"; import uuid from "react-native-uuid"; export const Constants = { defaultLanguage: "de", languages: [ { name: "de", label: "Deutsch", }, { name: "en", label: "English", }, ], actionType: { layers: 0, ambilight: 1, motor: 2, }, }; export const AppStyles = StyleSheet.create({ typography20: { fontSize: 20, fontWeight: "bold", lineHeight: 24, }, typography16: { fontSize: 16, lineHeight: 24, }, typography14: { fontSize: 14, lineHeight: 20, }, Shadow: { elevation: 2, // only android shadowColor: "#000", // only ios shadowOffset: { width: 0, height: 1 }, // only ios shadowOpacity: 0.2, // only ios shadowRadius: 1, // only ios }, modal: { flex: 1, padding: 10, }, }); const DarkAppTheme = { _id: "dark", // needed for status bar colors: { primary: "#e67e22", secondary: "#9b59b6", }, text: "#fff", textSecondary: "#ddd", backgroundColor: "#21252a", card: { backgroundColor: "#2b3139", }, drawer: { backgroundColor: "#2b3139", icon: "#fff", item: { inactiveTintColor: "#fff", activeTintColor: "#e67e22", iconColor: "#fff", activeBackgroundColor: "rgba(0, 0, 0, 0.1)", }, }, divider: "#434443", textInputBottomColor: "#b2b3b3", icon: "#ddd", switch: { trackColorTrue: "#01d064", trackColorFalse: "#b2b3b3", thumbColorTrue: "#f4f3f4", thumbColorFalse: "#f4f3f4", ios_backgroundColor: "#3e3e3e", }, slider: { minimumTrackTintColor: "#e67e22", maximumTrackTintColor: "#fff", thumbTintColor: "#e67e22", }, tag: { red: { backgroundColor: "#3d0801", text: "#fe4f50", borderColor: "#760b01", }, }, }; const LightAppTheme = { _id: "light", // needed for status bar colors: { primary: "#e67e22", secondary: "#9b59b6", }, text: "#000", textSecondary: "#555", backgroundColor: "#f7f7f7", card: { backgroundColor: "#fff", }, drawer: { backgroundColor: "#fff", item: { inactiveTintColor: "#000", activeTintColor: "#e67e22", iconColor: "#000", activeBackgroundColor: "rgba(0, 0, 0, 0.05)", }, }, divider: "#ddd", textInputBottomColor: "#b2b3b3", icon: "#000", switch: { trackColorTrue: "#01d064", trackColorFalse: "#b2b3b3", thumbColorTrue: "#f4f3f4", thumbColorFalse: "#f4f3f4", ios_backgroundColor: "#3e3e3e", }, slider: { minimumTrackTintColor: "#e67e22", maximumTrackTintColor: "#555", thumbTintColor: "#e67e22", }, tag: { red: { backgroundColor: "#fff3f1", text: "#ff6060", borderColor: "#fecdc7", }, }, }; export async function StoreData(key, value) { try { const jsonValue = JSON.stringify(value); await AsyncStorage.setItem(key, jsonValue); } catch (e) { console.log("err", e); } } export async function GetData(key) { try { const jsonValue = await AsyncStorage.getItem(key); return jsonValue != null ? JSON.parse(jsonValue) : null; } catch (e) { console.log("err", e); } } export async function GetMultipleData(keys) { try { const data = await AsyncStorage.multiGet(keys); const retrievedData = data.map(([key, value]) => [key, JSON.parse(value)]); return retrievedData; } catch (e) { console.log("err", e); } } export function GetDataFromList(list, key) { return list.find((v) => v[0] === key)[1]; } export function GetUuid() { return uuid.v4(); } // data set in the app by default or provided by our servers on firmware update const devDevicesFirmwareModes = { lightModes: [ { id: "6138e651-54c5-4fd4-8f40-3364f4e9dfe2", type: "solidColor", supportedFirmwareVersions: ["1.0.1"], name: { de: "Einfarbig", en: "Solid", }, defaults: [], adjustments: [], }, { id: "c7097a60-faa9-4928-a531-0a8ecbc115d9", type: "multipleColors", supportedFirmwareVersions: ["1.0.1"], name: { de: "Zufällig", en: "Random", }, defaults: [ { type: "color", value: "red", }, { type: "color", value: "orange", }, { type: "color", value: "blue", }, ], adjustments: [], }, { id: "b42c665a-c2ab-4029-9162-2280caae3274", type: "multipleColors", supportedFirmwareVersions: ["1.0.1"], name: { de: "Regenbogen", en: "Rainbow", }, defaults: [], adjustments: [ { type: "slider", name: { de: "Schnelligkeit des Modus", en: "Speed of the mode", }, }, ], }, ], motorModes: [ { type: "motor", name: { de: "Hin und her", en: "Back and forth", }, defaults: [], adjustments: [ { type: "slider", name: { de: "Schnelligkeit von hin und her", en: "Speed of the back and forth", }, }, ], }, ], animationsIn: [ { supportedFirmwareVersions: ["1.0.1"], name: { de: "Aufblendung", en: "Fade in", }, adjustments: [ { type: "slider", name: { de: "Dauer", en: "Duration", }, }, ], }, ], animationsOut: [ { supportedFirmwareVersions: ["1.0.1"], name: { de: "Ausblenden", en: "Fade out", }, adjustments: [ { type: "slider", name: { de: "Dauer", en: "Duration", }, }, ], }, ], }; export const DevDeviceId = "1f21a12a-0bec-4336-99bb-df3f9fc9f537"; // this data is transmitted from the device to the user app const devDevices = [ { id: "1f21a12a-0bec-4336-99bb-df3f9fc9f537", // deviceId displayName: "Turtle", deviceModel: "Aurora", firmware: { version: "1.0.1", lastUpdated: "11.07.2023 um 20:33 Uhr", }, selectedScene: null, /*scenes: [ { id: "2f21a12a-0bec-4336-99bb-df3f9fc9f537", name: "Szene 1", actions: [], }, { id: "3f21a12a-0bec-4336-99bb-df3f9fc9f537", name: "Szene 2", actions: [], }, ],*/ }, { id: "5b331a12a-0bec-4336-99bb-df3f9fc9f537", // deviceId displayName: "Elona", deviceModel: "Aurora", firmware: { version: "1.0.1", lastUpdated: "11.07.2023 um 20:33 Uhr", }, selectedScene: null, //scenes: [], }, ]; const devDeviceScenes = [ { deviceId: "", scenes: [ { id: "", name: "", }, ], }, ]; const devDeviceSceneActions = [ { sceneId: "", actions: [ { id: "", modeId: "", }, ], }, ]; export function NewInitialDeviceScene(deviceId) { return { deviceId: deviceId, scenes: [], }; } export function NewInitialDeviceSceneAction(sceneId) { return { sceneId: sceneId, actions: [], }; } export function NewEmptyDeviceScene(name) { return { id: GetUuid(), name: name, }; } export function NewAction(actionType) { return { id: GetUuid(), type: actionType, // layers, ambilight, motor modeId: "", }; } export function GetDevice(devices) { return devices.find((d) => d.id === AppSelectedUserDevice.current.id); } export function GetDeviceSceneAction(sceneActions, sceneId, actionId) { return sceneActions .find((s) => s.sceneId === sceneId) .actions.find((a) => a.id === actionId); } const appContextPreview = { appColorScheme: "", appLanguage: "", isUserExpertModeEnabled: "", isUserDeveloperModeEnabled: "", appTheme: DarkAppTheme, devices: [], deviceScenes: [], deviceSceneActions: [], deviceFirmwareModes: [], userColorSwatchesFavorites: [], }; export const AppSelectedUserDevice = createRef(); AppSelectedUserDevice.current = { id: "", routeName: "" }; export const AppContext = createContext(appContextPreview); export function AppProvider({ children }) { const [appLanguage, setAppLanguage] = useState("de"); const [appColorScheme, setAppColorScheme] = useState("light"); const [appTheme, setAppTheme] = useState(DarkAppTheme); const [isUserExpertModeEnabled, setIsUserExpertModeEnabled] = useState(false); const [devices, setDevices] = useState(devDevices); const [deviceScenes, setDeviceScenes] = useState([]); const [deviceSceneActions, setDeviceSceneActions] = useState([]); const [deviceFirmwareModes, setDeviceFirmwareModes] = useState( devDevicesFirmwareModes ); const [userColorSwatchesFavorites, setUserColorSwatchesFavorites] = useState( [] ); const { i18n } = useTranslation(); // TODO: only while development const [isUserDeveloperModeEnabled, setIsUserDeveloperModeEnabled] = useState(false); const saveAppColorScheme = async (value) => { StoreData("appColorScheme", value); setAppColorScheme(value); let colorScheme; colorScheme = value === "auto" ? Appearance.getColorScheme() : value; setAppTheme(colorScheme === "light" ? LightAppTheme : DarkAppTheme); }; const saveAppLanguage = async (value) => { StoreData("appLanguage", value); setAppLanguage(value); i18n.changeLanguage(value); }; const saveUserExpertMode = async (value) => { StoreData("userExpertMode", value); setIsUserExpertModeEnabled(value); }; // TODO: only while development const saveUserDeveloperMode = async (value) => { StoreData("userDeveloperMode", value); setIsUserDeveloperModeEnabled(value); }; const saveUserColorSwatchesFavorites = async (value) => { StoreData("userColorSwatchesFavorites", value); setUserColorSwatchesFavorites(value); }; return ( {children} ); } export function IsPlatformIos() { return Platform.OS === "ios"; } export function VibrateShort() { Vibration.vibrate(50); } export function ModalContainer({ children }) { return ( {children} ); }