setup boilerplate for data and rendering

This includes zod types creation for API response validation, and
exploration of path based resolution of rendering particles.
This commit is contained in:
talksik
2026-03-17 14:23:51 -07:00
parent 60330f65e0
commit 4273e324e5
19 changed files with 729 additions and 592 deletions
+26 -31
View File
@@ -1,40 +1,16 @@
import { useEffect } from "react";
import { HashRouter, Routes, Route } from "react-router-dom";
import { TooltipProvider } from "@/components/ui/tooltip";
import { useAppStore } from "@/stores/app-store";
import { useAuthStore } from "@/stores/auth-store";
import { LoginPage } from "@/features/auth/login-page";
import { StreamsPage } from "@/pages/streams-page";
import { StreamPlayerPage } from "@/pages/stream-player-page";
import { } from "@/firebase";
import {
QueryClient,
QueryClientProvider,
} from '@tanstack/react-query'
import PathResolver from "./pages/path-resolver";
function AuthenticatedApp() {
const fetchStartup = useAppStore((s) => s.fetchStartup);
const isLoading = useAppStore((s) => s.isLoading);
useEffect(() => {
fetchStartup();
}, [fetchStartup]);
if (isLoading) {
return (
<div className="flex min-h-screen items-center justify-center">
<p className="text-muted-foreground text-sm">Loading...</p>
</div>
);
}
return (
<TooltipProvider>
<HashRouter>
<Routes>
<Route path="/" element={<StreamsPage />} />
<Route path="/streams/:streamId" element={<StreamPlayerPage />} />
</Routes>
</HashRouter>
</TooltipProvider>
);
}
const queryClient = new QueryClient();
const App = () => {
const status = useAuthStore((s) => s.status);
@@ -59,4 +35,23 @@ const App = () => {
return <AuthenticatedApp />;
};
export default App;
function AuthenticatedApp() {
// NOTE: Hash router provides history, despite using catch-all
return (
<HashRouter>
<Routes>
<Route path="*" element={<PathResolver />} />
</Routes>
</HashRouter>
);
}
const AppWithProviders = () => (
<TooltipProvider>
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>
</TooltipProvider>
);
export default AppWithProviders;