import React, { useState, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { MenuItem, TextField, Typography, Box, Button, } from "@mui/material"; import { Schedule } from "@mui/icons-material"; import { Dropdown } from "../../ui/DropdownMui"; import { validMomentTimezones } from "../../../constants/const"; import { useGlobalInfoStore } from "../../../context/globalInfo"; import { getSchedule, deleteSchedule } from "../../../api/storage"; import { RobotConfigPage } from "./RobotConfigPage"; import { useNavigate, useLocation } from "react-router-dom"; interface ScheduleSettingsProps { handleStart: (settings: ScheduleSettings) => void; } export interface ScheduleSettings { runEvery: number; runEveryUnit: string; startFrom: string; dayOfMonth?: string; atTimeStart?: string; atTimeEnd?: string; timezone: string; } export const ScheduleSettingsPage = ({ handleStart, }: ScheduleSettingsProps) => { const { t } = useTranslation(); const navigate = useNavigate(); const location = useLocation(); const [schedule, setSchedule] = useState(null); const [settings, setSettings] = useState({ runEvery: 1, runEveryUnit: "HOURS", startFrom: "MONDAY", dayOfMonth: "1", atTimeStart: "00:00", atTimeEnd: "01:00", timezone: "UTC", }); const [isLoading, setIsLoading] = useState(false); const handleChange = ( field: keyof ScheduleSettings, value: string | number | boolean ) => { setSettings((prev) => ({ ...prev, [field]: value })); }; const units = ["MINUTES", "HOURS", "DAYS", "WEEKS", "MONTHS"]; const days = [ "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY", ]; const { recordingId, notify } = useGlobalInfoStore(); const deleteRobotSchedule = async () => { if (recordingId) { setIsLoading(true); try { await deleteSchedule(recordingId); setSchedule(null); notify("success", t("Schedule deleted successfully")); setSettings({ runEvery: 1, runEveryUnit: "HOURS", startFrom: "MONDAY", dayOfMonth: "", atTimeStart: "00:00", atTimeEnd: "01:00", timezone: "UTC", }); } catch (error) { notify("error", "Failed to delete schedule"); } finally { setIsLoading(false); } } else { console.error("No recording id provided"); } }; const getRobotSchedule = async () => { if (recordingId) { try { const scheduleData = await getSchedule(recordingId); setSchedule(scheduleData); } catch (error) { console.error("Failed to fetch robot schedule:", error); } } else { console.error("No recording id provided"); } }; useEffect(() => { const fetchSchedule = async () => { await getRobotSchedule(); }; fetchSchedule(); }, []); const handleSave = async () => { setIsLoading(true); try { await handleStart(settings); const basePath = location.pathname.includes("/prebuilt-robots") ? "/prebuilt-robots" : "/robots"; navigate(basePath); } catch (error) { notify("error", "Failed to save schedule"); } finally { setIsLoading(false); } }; const handleCancel = () => { const basePath = location.pathname.includes("/prebuilt-robots") ? "/prebuilt-robots" : "/robots"; navigate(basePath); }; const getDayOrdinal = (day: string | undefined) => { if (!day) return ""; const lastDigit = day.slice(-1); const lastTwoDigits = day.slice(-2); // Special cases for 11, 12, 13 if (["11", "12", "13"].includes(lastTwoDigits)) { return t("schedule_settings.labels.on_day.th"); } // Other cases switch (lastDigit) { case "1": return t("schedule_settings.labels.on_day.st"); case "2": return t("schedule_settings.labels.on_day.nd"); case "3": return t("schedule_settings.labels.on_day.rd"); default: return t("schedule_settings.labels.on_day.th"); } }; const textStyle = { width: "150px", height: "52px", marginRight: "10px", }; const dropDownStyle = { marginTop: "2px", width: "150px", height: "59px", marginRight: "10px", }; return ( *": { marginBottom: "20px" }, marginTop: "-20px", }} > <> {schedule !== null ? ( <> {t("schedule_settings.run_every")}: {schedule.runEvery}{" "} {schedule.runEveryUnit.toLowerCase()} {["MONTHS", "WEEKS"].includes(settings.runEveryUnit) ? t("schedule_settings.start_from") : t("schedule_settings.start_from")} : {schedule.startFrom.charAt(0).toUpperCase() + schedule.startFrom.slice(1).toLowerCase()} {schedule.runEveryUnit === "MONTHS" && ( {t("schedule_settings.on_day")}: {schedule.dayOfMonth} {getDayOrdinal(schedule.dayOfMonth)} of the month )} {t("schedule_settings.at_around")}: {schedule.atTimeStart},{" "} {schedule.timezone} {t("schedule_settings.timezone")} ) : ( <> {t("schedule_settings.labels.run_once_every")} handleChange("runEvery", parseInt(e.target.value)) } sx={textStyle} inputProps={{ min: 1 }} /> handleChange("runEveryUnit", e.target.value) } sx={dropDownStyle} > {units.map((unit) => ( {" "} {unit.charAt(0).toUpperCase() + unit.slice(1).toLowerCase()} ))} {["MONTHS", "WEEKS"].includes(settings.runEveryUnit) ? t("schedule_settings.labels.start_from_label") : t("schedule_settings.labels.start_from_label")} handleChange("startFrom", e.target.value) } sx={dropDownStyle} > {days.map((day) => ( {day.charAt(0).toUpperCase() + day.slice(1).toLowerCase()} ))} {settings.runEveryUnit === "MONTHS" && ( {t("schedule_settings.labels.on_day_of_month")} handleChange("dayOfMonth", e.target.value) } sx={textStyle} inputProps={{ min: 1, max: 31 }} /> )} {["MINUTES", "HOURS"].includes(settings.runEveryUnit) ? ( {t("schedule_settings.labels.in_between")} handleChange("atTimeStart", e.target.value) } sx={textStyle} /> handleChange("atTimeEnd", e.target.value) } sx={textStyle} /> ) : ( {t("schedule_settings.at_around")} handleChange("atTimeStart", e.target.value) } sx={textStyle} /> )} {t("schedule_settings.timezone")} handleChange("timezone", e.target.value) } sx={dropDownStyle} > {validMomentTimezones.map((tz) => ( {tz.charAt(0).toUpperCase() + tz.slice(1).toLowerCase()} ))} )} ); };