import { useMemo } from "react"; import dayjs from "dayjs"; import { maintenanceWindowSchema, repeatOptions, durationUnitOptions, type MaintenanceWindowFormData, } from "@/Validation/maintenanceWindow"; import type { MaintenanceWindow } from "@/Types/MaintenanceWindow"; interface UseMaintenanceWindowFormOptions { data?: MaintenanceWindow | null; } const getRepeatId = (repeatMs: number): string => { const option = repeatOptions.find((opt) => opt.value === repeatMs); return option?.id ?? "none"; }; const getDurationAndUnit = ( startMs: number, endMs: number ): { duration: number; durationUnit: string } => { const diffMs = endMs - startMs; for (const unit of [...durationUnitOptions].reverse()) { if (diffMs >= unit.multiplier && diffMs % unit.multiplier === 0) { return { duration: diffMs / unit.multiplier, durationUnit: unit.id, }; } } return { duration: diffMs / 1000, durationUnit: "seconds", }; }; export const useMaintenanceWindowForm = ({ data = null, }: UseMaintenanceWindowFormOptions = {}) => { return useMemo(() => { let defaults: MaintenanceWindowFormData; if (data) { const startDate = dayjs(data.start); const endDate = dayjs(data.end); const { duration, durationUnit } = getDurationAndUnit( startDate.valueOf(), endDate.valueOf() ); defaults = { name: data.name, repeat: getRepeatId(data.repeat), startDate: startDate.format("YYYY-MM-DD"), startTime: startDate.format("HH:mm"), duration, durationUnit, monitors: [data.monitorId], }; } else { const now = dayjs(); defaults = { name: "", repeat: "none", startDate: now.format("YYYY-MM-DD"), startTime: now.format("HH:mm"), duration: 0, durationUnit: "minutes", monitors: [], }; } return { schema: maintenanceWindowSchema, defaults }; }, [data]); };