import { ref, computed } from 'vue' import { injectService } from '@/core/di-container' import type { ChatService } from '../services/chat-service' import type { ChatPeer } from '../types' // Service token for chat service export const CHAT_SERVICE_TOKEN = Symbol('chatService') export function useChat() { const chatService = injectService(CHAT_SERVICE_TOKEN) if (!chatService) { throw new Error('ChatService not available. Make sure chat module is installed.') } const selectedPeer = ref(null) const isLoading = ref(false) const error = ref(null) // Computed properties const peers = computed(() => chatService.allPeers.value) const totalUnreadCount = computed(() => chatService.totalUnreadCount.value) const isReady = computed(() => chatService.isReady.value) const currentMessages = computed(() => { return selectedPeer.value ? chatService.getMessages(selectedPeer.value) : [] }) const currentPeer = computed(() => { return selectedPeer.value ? chatService.getPeer(selectedPeer.value) : undefined }) // Methods const selectPeer = (peerPubkey: string) => { selectedPeer.value = peerPubkey chatService.markAsRead(peerPubkey) } const sendMessage = async (content: string) => { if (!selectedPeer.value || !content.trim()) { return } isLoading.value = true error.value = null try { await chatService.sendMessage(selectedPeer.value, content.trim()) } catch (err) { error.value = err instanceof Error ? err.message : 'Failed to send message' console.error('Send message error:', err) } finally { isLoading.value = false } } const addPeer = (pubkey: string, name?: string): ChatPeer => { return chatService.addPeer(pubkey, name) } const markAsRead = (peerPubkey: string) => { chatService.markAsRead(peerPubkey) } const refreshPeers = async () => { isLoading.value = true error.value = null try { await chatService.refreshPeers() } catch (err) { error.value = err instanceof Error ? err.message : 'Failed to refresh peers' console.error('Failed to refresh peers:', err) } finally { isLoading.value = false } } return { // State selectedPeer, isLoading, error, // Computed peers, totalUnreadCount, isReady, currentMessages, currentPeer, // Methods selectPeer, sendMessage, addPeer, markAsRead, refreshPeers } }