import { createContext, use, useEffect, useRef } from "react"; import { Transactions } from "./transactions"; import { View } from "react-native"; import { Settings } from "./settings"; import type { AuthData } from "@money/shared/auth"; import { Budget } from "./budget"; import { ShortcutProvider, ShortcutDebug, keysStore } from "../lib/shortcuts"; import { useShortcut } from "../lib/shortcuts/hooks"; const PAGES = { "/": { screen: , key: "1", }, "/budget": { screen: , key: "2", }, "/settings": { screen: , key: "3", children: { "/accounts": {}, "/family": {}, }, }, }; type Join = `${A}${B}` extends `${infer X}` ? X : never; type ChildRoutes = { [K in keyof Children & string]: K extends `/${string}` ? Join : never; }[keyof Children & string]; type Routes = { [K in keyof T & string]: | K | (T[K] extends { children: infer C } ? ChildRoutes : never); }[keyof T & string]; export type Route = Routes; interface RouterContextType { auth: AuthData | null; route: Route; setRoute: (route: Route) => void; } export const RouterContext = createContext({ auth: null, route: "/", setRoute: () => {}, }); type AppProps = { auth: AuthData | null; route: Route; setRoute: (page: Route) => void; }; export function App({ auth, route, setRoute }: AppProps) { return (
); } function Main() { const { route, setRoute } = use(RouterContext); for (const [route, page] of Object.entries(PAGES)) { useShortcut(page.key, () => setRoute(route as Route)); } const match = route in PAGES ? (route as keyof typeof PAGES) : (Object.keys(PAGES) .sort((a, b) => b.length - a.length) .find((p) => route.startsWith(p)) as keyof typeof PAGES); return ( {PAGES[match].screen} ); }