diff --git a/App.js b/App.js index ff138b5..e31b89d 100644 --- a/App.js +++ b/App.js @@ -1,17 +1,26 @@ import "react-native-gesture-handler"; import { StatusBar } from "expo-status-bar"; -import { StyleSheet } from "react-native"; +import { Appearance, StyleSheet } from "react-native"; import { createDrawerNavigator } from "@react-navigation/drawer"; import { NavigationContainer } from "@react-navigation/native"; import SideBar from "./src/Components/SideBar"; import FaqScreen from "./src/Screens/FAQ"; import FeedbackScreen from "./src/Screens/Feedback"; import { PaperProvider } from "react-native-paper"; -import { Theme } from "./src/utils"; +import { + AppContext, + AppProvider, + Constants, + GetData, + GetDataFromList, + GetMultipleData, + Theme, +} from "./src/utils"; import DeviceOldScreen from "./src/Screens/DeviceOld"; import DeviceScreen from "./src/Screens/Device"; import { Colors } from "react-native-ui-lib"; import SettingsScreen from "./src/Screens/Settings"; +import { useContext, useEffect } from "react"; Colors.loadSchemes({ light: { @@ -43,11 +52,53 @@ const Drawer = createDrawerNavigator(); SECONDARY: "#9b59b6", */ -export default function App() { +export function MyApp() { + const appContext = useContext(AppContext); + + useEffect(() => { + const loadData = async () => { + const data = await GetMultipleData([ + "appLanguage", + "appColorScheme", + "userExpertMode", + "userDeveloperMode", + ]); + + const appLanguage = GetDataFromList(data, "appLanguage"); + const appColorScheme = GetDataFromList(data, "appColorScheme"); + const userExpertMode = GetDataFromList(data, "userExpertMode"); + const userDeveloperMode = GetDataFromList(data, "userDeveloperMode"); + + appContext.setAppLanguage( + appLanguage === null ? Constants.defaultLanguage : appLanguage + ); + appContext.setAppColorScheme( + appColorScheme === null ? Appearance.getColorScheme() : appColorScheme + ); + + appContext.setIsUserExpertModeEnabled( + userExpertMode == null ? false : userExpertMode + ); + + appContext.setUserIsDeveloperModeEnabled( + userDeveloperMode == null ? false : userDeveloperMode + ); + }; + + loadData(); + }, []); + return ( - }> + } + > @@ -61,6 +112,14 @@ export default function App() { ); } +export default function App() { + return ( + + + + ); +} + const styles = StyleSheet.create({ container: { flex: 1, diff --git a/src/Components/Card/index.js b/src/Components/Card/index.js index f4a6348..9935723 100644 --- a/src/Components/Card/index.js +++ b/src/Components/Card/index.js @@ -1,6 +1,10 @@ +import { useContext } from "react"; import { ScrollView, View } from "react-native"; +import { AppContext } from "../../utils"; export default function Card({ children }) { + const appContext = useContext(AppContext); + return ( + ); } diff --git a/src/Components/SideBar/index.js b/src/Components/SideBar/index.js index 3007af2..2c3e730 100644 --- a/src/Components/SideBar/index.js +++ b/src/Components/SideBar/index.js @@ -1,36 +1,55 @@ import { DrawerContentScrollView, DrawerItem } from "@react-navigation/drawer"; -import { useEffect, useState } from "react"; -import { Image, StyleSheet, View } from "react-native"; -import { Divider, Text } from "react-native-paper"; -import { GetData } from "../../utils"; +import { useContext } from "react"; +import { Image, Text, View } from "react-native"; +import { AppContext, AppStyles } from "../../utils"; +import { Divider } from "../Divider"; export default function Sidebar(props) { - const [isDeveloperModeEnabled, setIsDeveloperModeEnabled] = useState(false); + const appContext = useContext(AppContext); - useEffect(() => { - async function getDeveloperMode() { - setIsDeveloperModeEnabled(await GetData("developerMode")); - } - - getDeveloperMode(); - }, []); + const MyDrawerItem = ({ label, onPress }) => { + return ( + + ); + }; return ( <> - {isDeveloperModeEnabled ? ( + {appContext.isUserDeveloperModeEnabled ? ( ) : ( - + )} - + Geräte {["Splash X3", "Spinner V6"].map((item, i) => ( - props.navigation.navigate(item)} @@ -40,15 +59,15 @@ export default function Sidebar(props) { - props.navigation.navigate("FAQ")} /> - props.navigation.navigate("Feedback")} /> - props.navigation.navigate("Settings")} /> @@ -56,10 +75,3 @@ export default function Sidebar(props) { ); } - -const styles = StyleSheet.create({ - image: { - width: "100%", - height: 250, - }, -}); diff --git a/src/Screens/Device/index.js b/src/Screens/Device/index.js index d91426e..70fc146 100644 --- a/src/Screens/Device/index.js +++ b/src/Screens/Device/index.js @@ -1,9 +1,9 @@ -import { useEffect, useState } from "react"; +import { useContext, useEffect, useState } from "react"; import { Image, ScrollView, StyleSheet, View, Text } from "react-native"; import { IconButton } from "react-native-paper"; import { Colors } from "react-native-ui-lib"; import LightView from "./light"; -import { GetData } from "../../utils"; +import { AppContext, GetData } from "../../utils"; import MotorView from "./motor"; import SettingsView from "./settings"; @@ -19,18 +19,8 @@ const iconButtonActiveColor = "#e67e22"; const iconButtonNotActiveColor = "#fff"; export default function DeviceScreen() { + const appContext = useContext(AppContext); const [selectedView, setSelectedView] = useState(0); - const [isDeveloperModeEnabled, setIsDeveloperModeEnabled] = useState(false); - - useEffect(() => { - async function getMode() { - const data = await GetData("developerMode"); - - setIsDeveloperModeEnabled(data); - } - - getMode(); - }, []); const SelectedView = () => { switch (selectedView) { @@ -49,10 +39,10 @@ export default function DeviceScreen() { - {isDeveloperModeEnabled ? ( + {appContext.isUserDeveloperModeEnabled ? ( { - async function getModes() { - const data = await GetData("expertMode"); - - setSwitchExpertModeEnabled(data); - } - - getModes(); - }, []); - const onColorSelect = (color) => { selectedColorPickerColor.value = color.hex; @@ -279,7 +269,7 @@ export default function LightView() { colors={colorSwatchesFavorites} /> - {isExpertModeEnabled && ( + {appContext.isUserExpertModeEnabled && ( { - async function getModes() { - const data = await GetMultipleData(["developerMode", "expertMode"]); - - setSwitchDeveloperMode(data[0][1]); - setSwitchExpertMode(data[1][1]); - } - - getModes(); - }, []); + const appContext = useContext(AppContext); return ( - + setSelectedLanguage(v)} + value={appContext.appLanguage} + onChange={(v) => appContext.setAppLanguage(v)} fieldType={Picker.fieldTypes.settings} showSearch searchPlaceholder="Search a language" @@ -54,14 +52,47 @@ export default function SettingsScreen() { setSelectedColorScheme(v)} + value={appContext.appColorScheme} + onChange={(v) => appContext.setAppColorScheme(v)} fieldType={Picker.fieldTypes.settings} > - + + + + + + Experten Modus + + + Durch das Einschalten werden zusätzliche Funktionen in der App + freigeschaltet, wie beispielsweise die Möglichkeit, + benutzerdefinierte Farbcodes anzugeben. + + + appContext.setIsUserExpertModeEnabled(e)} + /> + @@ -72,31 +103,12 @@ export default function SettingsScreen() { justifyContent: "space-between", }} > - Developer Mode + + Developer Mode + { - setSwitchDeveloperMode(e); - StoreData("developerMode", e); - }} - /> - - - - Expert Mode - { - setSwitchExpertMode(e); - StoreData("expertMode", e); - }} + value={appContext.isUserDeveloperModeEnabled} + onValueChange={(e) => appContext.setUserIsDeveloperModeEnabled(e)} /> diff --git a/src/utils.js b/src/utils.js index 649ac16..b548481 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,14 +1,13 @@ import AsyncStorage from "@react-native-async-storage/async-storage"; +import { createContext, useState } from "react"; import { StyleSheet } from "react-native"; import { DefaultTheme } from "react-native-paper"; +export const Constants = { + defaultLanguage: "de", +}; + export const AppStyles = StyleSheet.create({ - container: { - flex: 1, - backgroundColor: "#fff", - alignItems: "center", - justifyContent: "center", - }, typography20: { fontSize: 20, fontWeight: "bold", @@ -24,6 +23,46 @@ export const AppStyles = StyleSheet.create({ }, }); +const DarkAppTheme = { + colors: { + primary: "#e67e22", + secondary: "#9b59b6", + }, + text: "#fff", + textSecondary: "#ddd", + backgroundColor: "#2e2e30", + card: { + backgroundColor: "#3f4042", + }, + drawer: { + backgroundColor: "#2e2e30", + item: { + inactiveTintColor: "#fff", + activeTintColor: "lime", + }, + }, +}; + +const LightAppTheme = { + colors: { + primary: "#e67e22", + secondary: "#9b59b6", + }, + text: "#000", + textSecondary: "#555", + backgroundColor: "#fff", + card: { + backgroundColor: "#fff", + }, + drawer: { + backgroundColor: "#fff", + item: { + inactiveTintColor: "#fff", + activeTintColor: "lime", + }, + }, +}; + export const Theme = { ...DefaultTheme, colors: { @@ -98,3 +137,72 @@ export async function GetMultipleData(keys) { console.log("err", e); } } + +export function GetDataFromList(list, key) { + return list.find((v) => v[0] === key)[1]; +} + +const appContextPreview = { + appColorScheme: "", + appLanguage: "", + isUserExpertModeEnabled: "", + isUserDeveloperModeEnabled: "", + appTheme: DarkAppTheme, +}; + +export const AppContext = createContext(appContextPreview); + +export function AppProvider({ children }) { + const [appLanguage, setAppLanguage] = useState("de"); + const [appColorScheme, setAppColorScheme] = useState(""); + const [appTheme, setAppTheme] = useState(DarkAppTheme); + const [isUserExpertModeEnabled, setIsUserExpertModeEnabled] = useState(false); + // TODO: only while development + const [isUserDeveloperModeEnabled, setIsUserDeveloperModeEnabled] = + useState(false); + + const saveAppColorScheme = async (value) => { + StoreData("appColorScheme", value); + setAppColorScheme(value); + + if (value === "dark") { + setAppTheme(DarkAppTheme); + } else { + setAppTheme(LightAppTheme); + } + }; + + const saveAppLanguage = async (value) => { + StoreData("appLanguage", value); + setAppLanguage(value); + }; + + const saveUserExpertMode = async (value) => { + StoreData("userExpertMode", value); + setIsUserExpertModeEnabled(value); + }; + + // TODO: only while development + const saveUserDeveloperMode = async (value) => { + StoreData("userDeveloperMode", value); + setIsUserDeveloperModeEnabled(value); + }; + + return ( + + {children} + + ); +}