init: 昔涟项目骨架
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
import { create } from 'zustand';
|
||||
|
||||
interface Message {
|
||||
id: string;
|
||||
role: 'user' | 'assistant' | 'system';
|
||||
content: string;
|
||||
audioUrl?: string;
|
||||
segments?: { index: number; text: string; audioUrl?: string }[];
|
||||
timestamp: number;
|
||||
isStreaming?: boolean; // 是否还在流式输出中
|
||||
}
|
||||
|
||||
interface ChatState {
|
||||
messages: Message[];
|
||||
isTyping: boolean;
|
||||
currentMode: 'text' | 'voice_msg' | 'voice_assistant';
|
||||
|
||||
// Actions
|
||||
addMessage: (msg: Message) => void;
|
||||
updateLastAssistantMessage: (content: string) => void;
|
||||
setTyping: (typing: boolean) => void;
|
||||
setMode: (mode: 'text' | 'voice_msg' | 'voice_assistant') => void;
|
||||
clearMessages: () => void;
|
||||
}
|
||||
|
||||
export const useChatStore = create<ChatState>((set) => ({
|
||||
messages: [],
|
||||
isTyping: false,
|
||||
currentMode: 'text',
|
||||
|
||||
addMessage: (msg) =>
|
||||
set((state) => ({
|
||||
messages: [...state.messages, msg],
|
||||
})),
|
||||
|
||||
updateLastAssistantMessage: (content) =>
|
||||
set((state) => {
|
||||
const messages = [...state.messages];
|
||||
const lastIdx = messages.length - 1;
|
||||
if (lastIdx >= 0 && messages[lastIdx].role === 'assistant') {
|
||||
messages[lastIdx] = {
|
||||
...messages[lastIdx],
|
||||
content: messages[lastIdx].content + content,
|
||||
};
|
||||
}
|
||||
return { messages };
|
||||
}),
|
||||
|
||||
setTyping: (typing) => set({ isTyping: typing }),
|
||||
setMode: (mode) => set({ currentMode: mode }),
|
||||
clearMessages: () => set({ messages: [] }),
|
||||
}));
|
||||
Reference in New Issue
Block a user