sd.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import { initDB } from "react-indexed-db-hook";
  2. import { StabilityPath, StoreKey } from "@/app/constant";
  3. import { showToast } from "@/app/components/ui-lib";
  4. import { getHeaders } from "@/app/client/api";
  5. import { createPersistStore } from "@/app/utils/store";
  6. import { nanoid } from "nanoid";
  7. export const SdDbConfig = {
  8. name: "@chatgpt-next-web/sd",
  9. version: 1,
  10. objectStoresMeta: [
  11. {
  12. store: StoreKey.SdList,
  13. storeConfig: { keyPath: "id", autoIncrement: true },
  14. storeSchema: [
  15. { name: "data", keypath: "data", options: { unique: false } },
  16. {
  17. name: "created_at",
  18. keypath: "created_at",
  19. options: { unique: false },
  20. },
  21. ],
  22. },
  23. ],
  24. };
  25. export function SdDbInit() {
  26. initDB(SdDbConfig);
  27. }
  28. export const useSdStore = createPersistStore<
  29. {
  30. currentId: number;
  31. draw: any[];
  32. },
  33. {
  34. getNextId: () => number;
  35. sendTask: (data: any, db: any, okCall?: Function) => void;
  36. updateDraw: (draw: any) => void;
  37. }
  38. >(
  39. {
  40. currentId: 0,
  41. draw: [],
  42. },
  43. (set, _get) => {
  44. function get() {
  45. return {
  46. ..._get(),
  47. ...methods,
  48. };
  49. }
  50. const methods = {
  51. getNextId() {
  52. const id = ++_get().currentId;
  53. set({ currentId: id });
  54. return id;
  55. },
  56. sendTask(data: any, db: any, okCall?: Function) {
  57. data = { ...data, id: nanoid(), status: "running" };
  58. set({ draw: [data, ..._get().draw] });
  59. // db.update(data);
  60. this.getNextId();
  61. this.stabilityRequestCall(data, db);
  62. okCall?.();
  63. },
  64. stabilityRequestCall(data: any, db: any) {
  65. const formData = new FormData();
  66. for (let paramsKey in data.params) {
  67. formData.append(paramsKey, data.params[paramsKey]);
  68. }
  69. const headers = getHeaders();
  70. delete headers["Content-Type"];
  71. fetch(`/api/stability/${StabilityPath.GeneratePath}/${data.model}`, {
  72. method: "POST",
  73. headers: {
  74. ...headers,
  75. Accept: "application/json",
  76. },
  77. body: formData,
  78. })
  79. .then((response) => response.json())
  80. .then((resData) => {
  81. if (resData.errors && resData.errors.length > 0) {
  82. this.updateDraw({
  83. ...data,
  84. status: "error",
  85. error: resData.errors[0],
  86. });
  87. this.getNextId();
  88. return;
  89. }
  90. if (resData.finish_reason === "SUCCESS") {
  91. const imgId = nanoid();
  92. db.add({ id: data.id, data: resData.image });
  93. this.updateDraw({
  94. ...data,
  95. status: "success",
  96. img_data: `indexeddb://${StoreKey.SdList}@${imgId}`,
  97. });
  98. } else {
  99. this.updateDraw({
  100. ...data,
  101. status: "error",
  102. error: JSON.stringify(resData),
  103. });
  104. }
  105. this.getNextId();
  106. })
  107. .catch((error) => {
  108. this.updateDraw({ ...data, status: "error", error: error.message });
  109. console.error("Error:", error);
  110. this.getNextId();
  111. });
  112. },
  113. updateDraw(draw: any) {
  114. _get().draw.some((item, index) => {
  115. if (item.id === draw.id) {
  116. _get().draw[index] = draw;
  117. return true;
  118. }
  119. });
  120. },
  121. };
  122. return methods;
  123. },
  124. {
  125. name: StoreKey.SdList,
  126. version: 1.0,
  127. },
  128. );