110 lines
2.9 KiB
TypeScript
110 lines
2.9 KiB
TypeScript
import React, { createContext, useContext, useState, useCallback, ReactNode } from 'react';
|
|
|
|
export interface ChatMessage {
|
|
id: string;
|
|
role: 'user' | 'assistant';
|
|
content: string;
|
|
timestamp: number;
|
|
type?: 'general' | 'agent' | 'compare';
|
|
agentName?: string;
|
|
}
|
|
|
|
export interface toolsUser {
|
|
email: string;
|
|
id: string;
|
|
is_active: boolean;
|
|
is_superuser: boolean;
|
|
is_verified: boolean;
|
|
pages_limit: number;
|
|
pages_used: string;
|
|
yUserId: string;
|
|
}
|
|
|
|
interface ChatContextType {
|
|
messages: ChatMessage[];
|
|
addMessage: (role: 'user' | 'assistant', content: string, type?: 'general' | 'agent' | 'compare', agentName?: string) => void;
|
|
clearMessages: () => void;
|
|
deleteMessage: (id: string) => void;
|
|
startConfig: unknown;
|
|
setStartConfig: (val: unknown) => void;
|
|
toolsUser: toolsUser | null;
|
|
setToolsUser: (val: toolsUser) => void;
|
|
}
|
|
|
|
const ChatContext = createContext<ChatContextType | undefined>(undefined);
|
|
|
|
export function ChatProvider({ children }: { children: ReactNode }) {
|
|
const [messages, setMessages] = useState<ChatMessage[]>(() => {
|
|
try {
|
|
const stored = localStorage.getItem('qa-chat-history');
|
|
return stored ? JSON.parse(stored) : [];
|
|
} catch {
|
|
return [];
|
|
}
|
|
});
|
|
|
|
const [startConfig, setStartConfig] = useState<unknown>(null);
|
|
const [toolsUser, setToolsUser] = useState<toolsUser | null>(null);
|
|
|
|
const saveToStorage = useCallback((newMessages: ChatMessage[]) => {
|
|
try {
|
|
localStorage.setItem('qa-chat-history', JSON.stringify(newMessages));
|
|
} catch (error) {
|
|
console.error('Failed to save chat history:', error);
|
|
}
|
|
}, []);
|
|
|
|
const addMessage = useCallback((role: 'user' | 'assistant', content: string, type?: 'general' | 'agent' | 'compare', agentName?: string) => {
|
|
const newMessage: ChatMessage = {
|
|
id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
role,
|
|
content,
|
|
timestamp: Date.now(),
|
|
type,
|
|
agentName,
|
|
};
|
|
setMessages((prev) => {
|
|
const updated = [...prev, newMessage];
|
|
saveToStorage(updated);
|
|
return updated;
|
|
});
|
|
}, [saveToStorage]);
|
|
|
|
const clearMessages = useCallback(() => {
|
|
setMessages([]);
|
|
localStorage.removeItem('qa-chat-history');
|
|
}, []);
|
|
|
|
const deleteMessage = useCallback((id: string) => {
|
|
setMessages((prev) => {
|
|
const updated = prev.filter((msg) => msg.id !== id);
|
|
saveToStorage(updated);
|
|
return updated;
|
|
});
|
|
}, [saveToStorage]);
|
|
|
|
return (
|
|
<ChatContext.Provider
|
|
value={{
|
|
messages,
|
|
addMessage,
|
|
clearMessages,
|
|
deleteMessage,
|
|
startConfig,
|
|
setStartConfig,
|
|
toolsUser,
|
|
setToolsUser,
|
|
}}
|
|
>
|
|
{children}
|
|
</ChatContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useChatContext() {
|
|
const context = useContext(ChatContext);
|
|
if (context === undefined) {
|
|
throw new Error('useChatContext must be used within a ChatProvider');
|
|
}
|
|
return context;
|
|
} |