'use client'; import { useState } from 'react'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Loader2, Search, X, Link2, ExternalLink } from 'lucide-react'; import Link from 'next/link'; import { useReferences, useAddReference, useRemoveReference, useCorrespondences, } from '@/hooks/use-correspondence'; interface LinkedDoc { uuid: string; correspondenceNumber: string; } interface RefItem { source?: LinkedDoc; target?: LinkedDoc; } interface CorrespondenceRevisionItem { subject: string; correspondence?: { uuid: string; correspondenceNumber: string }; } interface ReferenceSelectorProps { uuid: string; canEdit: boolean; } export function ReferenceSelector({ uuid, canEdit }: ReferenceSelectorProps) { const [searchQuery, setSearchQuery] = useState(''); const [isSearching, setIsSearching] = useState(false); const { data: referencesData, isLoading: isLoadingRefs } = useReferences(uuid); const addMutation = useAddReference(); const removeMutation = useRemoveReference(); const { data: searchResults, isFetching: isSearchFetching } = useCorrespondences( isSearching && searchQuery.trim().length >= 2 ? { search: searchQuery.trim(), limit: 8 } : { search: '', limit: 0 } ); const outgoing: RefItem[] = referencesData?.outgoing ?? []; const incoming: RefItem[] = referencesData?.incoming ?? []; const totalCount = outgoing.length + incoming.length; const searchItems = Array.isArray(searchResults?.data) ? searchResults.data : []; const existingRefUuids = new Set([ ...outgoing.map((r) => r.target?.uuid).filter(Boolean), ...incoming.map((r) => r.source?.uuid).filter(Boolean), ]); const handleAdd = (targetUuid: string) => { addMutation.mutate({ uuid, targetUuid }); setIsSearching(false); setSearchQuery(''); }; const handleRemove = (targetUuid: string) => { removeMutation.mutate({ uuid, targetUuid }); }; const renderRef = (linked: LinkedDoc, direction: 'out' | 'in') => (
{direction === 'out' ? 'REF' : 'FROM'} {linked.correspondenceNumber}
{canEdit && direction === 'out' && ( )}
); return ( Referenced Documents {totalCount > 0 && ( {totalCount} )} {isLoadingRefs ? (
Loading references...
) : totalCount === 0 ? (

No referenced documents

) : (
{outgoing.map((r) => r.target && renderRef(r.target, 'out'))} {incoming.map((r) => r.source && renderRef(r.source, 'in'))}
)} {canEdit && (
{isSearching ? ( <>
setSearchQuery(e.target.value)} placeholder="Search by number or subject..." className="pl-7 h-8 text-sm" />
{searchQuery.trim().length >= 2 && (
{isSearchFetching ? (
Searching...
) : searchItems.length === 0 ? (

No results found

) : ( searchItems .filter((item: CorrespondenceRevisionItem) => { const itemUuid = item.correspondence?.uuid; return itemUuid && itemUuid !== uuid && !existingRefUuids.has(itemUuid); }) .map((item: CorrespondenceRevisionItem) => ( )) )}
)} ) : ( )}
)}
); }