Spaces:
Build error
Build error
import { BUILTIN_MASKS } from "../masks"; | |
import { getLang, Lang } from "../locales"; | |
import { DEFAULT_TOPIC, ChatMessage } from "./chat"; | |
import { ModelConfig, useAppConfig } from "./config"; | |
import { StoreKey } from "../constant"; | |
import { nanoid } from "nanoid"; | |
import { createPersistStore } from "../utils/store"; | |
export type Mask = { | |
id: string; | |
createdAt: number; | |
avatar: string; | |
name: string; | |
hideContext?: boolean; | |
context: ChatMessage[]; | |
syncGlobalConfig?: boolean; | |
modelConfig: ModelConfig; | |
lang: Lang; | |
builtin: boolean; | |
usePlugins?: boolean; | |
}; | |
export const DEFAULT_MASK_STATE = { | |
masks: {} as Record<string, Mask>, | |
}; | |
export type MaskState = typeof DEFAULT_MASK_STATE; | |
export const DEFAULT_MASK_AVATAR = "gpt-bot"; | |
export const createEmptyMask = () => | |
({ | |
id: nanoid(), | |
avatar: DEFAULT_MASK_AVATAR, | |
name: DEFAULT_TOPIC, | |
context: [], | |
syncGlobalConfig: true, // use global config as default | |
modelConfig: { ...useAppConfig.getState().modelConfig }, | |
lang: getLang(), | |
builtin: false, | |
createdAt: Date.now(), | |
usePlugins: /^gpt(?!.*03\d{2}$).*$/.test( | |
useAppConfig.getState().modelConfig.model, | |
), | |
}) as Mask; | |
export const useMaskStore = createPersistStore( | |
{ ...DEFAULT_MASK_STATE }, | |
(set, get) => ({ | |
create(mask?: Partial<Mask>) { | |
const masks = get().masks; | |
const id = nanoid(); | |
masks[id] = { | |
...createEmptyMask(), | |
...mask, | |
id, | |
builtin: false, | |
}; | |
set(() => ({ masks })); | |
get().markUpdate(); | |
return masks[id]; | |
}, | |
updateMask(id: string, updater: (mask: Mask) => void) { | |
const masks = get().masks; | |
const mask = masks[id]; | |
if (!mask) return; | |
const updateMask = { ...mask }; | |
updater(updateMask); | |
masks[id] = updateMask; | |
set(() => ({ masks })); | |
get().markUpdate(); | |
}, | |
delete(id: string) { | |
const masks = get().masks; | |
delete masks[id]; | |
set(() => ({ masks })); | |
get().markUpdate(); | |
}, | |
get(id?: string) { | |
return get().masks[id ?? 1145141919810]; | |
}, | |
getAll() { | |
const userMasks = Object.values(get().masks).sort( | |
(a, b) => b.createdAt - a.createdAt, | |
); | |
const config = useAppConfig.getState(); | |
if (config.hideBuiltinMasks) return userMasks; | |
const buildinMasks = BUILTIN_MASKS.map( | |
(m) => | |
({ | |
...m, | |
modelConfig: { | |
...config.modelConfig, | |
...m.modelConfig, | |
}, | |
}) as Mask, | |
); | |
return userMasks.concat(buildinMasks); | |
}, | |
search(text: string) { | |
return Object.values(get().masks); | |
}, | |
}), | |
{ | |
name: StoreKey.Mask, | |
version: 3.1, | |
migrate(state, version) { | |
const newState = JSON.parse(JSON.stringify(state)) as MaskState; | |
// migrate mask id to nanoid | |
if (version < 3) { | |
Object.values(newState.masks).forEach((m) => (m.id = nanoid())); | |
} | |
if (version < 3.1) { | |
const updatedMasks: Record<string, Mask> = {}; | |
Object.values(newState.masks).forEach((m) => { | |
updatedMasks[m.id] = m; | |
}); | |
newState.masks = updatedMasks; | |
} | |
return newState as any; | |
}, | |
}, | |
); |