52 lines
2.8 KiB
TypeScript
52 lines
2.8 KiB
TypeScript
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
import { SafeAreaView, StatusBar } from 'react-native';
|
|
import { colors } from '../assets/styles/theme';
|
|
import { AuthUser } from '../types';
|
|
import { AppScreenProps, ROUTES, RouteName, RouteParams, RouteState } from './routes';
|
|
import LoginScreen from '../pages/login';
|
|
import HomeScreen from '../pages/home';
|
|
import OrdemServicoScreen from '../pages/ordem-de-serviço';
|
|
import NovaOrdemScreen from '../pages/ordem-de-serviço/nova-ordem';
|
|
import LojasScreen from '../pages/lojas';
|
|
import NovaLojaScreen from '../pages/lojas/nova-loja';
|
|
import PecasScreen from '../pages/peças';
|
|
import NovaPecaScreen from '../pages/peças/nova-peça';
|
|
import FornosScreen from '../pages/fornos';
|
|
import NovoFornoScreen from '../pages/fornos/novo-forno';
|
|
import PecasFornoScreen from '../pages/peças-forno';
|
|
import NovaPecaFornoScreen from '../pages/peças-forno/nova-peça';
|
|
import ManutencaoScreen from '../pages/manutençao';
|
|
import NovaManutencaoScreen from '../pages/manutençao/nova-manutenções';
|
|
|
|
const screens: Record<RouteName, React.ComponentType<AppScreenProps>> = {
|
|
[ROUTES.LOGIN]: LoginScreen,
|
|
[ROUTES.HOME]: HomeScreen,
|
|
[ROUTES.ORDEM_SERVICO]: OrdemServicoScreen,
|
|
[ROUTES.NOVA_ORDEM]: NovaOrdemScreen,
|
|
[ROUTES.LOJAS]: LojasScreen,
|
|
[ROUTES.NOVA_LOJA]: NovaLojaScreen,
|
|
[ROUTES.PECAS]: PecasScreen,
|
|
[ROUTES.NOVA_PECA]: NovaPecaScreen,
|
|
[ROUTES.FORNOS]: FornosScreen,
|
|
[ROUTES.NOVO_FORNO]: NovoFornoScreen,
|
|
[ROUTES.PECAS_FORNO]: PecasFornoScreen,
|
|
[ROUTES.NOVA_PECA_FORNO]: NovaPecaFornoScreen,
|
|
[ROUTES.MANUTENCAO]: ManutencaoScreen,
|
|
[ROUTES.NOVA_MANUTENCAO]: NovaManutencaoScreen,
|
|
};
|
|
|
|
export default function AppNavigator() {
|
|
const [user, setUser] = useState<AuthUser | null>(null);
|
|
const [stack, setStack] = useState<RouteState[]>([{ name: ROUTES.LOGIN }]);
|
|
const [refreshKey, setRefreshKey] = useState(0);
|
|
const route = stack[stack.length - 1];
|
|
const navigate = useCallback((name: RouteName, params?: RouteParams) => setStack((old) => [...old, { name, params }]), []);
|
|
const resetTo = useCallback((name: RouteName, params?: RouteParams) => setStack([{ name, params }]), []);
|
|
const goBack = useCallback(() => setStack((old) => old.length > 1 ? old.slice(0, -1) : old), []);
|
|
const bumpRefresh = useCallback(() => setRefreshKey((n) => n + 1), []);
|
|
useEffect(() => { if (!user && route.name !== ROUTES.LOGIN) resetTo(ROUTES.LOGIN); }, [resetTo, route.name, user]);
|
|
const Screen = screens[route.name];
|
|
const props = useMemo(() => ({ route, user, setUser, navigate, resetTo, goBack, refreshKey, bumpRefresh }), [route, user, navigate, resetTo, goBack, refreshKey, bumpRefresh]);
|
|
return <SafeAreaView style={{ flex: 1, backgroundColor: colors.bg }}><StatusBar barStyle="dark-content" /><Screen {...props} /></SafeAreaView>;
|
|
}
|