BillTracker/client/pages/AdminPage.jsx

83 lines
2.5 KiB
React
Raw Normal View History

2026-05-09 13:03:36 -05:00
import React, { useState, useEffect, useCallback } from 'react';
2026-05-03 19:51:57 -05:00
import { useNavigate } from 'react-router-dom';
import { api } from '@/api';
import AppNavigation from '@/components/layout/Sidebar';
import OnboardingWizard from '@/components/admin/OnboardingWizard';
import EmailNotifCard from '@/components/admin/EmailNotifCard';
import LoginModeCard from '@/components/admin/LoginModeCard';
import AuthMethodsCard from '@/components/admin/AuthMethodsCard';
import UsersTable from '@/components/admin/UsersTable';
import AddUserCard from '@/components/admin/AddUserCard';
import BackupManagementCard from '@/components/admin/BackupManagementCard';
import CleanupPanel from '@/components/admin/CleanupPanel';
2026-05-03 19:51:57 -05:00
export default function AdminPage() {
const navigate = useNavigate();
const [me, setMe] = useState(null);
const [hasUsers, setHasUsers] = useState(null);
2026-05-03 19:51:57 -05:00
const [users, setUsers] = useState([]);
const loadMe = useCallback(async () => {
try {
const d = await api.me();
setMe(d.user);
} catch {
navigate('/login', { replace: true });
}
}, [navigate]);
const loadUsers = useCallback(async () => {
try {
const d = await api.adminUsers();
setUsers(d.users || d);
} catch {}
}, []);
const loadHasUsers = useCallback(async () => {
try {
const d = await api.hasUsers();
setHasUsers(d.has_users);
if (d.has_users) loadUsers();
} catch {}
}, [loadUsers]);
2026-05-03 19:51:57 -05:00
useEffect(() => {
loadMe();
loadHasUsers();
}, [loadMe, loadHasUsers]);
const handleOnboardingComplete = () => {
setHasUsers(true);
loadUsers();
};
if (hasUsers === null) {
return (
<div className="flex items-center justify-center min-h-screen text-muted-foreground text-sm">
Loading
</div>
);
}
return (
2026-05-15 22:45:38 -05:00
<div className="min-h-screen bg-[radial-gradient(circle_at_top_left,oklch(var(--primary)/0.06),transparent_34rem),linear-gradient(180deg,oklch(var(--background)),oklch(var(--muted)/0.18))] text-foreground">
2026-05-03 19:51:57 -05:00
<AppNavigation adminMode />
{!hasUsers ? (
<OnboardingWizard onComplete={handleOnboardingComplete} />
) : (
<main className="mx-auto max-w-5xl px-4 py-6 sm:px-6 lg:px-8 lg:py-8 space-y-6">
<EmailNotifCard />
<BackupManagementCard />
<CleanupPanel />
<LoginModeCard users={users} />
<AuthMethodsCard />
<AddUserCard onCreated={loadUsers} />
<UsersTable users={users} onRefresh={loadUsers} currentUser={me} />
</main>
)}
</div>
);
}