Files
clube67_newwhats.local/newwhats.clube67.com/newwhats.local/frontend/services/whatsappService.ts
T
VPS 4 Deploy Agent 2f8c04a0a7
continuous-integration/webhook Falha no deploy de clube67_newwhats.local (VPS 4)
chore(ops): restore all source files in newwhats.clube67.com
2026-05-18 03:28:29 +02:00

167 lines
5.6 KiB
TypeScript

import { api } from '@/lib/api';
import { NewWhatsChat, WhatsAppInstance } from '../types/inboxTypes';
/**
* Service Layer for WhatsApp / New Whats API
* Isolates API calls from components, adds normalization and type safety.
*/
export const whatsappService = {
// ─── INSTANCES ───
async getInstances(): Promise<{ instances: WhatsAppInstance[], saved: string[] }> {
return api.getWhatsAppInstances();
},
async createInstance(name: string): Promise<{ ok: boolean, qr: string }> {
return api.createWhatsAppInstance(name);
},
async getQrCode(name: string, number?: string) {
return api.getWhatsAppQr(name, number);
},
async disconnectInstance(name: string) {
return api.disconnectWhatsAppInstance(name);
},
async updatePhoto(name: string) {
return api.updateWhatsAppPhoto(name);
},
async restartInstance(name: string) {
return api.restartWhatsAppInstance(name);
},
// ─── CHATS & HISTORY ───
async getChats(activeInstance?: string): Promise<{ chats: NewWhatsChat[] }> {
if (!activeInstance) return { chats: [] };
return api.getWhatsAppChats(activeInstance);
},
async getContacts(activeInstance: string): Promise<{ contacts: any[] }> {
return api.getWhatsAppContacts(activeInstance);
},
async getHistory(phone: string, instance?: string, remoteJid?: string) {
return api.getWhatsAppHistory(phone, 50, 0, instance, remoteJid);
},
// ─── MESSAGING ───
async sendText(
instance: string,
to: string,
text: string,
leadId?: number | string,
quotedId?: string,
remoteJid?: string,
quoted?: { key: { id: string; remoteJid: string; fromMe?: boolean; participant?: string } }
) {
return api.sendWhatsAppText(instance, to, text, leadId, quotedId, remoteJid, quoted);
},
async sendMedia(instance: string, to: string, url: string, mediaType: string, caption?: string, leadId?: number | string) {
return api.sendWhatsAppMedia(instance, to, url, mediaType, caption, leadId);
},
async sendAudio(instance: string, to: string, url: string, leadId?: number | string) {
return api.sendWhatsAppAudio(instance, to, url, leadId);
},
// ─── ACTIONS ───
async editMessage(instance: string, remoteJid: string, messageId: string, text: string) {
return api.editWhatsAppMessage(instance, remoteJid, messageId, text);
},
async blockContact(instance: string, remoteJid: string, block: boolean) {
return api.blockWhatsAppContact(instance, remoteJid, block);
},
async markAsRead(remoteJid: string, instanceName: string, messageId?: string): Promise<void> {
return api.markWhatsAppAsRead(remoteJid, instanceName, messageId);
},
async reactMessage(instance: string, remoteJid: string, messageId: string, emoji: string) {
return api.reactWhatsAppMessage(instance, remoteJid, messageId, emoji);
},
async deleteMessage(instance: string, remoteJid: string, messageId: string) {
return api.deleteWhatsAppMessage(instance, remoteJid, messageId);
},
async forwardMessage(instance: string, to: string, messagePayload: any) {
return api.forwardWhatsAppMessage(instance, to, messagePayload);
},
// ─── PRESENCE & STATUS ───
async sendPresence(to: string, presence: 'composing' | 'recording' | 'available' | 'unavailable', instance: string) {
return api.sendWhatsAppPresence(to, presence, instance);
},
// ─── EVENTS & SYNC ───
async syncEvents(after: number = 0) {
return api.syncWhatsAppEvents(after);
},
async syncAvatar(jid: string, instanceName: string) {
return api.syncWhatsAppAvatar(jid, instanceName);
},
// ─── LABELS & METADATA ───
async getLabels(instanceName: string) {
return api.getWhatsAppLabels(instanceName);
},
// ─── CHAT MANAGEMENT ───
async pinChat(chatId: number, pinned = true) {
return api.pinWhatsAppChat(chatId, pinned);
},
async archiveChat(chatId: number, archived = true) {
return api.archiveWhatsAppChat(chatId, archived);
},
async deleteChat(chatId: number) {
return api.deleteWhatsAppChat(chatId);
},
async uploadFile(file: File) {
return api.uploadFile(file);
},
async purgeInstance(instance: string, mode: string) {
return api.post(`/whatsapp-v3/instances/${instance}/purge`, { mode });
},
async getInstanceErrors(instance: string, limit: number = 50) {
return api.getInstanceErrors(instance, limit);
},
async getInstanceConfigs(instance: string) {
return api.getInstanceConfigs(instance);
},
async getInstanceMetrics(instance: string) {
return api.getInstanceMetrics(instance);
},
async updateInstanceConfigs(instance: string, data: any) {
return api.updateInstanceConfigs(instance, data);
}
};
// Data Normalization Utils (Ensuring parity between New Whats API, Backend and Frontend)
export const whatsappUtils = {
normalizePhone(jid: string): string {
if (!jid) return '';
const [user] = jid.split('@');
const [cleanUser] = user.split(':');
return cleanUser;
},
toISODate(timestamp: string | number | null): string {
if (!timestamp) return new Date().toISOString();
const date = new Date(timestamp);
return isNaN(date.getTime()) ? new Date().toISOString() : date.toISOString();
},
};