diff --git a/apps/web/components/schedule/time-slots/add-slot-form.tsx b/apps/web/components/schedule/time-slots/add-slot-form.tsx deleted file mode 100644 index d26c2ab..0000000 --- a/apps/web/components/schedule/time-slots/add-slot-form.tsx +++ /dev/null @@ -1,59 +0,0 @@ -/* eslint-disable canonical/id-match */ -'use client'; -import { ScheduleSlotsContext } from '@/context/schedule-slots'; -import { useSlotAdd } from '@/hooks/slots'; -import { combineDateTime } from '@/utils/date'; -import { Enum_Slot_State } from '@repo/graphql/types'; -import { Button } from '@repo/ui/components/ui/button'; -import { Input } from '@repo/ui/components/ui/input'; -import { PlusSquare } from 'lucide-react'; -import { type FormEvent, use, useState } from 'react'; - -export function AddSlotForm() { - const [startTime, setStartTime] = useState(''); - const [endTime, setEndTime] = useState(''); - - const { selectedDate } = use(ScheduleSlotsContext); - - const { isPending, mutate } = useSlotAdd(); - - const handleSubmit = (event: FormEvent) => { - event.preventDefault(); - mutate({ - dateend: combineDateTime(selectedDate, endTime).toISOString(), - datestart: combineDateTime(selectedDate, startTime).toISOString(), - state: Enum_Slot_State.Open, - }); - - setStartTime(''); - setEndTime(''); - }; - - return ( -
-
- setStartTime(event.target.value)} - required - type="time" - value={startTime} - /> -
-
- setEndTime(event.target.value)} - required - type="time" - value={endTime} - /> -
- -
- ); -} diff --git a/apps/web/components/schedule/time-slots/components/add-slot-form.tsx b/apps/web/components/schedule/time-slots/components/add-slot-form.tsx new file mode 100644 index 0000000..1c81e9b --- /dev/null +++ b/apps/web/components/schedule/time-slots/components/add-slot-form.tsx @@ -0,0 +1,43 @@ +/* eslint-disable canonical/id-match */ +'use client'; +import { Context, ContextProvider } from '../context'; +import { AddTimePair } from './time-pair'; +import { ScheduleSlotsContext } from '@/context/schedule-slots'; +import { useSlotAdd } from '@/hooks/slots'; +import { withContext } from '@/utils/context'; +import { combineDateTime } from '@/utils/date'; +import { Enum_Slot_State } from '@repo/graphql/types'; +import { Button } from '@repo/ui/components/ui/button'; +import { PlusSquare } from 'lucide-react'; +import { type FormEvent, use } from 'react'; + +export const AddSlotForm = withContext(ContextProvider)(function () { + const { endTime, setEndTime, setStartTime, startTime } = use(Context); + + const { selectedDate } = use(ScheduleSlotsContext); + + const { mutate: addSlot } = useSlotAdd(); + + const handleSubmit = (event: FormEvent) => { + event.preventDefault(); + if (startTime && endTime) { + addSlot({ + dateend: combineDateTime(selectedDate, endTime).toISOString(), + datestart: combineDateTime(selectedDate, startTime).toISOString(), + state: Enum_Slot_State.Open, + }); + + setStartTime(''); + setEndTime(''); + } + }; + + return ( +
+ + + + ); +}); diff --git a/apps/web/components/schedule/time-slots/edit-slot-form/components/form.tsx b/apps/web/components/schedule/time-slots/components/edit-slot-form.tsx similarity index 80% rename from apps/web/components/schedule/time-slots/edit-slot-form/components/form.tsx rename to apps/web/components/schedule/time-slots/components/edit-slot-form.tsx index e6b8e85..07f9cbc 100644 --- a/apps/web/components/schedule/time-slots/edit-slot-form/components/form.tsx +++ b/apps/web/components/schedule/time-slots/components/edit-slot-form.tsx @@ -1,15 +1,16 @@ 'use client'; -import { EditableTimePair, ReadonlyTimePair } from '.'; -import { Context } from '../context'; +import { Context, ContextProvider } from '../context'; import { type Props } from '../types'; +import { EditableTimePair, ReadonlyTimePair } from './time-pair'; import { ScheduleSlotsContext } from '@/context/schedule-slots'; import { useSlotMutation, useSlotQuery } from '@/hooks/slots'; +import { withContext } from '@/utils/context'; import { combineDateTime } from '@/utils/date'; import { Button } from '@repo/ui/components/ui/button'; import { Pencil, Save } from 'lucide-react'; import { type FormEvent, use } from 'react'; -export function Form(props: Readonly) { +export const EditSlotForm = withContext(ContextProvider)(function (props: Readonly) { const { documentId } = props; const { editMode, endTime, setEditMode, setEndTime, setStartTime, startTime } = use(Context); @@ -17,12 +18,12 @@ export function Form(props: Readonly) { const { selectedDate } = use(ScheduleSlotsContext); const { isLoading: isLoadingSlotQuery } = useSlotQuery({ documentId }); - const { isPending: isPendingSlotMutation, mutate } = useSlotMutation({ documentId }); + const { isPending: isPendingSlotMutation, mutate: mutateSlot } = useSlotMutation({ documentId }); const handleSubmit = (event: FormEvent) => { event.preventDefault(); if (startTime && endTime) { - mutate({ + mutateSlot({ data: { dateend: combineDateTime(selectedDate, endTime).toISOString(), datestart: combineDateTime(selectedDate, startTime).toISOString(), @@ -52,4 +53,4 @@ export function Form(props: Readonly) { ); -} +}); diff --git a/apps/web/components/schedule/time-slots/edit-slot-form/components/time-pair.tsx b/apps/web/components/schedule/time-slots/components/time-pair.tsx similarity index 57% rename from apps/web/components/schedule/time-slots/edit-slot-form/components/time-pair.tsx rename to apps/web/components/schedule/time-slots/components/time-pair.tsx index 50b4551..3e3b45b 100644 --- a/apps/web/components/schedule/time-slots/edit-slot-form/components/time-pair.tsx +++ b/apps/web/components/schedule/time-slots/components/time-pair.tsx @@ -1,12 +1,31 @@ 'use client'; -import { Context } from '../context'; +import { Context, type ContextType } from '../context'; import { type Props } from '../types'; -import { useSlotQuery } from '@/hooks/slots'; +import { useSlotAdd, useSlotQuery } from '@/hooks/slots'; import { getTimeString } from '@/utils/date'; import { Input } from '@repo/ui/components/ui/input'; import { Loader } from 'lucide-react'; import { use, useEffect } from 'react'; +type TimePairProps = Pick & { + readonly disabled?: boolean; +}; + +export function AddTimePair() { + const { endTime, setEndTime, setStartTime, startTime } = use(Context); + const { isPending } = useSlotAdd(); + + return ( + + ); +} + export function EditableTimePair({ documentId }: Readonly) { const { editMode, endTime, setEndTime, setStartTime, startTime } = use(Context); const { data } = useSlotQuery({ documentId }); @@ -19,26 +38,12 @@ export function EditableTimePair({ documentId }: Readonly) { }, [data?.slot?.dateend, data?.slot?.datestart, editMode, setEndTime, setStartTime]); return ( - <> -
- setStartTime(event.target.value)} - required - type="time" - value={startTime} - /> -
-
- setEndTime(event.target.value)} - required - type="time" - value={endTime} - /> -
- + ); } @@ -54,3 +59,36 @@ export function ReadonlyTimePair({ documentId }: Readonly) { ); } + +function TimeInputPair({ + disabled = false, + endTime, + setEndTime, + setStartTime, + startTime, +}: TimePairProps) { + return ( + <> +
+ setStartTime?.(event.target.value)} + required + type="time" + value={startTime} + /> +
+
+ setEndTime?.(event.target.value)} + required + type="time" + value={endTime} + /> +
+ + ); +} diff --git a/apps/web/components/schedule/time-slots/edit-slot-form/context.tsx b/apps/web/components/schedule/time-slots/context.tsx similarity index 96% rename from apps/web/components/schedule/time-slots/edit-slot-form/context.tsx rename to apps/web/components/schedule/time-slots/context.tsx index f1a0242..470af0a 100644 --- a/apps/web/components/schedule/time-slots/edit-slot-form/context.tsx +++ b/apps/web/components/schedule/time-slots/context.tsx @@ -1,7 +1,7 @@ 'use client'; import { createContext, type PropsWithChildren, useMemo, useState } from 'react'; -type ContextType = { +export type ContextType = { editMode: boolean; endTime: string; setEditMode: (value: boolean) => void; diff --git a/apps/web/components/schedule/time-slots/edit-slot-form/components/index.ts b/apps/web/components/schedule/time-slots/edit-slot-form/components/index.ts deleted file mode 100644 index d5e178e..0000000 --- a/apps/web/components/schedule/time-slots/edit-slot-form/components/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './form'; -export * from './time-pair'; diff --git a/apps/web/components/schedule/time-slots/edit-slot-form/index.tsx b/apps/web/components/schedule/time-slots/edit-slot-form/index.tsx deleted file mode 100644 index b76e233..0000000 --- a/apps/web/components/schedule/time-slots/edit-slot-form/index.tsx +++ /dev/null @@ -1,12 +0,0 @@ -'use client'; -import { Form } from './components'; -import { ContextProvider } from './context'; -import { type Props } from './types'; - -export function EditSlotForm(props: Readonly) { - return ( - -
- - ); -} diff --git a/apps/web/components/schedule/time-slots/index.tsx b/apps/web/components/schedule/time-slots/index.tsx index 5c1ea26..6df5662 100644 --- a/apps/web/components/schedule/time-slots/index.tsx +++ b/apps/web/components/schedule/time-slots/index.tsx @@ -1,6 +1,6 @@ 'use client'; -import { AddSlotForm } from './add-slot-form'; -import { EditSlotForm } from './edit-slot-form'; +import { AddSlotForm } from './components/add-slot-form'; +import { EditSlotForm } from './components/edit-slot-form'; import { useSlots } from '@/hooks/slots'; import { Loader } from 'lucide-react'; diff --git a/apps/web/components/schedule/time-slots/edit-slot-form/types.tsx b/apps/web/components/schedule/time-slots/types.tsx similarity index 100% rename from apps/web/components/schedule/time-slots/edit-slot-form/types.tsx rename to apps/web/components/schedule/time-slots/types.tsx diff --git a/apps/web/utils/context.tsx b/apps/web/utils/context.tsx new file mode 100644 index 0000000..dd7bb76 --- /dev/null +++ b/apps/web/utils/context.tsx @@ -0,0 +1,15 @@ +import { type ComponentType, type JSX } from 'react'; + +type ContextProvider = (props: T) => JSX.Element; + +export function withContext(ContextProvider: ContextProvider) { + return function

(Component: ComponentType

) { + return (props: P) => { + return ( + + + + ); + }; + }; +}