import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useUsers, useCreateUser, useUpdateUser, useDeleteUser } from '@/api/hooks'; import { Button } from '@/components/ui/Button'; import { Card } from '@/components/ui/Card'; import { Badge } from '@/components/ui/Badge'; import { Input } from '@/components/ui/Input'; import { Select } from '@/components/ui/Select'; import { EmptyState } from '@/components/ui/EmptyState'; import { Skeleton } from '@/components/ui/Skeleton'; import { Avatar } from '@/components/ui/Avatar'; import { Modal } from '@/components/ui/Modal'; import { ConfirmDialog } from '@/components/ui/ConfirmDialog'; import { useToast } from '@/components/ui/Toast'; const ROLES = [ { value: 'admin', label: 'Administrator' }, { value: 'manager', label: 'Manager' }, { value: 'user', label: 'Mitarbeiter' }, { value: 'guest', label: 'Gast' }, ]; export function SettingsUsersPage() { const { t } = useTranslation(); const toast = useToast(); const { data, isLoading } = useUsers(1, 100); const createUserMutation = useCreateUser(); const updateUserMutation = useUpdateUser(); const deleteUserMutation = useDeleteUser(); const [inviteOpen, setInviteOpen] = useState(false); const [inviteEmail, setInviteEmail] = useState(''); const [inviteRole, setInviteRole] = useState('user'); const [confirmDeactivate, setConfirmDeactivate] = useState(null); const users = data?.items ?? []; const handleInvite = async () => { if (!inviteEmail.trim()) { toast.error(t('validation.required')); return; } try { await createUserMutation.mutateAsync({ email: inviteEmail.trim(), role: inviteRole, first_name: '', last_name: '', }); toast.success(t('settings.userInvited')); setInviteEmail(''); setInviteRole('user'); setInviteOpen(false); } catch (err: any) { toast.error(err.message || t('common.error')); } }; const handleRoleChange = async (userId: string, newRole: string) => { try { await updateUserMutation.mutateAsync({ id: userId, data: { role: newRole } }); toast.success(t('settings.assignRole') + ' — OK'); } catch (err: any) { toast.error(err.message || t('common.error')); } }; const handleToggleActive = async () => { if (!confirmDeactivate) return; try { if (confirmDeactivate.is_active === false) { await updateUserMutation.mutateAsync({ id: confirmDeactivate.id, data: { is_active: true } }); toast.success(t('settings.userActivated')); } else { await updateUserMutation.mutateAsync({ id: confirmDeactivate.id, data: { is_active: false } }); toast.success(t('settings.userDeactivated')); } setConfirmDeactivate(null); } catch (err: any) { toast.error(err.message || t('common.error')); } }; if (isLoading) { return (
); } return (

{t('settings.users')}

{users.length === 0 ? ( setInviteOpen(true)}>{t('settings.inviteUser')}} /> ) : (
{users.map((user: any) => (

{user.first_name} {user.last_name}

{user.email}

{user.is_active === false ? t('common.inactive') : t('common.active')}
setInviteEmail(e.target.value)} placeholder="neu.mitarbeiter@firma.de" data-testid="invite-email" />