diff --git a/apps/web/src/app.tsx b/apps/web/src/app.tsx index ced0dec..2a84fb8 100644 --- a/apps/web/src/app.tsx +++ b/apps/web/src/app.tsx @@ -1,4 +1,3 @@ -import { useEffect } from "react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { createBrowserRouter, @@ -6,6 +5,7 @@ import { Navigate, } 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"; @@ -15,75 +15,120 @@ 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 } from "react"; +import { useAuthStore } from "@/store/auth-store"; +import { apiClient } from "@/lib/api-client"; + +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([ - { path: "/", element: }, + { 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: ( + ), }, { diff --git a/apps/web/src/components/auth-form.tsx b/apps/web/src/components/auth-form.tsx index 0f08635..0966360 100644 --- a/apps/web/src/components/auth-form.tsx +++ b/apps/web/src/components/auth-form.tsx @@ -1,4 +1,5 @@ import { FormEvent, useState } from 'react'; +import { Eye, EyeOff } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; @@ -17,6 +18,7 @@ export function AuthForm({ mode, isSubmitting, error, googleOAuthEnabled, onSubm const [name, setName] = useState(''); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); + const [showPassword, setShowPassword] = useState(false); async function handleSubmit(event: FormEvent) { event.preventDefault(); @@ -53,10 +55,19 @@ export function AuthForm({ mode, isSubmitting, error, googleOAuthEnabled, onSubm
- { - setPassword(event.target.value); - onFieldChange?.(); - }} required /> +
+ { + setPassword(event.target.value); + onFieldChange?.(); + }} required /> + +
{error &&

{error}

} + + + {/* Mobile Navigation */} + setMobileMenuOpen(false)} + /> + + {/* Page Content */} +
+
+ {children} +
+
+ + {/* Footer */} +