import { createAsyncThunk, PayloadAction } from "@reduxjs/toolkit"; import { createAppSlice } from "../hooks"; import { Script, SCRIPT_RUN_STATUS, SCRIPT_STATUS_DISABLE, SCRIPT_STATUS_ENABLE, ScriptDAO, } from "@App/app/repo/scripts"; import { arrayMove } from "@dnd-kit/sortable"; import { RuntimeClient, ScriptClient } from "@App/app/service/service_worker/client"; import { message } from "../global"; export const scriptClient = new ScriptClient(message); export const runtimeClient = new RuntimeClient(message); export const fetchAndSortScriptList = createAsyncThunk("script/fetchScriptList", async () => { // 排序 const dao = new ScriptDAO(); const scripts = await dao.all(); scripts.sort((a, b) => a.sort - b.sort); for (let i = 0; i < scripts.length; i += 1) { if (scripts[i].sort !== i) { dao.update(scripts[i].uuid, { sort: i }); scripts[i].sort = i; } } return scripts; }); export const requestEnableScript = createAsyncThunk( "script/enableScript", (param: { uuid: string; enable: boolean }) => { return scriptClient.enable(param.uuid, param.enable); } ); export const requestRunScript = createAsyncThunk("script/runScript", async (uuid: string) => { return await runtimeClient.runScript(uuid); }); export const requestStopScript = createAsyncThunk("script/stopScript", async (uuid: string) => { return await runtimeClient.stopScript(uuid); }); export const requestDeleteScript = createAsyncThunk("script/deleteScript", async (uuid: string) => { return scriptClient.delete(uuid); }); export type ScriptLoading = Script & { enableLoading?: boolean; actionLoading?: boolean }; const updateScript = (scripts: ScriptLoading[], uuid: string, update: (s: ScriptLoading) => void) => { const script = scripts.find((s) => s.uuid === uuid); if (script) { update(script); } }; export const scriptSlice = createAppSlice({ name: "script", initialState: { scripts: [] as ScriptLoading[], }, reducers: { upsertScript: (state, action: PayloadAction