/* eslint-disable react-hooks/exhaustive-deps */ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable no-irregular-whitespace */ import { Trans } from "react-i18next"; import useSidebarTabStore from "../stores/useSidebarStore"; import TimeSelector from "./TimeSelector"; import CloseIcon from "./icons/CloseIcon"; import { addMinutes, eachMinuteOfInterval, format, isAfter, parse, } from "date-fns"; import i18n from "../i18n"; import { enUS, ru } from "date-fns/locale"; import ky from "ky"; import { useEffect, useState } from "react"; import LoaderIcon from "./icons/LoaderIcon"; function SidebarTab2() { const [ currentTab, setCurrentTab, setIsOpen, setSelectedTime, selectedDay, buildId, ] = useSidebarTabStore((state) => [ state.currentTab, state.setCurrentTab, state.setIsOpen, state.setSelectedTime, state.selectedDay, state.buildId, ]); const [build, setBuild] = useState<{ [key: string]: any }>(); const [scheduledSessions, setScheduledSessions] = useState(); const [schedule, setSchedule] = useState<{ [key: string]: any }>(); const [scheduleTimes, setScheduleTimes] = useState(); function handleSelectTime(time: string) { setSelectedTime(time); setCurrentTab(currentTab + 1); } async function getBuild() { const result: { [key: string]: any } = await ky .get(`${import.meta.env.VITE_CRM_API_URL}/builds/${buildId}`) .json(); setBuild(result); } async function getScheduledSessions() { if (!selectedDay) return; const result: any[] = await ky .get( `${ import.meta.env.VITE_CRM_API_URL }/scheduled_sessions/builds/${buildId}?date=${format( selectedDay, "yyyy-MM-dd" )}` ) .json(); setScheduledSessions(result); } async function getSchedule() { if (!selectedDay) return; try { const result: { [key: string]: any } = await ky .get( `${ import.meta.env.VITE_CRM_API_URL }/schedules/builds/${buildId}?date=${format( selectedDay, "yyyy-MM-dd" )}` ) .json(); setSchedule(result); } catch (error) { if (error instanceof Error) { console.log("Error: ", error.message); } } } function generateScheduleTimes() { if (!selectedDay || !build || !scheduledSessions || !schedule) return; const step = schedule.sessionDuration + schedule.sessionBreak; const times = eachMinuteOfInterval( { start: parse(schedule.startTime, "HH:mm", selectedDay), end: parse(schedule.endTime, "HH:mm", selectedDay), }, { step } ); const formatTimes = times.map((time) => ({ value: format(time, "HH:mm"), active: isAfter(time, addMinutes(new Date(), 30)) && scheduledSessions.filter( (scheduledSession) => scheduledSession.startAt === time.toISOString() ).length < build.sessionLimit, })); setScheduleTimes(formatTimes); } useEffect(() => { getBuild(); }, [selectedDay]); useEffect(() => { if (!build) return; getScheduledSessions(); }, [build]); useEffect(() => { if (!scheduledSessions) return; getSchedule(); }, [scheduledSessions]); useEffect(() => { if (!schedule) return; generateScheduleTimes(); }, [schedule]); return (

Дата и время

{selectedDay && format( selectedDay, "dd MMMM", i18n.language === "ru" ? { locale: ru } : { locale: enUS } )}

Время

{scheduleTimes && scheduleTimes.length > 0 ? ( handleSelectTime(time)} /> ) : ( )}

Запись на демонстрацию работает в ознакомительном режиме и не сохраняет введенные данные

); } export default SidebarTab2;