import { Navigate, createFileRoute } from "@tanstack/react-router"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useState } from "react"; import type {Profile, ProfileUpdate} from "@/lib/api"; import { AppHeader } from "@/components/AppHeader"; import { ProfileForm } from "@/components/ProfileForm"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { api } from "@/lib/api"; import { useSession } from "@/lib/session"; export const Route = createFileRoute("/admin")({ component: AdminPage }); function AdminPage() { const session = useSession(); const qc = useQueryClient(); const [selected, setSelected] = useState(null); const [error, setError] = useState(null); const options = useQuery({ queryKey: ["options"], queryFn: api.options, enabled: !!session.data?.is_admin, }); const profiles = useQuery({ queryKey: ["adminProfiles"], queryFn: api.adminListProfiles, enabled: !!session.data?.is_admin, }); const save = useMutation({ mutationFn: ({ login, body }: { login: string; body: ProfileUpdate }) => api.adminSaveProfile(login, body), onSuccess: () => { void qc.invalidateQueries({ queryKey: ["adminProfiles"] }); setError(null); }, onError: (e: Error) => setError(e.message), }); if (session.isLoading) { return (
); } if (!session.data) return ; if (!session.data.is_admin) return ; const activeProfile: Profile | null = (selected && profiles.data?.find((p) => p.login === selected)) || null; return (
All users {profiles.data?.length ?? 0} profiles {profiles.isLoading ? ( ) : ( profiles.data?.map((p) => ( )) )} {activeProfile?.login ?? "Select a user"} {activeProfile?.email ?? ""} {!activeProfile ? (

Pick a user on the left to edit.

) : options.isLoading ? ( ) : ( save.mutateAsync({ login: activeProfile.login!, body }) } saving={save.isPending} error={error} /> )}
); }