mirror of
				https://github.com/Yidadaa/ChatGPT-Next-Web.git
				synced 2025-10-31 21:59:19 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			100 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { initDB, useIndexedDB } from "react-indexed-db-hook";
 | |
| import { StabilityPath, StoreKey } from "@/app/constant";
 | |
| import { create, StoreApi } from "zustand";
 | |
| import { showToast } from "@/app/components/ui-lib";
 | |
| import { getHeaders } from "@/app/client/api";
 | |
| 
 | |
| export const SdDbConfig = {
 | |
|   name: "@chatgpt-next-web/sd",
 | |
|   version: 1,
 | |
|   objectStoresMeta: [
 | |
|     {
 | |
|       store: StoreKey.SdList,
 | |
|       storeConfig: { keyPath: "id", autoIncrement: true },
 | |
|       storeSchema: [
 | |
|         { name: "model", keypath: "model", options: { unique: false } },
 | |
|         {
 | |
|           name: "model_name",
 | |
|           keypath: "model_name",
 | |
|           options: { unique: false },
 | |
|         },
 | |
|         { name: "status", keypath: "status", options: { unique: false } },
 | |
|         { name: "params", keypath: "params", options: { unique: false } },
 | |
|         { name: "img_data", keypath: "img_data", options: { unique: false } },
 | |
|         { name: "error", keypath: "error", options: { unique: false } },
 | |
|         {
 | |
|           name: "created_at",
 | |
|           keypath: "created_at",
 | |
|           options: { unique: false },
 | |
|         },
 | |
|       ],
 | |
|     },
 | |
|   ],
 | |
| };
 | |
| 
 | |
| export function SdDbInit() {
 | |
|   initDB(SdDbConfig);
 | |
| }
 | |
| 
 | |
| type SdStore = {
 | |
|   execCount: number;
 | |
|   execCountInc: () => void;
 | |
| };
 | |
| 
 | |
| export const useSdStore = create<SdStore>()((set) => ({
 | |
|   execCount: 1,
 | |
|   execCountInc: () => set((state) => ({ execCount: state.execCount + 1 })),
 | |
| }));
 | |
| 
 | |
| export function sendSdTask(data: any, db: any, inc: any, okCall?: Function) {
 | |
|   db.add(data).then(
 | |
|     (id: number) => {
 | |
|       data = { ...data, id, status: "running" };
 | |
|       db.update(data);
 | |
|       inc();
 | |
|       stabilityRequestCall(data, db, inc);
 | |
|       okCall?.();
 | |
|     },
 | |
|     (error: any) => {
 | |
|       console.error(error);
 | |
|       showToast(`error: ` + error.message);
 | |
|     },
 | |
|   );
 | |
| }
 | |
| 
 | |
| export function stabilityRequestCall(data: any, db: any, inc: 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) {
 | |
|         db.update({ ...data, status: "error", error: resData.errors[0] });
 | |
|         inc();
 | |
|         return;
 | |
|       }
 | |
|       if (resData.finish_reason === "SUCCESS") {
 | |
|         db.update({ ...data, status: "success", img_data: resData.image });
 | |
|       } else {
 | |
|         db.update({ ...data, status: "error", error: JSON.stringify(resData) });
 | |
|       }
 | |
|       inc();
 | |
|     })
 | |
|     .catch((error) => {
 | |
|       db.update({ ...data, status: "error", error: error.message });
 | |
|       console.error("Error:", error);
 | |
|       inc();
 | |
|     });
 | |
| }
 |