mask.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { create } from "zustand";
  2. import { persist } from "zustand/middleware";
  3. import { getLang, Lang } from "../locales";
  4. import { DEFAULT_TOPIC, Message } from "./chat";
  5. import { ModelConfig, ModelType, useAppConfig } from "./config";
  6. export const MASK_KEY = "mask-store";
  7. export type Mask = {
  8. id: number;
  9. avatar: string;
  10. name: string;
  11. context: Message[];
  12. modelConfig: ModelConfig;
  13. lang: Lang;
  14. };
  15. export const DEFAULT_MASK_STATE = {
  16. masks: {} as Record<number, Mask>,
  17. globalMaskId: 0,
  18. };
  19. export type MaskState = typeof DEFAULT_MASK_STATE;
  20. type MaskStore = MaskState & {
  21. create: (mask: Partial<Mask>) => Mask;
  22. update: (id: number, updater: (mask: Mask) => void) => void;
  23. delete: (id: number) => void;
  24. search: (text: string) => Mask[];
  25. getAll: () => Mask[];
  26. };
  27. export const DEFAULT_MASK_ID = 1145141919810;
  28. export const DEFAULT_MASK_AVATAR = "gpt-bot";
  29. export const createEmptyMask = () =>
  30. ({
  31. id: DEFAULT_MASK_ID,
  32. avatar: DEFAULT_MASK_AVATAR,
  33. name: DEFAULT_TOPIC,
  34. context: [],
  35. modelConfig: useAppConfig.getState().modelConfig,
  36. lang: getLang(),
  37. } as Mask);
  38. export const useMaskStore = create<MaskStore>()(
  39. persist(
  40. (set, get) => ({
  41. ...DEFAULT_MASK_STATE,
  42. create(mask) {
  43. set(() => ({ globalMaskId: get().globalMaskId + 1 }));
  44. const id = get().globalMaskId;
  45. const masks = get().masks;
  46. masks[id] = {
  47. ...createEmptyMask(),
  48. id,
  49. ...mask,
  50. };
  51. set(() => ({ masks }));
  52. return masks[id];
  53. },
  54. update(id, updater) {
  55. const masks = get().masks;
  56. const mask = masks[id];
  57. if (!mask) return;
  58. const updateMask = { ...mask };
  59. updater(updateMask);
  60. masks[id] = updateMask;
  61. set(() => ({ masks }));
  62. },
  63. delete(id) {
  64. const masks = get().masks;
  65. delete masks[id];
  66. set(() => ({ masks }));
  67. },
  68. getAll() {
  69. return Object.values(get().masks).sort((a, b) => a.id - b.id);
  70. },
  71. search(text) {
  72. return Object.values(get().masks);
  73. },
  74. }),
  75. {
  76. name: MASK_KEY,
  77. version: 2,
  78. },
  79. ),
  80. );