import "react-native-gesture-handler"; import { StatusBar } from "expo-status-bar"; import { Text, View } from "react-native"; import { createDrawerNavigator } from "@react-navigation/drawer"; import { DefaultTheme, NavigationContainer } from "@react-navigation/native"; import SideBar from "./src/Components/SideBar"; import { AppContext, AppProvider, AppStyles, Constants, GetDataFromList, GetMultipleData, IsPlatformIos, } from "./src/utils"; import { Suspense, lazy, useCallback, useContext, useEffect, useState, } from "react"; import { SafeAreaView } from "react-native-safe-area-context"; import "./i18n"; import DeviceScreen from "./src/Screens/Device"; import { createStackNavigator } from "@react-navigation/stack"; import { TouchableOpacity } from "react-native"; import MyIcon from "./src/Components/Icon"; import { useTranslation } from "react-i18next"; import * as SplashScreen from "expo-splash-screen"; /* This screens shouldn't be loaded lazy as it one of the first screens the user sees */ import OnboardingScreen from "./src/Screens/Onboarding/Onboarding"; import NoDevicesConnectedScreen from "./src/Screens/NoDevicesConnected"; /* This screens should be loaded lazy as they are they not seen by the user on startup */ const SettingsScreen = lazy(() => import("./src/Screens/Settings")); const HelpScreen = lazy(() => import("./src/Screens/Help")); const OpenSourceLicensesModalContent = lazy(() => import("./src/Screens/Settings/modals/openSourceLicences") ); const MotorEditActionModalContent = lazy(() => import("./src/Screens/Device/modals/EditActions/Motor") ); const MotorEditActionMotorModeSelectionModalContent = lazy(() => import("./src/Screens/Device/modals/EditActions/Motor").then((module) => ({ default: module.MotorEditActionMotorModeSelectionModalContent, })) ); const WaitXSecondsEditActionModalContent = lazy(() => import("./src/Screens/Device/modals/EditActions/Wait") ); const StopEditActionModalContent = lazy(() => import("./src/Screens/Device/modals/EditActions/Stop") ); const SearchForNewDevicesModalContent = lazy(() => import("./src/Screens/SearchForNewDevices") ); const HelpCenterModalContent = lazy(() => import("./src/Screens/Help/modals/HelpCenter") ); const FeedbackStepsModalContent = lazy(() => import("./src/Screens/Help/modals/Feedback/steps") ); const GiveFeedbackModalContent = lazy(() => import("./src/Screens/Help/modals/Feedback") ); const FeedbackFinishedModalContent = lazy(() => import("./src/Screens/Help/modals/Feedback/finished") ); const SettingsAppColorSchemeModalContent = lazy(() => import("./src/Screens/Settings/modals/appColorScheme") ); const SettingsAppLanguageModalContent = lazy(() => import("./src/Screens/Settings/modals/appLanguage") ); const ChooseSceneModalContent = lazy(() => import("./src/Screens/Device/modals/ChooseScene") ); const CreateSceneModalContent = lazy(() => import("./src/Screens/Device/modals/ChooseScene/CreateScene") ); const AddSceneActionModalContent = lazy(() => import("./src/Screens/Device/modals/AddSceneAction") ); const LayerSelectionModalContent = lazy(() => import("./src/Screens/Device/modals/AddSceneAction/LayerSelection") ); const UpdateSceneNameModalContent = lazy(() => import("./src/Screens/Device/modals/UpdateSceneName") ); const SettingsChangeDeviceDisplayNameModalContent = lazy(() => import("./src/Screens/Device/modals/SettingsChangeDeviceDisplayName") ); const LightsEditActionModalContent = lazy(() => import("./src/Screens/Device/modals/EditActions/Lights") ); const LightsEditActionColorModeSelectionModalContent = lazy(() => import("./src/Screens/Device/modals/EditActions/Lights").then((module) => ({ default: module.LightsEditActionColorModeSelectionModalContent, })) ); const EditActionAnimationSelectionModalContent = lazy(() => import("./src/Screens/Device/modals/EditActions") ); const Drawer = createDrawerNavigator(); const Stack = createStackNavigator(); // Keep the splash screen visible while we fetch resources SplashScreen.preventAutoHideAsync(); export function MyApp() { const appContext = useContext(AppContext); const { t } = useTranslation(); const [appIsReady, setAppIsReady] = useState(false); const [showOnboarding, setShowOnboarding] = useState(false); useEffect(() => { const loadData = async () => { const data = await GetMultipleData([ "appLanguage", "appColorScheme", "userExpertMode", "userDeveloperMode", "userColorSwatchesFavorites", ]); const appLanguage = GetDataFromList(data, "appLanguage"); const appColorScheme = GetDataFromList(data, "appColorScheme"); const userExpertMode = GetDataFromList(data, "userExpertMode"); const userDeveloperMode = GetDataFromList(data, "userDeveloperMode"); const userColorSwatchesFavorites = GetDataFromList( data, "userColorSwatchesFavorites" ); // if the app language is not set we know that the user is using the app for the first time if (appLanguage === null) { setShowOnboarding(true); } appContext.setAppLanguage( appLanguage === null ? Constants.defaultLanguage : appLanguage ); appContext.setAppColorScheme( appColorScheme === null ? "auto" : appColorScheme ); appContext.setIsUserExpertModeEnabled( userExpertMode == null ? false : userExpertMode ); appContext.setUserIsDeveloperModeEnabled( userDeveloperMode == null ? false : userDeveloperMode ); appContext.setUserColorSwatchesFavorites( userColorSwatchesFavorites === null ? Constants.defaultColorSwatchesFavorites : userColorSwatchesFavorites ); setAppIsReady(true); }; loadData(); }, []); const options = ({ navigation, pageTitle }) => { return getScreenStackOptions( navigation, pageTitle, appContext.appTheme.text, appContext.appTheme.backgroundColor, true ); }; const navigatonTheme = { ...DefaultTheme, colors: { ...DefaultTheme.colors, background: appContext.appTheme.backgroundColor, border: "transparent", }, }; const onLayoutRootView = useCallback(async () => { if (appIsReady) { // This tells the splash screen to hide immediately! If we call this after // `setAppIsReady`, then we may see a blank screen while the app is // loading its initial state and rendering its first pixels. So instead, // we hide the splash screen once we know the root view has already // performed layout. await SplashScreen.hideAsync(); } }, [appIsReady]); if (!appIsReady) return null; return ( {showOnboarding ? ( setShowOnboarding(false)} /> ) : ( <> options({ navigation: navigation, pageTitle: t( "screens.device.scenes.modalChooseScene.pageTitle" ), }) } /> options({ navigation: navigation, pageTitle: t( "screens.device.scenes.modalCreateScene.pageTitle" ), }) } /> options({ navigation: navigation, pageTitle: t( "screens.device.scenes.modalAddSceneAction.pageTitle" ), }) } /> options({ navigation: navigation, pageTitle: t( "screens.device.scenes.modalLayerSelection.pageTitle" ), }) } /> options({ navigation: navigation, }) } /> options({ navigation: navigation, pageTitle: t( "screens.device.scenes.editActions.modalLightsEditActionColorModeSelection.pageTitle" ), }) } /> options({ navigation: navigation, }) } /> options({ navigation: navigation, pageTitle: t( "screens.device.scenes.editActions.modalMotorEditAction.pageTitle" ), }) } /> options({ navigation: navigation, pageTitle: t( "screens.device.scenes.editActions.modalMotorEditActionMotorModeSelection.pageTitle" ), }) } /> options({ navigation: navigation, pageTitle: t( "screens.device.scenes.editActions.modalWaitEditAction.pageTitle" ), }) } /> options({ navigation: navigation, pageTitle: t( "screens.device.scenes.editActions.modalStopEditAction.pageTitle" ), }) } /> options({ navigation: navigation, pageTitle: t( "screens.device.scenes.modalUpdateSceneName.pageTitle" ), }) } /> options({ navigation: navigation, pageTitle: t("screens.help.modalHelpCenter.pageTitle"), }) } /> options({ navigation: navigation, pageTitle: t("screens.help.modalGiveFeedback.pageTitle"), }) } /> options({ navigation: navigation, pageTitle: t("screens.help.modalFeedbackSteps.pageTitle"), }) } /> options({ navigation: navigation, pageTitle: t( "screens.help.modalFeedbackFinished.pageTitle" ), }) } /> options({ navigation: navigation, pageTitle: t( "screens.settings.cardGeneral.modalAppColorSchemePicker.pageTitle" ), }) } /> options({ navigation: navigation, pageTitle: t( "screens.settings.cardGeneral.modalLanguagePageTitle" ), }) } /> options({ navigation: navigation, pageTitle: t( "screens.settings.modalOpenSourceLicences.pageTitle" ), }) } /> options({ navigation: navigation, pageTitle: t( "screens.device.settings.modalSettingsChangeDeviceDisplayName.pageTitle" ), }) } /> options({ navigation: navigation, pageTitle: t("screens.modalSearchForNewDevices.pageTitle"), }) } /> )} ); } // This is for the left sidebar navigation function MyDrawer() { const appContext = useContext(AppContext); return ( } > {appContext.devices.map((device) => ( ))} ); } const DeviceScreenStack = (props) => { return ( ); }; const NoDevicesConnectedStack = (props) => { const { t } = useTranslation(); return ( ); }; const HelpScreenStack = (props) => { const { t } = useTranslation(); return ( ); }; const SettingsScreenStack = (props) => { const { t } = useTranslation(); return ( ); }; function getScreenStackOptions( navigation, pageTitle, headerTintColor, headerBackgroundColor, isModalScreen ) { return { title: pageTitle, headerLeft: () => ( isModalScreen ? navigation.goBack() : navigation.toggleDrawer() } > ), headerTintColor: headerTintColor, headerTitleAlign: "center", headerStyle: { backgroundColor: headerBackgroundColor, height: IsPlatformIos() ? 76 : 56, }, }; } function MyScreenStack({ navigation, name, pageTitle, component, params }) { const appContext = useContext(AppContext); return ( ); } export default function App() { return ( Loading... } > ); }