| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- 'use client';
- import { create } from 'zustand';
- import { persist } from 'zustand/middleware';
- import { AppConfig, ResourceModel, ChatMessage, CHAT_MODE, APP_TYPE, IFER_TYPE, RESOURCE_TYPE } from '@/lib/protocol';
- import * as CONSTANTS from '@/lib/constants';
- import { getSrcPath } from "../path";
- // 默认背景:usky
- const defaultBackground: ResourceModel = {
- resource_id: 'DYNAMIC_usky.mp4',
- type: RESOURCE_TYPE.BACKGROUND,
- name: 'usky',
- link: getSrcPath(`${CONSTANTS.SENTIO_BACKGROUND_DYNAMIC_PATH}/usky.mp4`)
- };
- // ==================== 聊天记录 ==================
- // 最多保留的消息数量(1组对话:1个Human + 1个AI = 2条消息)
- const MAX_CHAT_RECORDS = 2;
- interface SentioChatRecordState {
- chatRecord: ChatMessage[],
- addChatRecord: (message: ChatMessage) => void,
- getLastRecord: () => ChatMessage | undefined,
- updateLastRecord: (message: ChatMessage) => void,
- deleteLastRecord: () => void,
- clearChatRecord: () => void
- }
- export const useChatRecordStore = create<SentioChatRecordState>()(
- persist(
- (set) => ({
- chatRecord: [] as ChatMessage[],
- addChatRecord: (message: ChatMessage) => set((state) => {
- // 添加新消息
- const newChatRecord = [...state.chatRecord, message];
- // 如果超过最大数量,删除最旧的消息
- if (newChatRecord.length > MAX_CHAT_RECORDS) {
- return { chatRecord: newChatRecord.slice(newChatRecord.length - MAX_CHAT_RECORDS) };
- }
- return { chatRecord: newChatRecord };
- }),
- getLastRecord: () => {
- const chatRecord: ChatMessage[] = useChatRecordStore.getState().chatRecord;
- return chatRecord.length > 0 ? chatRecord[chatRecord.length - 1] : undefined;
- },
- updateLastRecord: (message: ChatMessage) => set((state) => ({ chatRecord: [...state.chatRecord.slice(0, -1), message] })),
- deleteLastRecord: () => set((state) => ({ chatRecord: [...state.chatRecord.slice(0, -1)] })),
- clearChatRecord: () => set((state) => ({ chatRecord: [] })),
- }),
- {
- name: 'sentio-chat-record-storage'
- }
- )
- )
- // ==================== 基础设置 ==================
- interface SentioBasicState {
- sound: boolean,
- lipFactor: number,
- showThink: boolean
- setSound: (sound: boolean) => void
- setShowThink: (showThink: boolean) => void
- setLipFactor: (weight: number) => void
- }
- export const useSentioBasicStore = create<SentioBasicState>()(
- persist(
- (set) => ({
- sound: true,
- showThink: true,
- lipFactor: CONSTANTS.SENTIO_LIPFACTOR_DEFAULT,
- setSound: (sound: boolean) => set((state) => ({ sound: sound })),
- setShowThink: (showThink: boolean) => set((state) => ({ showThink: showThink })),
- setLipFactor: (weight: number) => set((state) => ({ lipFactor: weight }))
- }),
- {
- name: 'sentio-basic-storage'
- }
- )
- )
- // ==================== ASR 相关设置 ==================
- interface SentioAsrState {
- enable: boolean,
- engine: string,
- infer_type: IFER_TYPE,
- settings: { [key: string]: any },
- setEnable: (enable: boolean) => void,
- setInferType: (infer_type: IFER_TYPE) => void,
- setEngine: (engine: string) => void,
- setSettings: (settings: { [key: string]: any }) => void,
- }
- export const useSentioAsrStore = create<SentioAsrState>()(
- persist(
- (set) => ({
- enable: true,
- engine: "default",
- infer_type: IFER_TYPE.NORMAL,
- settings: {},
- setEnable: (enable: boolean) => set((state) => ({ enable: enable })),
- setInferType: (infer_type: IFER_TYPE) => set((state) => ({ infer_type: infer_type })),
- setEngine: (by: string) => set((state) => ({ engine: by })),
- setSettings: (by: { [key: string]: any }) => set((state) => ({ settings: by })),
- }),
- {
- name: 'sentio-asr-storage',
- }
- )
- )
- // ==================== TTS 相关设置 ==================
- interface SentioTtsState {
- enable: boolean,
- engine: string,
- infer_type: IFER_TYPE,
- settings: { [key: string]: any },
- setEnable: (enable: boolean) => void,
- setInferType: (infer_type: IFER_TYPE) => void,
- setEngine: (engine: string) => void,
- setSettings: (settings: { [key: string]: any }) => void
- }
- export const useSentioTtsStore = create<SentioTtsState>()(
- persist(
- (set) => ({
- enable: true,
- engine: "default",
- infer_type: IFER_TYPE.NORMAL,
- settings: {},
- setEnable: (enable: boolean) => set((state) => ({ enable: enable })),
- setInferType: (infer_type: IFER_TYPE) => set((state) => ({ infer_type: infer_type })),
- setEngine: (by: string) => set((state) => ({ engine: by })),
- setSettings: (by: { [key: string]: any }) => set((state) => ({ settings: by }))
- }),
- {
- name: 'sentio-tts-storage',
- }
- )
- )
- // ==================== Agent 相关设置 ==================
- interface SentioAgentState {
- enable: boolean,
- engine: string,
- infer_type: IFER_TYPE,
- settings: { [key: string]: any },
- setEnable: (enable: boolean) => void,
- setInferType: (infer_type: IFER_TYPE) => void,
- setEngine: (engine: string) => void,
- setSettings: (settings: { [key: string]: any }) => void
- }
- export const useSentioAgentStore = create<SentioAgentState>()(
- persist(
- (set) => ({
- enable: true,
- engine: "default",
- infer_type: IFER_TYPE.NORMAL,
- settings: {},
- // setEnable: (enable: boolean) => set((state) => ({ enable: enable })),
- setEnable: (enable: boolean) => set((state) => ({})),
- setInferType: (infer_type: IFER_TYPE) => set((state) => ({ infer_type: infer_type })),
- setEngine: (by: string) => set((state) => ({ engine: by })),
- setSettings: (by: { [key: string]: any }) => set((state) => ({ settings: by }))
- }),
- {
- name: 'sentio-agent-storage',
- }
- )
- )
- // ==================== 背景选择 ==================
- interface SentioBackgroundState {
- background: ResourceModel | null,
- setBackground: (background: ResourceModel | null) => void
- }
- export const useSentioBackgroundStore = create<SentioBackgroundState>()(
- persist(
- (set) => ({
- background: defaultBackground,
- setBackground: (by: ResourceModel | null) => set((state) => ({ background: by })),
- }),
- {
- name: 'sentio-background-storage',
- }
- )
- )
- // ==================== 人物选择 ==================
- interface SentioCharacterState {
- character: ResourceModel | null,
- setCharacter: (character: ResourceModel | null) => void
- }
- export const useSentioCharacterStore = create<SentioCharacterState>()(
- persist(
- (set) => ({
- character: null as ResourceModel | null,
- setCharacter: (by: ResourceModel | null) => set((state) => ({ character: by })),
- }),
- {
- name: 'sentio-character-storage',
- }
- )
- )
- // ==================== 聊天模式 ==================
- interface SentioChatModeState {
- chatMode: CHAT_MODE,
- setChatMode: (chatMode: CHAT_MODE) => void
- }
- export const useSentioChatModeStore = create<SentioChatModeState>()(
- persist(
- (set) => ({
- chatMode: CONSTANTS.SENTIO_CHATMODE_DEFULT,
- setChatMode: (by: CHAT_MODE) => set((state) => ({ chatMode: by })),
- }),
- {
- name: 'sentio-chat-mode-storage',
- }
- )
- )
- // ==================== 主题 ==================
- interface SentioThemeState {
- theme: APP_TYPE,
- setTheme: (theme: APP_TYPE) => void
- }
- export const useSentioThemeStore = create<SentioThemeState>()(
- persist(
- (set) => ({
- theme: CONSTANTS.SENTIO_THENE_DEFAULT,
- // setTheme: (by: APP_TYPE) => set((state) => ({ theme: by })),
- setTheme: (by: APP_TYPE) => set((state) => ({ theme: by })),
- }),
- {
- name: 'sentio-theme-storage',
- }
- )
- )
- // ==================== live2d ==================
- interface SentioLive2DState {
- ready: boolean,
- isRunning: boolean,
- showControlButton: boolean,
- isAutoStarted: boolean, // 标记是否是自动启动(人脸检测触发)
- setReady: (enable: boolean) => void,
- setIsRunning: (isRunning: boolean) => void,
- setShowControlButton: (show: boolean) => void,
- setIsAutoStarted: (isAutoStarted: boolean) => void,
- toggleRunning: () => void
- }
- export const useSentioLive2DStore = create<SentioLive2DState>()(
- (set) => ({
- ready: false,
- isRunning: false, // 默认不运行,等待按钮启动
- showControlButton: true, // 默认显示控制按钮
- isAutoStarted: false, // 默认不是自动启动
- setReady: (ready: boolean) => set((state) => ({ ready: ready })),
- setIsRunning: (isRunning: boolean) => set((state) => ({ isRunning: isRunning })),
- setShowControlButton: (show: boolean) => set((state) => ({ showControlButton: show })),
- setIsAutoStarted: (isAutoStarted: boolean) => set((state) => ({ isAutoStarted: isAutoStarted })),
- toggleRunning: () => set((state) => ({
- isRunning: !state.isRunning,
- showControlButton: false, // 点击后隐藏按钮
- isAutoStarted: false // 手动启动,标记为非自动启动
- })),
- })
- )
- // ==================== 展示模式 ==================
- interface SentioPresentationState {
- isPresentationMode: boolean,
- presentationBackground: ResourceModel | null,
- setPresentationMode: (isPresentation: boolean) => void,
- setPresentationBackground: (background: ResourceModel | null) => void,
- exitPresentationMode: () => void
- }
- export const useSentioPresentationStore = create<SentioPresentationState>()(
- (set) => ({
- isPresentationMode: false,
- presentationBackground: null,
- setPresentationMode: (isPresentation: boolean) => set((state) => ({ isPresentationMode: isPresentation })),
- setPresentationBackground: (background: ResourceModel | null) => set((state) => ({ presentationBackground: background })),
- exitPresentationMode: () => set((state) => ({
- isPresentationMode: false,
- presentationBackground: null
- })),
- })
- )
|