sd.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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 { uploadImage, base64Image2Blob } from "@/app/utils/chat";
  7. export const useSdStore = createPersistStore<
  8. {
  9. currentId: number;
  10. draw: any[];
  11. },
  12. {
  13. getNextId: () => number;
  14. sendTask: (data: 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, okCall?: Function) {
  36. data = { ...data, id: nanoid(), status: "running" };
  37. set({ draw: [data, ..._get().draw] });
  38. this.getNextId();
  39. this.stabilityRequestCall(data);
  40. okCall?.();
  41. },
  42. stabilityRequestCall(data: any) {
  43. const formData = new FormData();
  44. for (let paramsKey in data.params) {
  45. formData.append(paramsKey, data.params[paramsKey]);
  46. }
  47. const headers = getHeaders();
  48. delete headers["Content-Type"];
  49. fetch(`/api/stability/${StabilityPath.GeneratePath}/${data.model}`, {
  50. method: "POST",
  51. headers: {
  52. ...headers,
  53. Accept: "application/json",
  54. },
  55. body: formData,
  56. })
  57. .then((response) => response.json())
  58. .then((resData) => {
  59. if (resData.errors && resData.errors.length > 0) {
  60. this.updateDraw({
  61. ...data,
  62. status: "error",
  63. error: resData.errors[0],
  64. });
  65. this.getNextId();
  66. return;
  67. }
  68. if (resData.finish_reason === "SUCCESS") {
  69. const self = this;
  70. uploadImage(base64Image2Blob(resData.image, "image/png"))
  71. .then((img_data) => {
  72. console.debug("uploadImage success", img_data, self);
  73. self.updateDraw({
  74. ...data,
  75. status: "success",
  76. img_data,
  77. });
  78. })
  79. .catch((e) => {
  80. console.error("uploadImage error", e);
  81. self.updateDraw({
  82. ...data,
  83. status: "error",
  84. error: JSON.stringify(resData),
  85. });
  86. });
  87. } else {
  88. self.updateDraw({
  89. ...data,
  90. status: "error",
  91. error: JSON.stringify(resData),
  92. });
  93. }
  94. this.getNextId();
  95. })
  96. .catch((error) => {
  97. this.updateDraw({ ...data, status: "error", error: error.message });
  98. console.error("Error:", error);
  99. this.getNextId();
  100. });
  101. },
  102. updateDraw(_draw: any) {
  103. const draw = _get().draw || [];
  104. draw.some((item, index) => {
  105. if (item.id === _draw.id) {
  106. draw[index] = _draw;
  107. set(() => ({ draw }));
  108. return true;
  109. }
  110. });
  111. },
  112. };
  113. return methods;
  114. },
  115. {
  116. name: StoreKey.SdList,
  117. version: 1.0,
  118. },
  119. );