import { useRef, useState } from 'react'
import CopyableCredential from '../components/CopyableCredential'
import { Badge, Button, Card, Dialog, EmptyState, Field, PageHeader, Tabs } from '../components/ui'
import { useAuth } from '../context/AuthContext'
import { useEmployees } from '../hooks/useEmployees'
import { useScrollIntoView } from '../hooks/useScrollIntoView'
import { validateEmployeeForm } from '../lib/employeeForm'
import './AdminPage.css'
const EMPTY_EMPLOYEE = {
displayName: '',
email: '',
password: '',
shortcode: '',
isAdmin: false,
}
function Notice({ notice }) {
if (!notice?.text) return null
return (
{notice.text}
)
}
export default function AdminPage() {
const { user, isAdmin } = useAuth()
const {
employees,
loading: employeesLoading,
error: employeesError,
createEmployee,
updateEmployee,
deleteEmployee,
} = useEmployees()
// Kunden werden unter "Kunden" gepflegt (Anlegen und Loeschen fuer Admins dort)
const [activeSection, setActiveSection] = useState('employees')
const [employeeForm, setEmployeeForm] = useState(EMPTY_EMPLOYEE)
const [editingEmployee, setEditingEmployee] = useState(null)
const [formOpen, setFormOpen] = useState(false)
const [formError, setFormError] = useState(null)
const [employeeBusy, setEmployeeBusy] = useState(false)
const [createdCredential, setCreatedCredential] = useState(null)
const [notice, setNotice] = useState(null)
const errorRef = useRef(null)
// Hooks stehen vor dem frühen return bei !isAdmin
useScrollIntoView(errorRef, formError)
const showNotice = (type, text) => {
setNotice({ type, text })
window.setTimeout(() => setNotice(null), 4500)
}
if (!isAdmin) {
return (
403
Zugriff verweigert
Für diesen Bereich ist ein Admin-Account erforderlich.
)
}
// Der Admin-Haken des eigenen Kontos ist gesperrt: man nimmt sich nicht selbst die Rechte
const editingSelf = Boolean(editingEmployee) && employees.find((item) => item.$id === editingEmployee)?.userId === user?.$id
const closeForm = () => {
setFormOpen(false)
setFormError(null)
setEmployeeForm(EMPTY_EMPLOYEE)
setEditingEmployee(null)
}
const createNew = () => {
setEmployeeForm(EMPTY_EMPLOYEE)
setEditingEmployee(null)
setFormError(null)
setFormOpen(true)
}
const editEmployee = (employee) => {
setEditingEmployee(employee.$id)
setEmployeeForm({
displayName: employee.displayName || '',
email: employee.email || '',
password: '',
shortcode: employee.shortcode || '',
isAdmin: Boolean(employee.isAdmin),
})
setFormError(null)
setFormOpen(true)
}
const submitEmployee = async (event) => {
event.preventDefault()
const message = validateEmployeeForm(employeeForm, Boolean(editingEmployee))
if (message) {
setFormError(message)
return
}
setFormError(null)
setEmployeeBusy(true)
const result = editingEmployee
? await updateEmployee(editingEmployee, employeeForm)
: await createEmployee(employeeForm)
setEmployeeBusy(false)
if (!result.success) {
setFormError(result.error || 'Mitarbeiter konnte nicht gespeichert werden.')
return
}
if (!editingEmployee) {
setCreatedCredential({
email: employeeForm.email.trim(),
password: employeeForm.password,
})
}
showNotice('success', editingEmployee ? 'Mitarbeiter aktualisiert.' : 'Mitarbeiter angelegt. Der Login ist sofort aktiv.')
closeForm()
}
const removeEmployee = async (employee) => {
if (!window.confirm(`${employee.displayName || employee.email} und dessen Login wirklich löschen?`)) return
const result = await deleteEmployee(employee.$id)
showNotice(
result.success ? 'success' : 'error',
result.success ? 'Mitarbeiter und Login gelöscht.' : result.error
)
}
const setField = (key) => (event) => setEmployeeForm({ ...employeeForm, [key]: event.target.value })
return (
)
}