Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import {
updateVisit,
useProviders,
} from './patient-queues.resource';
import { Controller, useForm } from 'react-hook-form';
import { Controller, useForm, useFormContext } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { CreateQueueEntryFormData, createQueueEntrySchema } from './patient-queue-validation-schema.resource';
import { PatientQueue } from '../types/patient-queues';
Expand Down Expand Up @@ -69,48 +69,62 @@ const ChangeStatus: React.FC<ChangeStatusDialogProps> = ({ queueEntry, currentEn

const [selectedNextQueueLocation, setSelectedNextQueueLocation] = useState(queueRoomLocations[0]?.uuid);

const [provider, setProvider] = useState('');

const [priorityComment, setPriorityComment] = useState('');

const [selectedProvider, setSelectedProvider] = useState('');

const { activeVisit } = useVisit(queueEntry.patient.uuid);

const [isLoading, setIsLoading] = useState(true);

const [isSubmitting, setIsSubmitting] = useState(false);

const [isEndingVisit, setIsEndingVisit] = useState(false);

const { providers, error: errorLoadingProviders } = useProviders(selectedNextQueueLocation);

// Memoize the function to fetch the provider using useCallback
const fetchProvider = useCallback(() => {
const { setValue, watch } = useFormContext();

const selectedProvider = watch('provider');
const [isFetchingProvider, setIsFetchingProvider] = useState(false);

const fetchAndSetDefaultProvider = useCallback(async () => {
if (!sessionUser?.user?.uuid) return;

setIsLoading(true);

getCareProvider(sessionUser?.user?.uuid).then(
(response) => {
const uuid = response?.data?.results[0].uuid;
setIsLoading(false);
setProvider(uuid);
},
(error) => {
const errorMessages = extractErrorMessagesFromResponse(error);
setIsLoading(false);
try {
setIsFetchingProvider(true);
const response = await getCareProvider(sessionUser.user.uuid);
const fetchedProvider = response?.data?.results?.[0]?.uuid;

if (fetchedProvider) {
const providerExists = providers.some(({ uuid }) => uuid === fetchedProvider);
if (providerExists) {
setValue('provider', fetchedProvider);
}
} else {
showNotification({
title: "Couldn't get provider",
title: 'Provider Not Found',
kind: 'error',
critical: true,
description: errorMessages.join(','),
description: 'No care provider linked to your account.',
});
},
);
}, [sessionUser?.user?.uuid]);
}
} catch (error) {
showNotification({
title: "Couldn't fetch provider",
kind: 'error',
critical: true,
description: extractErrorMessagesFromResponse(error).join(', '),
});
} finally {
setIsFetchingProvider(false);
}
}, [sessionUser?.user?.uuid, providers, setValue]);

useEffect(() => fetchProvider(), [fetchProvider]);
useEffect(() => {
fetchAndSetDefaultProvider();
}, [fetchAndSetDefaultProvider]);

// Reset provider if location changes
useEffect(() => {
setValue('provider', '');
}, [selectedNextQueueLocation, setValue]);

const priorityLabels = useMemo(() => ['Not Urgent', 'Urgent', 'Emergency'], []);

Expand Down Expand Up @@ -155,7 +169,7 @@ const ChangeStatus: React.FC<ChangeStatusDialogProps> = ({ queueEntry, currentEn
try {
const response = await updateQueueEntry(
QueueStatus.Completed,
provider,
selectedProvider,
queueEntry?.uuid,
contentSwitcherIndex,
priorityComment,
Expand Down Expand Up @@ -190,7 +204,7 @@ const ChangeStatus: React.FC<ChangeStatusDialogProps> = ({ queueEntry, currentEn
try {
setIsSubmitting(true);
if (status === QueueStatus.Pending) {
await updateQueueEntry(status, provider, queueEntry?.uuid, 0, priorityComment, 'comment');
await updateQueueEntry(status, selectedProvider, queueEntry?.uuid, 0, priorityComment, 'comment');

showToast({
critical: true,
Expand All @@ -206,7 +220,7 @@ const ChangeStatus: React.FC<ChangeStatusDialogProps> = ({ queueEntry, currentEn
if (status === QueueStatus.Completed) {
await updateQueueEntry(
QueueStatus.Completed,
provider,
selectedProvider,
queueEntry?.uuid,
contentSwitcherIndex,
priorityComment,
Expand All @@ -232,7 +246,7 @@ const ChangeStatus: React.FC<ChangeStatusDialogProps> = ({ queueEntry, currentEn
// Pick and route
await updateQueueEntry(
QueueStatus.Picked,
provider,
selectedProvider,
currentEntry?.uuid,
contentSwitcherIndex,
priorityComment,
Expand Down Expand Up @@ -265,7 +279,7 @@ const ChangeStatus: React.FC<ChangeStatusDialogProps> = ({ queueEntry, currentEn
}
}, [
status,
provider,

queueEntry?.uuid,
queueEntry?.patient?.uuid,
priorityComment,
Expand All @@ -286,7 +300,7 @@ const ChangeStatus: React.FC<ChangeStatusDialogProps> = ({ queueEntry, currentEn
if (queueEntry && Object.keys(queueEntry)?.length > 0) {
return (
<div>
{isLoading && <InlineLoading description={'Fetching Provider..'} />}
{isFetchingProvider && <InlineLoading description={'Fetching Provider..'} />}
<Form onSubmit={handleSubmit(onSubmit)}>
<ModalHeader closeModal={closeModal} />
<ModalBody>
Expand Down Expand Up @@ -391,29 +405,29 @@ const ChangeStatus: React.FC<ChangeStatusDialogProps> = ({ queueEntry, currentEn
<Controller
name="locationTo"
control={control}
defaultValue={queueRoomLocations.length > 0 ? queueRoomLocations[0].uuid : ''}
defaultValue={queueRoomLocations[0]?.uuid || ''}
render={({ field }) => (
<Select
{...field}
labelText={''}
id="nextQueueLocation"
name="nextQueueLocation"
labelText=""
disabled={errorLoadingQueueRooms}
invalid={!!errors.locationTo}
invalidText={errors.locationTo?.message}
value={field.value}
onChange={(event) => {
field.onChange(event.target.value);
setSelectedNextQueueLocation(event.target.value);
onChange={(e) => {
const selectedValue = e.target.value;
field.onChange(selectedValue);
setSelectedNextQueueLocation(selectedValue);
}}
>
{!field.value ? (
<SelectItem text={t('selectNextServicePoint', 'Choose next service point')} value="" />
) : null}
{queueRoomLocations.map((location) => (
<SelectItem key={location.uuid} text={location.display} value={location.uuid}>
{location.display}
</SelectItem>
{!field.value && (
<SelectItem value="" text={t('selectNextServicePoint', 'Choose next service point')} />
)}

{queueRoomLocations.map(({ uuid, display }) => (
<SelectItem key={uuid} value={uuid} text={display} />
))}
</Select>
)}
Expand All @@ -423,9 +437,9 @@ const ChangeStatus: React.FC<ChangeStatusDialogProps> = ({ queueEntry, currentEn
<InlineNotification
className={styles.errorNotification}
kind="error"
onClick={() => {}}
subtitle={errorLoadingQueueRooms}
title={t('errorFetchingQueueRooms', 'Error fetching queue rooms')}
subtitle={errorLoadingQueueRooms}
onClick={() => {}}
/>
)}
</ResponsiveWrapper>
Expand All @@ -436,29 +450,23 @@ const ChangeStatus: React.FC<ChangeStatusDialogProps> = ({ queueEntry, currentEn
<Controller
name="provider"
control={control}
defaultValue={providers.length > 0 ? providers[0].uuid : ''}
defaultValue=""
render={({ field }) => (
<Select
{...field}
labelText={''}
id="providers-list"
name="providers-list"
disabled={errorLoadingProviders}
disabled={errorLoadingProviders || isFetchingProvider}
invalid={!!errors.provider}
invalidText={errors.provider?.message}
value={field.value}
onChange={(event) => {
field.onChange(event.target.value);
setSelectedProvider(event.target.value);
onChange={(e) => {
field.onChange(e.target.value);
}}
>
{!field.value ? (
<SelectItem text={t('selectProvider', 'choose a provider')} value="" />
) : null}
{providers.map((provider) => (
<SelectItem key={provider.uuid} text={provider.display} value={provider.uuid}>
{provider.display}
</SelectItem>
{!field.value && <SelectItem value="" text={t('selectProvider', 'Choose a provider')} />}

{providers.map(({ uuid, display }) => (
<SelectItem key={uuid} value={uuid} text={display} />
))}
</Select>
)}
Expand All @@ -468,9 +476,9 @@ const ChangeStatus: React.FC<ChangeStatusDialogProps> = ({ queueEntry, currentEn
<InlineNotification
className={styles.errorNotification}
kind="error"
onClick={() => {}}
subtitle={errorLoadingProviders}
title={t('errorFetchingQueueRooms', 'Error fetching providers')}
subtitle={errorLoadingProviders}
onClick={() => {}}
/>
)}
</ResponsiveWrapper>
Expand Down Expand Up @@ -516,7 +524,9 @@ const ChangeStatus: React.FC<ChangeStatusDialogProps> = ({ queueEntry, currentEn
{isSubmitting ? (
<InlineLoading description={'Submitting...'} />
) : (
<Button type="submit">{status === 'pending' ? 'Save' : 'Move to the next queue room'}</Button>
<Button disabled={!selectedProvider || isFetchingProvider || isSubmitting} type="submit">
{status === QueueStatus.Pending ? 'Save' : 'Move to the next queue room'}
</Button>
)}
</ModalFooter>
</Form>
Expand Down
Loading