sd.ts 3.1 KB

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