VibeGame / src /lib /controllers /chat-controller.ts
dylanebert's picture
refactor
bc7e9cd
import { get } from "svelte/store";
import { websocketService } from "../services/websocket";
import { chatStore } from "../stores/chat-store";
import { authStore } from "../services/auth";
import { type ChatMessage } from "../models/chat-data";
export class ChatController {
sendMessage(content: string): void {
const trimmedContent = content.trim();
if (!trimmedContent) return;
const state = get(chatStore);
if (!state.connected || state.processing) return;
const userMessage: ChatMessage = {
id: `user_${Date.now()}`,
role: "user",
content: trimmedContent,
timestamp: Date.now(),
};
chatStore.addMessage(userMessage);
chatStore.setError(null);
websocketService.send({
type: "chat",
payload: { content: trimmedContent },
timestamp: Date.now(),
});
chatStore.setProcessing(true);
}
stopConversation(): void {
const state = get(chatStore);
if (!state.connected) return;
websocketService.send({
type: "abort",
payload: {},
timestamp: Date.now(),
});
chatStore.setProcessing(false);
}
clearConversation(): void {
const state = get(chatStore);
if (!state.connected) return;
websocketService.send({
type: "clear_conversation",
payload: {},
timestamp: Date.now(),
});
chatStore.clearMessages();
}
handleConnectionChange(connected: boolean): void {
chatStore.setConnected(connected);
if (connected) {
this.authenticate();
this.syncEditor();
}
}
handleProcessingChange(processing: boolean): void {
chatStore.setProcessing(processing);
}
handleError(error: string | null): void {
chatStore.setError(error);
chatStore.setProcessing(false);
}
private authenticate(): void {
const token = authStore.getToken();
if (token) {
websocketService.send({
type: "auth",
payload: { token },
timestamp: Date.now(),
});
} else {
const authState = get(authStore);
if (!authState.isAuthenticated && !authState.loading) {
chatStore.setError(
"Authentication required. Please sign in with Hugging Face.",
);
chatStore.setConnected(false);
websocketService.disconnect();
}
}
}
private syncEditor(): void {
import("../services/content-manager").then(({ contentManager }) => {
const currentContent = contentManager.getCurrentContent();
if (currentContent) {
setTimeout(() => {
if (websocketService.isConnected()) {
websocketService.send({
type: "editor_sync",
payload: { content: currentContent },
timestamp: Date.now(),
});
}
}, 500);
}
});
}
}
export const chatController = new ChatController();