From 79570efe1a87f332da13d229a2288b31067fbc10 Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Fri, 14 Mar 2025 13:56:36 +0300 Subject: [PATCH] save selected date to context --- .../orders/components/datetime-select.tsx | 45 +++++++++++-------- apps/web/components/orders/order-form.tsx | 6 ++- apps/web/context/order.tsx | 26 ++++++++++- 3 files changed, 54 insertions(+), 23 deletions(-) diff --git a/apps/web/components/orders/components/datetime-select.tsx b/apps/web/components/orders/components/datetime-select.tsx index 8a40a2e..ebcacc8 100644 --- a/apps/web/components/orders/components/datetime-select.tsx +++ b/apps/web/components/orders/components/datetime-select.tsx @@ -6,30 +6,27 @@ import dayjs, { type Dayjs } from 'dayjs'; import { use } from 'react'; type TimeSlotsProps = { - endTime: string; + endTime?: string; interval?: number; - startTime: string; + startTime?: string; }; -export function DateTimeSelect() { - const { step } = use(OrderContext); +export function DateSelect() { + const { date: selectedDate, setDate, step } = use(OrderContext); if (step !== 'datetime-select') return null; return ( -
- { - return dayjs().isAfter(dayjs(date), 'day'); - }} - mode="single" - // onSelect={(date) => { - // if (date) setSelectedDate(date); - // }} - // selected={selectedDate} - /> - -
+ { + return dayjs().isAfter(dayjs(date), 'day'); + }} + mode="single" + onSelect={(date) => { + if (date) setDate(date); + }} + selected={selectedDate} + /> ); } @@ -46,7 +43,15 @@ const generateTimeSlots = (start: string, end: string, interval: number): Dayjs[ return times; }; -function TimeSlots({ endTime, interval = 30, startTime }: Readonly) { +export function TimeSelect({ + endTime = '2025-03-10T20:00:00', + interval = 30, + startTime = '2025-03-10T09:00:00', +}: Readonly) { + const { step } = use(OrderContext); + + if (step !== 'datetime-select') return null; + const timeSlots = generateTimeSlots(startTime, endTime, interval); const morning = timeSlots.filter((time) => time.hour() < 12); @@ -63,6 +68,8 @@ function TimeSlots({ endTime, interval = 30, startTime }: Readonly) { + if (!times.length) return null; + return (

{title}

diff --git a/apps/web/components/orders/order-form.tsx b/apps/web/components/orders/order-form.tsx index dda91cd..8129b06 100644 --- a/apps/web/components/orders/order-form.tsx +++ b/apps/web/components/orders/order-form.tsx @@ -1,9 +1,10 @@ import { BackButton, ContactsGrid, - DateTimeSelect, + DateSelect, ServiceSelect, SubmitButton, + TimeSelect, } from './components'; import { OrderContextProvider } from '@/context/order'; @@ -13,7 +14,8 @@ export function OrderForm() { - + +
diff --git a/apps/web/context/order.tsx b/apps/web/context/order.tsx index 3fead74..65409b0 100644 --- a/apps/web/context/order.tsx +++ b/apps/web/context/order.tsx @@ -5,13 +5,17 @@ type Action = { payload: Steps; type: 'SET_STEP' } | { type: 'NEXT_STEP' } | { t type ContextType = { customerId: null | string; + date: Date; nextStep: () => void; prevStep: () => void; serviceId: null | string; setCustomerId: (customerId: string) => void; + setDate: (date: Date) => void; setServiceId: (serviceId: string) => void; setStep: (step: Steps) => void; + setTime: (time: string) => void; step: Steps; + time: null | string; }; type State = { step: Steps }; @@ -67,11 +71,29 @@ export function OrderContextProvider({ children }: Readonly) const { entityId: customerId, setEntityId: setCustomerId } = useEntityState(); const { entityId: serviceId, setEntityId: setServiceId } = useEntityState(); + const [date, setDate] = useState(new Date()); + const [time, setTime] = useState(null); + const { nextStep, prevStep, setStep, step } = useStep(); const value = useMemo( () => ({ customerId, + date, + nextStep, + prevStep, + serviceId, + setCustomerId, + setDate, + setServiceId, + setStep, + setTime, + step, + time, + }), + [ + customerId, + date, nextStep, prevStep, serviceId, @@ -79,8 +101,8 @@ export function OrderContextProvider({ children }: Readonly) setServiceId, setStep, step, - }), - [customerId, nextStep, prevStep, serviceId, setCustomerId, setServiceId, setStep, step], + time, + ], ); return {children};