import type { CronPreview, Schedule } from "../../../services/api"; import type { StateCreator } from "zustand"; import { handleError, notify, requireApi } from "./helpers"; import type { SchedulesStore } from "./useSchedulesStore"; // ---- State ---- export type DialogSliceState = { createDialogOpen: boolean; newScheduleName: string; renameTarget: Schedule | null; renameName: string; cronResult: CronPreview | null; }; // ---- Actions ---- export type DialogSliceActions = { // pure setters setCreateDialogOpen: (open: boolean) => void; setNewScheduleName: (name: string) => void; setRenameName: (name: string) => void; setCronResult: (result: CronPreview | null) => void; // mutations openCreateDialog: () => void; openRenameDialog: (target: Schedule) => void; closeRenameDialog: () => void; runCronPreview: () => Promise; }; // `SchedulesStore` is the combined state+actions of all slices, so `get()` // returns a fully typed snapshot — no `any` propagation. // eslint-disable-next-line @typescript-eslint/no-explicit-any export const createDialogSlice: StateCreator = (set, get) => ({ // ---- initial state ---- createDialogOpen: false, newScheduleName: "", renameTarget: null, renameName: "", cronResult: null, // ---- pure setters ---- setCreateDialogOpen: (open) => set({ createDialogOpen: open }), setNewScheduleName: (name) => set({ newScheduleName: name }), setRenameName: (name) => set({ renameName: name }), setCronResult: (result) => set({ cronResult: result }), // ---- mutations ---- openCreateDialog: () => { if (get().busy) return; set((s: any) => ({ contextMenu: null, newScheduleName: `新建调度 ${s.schedules.length + 1}`, createDialogOpen: true, })); }, openRenameDialog: (target) => { if (get().busy) return; set({ contextMenu: null, renameTarget: target, renameName: target.schedule_name, }); }, closeRenameDialog: () => { if (get().busy === "rename-schedule") return; set({ renameTarget: null, renameName: "" }); }, runCronPreview: async () => { const api = requireApi(); const { scheduleForm } = get(); if (scheduleForm.triggerType !== "cron") return; if (get().busy) return; set({ busy: "cron-preview" }); try { const result = await api.previewCron({ cron_expression: scheduleForm.cronExpression.trim(), timezone: scheduleForm.timezone.trim(), count: 5, }); set({ cronResult: result }); notify({ tone: "success", message: "Cron 表达式校验通过" }); } catch (error) { set({ cronResult: null }); await handleError(get, error, "Cron 预览失败"); } finally { set({ busy: null }); } }, });