'use client'; import { useCallback, useEffect, useState } from 'react'; import { useTranslations } from 'next-intl'; import { Eye, EyeOff } from 'lucide-react'; import { formatApiErrorMessage } from '@/components/shared/formatApiError'; import { Button } from '@/components/ui/shared/Button'; import type { LabCaseComment } from '@/types/cases'; interface LabCaseCommentsPanelProps { caseId: string; canPost: boolean; canToggleVisibility: boolean; loadComments: () => Promise; onPost: (body: string, visibleToClinic?: boolean) => Promise; onToggleVisibility?: (commentId: string, visible: boolean) => Promise; onError?: (message: string) => void; } export function LabCaseCommentsPanel({ caseId, canPost, canToggleVisibility, loadComments, onPost, onToggleVisibility, onError, }: LabCaseCommentsPanelProps) { const t = useTranslations('caseComments'); const [comments, setComments] = useState([]); const [loading, setLoading] = useState(false); const [posting, setPosting] = useState(false); const [body, setBody] = useState(''); const [visibleToClinic, setVisibleToClinic] = useState(false); const refresh = useCallback(async () => { setLoading(true); try { const items = await loadComments(); setComments(items); } catch (error: unknown) { onError?.(formatApiErrorMessage(error, t('errorLoad'))); } finally { setLoading(false); } }, [loadComments, onError, t]); useEffect(() => { void refresh(); }, [caseId, refresh]); async function handlePost() { const trimmed = body.trim(); if (!trimmed || !canPost) return; setPosting(true); try { const created = await onPost(trimmed, visibleToClinic); setComments((prev) => [...prev, created]); setBody(''); setVisibleToClinic(false); } catch (error: unknown) { onError?.(formatApiErrorMessage(error, t('errorPost'))); } finally { setPosting(false); } } async function handleToggle(comment: LabCaseComment) { if (!onToggleVisibility || !canToggleVisibility) return; try { const updated = await onToggleVisibility(comment.id, !comment.visibleToClinic); setComments((prev) => prev.map((c) => (c.id === updated.id ? updated : c))); } catch (error: unknown) { onError?.(formatApiErrorMessage(error, t('errorToggle'))); } } return (

{t('title')}

{loading ? (

) : comments.length === 0 ? (

{t('empty')}

) : (
    {comments.map((comment) => (
  • {comment.authorSide === 'LAB' ? t('labAuthor') : t('clinicAuthor')} {comment.authorName ? ` · ${comment.authorName}` : ''} {comment.visibleToClinic ? ( {t('clinicCanSee')} ) : ( {t('hiddenFromClinic')} )}

    {comment.body}

    {canToggleVisibility && comment.canToggleVisibility && onToggleVisibility ? ( ) : null}
  • ))}
)} {canPost ? (