sd.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. db.add({ id: data.id, data: resData.image });
  92. this.updateDraw({
  93. ...data,
  94. status: "success",
  95. img_data: `indexeddb://${StoreKey.SdList}@${data.id}`,
  96. });
  97. } else {
  98. this.updateDraw({
  99. ...data,
  100. status: "error",
  101. error: JSON.stringify(resData),
  102. });
  103. }
  104. this.getNextId();
  105. })
  106. .catch((error) => {
  107. this.updateDraw({ ...data, status: "error", error: error.message });
  108. console.error("Error:", error);
  109. this.getNextId();
  110. });
  111. },
  112. updateDraw(draw: any) {
  113. _get().draw.some((item, index) => {
  114. if (item.id === draw.id) {
  115. _get().draw[index] = draw;
  116. return true;
  117. }
  118. });
  119. },
  120. };
  121. return methods;
  122. },
  123. {
  124. name: StoreKey.SdList,
  125. version: 1.0,
  126. },
  127. );