ChatGPT-Next-Web/app/store/mask.ts

95 lines
2.2 KiB
TypeScript
Raw Normal View History

2023-04-23 17:15:44 +00:00
import { create } from "zustand";
import { persist } from "zustand/middleware";
import { getLang, Lang } from "../locales";
2023-04-24 16:49:27 +00:00
import { DEFAULT_TOPIC, Message } from "./chat";
import { ModelConfig, ModelType, useAppConfig } from "./config";
2023-04-23 17:15:44 +00:00
export const MASK_KEY = "mask-store";
export type Mask = {
id: number;
avatar: string;
name: string;
context: Message[];
2023-04-24 16:49:27 +00:00
modelConfig: ModelConfig;
2023-04-23 17:15:44 +00:00
lang: Lang;
};
export const DEFAULT_MASK_STATE = {
masks: {} as Record<number, Mask>,
globalMaskId: 0,
};
export type MaskState = typeof DEFAULT_MASK_STATE;
type MaskStore = MaskState & {
2023-04-25 18:02:46 +00:00
create: (mask?: Partial<Mask>) => Mask;
2023-04-23 17:15:44 +00:00
update: (id: number, updater: (mask: Mask) => void) => void;
delete: (id: number) => void;
search: (text: string) => Mask[];
2023-04-25 18:02:46 +00:00
get: (id?: number) => Mask | null;
2023-04-23 17:15:44 +00:00
getAll: () => Mask[];
};
2023-04-24 16:49:27 +00:00
export const DEFAULT_MASK_ID = 1145141919810;
export const DEFAULT_MASK_AVATAR = "gpt-bot";
export const createEmptyMask = () =>
({
id: DEFAULT_MASK_ID,
avatar: DEFAULT_MASK_AVATAR,
name: DEFAULT_TOPIC,
context: [],
2023-04-25 18:02:46 +00:00
modelConfig: { ...useAppConfig.getState().modelConfig },
2023-04-24 16:49:27 +00:00
lang: getLang(),
} as Mask);
2023-04-23 17:15:44 +00:00
export const useMaskStore = create<MaskStore>()(
persist(
(set, get) => ({
...DEFAULT_MASK_STATE,
create(mask) {
set(() => ({ globalMaskId: get().globalMaskId + 1 }));
const id = get().globalMaskId;
const masks = get().masks;
masks[id] = {
2023-04-24 16:49:27 +00:00
...createEmptyMask(),
2023-04-23 17:15:44 +00:00
id,
...mask,
};
set(() => ({ masks }));
return masks[id];
},
update(id, updater) {
const masks = get().masks;
const mask = masks[id];
if (!mask) return;
const updateMask = { ...mask };
updater(updateMask);
masks[id] = updateMask;
set(() => ({ masks }));
},
delete(id) {
const masks = get().masks;
delete masks[id];
set(() => ({ masks }));
},
2023-04-25 18:02:46 +00:00
get(id) {
return get().masks[id ?? 1145141919810];
},
2023-04-23 17:15:44 +00:00
getAll() {
return Object.values(get().masks).sort((a, b) => a.id - b.id);
},
search(text) {
return Object.values(get().masks);
},
}),
{
name: MASK_KEY,
version: 2,
},
),
);