import { useCallback, useState } from "react"; import { Button, Field, Input, MessageBar, MessageBarBody, Select, Spinner, Text } from "@fluentui/react-components"; import { PlayRegular } from "@fluentui/react-icons"; import { useCommonSectionStyles } from "../../theme/commonStyles"; import { useSchedule } from "../../hooks/useBlocklist"; import { useBlocklistStyles } from "./blocklistStyles"; import type { ScheduleConfig, ScheduleFrequency } from "../../types/blocklist"; const FREQUENCY_LABELS: Record = { hourly: "Every N hours", daily: "Daily", weekly: "Weekly", }; const DAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; interface ScheduleSectionProps { onRunImport: () => void; runImportRunning: boolean; } export function BlocklistScheduleSection({ onRunImport, runImportRunning }: ScheduleSectionProps): React.JSX.Element { const styles = useBlocklistStyles(); const sectionStyles = useCommonSectionStyles(); const { info, loading, error, saveSchedule } = useSchedule(); const [saving, setSaving] = useState(false); const [saveMsg, setSaveMsg] = useState(null); const config = info?.config ?? { frequency: "daily" as ScheduleFrequency, interval_hours: 24, hour: 3, minute: 0, day_of_week: 0, }; const [draft, setDraft] = useState(config); const handleSave = useCallback((): void => { setSaving(true); saveSchedule(draft) .then(() => { setSaveMsg("Schedule saved."); setSaving(false); setTimeout(() => { setSaveMsg(null); }, 3000); }) .catch((err: unknown) => { setSaveMsg(err instanceof Error ? err.message : "Failed to save schedule"); setSaving(false); }); }, [draft, saveSchedule]); return (
Import Schedule
{error && ( {error} )} {saveMsg && ( {saveMsg} )} {loading ? (
) : ( <>
{draft.frequency === "hourly" && ( { setDraft((p) => ({ ...p, interval_hours: Math.max(1, parseInt(d.value, 10) || 1) })); }} min={1} max={168} /> )} {draft.frequency !== "hourly" && ( <> {draft.frequency === "weekly" && ( )} )}
Last run {info?.last_run_at ?? "Never"}
Next run {info?.next_run_at ?? "Not scheduled"}
)}
); }