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 (
-
- );
-}
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 (
+
+
+
+ );
+ };
+ };
+}