Files
deerflow-code/web-code/hooks/useChatHistory.ts
T
2026-05-27 19:43:15 +08:00

80 lines
2.1 KiB
TypeScript

import { useState, useCallback } from 'react';
export interface ChatMessage {
id: string;
role: 'user' | 'assistant';
content: string;
timestamp: number;
}
interface UseChatHistoryReturn {
messages: ChatMessage[];
addMessage: (role: 'user' | 'assistant', content: string) => void;
clearMessages: () => void;
deleteMessage: (id: string) => void;
updateMessage: (id: string, content: string) => void;
}
export function useChatHistory(storageKey: string = 'chat-history'): UseChatHistoryReturn {
const [messages, setMessages] = useState<ChatMessage[]>(() => {
try {
const stored = localStorage.getItem(storageKey);
return stored ? JSON.parse(stored) : [];
} catch {
return [];
}
});
const saveToStorage = useCallback((newMessages: ChatMessage[]) => {
try {
localStorage.setItem(storageKey, JSON.stringify(newMessages));
} catch (error) {
console.error('Failed to save chat history:', error);
}
}, [storageKey]);
const addMessage = useCallback((role: 'user' | 'assistant', content: string) => {
const newMessage: ChatMessage = {
id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
role,
content,
timestamp: Date.now(),
};
setMessages((prev) => {
const updated = [...prev, newMessage];
saveToStorage(updated);
return updated;
});
}, [saveToStorage]);
const clearMessages = useCallback(() => {
setMessages([]);
localStorage.removeItem(storageKey);
}, [storageKey]);
const deleteMessage = useCallback((id: string) => {
setMessages((prev) => {
const updated = prev.filter((msg) => msg.id !== id);
saveToStorage(updated);
return updated;
});
}, [saveToStorage]);
const updateMessage = useCallback((id: string, content: string) => {
setMessages((prev) => {
const updated = prev.map((msg) =>
msg.id === id ? { ...msg, content } : msg
);
saveToStorage(updated);
return updated;
});
}, [saveToStorage]);
return {
messages,
addMessage,
clearMessages,
deleteMessage,
updateMessage,
};
}