import React from 'react'; import classNames from 'classnames'; import { useTranslation } from 'react-i18next'; import { type TFunction } from 'i18next'; import { Controller, useForm } from 'react-hook-form'; import { useSWRConfig } from 'swr'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { Button, ButtonSet, Column, Form, InlineLoading, Layer, Select, SelectItem, Stack, TextInput, TextArea, } from '@carbon/react'; import { getCoreTranslation, restBaseUrl, showSnackbar, useLayoutType, Workspace2, type Workspace2DefinitionProps, } from '@openmrs/esm-framework'; import { saveQueueRoom, updateQueueRoom } from './queue-room.resource'; import { useQueueLocations } from '../../create-queue-entry/hooks/useQueueLocations'; import { useQueues } from '../../hooks/useQueues'; import styles from './queue-room-form.scss'; const createQueueRoomSchema = (t: TFunction, isEditMode: boolean) => z.object({ queueRoomName: z .string({ required_error: t('queueRoomNameIsRequired', 'Queue room name is required'), }) .trim() .min(1, t('queueRoomNameIsRequired', 'Queue room name is required')), queueRoomService: z .string({ required_error: t('queueRequired', 'Queue is required'), }) .trim() .min(1, t('queueRequired', 'Queue is required')), queueLocation: isEditMode ? z.string().optional() : z .string({ required_error: t('queueLocationRequired', 'Queue location is required'), }) .trim() .min(1, t('queueLocationRequired', 'Queue location is required')), description: z.string().optional(), }); type QueueRoomFormData = z.infer>; interface QueueRoomWorkspaceProps { queueRoom?: { uuid: string; name: string; description?: string; queue: { uuid: string; display: string }; }; } const QueueRoomForm: React.FC> = ({ closeWorkspace, workspaceProps, }) => { const { t } = useTranslation(); const { mutate } = useSWRConfig(); const isTablet = useLayoutType() === 'tablet'; const queueRoomToEdit = workspaceProps?.queueRoom; const isEditMode = !!queueRoomToEdit; const { control, handleSubmit, watch, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(createQueueRoomSchema(t, isEditMode)), defaultValues: { queueRoomName: queueRoomToEdit?.name || '', queueRoomService: queueRoomToEdit?.queue?.uuid || '', queueLocation: '', description: queueRoomToEdit?.description || '', }, }); const watchedQueueLocationId = watch('queueLocation'); const { queues } = useQueues(isEditMode ? undefined : watchedQueueLocationId); const { queueLocations } = useQueueLocations(); const handleSaveQueueRoom = async (data: QueueRoomFormData) => { try { if (isEditMode) { await updateQueueRoom(queueRoomToEdit.uuid, data.queueRoomName, data.description, data.queueRoomService); showSnackbar({ title: t('queueRoomUpdated', 'Queue room updated'), kind: 'success', subtitle: `${data.queueRoomName}`, }); } else { await saveQueueRoom(data.queueRoomName, data.description, data.queueRoomService); showSnackbar({ title: t('queueRoomCreated', 'Queue room created'), kind: 'success', subtitle: `${data.queueRoomName}`, }); } await mutate((key) => typeof key === 'string' && key.startsWith(`${restBaseUrl}/queue-room?`)); closeWorkspace(); } catch (error) { showSnackbar({ title: isEditMode ? t('errorUpdatingQueueRoom', 'Error updating queue room') : t('errorCreatingQueueRoom', 'Error creating queue room'), kind: 'error', isLowContrast: false, subtitle: error?.responseBody?.message || error?.message, }); } }; return (
( )} /> ( )} /> ( )} /> (