import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { createBrowserRouter, RouterProvider, Navigate, Outlet, useNavigate, } from "react-router-dom"; import { AuthInitializer } from "@/components/auth-initializer"; import { AuthGuard } from "@/components/auth-guard"; import { DashboardPage } from "@/pages/dashboard-page"; import { ScanPage } from "@/pages/scan-page"; import { LibraryPage } from "@/pages/library-page"; import { CatalogPage } from "@/pages/catalog-page"; import { DiseaseDetailPage } from "@/pages/disease-detail-page"; import { DiagnosisDetailPage } from "@/pages/diagnosis-detail-page"; import { ExpertReviewsPage } from "@/pages/expert-reviews-page"; import { DiagnosesPage } from "@/pages/diagnoses-page"; import { TelemetryPage } from "@/pages/telemetry-page"; import { LoginPage } from "@/pages/login-page"; import { RegisterPage } from "@/pages/register-page"; import { MainLayout } from "@/components/layout/main-layout"; import { useEffect, useRef } from "react"; import { useAuthStore } from "@/store/auth-store"; import { apiClient } from "@/lib/api-client"; import { setupDeepLinkHandler, consumeDeepLinkTarget } from "@/lib/tauri"; function LogoutProses() { const setUser = useAuthStore((state) => state.setUser); useEffect(() => { apiClient.logout().then(() => { setUser(null); }).catch((error) => { console.error("Oops, gagal logout dari server:", error); setUser(null); }); }, [setUser]); return ; } import { trackPageView, trackError } from "./lib/telemetry"; const queryClient = new QueryClient(); const router = createBrowserRouter([ { element: , children: [ { path: "/", element: }, { path: "/login", element: }, { path: "/register", element: }, { path: "/dashboard", element: ( ), }, { path: "/scan", element: ( ), }, { path: "/library", element: ( ), }, { path: "/diagnoses", element: ( ), }, { path: "/diagnoses/:id", element: ( ), }, { path: "/expert/reviews", element: ( ), }, { path: "/catalog", element: ( ), }, { path: "/catalog/:slug", element: ( ), }, { path: "/logout", element: , }, { path: "/telemetry", element: ( ), }, ], }, ]); /** * Listens for deep-link custom events and routes via React Router's navigate(), * avoiding full page reloads that break the Tauri IPC bridge. */ function DeepLinkRouterHandler() { const navigate = useNavigate(); const handled = useRef(new Set()); useEffect(() => { // Check for cold-start pending deep link const pending = consumeDeepLinkTarget(); if (pending && !handled.current.has(pending)) { handled.current.add(pending); navigate(pending, { replace: true }); } // Listen for warm-start deep links const handler = (e: CustomEvent) => { const target = e.detail; if (handled.current.has(target)) return; handled.current.add(target); navigate(target, { replace: true }); }; window.addEventListener('zeavis:deeplink', handler as EventListener); return () => window.removeEventListener('zeavis:deeplink', handler as EventListener); }, [navigate]); return ; } function PageViewTracker() { const location = window.location; useEffect(() => { trackPageView(location.pathname + location.search); }, [location.pathname, location.search]); return null; } function GlobalErrorTracker() { useEffect(() => { const handler = (event: ErrorEvent) => { trackError(event.filename || "global"); }; window.addEventListener("error", handler); return () => window.removeEventListener("error", handler); }, []); return null; } export function App() { // Register deep link handler for Android OAuth return useEffect(() => { setupDeepLinkHandler(); }, []); return ( ); }