import { useState } from 'react' import { createFileRoute, Link, redirect, useRouter } from '@tanstack/react-router' import { getCurrentStaffUser } from '#/lib/auth' import { authClient } from '#/lib/auth-client' import { listStaffMembers } from '#/lib/staff' export const Route = createFileRoute('/staff/team')({ component: StaffTeam, beforeLoad: async () => { const staffUser = await getCurrentStaffUser() if (!staffUser) { throw redirect({ to: '/staff/login' }) } if (staffUser.role !== 'admin') { throw redirect({ to: '/staff' }) } return { staffUser } }, loader: async ({ context }) => { const members = await listStaffMembers() return { staffUser: context.staffUser, members } }, }) type StaffMember = Awaited>[number] type FormState = { name: string email: string password: string role: 'admin' | 'user' } function emptyForm(): FormState { return { name: '', email: '', password: '', role: 'user' } } function StaffTeam() { const router = useRouter() const { staffUser, members } = Route.useLoaderData() const [form, setForm] = useState(emptyForm) const [error, setError] = useState(null) const [success, setSuccess] = useState(null) const [isSubmitting, setIsSubmitting] = useState(false) const [busyId, setBusyId] = useState(null) async function handleCreate(event: React.FormEvent) { event.preventDefault() setError(null) setSuccess(null) setIsSubmitting(true) const { error: createError } = await authClient.admin.createUser({ name: form.name, email: form.email, password: form.password, role: form.role, }) if (createError) { setError(createError.message ?? 'Etwas ist schiefgelaufen') setIsSubmitting(false) return } setSuccess('Mitarbeiter wurde angelegt.') setForm(emptyForm()) setIsSubmitting(false) await router.invalidate() } async function handleRemove(member: StaffMember) { if (!window.confirm(`Zugang für ${member.name} wirklich entfernen?`)) { return } setBusyId(member.id) setError(null) setSuccess(null) const { error: removeError } = await authClient.admin.removeUser({ userId: member.id }) if (removeError) { setError(removeError.message ?? 'Etwas ist schiefgelaufen') } else { setSuccess('Zugang wurde entfernt.') await router.invalidate() } setBusyId(null) } async function handleToggleRole(member: StaffMember) { const nextRole = member.role === 'admin' ? 'user' : 'admin' setBusyId(member.id) setError(null) setSuccess(null) const { error: roleError } = await authClient.admin.setRole({ userId: member.id, role: nextRole }) if (roleError) { setError(roleError.message ?? 'Etwas ist schiefgelaufen') } else { setSuccess('Rolle wurde aktualisiert.') await router.invalidate() } setBusyId(null) } async function handleToggleBan(member: StaffMember) { setBusyId(member.id) setError(null) setSuccess(null) const { error: banError } = member.banned ? await authClient.admin.unbanUser({ userId: member.id }) : await authClient.admin.banUser({ userId: member.id }) if (banError) { setError(banError.message ?? 'Etwas ist schiefgelaufen') } else { setSuccess(member.banned ? 'Zugang wurde reaktiviert.' : 'Zugang wurde gesperrt.') await router.invalidate() } setBusyId(null) } async function handleSetPassword(member: StaffMember) { const newPassword = window.prompt(`Neues Passwort für ${member.name} (mind. 8 Zeichen):`) if (!newPassword) { return } setBusyId(member.id) setError(null) setSuccess(null) const { error: passwordError } = await authClient.admin.setUserPassword({ userId: member.id, newPassword, }) if (passwordError) { setError(passwordError.message ?? 'Etwas ist schiefgelaufen') } else { setSuccess(`Passwort für ${member.name} wurde geändert.`) } setBusyId(null) } return (
Steakhaus bei Mirko
Zu den Reservierungen Angemeldet als {staffUser.name}

Mitarbeiter

Neuer Mitarbeiter

{error &&

{error}

} {success &&

{success}

}
{members.map((member) => ( ))}
Name E-Mail Rolle Status
{member.name} {member.email} {member.role === 'admin' ? 'Admin' : 'Mitarbeiter'} {member.banned ? 'Gesperrt' : 'Aktiv'}
) }