Files
Checkmate/client/src/Hooks/useMaintenanceWindowForm.ts
T
2026-02-04 21:45:39 +00:00

80 lines
1.8 KiB
TypeScript

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]);
};