/** * Composable for managing WhatsApp instances */ export interface Instance { id: string name: string phoneNumber: string | null status: 'disconnected' | 'connecting' | 'connected' | 'qr_ready' | 'pairing' qrCode: string | null pairingCode: string | null lastConnectedAt: Date | null createdAt: Date } export const useInstances = () => { const instances = useState('instances', () => []) const loading = useState('instancesLoading', () => false) const error = useState('instancesError', () => null) const fetchInstances = async () => { loading.value = true error.value = null try { const data = await $fetch('/api/instances') instances.value = data } catch (e) { error.value = (e as Error).message console.error('Error fetching instances:', e) } finally { loading.value = false } } const createInstance = async (name: string): Promise => { try { const instance = await $fetch('/api/instances', { method: 'POST', body: { name } }) instances.value.push(instance) return instance } catch (e) { console.error('Error creating instance:', e) throw e } } const deleteInstance = async (id: string) => { try { await $fetch(`/api/instances/${id}`, { method: 'DELETE' }) instances.value = instances.value.filter(i => i.id !== id) } catch (e) { console.error('Error deleting instance:', e) throw e } } const connectInstance = async (id: string): Promise<{ qrCode: string | null; status: string }> => { const result = await $fetch<{ qrCode: string | null; status: string }>(`/api/instances/${id}/connect`, { method: 'POST' }) // Update local state const idx = instances.value.findIndex(i => i.id === id) if (idx !== -1) { instances.value[idx].status = result.status as Instance['status'] instances.value[idx].qrCode = result.qrCode } return result } const disconnectInstance = async (id: string) => { await $fetch(`/api/instances/${id}/disconnect`, { method: 'POST' }) // Update local state const idx = instances.value.findIndex(i => i.id === id) if (idx !== -1) { instances.value[idx].status = 'disconnected' instances.value[idx].qrCode = null } } const getQRCode = async (id: string): Promise => { const result = await $fetch<{ qrCode: string | null }>(`/api/instances/${id}/qr`) return result.qrCode } const requestPairingCode = async (id: string, phoneNumber: string): Promise => { const result = await $fetch<{ code: string }>(`/api/instances/${id}/pairing-code`, { method: 'POST', body: { phoneNumber } }) return result.code } const getInstanceStatus = async (id: string) => { return await $fetch(`/api/instances/${id}/status`) } const resetInstance = async (id: string) => { await $fetch(`/api/instances/${id}/reset`, { method: 'POST' }) // Update local state const idx = instances.value.findIndex(i => i.id === id) if (idx !== -1) { instances.value[idx].status = 'disconnected' instances.value[idx].qrCode = null } } // Computed helpers const connectedCount = computed(() => instances.value.filter(i => i.status === 'connected').length ) const totalCount = computed(() => instances.value.length) return { instances, loading, error, fetchInstances, createInstance, deleteInstance, connectInstance, disconnectInstance, resetInstance, getQRCode, requestPairingCode, getInstanceStatus, connectedCount, totalCount } }