Files
whatsappNucleo/app/composables/useInstances.ts
josedario87 3817e3c4ae
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 51s
Feature: Boton para reiniciar conexion de instancia
2025-12-02 19:36:06 -06:00

137 lines
3.7 KiB
TypeScript

/**
* 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<Instance[]>('instances', () => [])
const loading = useState('instancesLoading', () => false)
const error = useState<string | null>('instancesError', () => null)
const fetchInstances = async () => {
loading.value = true
error.value = null
try {
const data = await $fetch<Instance[]>('/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<Instance | null> => {
try {
const instance = await $fetch<Instance>('/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<string | null> => {
const result = await $fetch<{ qrCode: string | null }>(`/api/instances/${id}/qr`)
return result.qrCode
}
const requestPairingCode = async (id: string, phoneNumber: string): Promise<string> => {
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
}
}