2025-04-02 20:42:47 -03:00
|
|
|
"use client";
|
2025-03-30 19:04:24 -03:00
|
|
|
import React, { createContext, useContext, useState, useEffect } from 'react';
|
2025-03-30 21:47:18 -03:00
|
|
|
import { core } from '@tauri-apps/api';
|
2025-03-30 19:04:24 -03:00
|
|
|
import { User, ChatInstance } from '../types';
|
2025-03-30 16:42:51 -03:00
|
|
|
|
|
|
|
interface ChatContextType {
|
2025-03-30 19:04:24 -03:00
|
|
|
line: any;
|
2025-03-30 16:42:51 -03:00
|
|
|
user: User;
|
|
|
|
instance: ChatInstance | null;
|
|
|
|
sendActivity: (activity: any) => void;
|
|
|
|
selectedVoice: any;
|
|
|
|
setVoice: (voice: any) => void;
|
|
|
|
}
|
|
|
|
|
2025-03-30 19:04:24 -03:00
|
|
|
const ChatContext = createContext<ChatContextType | undefined>(undefined);
|
2025-03-30 16:42:51 -03:00
|
|
|
|
|
|
|
export function ChatProvider({ children }: { children: React.ReactNode }) {
|
2025-03-30 19:04:24 -03:00
|
|
|
const [line, setLine] = useState<any>(null);
|
|
|
|
const [instance, setInstance] = useState<ChatInstance | null>(null);
|
2025-03-30 16:42:51 -03:00
|
|
|
const [selectedVoice, setSelectedVoice] = useState(null);
|
2025-03-30 19:04:24 -03:00
|
|
|
const [user] = useState<User>({
|
2025-03-30 16:42:51 -03:00
|
|
|
id: `user_${Math.random().toString(36).slice(2)}`,
|
|
|
|
name: 'You'
|
2025-03-30 19:04:24 -03:00
|
|
|
});
|
2025-03-30 16:42:51 -03:00
|
|
|
|
2025-03-30 19:04:24 -03:00
|
|
|
useEffect(() => {
|
|
|
|
const initializeChat = async () => {
|
|
|
|
try {
|
|
|
|
const botId = window.location.pathname.split('/')[1] || 'default';
|
2025-03-30 21:47:18 -03:00
|
|
|
const instanceData = await core.invoke('get_chat_instance', { botId });
|
2025-03-30 19:04:24 -03:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2025-03-30 16:42:51 -03:00
|
|
|
initializeChat();
|
|
|
|
}, []);
|
|
|
|
|
2025-03-30 19:04:24 -03:00
|
|
|
const sendActivity = async (activity: any) => {
|
2025-03-30 16:42:51 -03:00
|
|
|
try {
|
2025-03-30 21:47:18 -03:00
|
|
|
await core.invoke('send_chat_activity', {
|
2025-03-30 19:04:24 -03:00
|
|
|
activity: {
|
|
|
|
...activity,
|
|
|
|
from: user,
|
|
|
|
timestamp: new Date().toISOString()
|
|
|
|
}
|
|
|
|
});
|
|
|
|
line?.postActivity(activity).subscribe();
|
2025-03-30 16:42:51 -03:00
|
|
|
} catch (error) {
|
2025-03-30 19:04:24 -03:00
|
|
|
console.error('Failed to send activity:', error);
|
2025-03-30 16:42:51 -03:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const setVoice = (voice: any) => {
|
|
|
|
setSelectedVoice(voice);
|
|
|
|
};
|
|
|
|
|
|
|
|
return (
|
2025-03-30 19:04:24 -03:00
|
|
|
<ChatContext.Provider value={{ line, user, instance, sendActivity, selectedVoice, setVoice }}>
|
2025-03-30 16:42:51 -03:00
|
|
|
{children}
|
|
|
|
</ChatContext.Provider>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function useChat() {
|
2025-03-30 19:04:24 -03:00
|
|
|
const context = useContext(ChatContext);
|
2025-03-30 16:42:51 -03:00
|
|
|
if (!context) {
|
|
|
|
throw new Error('useChat must be used within ChatProvider');
|
|
|
|
}
|
|
|
|
return context;
|
|
|
|
}
|