'use client'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslations } from 'next-intl'; import { TaskCaseGroupHeader } from '@/components/ui/lab/TaskCaseGroupHeader'; import { TaskProsthesisGroupHeader } from '@/components/ui/lab/TaskProsthesisGroupHeader'; import { TaskRow } from '@/components/ui/lab/TaskRow'; import { LabCaseCommentsPanel } from '@/components/ui/lab/LabCaseCommentsPanel'; import { groupTasksForDisplay } from '@/components/lab/taskListGrouping'; import { canEditLabTaskStatus } from '@/components/lab/labTaskStatusDisplay'; import { getUserFacingError } from '@/components/shared/formatApiError'; import { asApiError } from '@/types/api'; import { useAuth } from '@/lib/hooks/useAuth'; import { useToast } from '@/lib/hooks/useToast'; import { labCaseAccessApi, type LabCaseAccessSession } from '@/lib/api/lab-case-access'; import { prosthesisCatalogApi } from '@/lib/api/prosthesis-catalog'; import { tasksApi } from '@/lib/api/tasks'; import { notifyTabBadgesChanged } from '@/lib/tabBadgeUtils'; import type { LabTaskListItem, LabTaskStatus } from '@/types/cases'; import type { ProsthesisCatalogEntry } from '@/types/treatment-catalog'; interface CaseTasksFocusViewProps { token: string; } export function CaseTasksFocusView({ token }: CaseTasksFocusViewProps) { const t = useTranslations('labCaseAccess'); const tTasks = useTranslations('tasks'); const tErrors = useTranslations('errors'); const { user, isAuthReady } = useAuth(); const { showError, showSuccess } = useToast(); const [session, setSession] = useState(null); const [tasks, setTasks] = useState([]); const [loading, setLoading] = useState(true); const [accessDenied, setAccessDenied] = useState(false); const [updatingTaskId, setUpdatingTaskId] = useState(null); const [prosthesisCatalog, setProsthesisCatalog] = useState([]); const locale = user?.language ?? 'en'; const canEditTasks = session?.canEditTaskStatus ?? false; const canPostComments = session?.canPostComments ?? false; const canToggleCommentVisibility = session?.canToggleCommentVisibility ?? false; const statusOptions: { value: LabTaskStatus; label: string }[] = useMemo( () => [ { value: 'IN_PROGRESS', label: tTasks('statusInProgress') }, { value: 'COMPLETED', label: tTasks('statusCompleted') }, ], [tTasks], ); const loadData = useCallback(async () => { setLoading(true); setAccessDenied(false); try { const [sessionRes, tasksRes] = await Promise.all([ labCaseAccessApi.resolve(token), labCaseAccessApi.listTasks(token), ]); setSession(sessionRes.data); setTasks(tasksRes.data.items); } catch (error: unknown) { if (asApiError(error)?.code === 'LAB_CASE_ACCESS_DENIED') { setAccessDenied(true); } else { showError(getUserFacingError(error, tErrors, t('accessDenied'))); } setSession(null); setTasks([]); } finally { setLoading(false); } }, [showError, t, tErrors, token]); useEffect(() => { if (!isAuthReady || !user) return; void loadData(); }, [isAuthReady, user, loadData]); useEffect(() => { void prosthesisCatalogApi .list() .then((response) => setProsthesisCatalog(response.data)) .catch(() => {}); }, []); const displayModel = useMemo(() => groupTasksForDisplay(tasks, 'date'), [tasks]); const handleStatusUpdate = useCallback( async (taskId: string, status: LabTaskStatus) => { if (!canEditTasks || !user?.id) return; const task = tasks.find((item) => item.id === taskId); if (!task || !canEditLabTaskStatus(task, user.id, canEditTasks)) return; setUpdatingTaskId(taskId); try { await tasksApi.updateStatus(taskId, status); await loadData(); notifyTabBadgesChanged(); if (status === 'COMPLETED') { showSuccess(tTasks('taskCompletedToast')); } } catch (error: unknown) { showError(getUserFacingError(error, tErrors, tTasks('errorUpdateTask'))); } finally { setUpdatingTaskId(null); } }, [canEditTasks, loadData, showError, showSuccess, tErrors, tTasks, tasks, user?.id], ); if (!isAuthReady || loading) { return

{t('loading')}

; } if (accessDenied) { return (

{t('accessDeniedTitle')}

{t('accessDenied')}

); } if (!session || displayModel.mode !== 'grouped' || displayModel.cases.length === 0) { return

{t('emptyTasks')}

; } const caseGroup = displayModel.cases[0]; return (

{t('pageTitle')}

{t('caseSummary', { clinic: session.clinic.name, patient: `${session.patient.firstName} ${session.patient.lastName}`.trim(), })}

{session.lab ? (

{t('labName', { name: session.lab.name })}

) : null}
{caseGroup.prosthesisGroups.map((prosthesisGroup) => (
    {prosthesisGroup.tasks.map((task) => ( void handleStatusUpdate(id, status)} onToggleComments={() => {}} onCommentError={showError} /> ))}
))}
{ const r = await labCaseAccessApi.listComments(token); return r.data; }} onPost={async (body, visibleToClinic) => { const r = await labCaseAccessApi.addComment(token, { body, visibleToClinic, }); notifyTabBadgesChanged(); return r.data; }} onToggleVisibility={ canToggleCommentVisibility ? async (commentId, visible) => { const r = await labCaseAccessApi.setCommentVisibility( token, commentId, visible, ); return r.data; } : undefined } onError={showError} />
); }