import { Link } from 'react-router-dom'; import { Plus } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { extractApiError } from '@/api/client'; import type { Engagement } from '@/api/types'; import { useDeleteEngagement, useEngagementsList } from '@/hooks/useEngagements'; import { useAuth } from '@/hooks/useAuth'; import { useToast } from '@/hooks/useToast'; import { LoadingState } from '@/components/LoadingState'; import { ErrorState } from '@/components/ErrorState'; import { EmptyState } from '@/components/EmptyState'; import { StatusBadge } from '@/components/StatusBadge'; import { formatDate } from '@/lib/format'; export function EngagementsListPage(): JSX.Element { const { t } = useTranslation(); const { data, isLoading, isError, error, refetch } = useEngagementsList(); const { canEditEngagements } = useAuth(); const { push } = useToast(); const deleteMutation = useDeleteEngagement(); const onDelete = async (eng: Engagement) => { if (!window.confirm(t('engagement.list.deleteConfirm', { name: eng.name }))) return; try { await deleteMutation.mutateAsync(eng.id); push(t('engagement.list.toast.deleted'), 'success'); } catch (err) { push(extractApiError(err, t('engagement.list.error.delete')), 'error'); } }; return (

{t('engagement.list.title')}

{t('engagement.list.subtitle')}

{canEditEngagements ? ( {t('engagement.list.new')} ) : null}
{isLoading ? : null} {isError ? ( refetch()} /> ) : null} {!isLoading && !isError && data && data.length === 0 ? ( {t('engagement.list.new')} ) : undefined } /> ) : null} {!isLoading && !isError && data && data.length > 0 ? (
{data.map((eng) => ( ))}
{t('engagement.list.col.name')} {t('engagement.list.col.status')} {t('engagement.list.col.start')} {t('engagement.list.col.end')} {t('engagement.list.col.createdBy')} {t('engagement.list.col.actions')}
{eng.name} {formatDate(eng.start_date)} {formatDate(eng.end_date)} {eng.created_by.username}
{t('engagement.list.view')} {canEditEngagements ? ( <> {t('engagement.list.edit')} ) : null}
) : null}
); }