feat: WhatsApp Nucleo con Nuxt 4 + Baileys v7
Some checks failed
Build and Deploy / build-and-deploy (push) Failing after 6m46s
Some checks failed
Build and Deploy / build-and-deploy (push) Failing after 6m46s
Reemplazo completo de Evolution API por implementación directa con Baileys. Características: - Dashboard completo con Nuxt UI v4 - Soporte para múltiples instancias de WhatsApp - Conexión via QR code o pairing code - Persistencia de mensajes en PostgreSQL - API REST para integraciones externas - Webhooks con firma HMAC - SSE para actualizaciones en tiempo real - Autenticación con Authentik
This commit is contained in:
124
app/composables/useInstances.ts
Normal file
124
app/composables/useInstances.ts
Normal file
@@ -0,0 +1,124 @@
|
||||
/**
|
||||
* 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`)
|
||||
}
|
||||
|
||||
// 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,
|
||||
getQRCode,
|
||||
requestPairingCode,
|
||||
getInstanceStatus,
|
||||
connectedCount,
|
||||
totalCount
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user