80 lines
2.1 KiB
TypeScript
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,
|
|
};
|
|
} |