import { useState } from 'react'; import { Item, ItemGroup } from "../../../../components/ui/item-group"; import { useNavigate } from 'react-router-dom'; import { Icon } from "../../../../components/ui/icon"; import { Flex, FlexItem, FlexBlock } from '../../../../components/ui/flex'; import { Text } from '../../../../components/ui/text'; import { Spacer } from '../../../../components/ui/spacer'; // `tag` still feeds the WordPress icon component on each row - a separate sweep. import { Pencil, Plus, Tag as tag } from 'lucide-react'; import { EpisodeOfCare } from 'fhir/r4'; import { AppSpinner, FhirEpisodeOfCareDisplay, ScrollableTab } from '../../../../components'; import { ResourceListStatus } from '../../../../components/ui/resource-list-status'; import { useFhirEpisodeOfCareBroadcast, useFhirEpisodeOfCareTargetedBroadcast, useFhirEpisodesOfCare } from '../../../../hooks'; import { useAuthServiceContext, useEpisodeOfCareServiceContext } from '../../../../services'; const EpisodesOfCare = () => { const navigate = useNavigate(); const { userRole, USER_ROLES } = useAuthServiceContext(); const { getEpisodeOfCareDisplay } = useEpisodeOfCareServiceContext(); const { loading, error, clearError, episodesOfCareList, attempted } = useFhirEpisodesOfCare(); const [selectedEpisodeOfCare, setSelectedEpisodeOfCare] = useState(null); const [showDisplayModal, setShowDisplayModal] = useState(false); useFhirEpisodeOfCareBroadcast(); useFhirEpisodeOfCareTargetedBroadcast({ episodeOfCare: selectedEpisodeOfCare || undefined, isOpen: showDisplayModal, onUpdate: (updatedEpisodeOfCare) => { setSelectedEpisodeOfCare(updatedEpisodeOfCare); }, onDelete: () => { setShowDisplayModal(false); setSelectedEpisodeOfCare(null); } }); const viewEpisodeOfCare = (episodeOfCare: EpisodeOfCare) => { setSelectedEpisodeOfCare(episodeOfCare); setShowDisplayModal(true); }; const editEpisodeOfCare = (event: React.MouseEvent, episodeOfCare: EpisodeOfCare) => { event.stopPropagation(); navigate(episodeOfCare.id as string, { relative: 'route' }); }; const addEpisodeOfCare = () => { navigate('new', { relative: 'route' }); }; const isAuthorizedToEdit = () => { return userRole && [USER_ROLES.PRACTITIONER].includes(userRole as string); }; const getStatusDisplay = (episodeOfCare: EpisodeOfCare): { text: string, color?: string } => { if (!episodeOfCare) return { text: 'Unknown' }; switch (episodeOfCare.status) { case 'active': return { text: 'Active', color: '#4CAF50' }; case 'finished': return { text: 'Finished', color: '#2196F3' }; case 'cancelled': return { text: 'Cancelled', color: '#F44336' }; case 'entered-in-error': return { text: 'Error', color: '#FF9800' }; case 'onhold': return { text: 'On Hold', color: '#FFC107' }; case 'planned': return { text: 'Planned', color: '#9C27B0' }; case 'waitlist': return { text: 'Waitlist', color: '#607D8B' }; default: return { text: episodeOfCare.status?.charAt(0).toUpperCase() + episodeOfCare.status?.slice(1) || 'Unknown', color: '#757575' }; } }; return (
{isAuthorizedToEdit() && ( )} <> {loading ? ( ) : ( {episodesOfCareList.length !== 0 && ( {episodesOfCareList.map((episodeOfCare: EpisodeOfCare) => { const displayTitle = getEpisodeOfCareDisplay(episodeOfCare); const { text: statusText, color: statusColor } = getStatusDisplay(episodeOfCare); const diagnosisCount = episodeOfCare.diagnosis?.length || 0; return ( viewEpisodeOfCare(episodeOfCare)}> {displayTitle} {diagnosisCount > 0 && ( {diagnosisCount} diagnosis{diagnosisCount !== 1 ? 'es' : ''} )} {isAuthorizedToEdit() && ( )} ); })} )} )} {selectedEpisodeOfCare && ( { setShowDisplayModal(false); setSelectedEpisodeOfCare(null); }} /> )}
); }; export default EpisodesOfCare;