import { useCallback, useEffect, useState } from "react"; import type { FormEvent } from "react"; import { assignEmployeeToCompany, createCompany, deleteCompany, getCompanyEmployeeNames, } from "@api/companiesApi"; import { getUsers } from "@api/usersApi"; import { Modal } from "@components/Modal"; import { PageHeader } from "@components/PageHeader"; import type { BackendPreference } from "@/types/backend"; import type { Company } from "@/types/companies"; import type { Employee } from "@/types/users"; import { useCompaniesStore } from "../store/companiesStore"; import styles from "./CompaniesPage.module.scss"; type CompaniesPageProps = { backendPreference: BackendPreference; }; type EmployeeNamesByCompany = Record; export function CompaniesPage({ backendPreference }: CompaniesPageProps) { const [employeeNamesByCompany, setEmployeeNamesByCompany] = useState({}); const [users, setUsers] = useState([]); const [companyName, setCompanyName] = useState(""); const [companyToDelete, setCompanyToDelete] = useState(null); const [selectedCompany, setSelectedCompany] = useState(null); const [selectedEmployeeId, setSelectedEmployeeId] = useState(""); const [error, setError] = useState(""); const [isAddCompanyOpen, setIsAddCompanyOpen] = useState(false); const [deletingCompanyId, setDeletingCompanyId] = useState(null); const [isLoading, setIsLoading] = useState(true); const [isSaving, setIsSaving] = useState(false); const companies = useCompaniesStore((state) => state.companies); const refreshCompanies = useCompaniesStore((state) => state.loadCompanies); const loadCompanies = useCallback(async () => { setError(""); setIsLoading(true); try { const [companiesResponse, usersResponse] = await Promise.all([ refreshCompanies(backendPreference), getUsers(backendPreference), ]); const employeeNameEntries = await Promise.all( companiesResponse.map(async (company) => { const response = await getCompanyEmployeeNames(backendPreference, company.name); return [company.id, response.employees] as const; }), ); setUsers(usersResponse); setEmployeeNamesByCompany(Object.fromEntries(employeeNameEntries)); } catch (loadError) { setError(loadError instanceof Error ? loadError.message : "Unable to load companies"); } finally { setIsLoading(false); } }, [backendPreference, refreshCompanies]); useEffect(() => { void loadCompanies(); }, [loadCompanies]); async function handleCreateCompany(event: FormEvent) { event.preventDefault(); setIsSaving(true); setError(""); try { await createCompany(backendPreference, { name: companyName }); setCompanyName(""); setIsAddCompanyOpen(false); await loadCompanies(); } catch (saveError) { setError(saveError instanceof Error ? saveError.message : "Unable to create company"); } finally { setIsSaving(false); } } async function handleAssignEmployee(event: FormEvent) { event.preventDefault(); if (!selectedCompany || !selectedEmployeeId) { return; } setIsSaving(true); setError(""); try { await assignEmployeeToCompany( backendPreference, selectedCompany.id, Number(selectedEmployeeId), ); setSelectedCompany(null); setSelectedEmployeeId(""); await loadCompanies(); } catch (saveError) { setError(saveError instanceof Error ? saveError.message : "Unable to assign employee"); } finally { setIsSaving(false); } } async function handleDeleteCompany() { if (!companyToDelete) { return; } setDeletingCompanyId(companyToDelete.id); setError(""); try { await deleteCompany(backendPreference, companyToDelete.id); setCompanyToDelete(null); await loadCompanies(); } catch (deleteError) { setError(deleteError instanceof Error ? deleteError.message : "Unable to delete company"); } finally { setDeletingCompanyId(null); } } return ( <> setIsAddCompanyOpen(true)}> Add company } /> {error ?

{error}

: null} {isLoading ?

Loading companies...

: null}
{companies.map((company) => (

{company.name}

Created {new Date(company.date_created).toLocaleDateString()}

{(employeeNamesByCompany[company.id] ?? []).length > 0 ? ( employeeNamesByCompany[company.id].map((user) => ( {user} )) ) : ( No users assigned )}
))}
{isAddCompanyOpen ? ( setIsAddCompanyOpen(false)}>
) : null} {selectedCompany ? (() => { const assignedNames = new Set(employeeNamesByCompany[selectedCompany.id] ?? []); const availableUsers = users.filter( (user) => !assignedNames.has(`${user.name} ${user.last_name}`), ); return ( setSelectedCompany(null)} >
{availableUsers.length === 0 ? (

All users are in a company

) : ( )}
); })() : null} {companyToDelete ? ( setCompanyToDelete(null)}>

Delete {companyToDelete.name}? This action cannot be undone.

) : null} ); }