123 lines
3.4 KiB
TypeScript
123 lines
3.4 KiB
TypeScript
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;
|
|
}
|
|
if (resData.finish_reason === "SUCCESS") {
|
|
const self = this;
|
|
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,
|
|
},
|
|
);
|