import { StabilityPath, StoreKey } from "@/app/constant"; import { showToast } from "@/app/components/ui-lib"; import { getHeaders } from "@/app/client/api"; import { createPersistStore } from "@/app/utils/store"; import { nanoid } from "nanoid"; import { uploadImage, base64Image2Blob } from "@/app/utils/chat"; export const useSdStore = createPersistStore< { currentId: number; draw: any[]; }, { getNextId: () => number; sendTask: (data: any, okCall?: Function) => void; updateDraw: (draw: any) => void; } >( { currentId: 0, draw: [], }, (set, _get) => { function get() { return { ..._get(), ...methods, }; } const methods = { getNextId() { const id = ++_get().currentId; set({ currentId: id }); return id; }, sendTask(data: any, okCall?: Function) { data = { ...data, id: nanoid(), status: "running" }; set({ draw: [data, ..._get().draw] }); this.getNextId(); this.stabilityRequestCall(data); okCall?.(); }, stabilityRequestCall(data: any) { const formData = new FormData(); for (let paramsKey in data.params) { formData.append(paramsKey, data.params[paramsKey]); } const headers = getHeaders(); delete headers["Content-Type"]; fetch(`/api/stability/${StabilityPath.GeneratePath}/${data.model}`, { method: "POST", headers: { ...headers, Accept: "application/json", }, body: formData, }) .then((response) => response.json()) .then((resData) => { if (resData.errors && resData.errors.length > 0) { this.updateDraw({ ...data, status: "error", error: resData.errors[0], }); this.getNextId(); return; } const self = this; if (resData.finish_reason === "SUCCESS") { uploadImage(base64Image2Blob(resData.image, "image/png")) .then((img_data) => { console.debug("uploadImage success", img_data, self); self.updateDraw({ ...data, status: "success", img_data, }); }) .catch((e) => { console.error("uploadImage error", e); self.updateDraw({ ...data, status: "error", error: JSON.stringify(resData), }); }); } else { self.updateDraw({ ...data, status: "error", error: JSON.stringify(resData), }); } this.getNextId(); }) .catch((error) => { this.updateDraw({ ...data, status: "error", error: error.message }); console.error("Error:", error); this.getNextId(); }); }, updateDraw(_draw: any) { const draw = _get().draw || []; draw.some((item, index) => { if (item.id === _draw.id) { draw[index] = _draw; set(() => ({ draw })); return true; } }); }, }; return methods; }, { name: StoreKey.SdList, version: 1.0, }, );