40365-vm/src/navigation/AppNavigator.tsx
Flatlogic Bot 850d636d8a v1
2026-07-01 19:23:54 +00:00

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>;
}