import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { User } from '../types'; import { useBusinessUsers, useCreateResource, useResources } from '../hooks/useBusiness'; import { Plus, MoreHorizontal, User as UserIcon, Shield, Briefcase, Calendar } from 'lucide-react'; import Portal from '../components/Portal'; interface StaffProps { onMasquerade: (user: User) => void; effectiveUser: User; } const Staff: React.FC = ({ onMasquerade, effectiveUser }) => { const { t } = useTranslation(); const { data: users = [], isLoading, error } = useBusinessUsers(); const { data: resources = [] } = useResources(); const createResourceMutation = useCreateResource(); const [isInviteModalOpen, setIsInviteModalOpen] = useState(false); // Helper to check if a user is already linked to a resource const getLinkedResource = (userId: string) => { return resources.find((r: any) => r.user_id === parseInt(userId)); }; const handleMakeBookable = (user: any) => { if (confirm(`Create a bookable resource for ${user.name || user.username}?`)) { createResourceMutation.mutate({ name: user.name || user.username, type: 'STAFF', user_id: user.id }); } }; if (isLoading) { return (
); } if (error) { return (

{t('staff.errorLoading')}: {(error as Error).message}

); } // Filter for staff/management roles const staffUsers = users.filter((u: any) => ['owner', 'manager', 'staff'].includes(u.role)); return (
{/* Header */}

{t('staff.title')}

{t('staff.description')}

{/* Table */}
{staffUsers.map((user: any) => { const linkedResource = getLinkedResource(user.id); // Owners/Managers can log in as anyone. const canMasquerade = ['owner', 'manager'].includes(effectiveUser.role) && user.id !== effectiveUser.id; return ( ); })}
{t('staff.name')} {t('staff.role')} {t('staff.bookableResource')} {t('common.actions')}
{user.name ? user.name.charAt(0).toUpperCase() : user.username.charAt(0).toUpperCase()}
{user.name || user.username}
{user.email}
{user.role === 'owner' && } {user.role === 'manager' && } {user.role} {linkedResource ? ( {t('staff.yes')} ({linkedResource.name}) ) : ( )}
{canMasquerade && ( )}
{/* Invite Modal Placeholder */} {isInviteModalOpen && (

{t('staff.inviteModalTitle')}

{t('staff.inviteModalDescription')}

)}
); }; export default Staff;