gbclient/src/chat/providers/chat-provider.tsx

79 lines
2.2 KiB
TypeScript
Raw Normal View History

import React, { createContext, useContext, useState, useEffect } from 'react';
import { invoke } from '@tauri-apps/api/tauri';
import { User, ChatInstance } from '../types';
interface ChatContextType {
line: any;
user: User;
instance: ChatInstance | null;
sendActivity: (activity: any) => void;
selectedVoice: any;
setVoice: (voice: any) => void;
}
const ChatContext = createContext<ChatContextType | undefined>(undefined);
export function ChatProvider({ children }: { children: React.ReactNode }) {
const [line, setLine] = useState<any>(null);
const [instance, setInstance] = useState<ChatInstance | null>(null);
const [selectedVoice, setSelectedVoice] = useState(null);
const [user] = useState<User>({
id: `user_${Math.random().toString(36).slice(2)}`,
name: 'You'
});
useEffect(() => {
const initializeChat = async () => {
try {
const botId = window.location.pathname.split('/')[1] || 'default';
const instanceData = await invoke('get_chat_instance', { botId });
setInstance(instanceData as ChatInstance);
// Initialize DirectLine or other chat service
const directLine = {
activity$: { subscribe: () => {} },
postActivity: () => ({ subscribe: () => {} })
};
setLine(directLine);
} catch (error) {
console.error('Failed to initialize chat:', error);
}
};
initializeChat();
}, []);
const sendActivity = async (activity: any) => {
try {
await invoke('send_chat_activity', {
activity: {
...activity,
from: user,
timestamp: new Date().toISOString()
}
});
line?.postActivity(activity).subscribe();
} catch (error) {
console.error('Failed to send activity:', error);
}
};
const setVoice = (voice: any) => {
setSelectedVoice(voice);
};
return (
<ChatContext.Provider value={{ line, user, instance, sendActivity, selectedVoice, setVoice }}>
{children}
</ChatContext.Provider>
);
}
export function useChat() {
const context = useContext(ChatContext);
if (!context) {
throw new Error('useChat must be used within ChatProvider');
}
return context;
}