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 { AppShell, SettingsSection } from "@/components/AppShell"; import { ProfileForm } from "@/components/ProfileForm"; import { Button } from "@/components/ui/button"; 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 (
{profiles.isLoading ? ( ) : ( profiles.data?.map((p) => ( )) )}
{!activeProfile ? (

Pick a user on the left to edit.

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