'use client'; import React, {FC, useEffect, useState} from 'react'; import classNames from 'classnames'; import { Modal, Menu, Calendar, Radio, Button, Input, message, Form } from 'antd'; import type { CalendarProps, MenuProps } from 'antd'; import { ArrowLeftOutlined } from '@ant-design/icons'; import { CloseOutlined } from '@ant-design/icons'; import dayjs, { Dayjs } from 'dayjs'; import 'dayjs/locale/ru'; import 'dayjs/locale/en'; import 'dayjs/locale/de'; import 'dayjs/locale/it'; import 'dayjs/locale/fr'; import 'dayjs/locale/es'; import { getLocale } from '../../utils/locale'; import { AUTH_TOKEN_KEY, SESSION_DATA } from '../../constants/common'; import { ExpertScheduler, SignupSessionData } from '../../types/experts'; import { Tag } from '../../types/tags'; import { getSchedulerByExpertId, getSchedulerSession } from '../../actions/experts'; import { StripeElementsForm } from '../stripe/StripeElementsForm'; import { i18nText } from '../../i18nKeys'; import { CustomSelect } from '../../components/view/CustomSelect'; import { Loader } from '../view/Loader'; import { getStorageValue } from '../../hooks/useLocalStorage'; type ScheduleModalProps = { open: boolean; handleCancel: () => void; mode: 'data' | 'time' | 'pay' | 'finish'; updateMode: (mode: 'data' | 'time' | 'pay' | 'finish') => void; sessionCost: number; expertId: string; locale: string; checkSession: (data?: SignupSessionData) => void; }; type MenuItem = Required['items'][number]; const getCalendarMenu = (start: Dayjs): MenuItem[] => Array.from({ length: 3 }) .map((_: unknown, index: number) => { const date = index ? start.add(index, 'M') : start.clone(); return { label: {date.format('MMMM')}, key: date.format('YYYY-MM-DD') } }); export const ScheduleModal: FC = ({ open, handleCancel, mode, updateMode, sessionCost, locale, expertId, checkSession, }) => { const [selectDate, setSelectDate] = useState(dayjs()); const [dates, setDates] = useState | undefined>(); const [tags, setTags] = useState(); const [rawScheduler, setRawScheduler] = useState(null); const [isPayLoading, setIsPayLoading] = useState(false); const [sessionId, setSessionId] = useState(''); const [form] = Form.useForm<{ clientComment?: string, startAtUtc?: string, tagId?: number }>(); dayjs.locale(locale); const signupSession = () => { const data = sessionStorage?.getItem(SESSION_DATA); const jwt = getStorageValue(AUTH_TOKEN_KEY, ''); if (jwt && data) { const parseData = JSON.parse(data); setIsPayLoading(true); getSchedulerSession(parseData as SignupSessionData, locale || 'en', jwt) .then((session) => { setSessionId(session?.sessionId); console.log(session?.sessionId); }) .catch((err) => { console.log(err); message.error('Не удалось провести оплату') }) .finally(() => { sessionStorage?.removeItem(SESSION_DATA); setIsPayLoading(false); }) } }; useEffect(()=> { if (open && mode !== 'pay') { getSchedulerByExpertId(expertId as string, locale as string) .then((data) => { setRawScheduler(data); }) .catch((err) => { console.log(err); }); } if (!open) { form.resetFields(); } }, [open]); useEffect(() => { if (open && mode === 'pay') { signupSession(); } }, [mode]); useEffect(() => { const map = {} as any rawScheduler?.availableSlots.forEach((el) => { const key = dayjs(el.startTime).format('YYYY-MM-DD'); if (!map[key]){ map[key] = [] } map[key].push(el); }) setDates(map); setTags(rawScheduler?.tags) }, [rawScheduler]); const onPanelChange = (value: Dayjs) => setSelectDate(value); const onDateChange: CalendarProps['onSelect'] = (value, selectInfo) => { if (selectInfo.source === 'date') { setSelectDate(value); updateMode('time'); } }; const disabledDate = (currentDate: Dayjs) => !dates || !dates[currentDate.format('YYYY-MM-DD')]; const cellRender: CalendarProps['fullCellRender'] = (date, info) => { const isWeekend = date.day() === 6 || date.day() === 0; return React.cloneElement(info.originNode, { ...info.originNode.props, className: classNames('b-calendar-cell', { ['b-calendar-cell__select']: selectDate.isSame(date, 'date'), ['b-calendar-cell__today']: date.isSame(dayjs(), 'date'), ['b-calendar-cell__weekend']: isWeekend, }), children: (
{date.get('date')}
), }); }; const onValidate = () => { form.validateFields() .then((values) => { checkSession({ coachId: +expertId, ...values }); }) } return ( } > {mode === 'data' && ( { const start = dayjs().startOf('M'); const [activeMonth, setActiveMonth] = useState(start.format('YYYY-MM-DD')); const onClick: MenuProps['onClick'] = (e) => { setActiveMonth(e.key); onChange(dayjs(e.key)); }; return ( ); }} /> )} {mode === 'time' && (
{tags && ( ({value: id, label: name}))} /> )}
{dates && dates[selectDate.format('YYYY-MM-DD')].map((el: any) => ( {dayjs(el.startTime).format('HH:mm')} - {dayjs(el.endTime).format('HH:mm')} ) )}
)} {mode === 'pay' && (
)} ); };