@greatapps/greatchat-ui 0.1.6 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -4
- package/dist/index.js +667 -1560
- package/dist/index.js.map +1 -1
- package/package.json +16 -13
- package/src/components/channel-card.tsx +1 -1
- package/src/components/channel-create-dialog.tsx +4 -4
- package/src/components/channel-edit-dialog.tsx +4 -4
- package/src/components/channels-page.tsx +3 -3
- package/src/components/chat-dashboard.tsx +5 -5
- package/src/components/chat-input.tsx +1 -2
- package/src/components/chat-view.tsx +1 -8
- package/src/components/contact-avatar.tsx +1 -2
- package/src/components/contact-form-dialog.tsx +5 -5
- package/src/components/contact-info-panel.tsx +1 -4
- package/src/components/contacts-page.tsx +1 -1
- package/src/components/contacts-table.tsx +3 -5
- package/src/components/data-table.tsx +4 -4
- package/src/components/inbox-item.tsx +6 -4
- package/src/components/inbox-page.tsx +1 -8
- package/src/components/inbox-sidebar.tsx +1 -5
- package/src/components/message-bubble.tsx +4 -6
- package/src/components/new-conversation-dialog.tsx +2 -6
- package/src/components/whatsapp-qr-dialog.tsx +2 -2
- package/src/components/whatsapp-status-badge.tsx +1 -1
- package/src/index.ts +1 -1
- package/src/components/ui/alert-dialog.tsx +0 -167
- package/src/components/ui/avatar.tsx +0 -51
- package/src/components/ui/badge.tsx +0 -44
- package/src/components/ui/button.tsx +0 -62
- package/src/components/ui/card.tsx +0 -94
- package/src/components/ui/command.tsx +0 -106
- package/src/components/ui/dialog.tsx +0 -133
- package/src/components/ui/dropdown-menu.tsx +0 -173
- package/src/components/ui/input.tsx +0 -19
- package/src/components/ui/label.tsx +0 -24
- package/src/components/ui/progress.tsx +0 -31
- package/src/components/ui/scroll-area.tsx +0 -50
- package/src/components/ui/select.tsx +0 -156
- package/src/components/ui/separator.tsx +0 -26
- package/src/components/ui/skeleton.tsx +0 -16
- package/src/components/ui/table.tsx +0 -101
- package/src/components/ui/tabs.tsx +0 -64
- package/src/components/ui/textarea.tsx +0 -18
- package/src/components/ui/tooltip.tsx +0 -58
- package/src/lib/utils.ts +0 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/index.ts","../src/lib/utils.ts","../src/utils/group-messages.ts","../src/utils/format-date.ts","../src/hooks/types.ts","../src/hooks/use-inboxes.ts","../src/hooks/use-inbox-messages.ts","../src/hooks/use-contacts.ts","../src/hooks/use-channels.ts","../src/components/chat-view.tsx","../src/components/message-bubble.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/alert-dialog.tsx","../src/components/ui/button.tsx","../src/components/ui/textarea.tsx","../src/components/chat-input.tsx","../src/components/ui/skeleton.tsx","../src/components/ui/select.tsx","../src/components/ui/avatar.tsx","../src/components/contact-avatar.tsx","../src/components/inbox-item.tsx","../src/components/ui/badge.tsx","../src/components/ui/tooltip.tsx","../src/components/inbox-sidebar.tsx","../src/components/ui/input.tsx","../src/components/ui/tabs.tsx","../src/components/ui/scroll-area.tsx","../src/components/ui/separator.tsx","../src/components/contact-info-panel.tsx","../src/components/new-conversation-dialog.tsx","../src/components/ui/dialog.tsx","../src/components/ui/command.tsx","../src/components/whatsapp-status-badge.tsx","../src/components/channel-card.tsx","../src/components/whatsapp-icon.tsx","../src/components/whatsapp-qr-dialog.tsx","../src/components/channel-create-dialog.tsx","../src/components/ui/label.tsx","../src/components/channel-edit-dialog.tsx","../src/components/contact-form-dialog.tsx","../src/components/contacts-table.tsx","../src/components/data-table.tsx","../src/components/ui/table.tsx","../src/components/inbox-page.tsx","../src/components/channels-page.tsx","../src/components/contacts-page.tsx","../src/components/chat-dashboard.tsx","../src/components/ui/card.tsx","../src/components/ui/progress.tsx"],"sourcesContent":["import type {\n ApiResponse,\n Channel,\n Contact,\n Inbox,\n InboxMessage,\n InboxStats,\n WhatsappStatus,\n} from \"../types\";\n\nexport interface GchatClientConfig {\n baseUrl: string;\n token: string;\n language?: string;\n idWl?: number;\n}\n\nexport function createGchatClient(config: GchatClientConfig) {\n const { baseUrl, token, language = \"pt-br\", idWl = 1 } = config;\n\n function buildUrl(idAccount: number, path: string): string {\n return `${baseUrl}/v1/${language}/${idWl}/accounts/${idAccount}/${path}`;\n }\n\n async function request<T>(\n method: string,\n idAccount: number,\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ApiResponse<T>> {\n const url = new URL(buildUrl(idAccount, path));\n if (params) {\n Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));\n }\n\n const res = await fetch(url.toString(), {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n let message = `HTTP ${res.status}: ${res.statusText}`;\n try {\n const errorBody = await res.json();\n message = errorBody.message || message;\n } catch {\n /* ignore parse errors */\n }\n throw new Error(message);\n }\n\n const json: ApiResponse<T> = await res.json();\n\n // For mutations, treat API-level failures as errors so TanStack Query\n // fires onError instead of onSuccess (API returns HTTP 200 even on failure)\n if (method !== \"GET\" && json.status === 0) {\n throw new Error(json.message || \"Operação falhou\");\n }\n\n return json;\n }\n\n return {\n // --- Inboxes ---\n listInboxes: (idAccount: number, params?: Record<string, string>) =>\n request<Inbox[]>(\"GET\", idAccount, \"inboxes\", undefined, params),\n getInbox: (idAccount: number, id: number) =>\n request<Inbox>(\"GET\", idAccount, `inboxes/${id}`),\n getInboxStats: (idAccount: number) =>\n request<InboxStats>(\"GET\", idAccount, \"inboxes/stats\"),\n createInbox: (\n idAccount: number,\n body: { id_channel: number; id_contact: number },\n ) => request<Inbox>(\"POST\", idAccount, \"inboxes\", body),\n updateInbox: (\n idAccount: number,\n id: number,\n body: Partial<Pick<Inbox, \"status\" | \"id_agent\">>,\n ) => request<Inbox>(\"PUT\", idAccount, `inboxes/${id}`, body),\n deleteInbox: (idAccount: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `inboxes/${id}`),\n\n // --- Inbox Messages ---\n listInboxMessages: (idAccount: number, params: Record<string, string>) =>\n request<InboxMessage[]>(\n \"GET\",\n idAccount,\n \"inbox-messages\",\n undefined,\n params,\n ),\n sendMessage: (\n idAccount: number,\n body: {\n id_inbox: number;\n content: string;\n content_type?: string;\n source?: string;\n direction: \"outbound\";\n },\n ) => request<InboxMessage>(\"POST\", idAccount, \"inbox-messages\", body),\n revokeMessage: (idAccount: number, id: number) =>\n request<void>(\"POST\", idAccount, `inbox-messages/${id}/revoke`),\n editMessage: (idAccount: number, id: number, body: { content: string }) =>\n request<void>(\"POST\", idAccount, `inbox-messages/${id}/edit`, body),\n\n // --- Contacts ---\n listContacts: (idAccount: number, params?: Record<string, string>) =>\n request<Contact[]>(\"GET\", idAccount, \"contacts\", undefined, params),\n getContact: (idAccount: number, id: number) =>\n request<Contact>(\"GET\", idAccount, `contacts/${id}`),\n createContact: (\n idAccount: number,\n body: Pick<Contact, \"name\"> &\n Partial<Pick<Contact, \"phone_number\" | \"identifier\">>,\n ) => request<Contact>(\"POST\", idAccount, \"contacts\", body),\n updateContact: (\n idAccount: number,\n id: number,\n body: Partial<Pick<Contact, \"name\" | \"phone_number\" | \"identifier\">>,\n ) => request<Contact>(\"PUT\", idAccount, `contacts/${id}`, body),\n deleteContact: (idAccount: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `contacts/${id}`),\n\n // --- Channels ---\n listChannels: (idAccount: number) =>\n request<Channel[]>(\"GET\", idAccount, \"channels\"),\n getChannel: (idAccount: number, id: number) =>\n request<Channel>(\"GET\", idAccount, `channels/${id}`),\n createChannel: (\n idAccount: number,\n body: Pick<Channel, \"name\" | \"type\" | \"provider\"> &\n Partial<Pick<Channel, \"identifier\" | \"id_agent\">>,\n ) => request<Channel>(\"POST\", idAccount, \"channels\", body),\n updateChannel: (\n idAccount: number,\n id: number,\n body: Partial<\n Pick<Channel, \"name\" | \"identifier\" | \"status\" | \"id_agent\">\n >,\n ) => request<Channel>(\"PUT\", idAccount, `channels/${id}`, body),\n deleteChannel: (idAccount: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `channels/${id}`),\n\n // --- WhatsApp Channel Management ---\n connectChannel: (idAccount: number, id: number) =>\n request<unknown>(\"POST\", idAccount, `channels/${id}/connect`),\n getChannelQR: async (\n idAccount: number,\n id: number,\n ): Promise<string | null> => {\n const url = buildUrl(idAccount, `channels/${id}/qr`);\n const res = await fetch(url, {\n headers: {\n Accept: \"image/png\",\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!res.ok) return null;\n\n const contentType = res.headers.get(\"content-type\") || \"\";\n if (!contentType.includes(\"image/\")) return null;\n\n const blob = await res.blob();\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.onerror = () => reject(new Error(\"Failed to read QR image\"));\n reader.readAsDataURL(blob);\n });\n },\n getChannelWhatsappStatus: (idAccount: number, id: number) =>\n request<WhatsappStatus>(\n \"GET\",\n idAccount,\n `channels/${id}/whatsapp-status`,\n ),\n disconnectChannel: (idAccount: number, id: number) =>\n request<unknown>(\"POST\", idAccount, `channels/${id}/disconnect`),\n logoutChannel: (idAccount: number, id: number) =>\n request<unknown>(\"POST\", idAccount, `channels/${id}/logout`),\n provisionChannel: (idAccount: number, id: number) =>\n request<unknown>(\"POST\", idAccount, `channels/${id}/provision`),\n };\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import type { InboxMessage } from \"../types\";\n\n/**\n * Groups messages by date. Assumes messages are pre-sorted by datetime_add (ascending).\n */\nexport function groupMessagesByDate(\n messages: InboxMessage[],\n): { date: string; messages: InboxMessage[] }[] {\n const groups: { date: string; messages: InboxMessage[] }[] = [];\n let currentDate = \"\";\n\n for (const msg of messages) {\n const dateStr = msg.datetime_add.split(\"T\")[0];\n if (dateStr !== currentDate) {\n currentDate = dateStr;\n groups.push({ date: msg.datetime_add, messages: [] });\n }\n groups[groups.length - 1].messages.push(msg);\n }\n\n return groups;\n}\n","import { format, isToday, isYesterday } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\n\nexport function formatDateGroup(dateStr: string): string {\n const date = new Date(dateStr);\n if (isToday(date)) return \"Hoje\";\n if (isYesterday(date)) return \"Ontem\";\n return format(date, \"dd 'de' MMMM\", { locale: ptBR });\n}\n\nexport function formatMessageTime(dateStr: string): string {\n return format(new Date(dateStr), \"HH:mm\");\n}\n","import { useMemo } from \"react\";\nimport { createGchatClient } from \"../client\";\n\n// ---------------------------------------------------------------------------\n// Hook Configuration\n// ---------------------------------------------------------------------------\n\nexport interface GchatHookConfig {\n accountId: number;\n token: string;\n baseUrl: string;\n language?: string;\n idWl?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Polling Defaults (ms)\n// ---------------------------------------------------------------------------\n\nexport const DEFAULT_INBOX_POLLING = 5000;\nexport const DEFAULT_MESSAGES_POLLING = 3000;\nexport const DEFAULT_CHANNEL_STATUS_POLLING = 5000;\nexport const DEFAULT_QR_POLLING = 2000;\n\n// ---------------------------------------------------------------------------\n// Internal helper — memoized client from config\n// ---------------------------------------------------------------------------\n\nexport function useGchatClient(config: GchatHookConfig) {\n return useMemo(\n () =>\n createGchatClient({\n baseUrl: config.baseUrl,\n token: config.token,\n language: config.language,\n idWl: config.idWl,\n }),\n [config.baseUrl, config.token, config.language, config.idWl],\n );\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { Inbox, InboxStats } from \"../types\";\nimport {\n type GchatHookConfig,\n DEFAULT_INBOX_POLLING,\n useGchatClient,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Queries\n// ---------------------------------------------------------------------------\n\nexport function useInboxes(\n config: GchatHookConfig,\n statusFilter?: string,\n pollingInterval?: number,\n) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"inboxes\", config.accountId, statusFilter],\n queryFn: () => {\n const params: Record<string, string> = {};\n if (statusFilter && statusFilter !== \"all\") {\n params.status = statusFilter;\n }\n return client.listInboxes(config.accountId, params);\n },\n enabled: !!config.accountId && !!config.token,\n refetchInterval: pollingInterval ?? DEFAULT_INBOX_POLLING,\n select: (res) => res.data || [],\n });\n}\n\nexport function useInbox(config: GchatHookConfig, id: number | null) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"inbox\", config.accountId, id],\n queryFn: () => client.getInbox(config.accountId, id!),\n enabled: !!config.accountId && !!config.token && !!id,\n select: (res) => {\n const d = res.data;\n return (Array.isArray(d) ? d[0] : d) as Inbox;\n },\n });\n}\n\nexport function useInboxStats(\n config: GchatHookConfig,\n pollingInterval?: number,\n) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"inbox-stats\", config.accountId],\n queryFn: () => client.getInboxStats(config.accountId),\n enabled: !!config.accountId && !!config.token,\n refetchInterval: pollingInterval ?? DEFAULT_INBOX_POLLING,\n select: (res) => {\n const d = res.data;\n return (Array.isArray(d) ? d[0] : d) as InboxStats;\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Mutations\n// ---------------------------------------------------------------------------\n\nexport function useCreateInbox(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (body: { id_channel: number; id_contact: number }) =>\n client.createInbox(config.accountId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inboxes\"],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inbox-stats\"],\n });\n },\n });\n}\n\nexport function useUpdateInbox(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n id,\n body,\n }: {\n id: number;\n body: Partial<Pick<Inbox, \"status\" | \"id_agent\">>;\n }) => client.updateInbox(config.accountId, id, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inboxes\"],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inbox-stats\"],\n });\n },\n });\n}\n\nexport function useDeleteInbox(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (id: number) => client.deleteInbox(config.accountId, id),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inboxes\"],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inbox-stats\"],\n });\n },\n });\n}\n","import { useMemo, useSyncExternalStore } from \"react\";\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { InboxMessage } from \"../types\";\nimport {\n type GchatHookConfig,\n DEFAULT_MESSAGES_POLLING,\n useGchatClient,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Optimistic message store (module-level — survives server refetches)\n// ---------------------------------------------------------------------------\n\nconst optimisticStore = new Map<string, InboxMessage[]>();\nlet nextOptimisticId = -1;\n\n// useSyncExternalStore subscription — guarantees synchronous re-renders\nlet storeVersion = 0;\nconst listeners = new Set<() => void>();\n\nfunction subscribeStore(listener: () => void) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nfunction getStoreVersion() {\n return storeVersion;\n}\n\nfunction storeKey(accountId: number, idInbox: number) {\n return `${accountId}:${idInbox}`;\n}\n\nfunction getOptimistic(accountId: number, idInbox: number): InboxMessage[] {\n return optimisticStore.get(storeKey(accountId, idInbox)) || [];\n}\n\nfunction setOptimistic(\n accountId: number,\n idInbox: number,\n msgs: InboxMessage[],\n) {\n const key = storeKey(accountId, idInbox);\n if (msgs.length === 0) {\n optimisticStore.delete(key);\n } else {\n optimisticStore.set(key, msgs);\n }\n storeVersion++;\n listeners.forEach((fn) => fn());\n}\n\n/**\n * Silently clean up the store without notifying listeners (avoids render loops).\n * Used inside useMemo to remove optimistic messages confirmed by the server.\n */\nfunction cleanupOptimistic(\n accountId: number,\n idInbox: number,\n msgs: InboxMessage[],\n) {\n const key = storeKey(accountId, idInbox);\n if (msgs.length === 0) {\n optimisticStore.delete(key);\n } else {\n optimisticStore.set(key, msgs);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Query\n// ---------------------------------------------------------------------------\n\nexport function useInboxMessages(\n config: GchatHookConfig,\n idInbox: number | null,\n pollingInterval?: number,\n) {\n const client = useGchatClient(config);\n\n // Subscribe to optimistic store — re-renders when store changes\n const optimisticVersion = useSyncExternalStore(\n subscribeStore,\n getStoreVersion,\n getStoreVersion,\n );\n\n const query = useQuery({\n queryKey: [\"greatchat\", \"inbox-messages\", config.accountId, idInbox],\n queryFn: () =>\n client.listInboxMessages(config.accountId, {\n id_inbox: String(idInbox!),\n sort: \"datetime_add:asc\",\n limit: \"100\",\n }),\n enabled: !!config.accountId && !!config.token && !!idInbox,\n refetchInterval: pollingInterval ?? DEFAULT_MESSAGES_POLLING,\n select: (res) => res.data || [],\n });\n\n // Merge server data with optimistic messages\n const messages = useMemo(() => {\n const serverMessages = query.data || [];\n if (!config.accountId || !idInbox) return serverMessages;\n\n const optimistic = getOptimistic(config.accountId, idInbox);\n if (!optimistic.length) return serverMessages;\n\n // Separate overrides (positive ID = retry) from new messages (negative ID = send)\n const overrides = new Map<number, InboxMessage>();\n const newOptimistic: InboxMessage[] = [];\n for (const om of optimistic) {\n if (om.id > 0) {\n overrides.set(om.id, om);\n } else {\n newOptimistic.push(om);\n }\n }\n\n // Apply overrides to server messages (replace in-place)\n const merged =\n overrides.size > 0\n ? serverMessages.map((sm) => overrides.get(sm.id) ?? sm)\n : serverMessages;\n\n // Auto-cleanup: remove overrides when server no longer shows \"failed\"\n if (overrides.size > 0) {\n for (const [id] of overrides) {\n const sm = serverMessages.find((s) => s.id === id);\n if (sm && sm.status !== \"failed\") {\n overrides.delete(id);\n }\n }\n }\n\n // One-to-one matching for new optimistic messages (negative IDs)\n const stillNeeded: InboxMessage[] = [];\n const claimed = new Set<number>();\n\n for (const om of newOptimistic) {\n // Always keep failed messages (until user retries or dismisses)\n if (om.status === \"failed\") {\n stillNeeded.push(om);\n continue;\n }\n\n // Find a matching server message that hasn't been claimed yet\n const matchIdx = merged.findIndex(\n (sm, i) =>\n !claimed.has(i) &&\n sm.direction === \"outbound\" &&\n sm.content === om.content &&\n sm.content_type === om.content_type &&\n sm.source === om.source,\n );\n\n if (matchIdx >= 0) {\n claimed.add(matchIdx); // server confirmed this one\n } else {\n stillNeeded.push(om); // keep showing optimistic\n }\n }\n\n // Silently clean up confirmed messages (no re-notification)\n const allKept = [...Array.from(overrides.values()), ...stillNeeded];\n if (allKept.length !== optimistic.length) {\n cleanupOptimistic(config.accountId, idInbox, allKept);\n }\n\n // Sort by datetime to keep chronological order\n const result = [...merged, ...stillNeeded];\n result.sort(\n (a, b) =>\n new Date(a.datetime_add).getTime() -\n new Date(b.datetime_add).getTime(),\n );\n return result;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query.data, config.accountId, idInbox, optimisticVersion]);\n\n return { ...query, data: messages };\n}\n\n// ---------------------------------------------------------------------------\n// Send mutation\n// ---------------------------------------------------------------------------\n\nexport function useSendMessage(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n idInbox,\n content,\n }: {\n idInbox: number;\n content: string;\n }) => {\n const result = await client.sendMessage(config.accountId, {\n id_inbox: idInbox,\n content,\n content_type: \"text\",\n source: \"agent\",\n direction: \"outbound\",\n });\n\n if (result.status === 0) {\n throw new Error(result.message || \"Erro desconhecido ao enviar\");\n }\n\n return result;\n },\n\n onMutate: (variables) => {\n const msg: InboxMessage = {\n id: nextOptimisticId--,\n id_account: config.accountId,\n id_inbox: variables.idInbox,\n id_contact: null,\n direction: \"outbound\",\n content: variables.content,\n content_type: \"text\",\n content_url: null,\n metadata: null,\n external_id: null,\n status: \"pending\",\n source: \"agent\",\n is_private: false,\n datetime_add: new Date().toISOString(),\n datetime_alt: null,\n };\n\n const current = getOptimistic(config.accountId, variables.idInbox);\n setOptimistic(config.accountId, variables.idInbox, [...current, msg]);\n\n return { optimisticMsg: msg };\n },\n\n onError: (error, variables, context) => {\n if (!context) return;\n const { optimisticMsg } = context;\n\n const current = getOptimistic(config.accountId, variables.idInbox);\n setOptimistic(\n config.accountId,\n variables.idInbox,\n current.map((m) =>\n m.id === optimisticMsg.id\n ? { ...m, status: \"failed\" as const, _error: error.message }\n : m,\n ),\n );\n },\n\n onSuccess: (_result, variables, context) => {\n if (!context) return;\n const { optimisticMsg } = context;\n\n const current = getOptimistic(config.accountId, variables.idInbox);\n setOptimistic(\n config.accountId,\n variables.idInbox,\n current.filter((m) => m.id !== optimisticMsg.id),\n );\n queryClient.invalidateQueries({\n queryKey: [\n \"greatchat\",\n \"inbox-messages\",\n config.accountId,\n variables.idInbox,\n ],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inboxes\"],\n });\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Retry failed message (updates in-place, same bubble transitions states)\n// ---------------------------------------------------------------------------\n\nexport function useRetryMessage(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return async (message: InboxMessage) => {\n if (!config.accountId || !config.token || !message.content) return;\n\n // Add as override with status \"pending\"\n const current = getOptimistic(config.accountId, message.id_inbox);\n setOptimistic(config.accountId, message.id_inbox, [\n ...current.filter((m) => m.id !== message.id),\n {\n ...message,\n status: \"pending\" as const,\n _error: undefined,\n datetime_add: new Date().toISOString(),\n },\n ]);\n\n try {\n const result = await client.sendMessage(config.accountId, {\n id_inbox: message.id_inbox,\n content: message.content,\n content_type: message.content_type,\n source: \"agent\",\n direction: \"outbound\",\n });\n\n if (result.status === 0) {\n throw new Error(result.message || \"Erro desconhecido ao enviar\");\n }\n\n const after = getOptimistic(config.accountId, message.id_inbox);\n setOptimistic(\n config.accountId,\n message.id_inbox,\n after.filter((m) => m.id !== message.id),\n );\n queryClient.invalidateQueries({\n queryKey: [\n \"greatchat\",\n \"inbox-messages\",\n config.accountId,\n message.id_inbox,\n ],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inboxes\"],\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Erro ao enviar mensagem\";\n const after = getOptimistic(config.accountId, message.id_inbox);\n setOptimistic(\n config.accountId,\n message.id_inbox,\n after.map((m) =>\n m.id === message.id\n ? { ...m, status: \"failed\" as const, _error: errorMessage }\n : m,\n ),\n );\n }\n };\n}\n\n// ---------------------------------------------------------------------------\n// Revoke message\n// ---------------------------------------------------------------------------\n\nexport function useRevokeMessage(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({ id }: { id: number; idInbox: number }) =>\n client.revokeMessage(config.accountId, id),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [\n \"greatchat\",\n \"inbox-messages\",\n config.accountId,\n variables.idInbox,\n ],\n });\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Edit message\n// ---------------------------------------------------------------------------\n\nexport function useEditMessage(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n id,\n content,\n }: {\n id: number;\n idInbox: number;\n content: string;\n }) => client.editMessage(config.accountId, id, { content }),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [\n \"greatchat\",\n \"inbox-messages\",\n config.accountId,\n variables.idInbox,\n ],\n });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { Contact } from \"../types\";\nimport { type GchatHookConfig, useGchatClient } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Queries\n// ---------------------------------------------------------------------------\n\nexport function useContacts(\n config: GchatHookConfig,\n params?: Record<string, string>,\n) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"contacts\", config.accountId, params],\n queryFn: () => client.listContacts(config.accountId, params),\n enabled: !!config.accountId && !!config.token,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useGetContact(\n config: GchatHookConfig,\n contactId: number | null,\n) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"contact\", config.accountId, contactId],\n queryFn: () => client.getContact(config.accountId, contactId!),\n enabled: !!config.accountId && !!config.token && !!contactId,\n select: (res) => {\n const d = res.data;\n return (Array.isArray(d) ? d[0] : d) as Contact;\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Mutations\n// ---------------------------------------------------------------------------\n\nexport function useCreateContact(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (body: {\n name: string;\n phone_number?: string;\n identifier?: string;\n }) => client.createContact(config.accountId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"contacts\"],\n });\n },\n });\n}\n\nexport function useUpdateContact(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n id,\n body,\n }: {\n id: number;\n body: { name?: string; phone_number?: string; identifier?: string };\n }) => client.updateContact(config.accountId, id, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"contacts\"],\n });\n },\n });\n}\n\nexport function useDeleteContact(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (id: number) => client.deleteContact(config.accountId, id),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"contacts\"],\n });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { Channel, WhatsappStatus } from \"../types\";\nimport {\n type GchatHookConfig,\n DEFAULT_CHANNEL_STATUS_POLLING,\n DEFAULT_QR_POLLING,\n useGchatClient,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Queries\n// ---------------------------------------------------------------------------\n\nexport function useChannels(config: GchatHookConfig) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"channels\", config.accountId],\n queryFn: () => client.listChannels(config.accountId),\n enabled: !!config.accountId && !!config.token,\n select: (res) => res.data || [],\n });\n}\n\nexport function useChannelWhatsappStatus(\n config: GchatHookConfig,\n channelId: number | null,\n enabled = true,\n pollingInterval?: number,\n) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"channel-status\", config.accountId, channelId],\n queryFn: () =>\n client.getChannelWhatsappStatus(config.accountId, channelId!),\n enabled: !!config.accountId && !!config.token && !!channelId && enabled,\n refetchInterval: pollingInterval ?? DEFAULT_CHANNEL_STATUS_POLLING,\n select: (res) => {\n const d = res.data;\n return (Array.isArray(d) ? d[0] : d) as WhatsappStatus;\n },\n });\n}\n\nexport function useChannelQR(\n config: GchatHookConfig,\n channelId: number | null,\n enabled = false,\n pollingInterval?: number,\n) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"channel-qr\", config.accountId, channelId],\n queryFn: () => client.getChannelQR(config.accountId, channelId!),\n enabled: !!config.accountId && !!config.token && !!channelId && enabled,\n refetchInterval: pollingInterval ?? DEFAULT_QR_POLLING,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Mutations\n// ---------------------------------------------------------------------------\n\nexport function useCreateChannel(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (\n body: Pick<Channel, \"name\" | \"type\" | \"provider\"> &\n Partial<Pick<Channel, \"identifier\" | \"id_agent\">>,\n ) => client.createChannel(config.accountId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"channels\"],\n });\n },\n });\n}\n\nexport function useUpdateChannel(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n id,\n body,\n }: {\n id: number;\n body: Partial<\n Pick<Channel, \"name\" | \"identifier\" | \"status\" | \"id_agent\">\n >;\n }) => client.updateChannel(config.accountId, id, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"channels\"],\n });\n },\n });\n}\n\nexport function useDeleteChannel(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (channelId: number) =>\n client.deleteChannel(config.accountId, channelId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"channels\"],\n });\n },\n });\n}\n\nexport function useConnectChannel(config: GchatHookConfig) {\n const client = useGchatClient(config);\n\n return useMutation({\n mutationFn: (channelId: number) =>\n client.connectChannel(config.accountId, channelId),\n });\n}\n\nexport function useDisconnectChannel(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (channelId: number) =>\n client.disconnectChannel(config.accountId, channelId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"channel-status\"],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"channels\"],\n });\n },\n });\n}\n\nexport function useLogoutChannel(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (channelId: number) =>\n client.logoutChannel(config.accountId, channelId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"channel-status\"],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"channels\"],\n });\n },\n });\n}\n","import { useRef, useEffect } from \"react\";\nimport type { InboxMessage } from \"../types\";\nimport { groupMessagesByDate } from \"../utils/group-messages\";\nimport { formatDateGroup } from \"../utils/format-date\";\nimport { MessageBubble } from \"./message-bubble\";\nimport { ChatInput } from \"./chat-input\";\nimport { Skeleton } from \"./ui/skeleton\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./ui/select\";\n\nexport interface ChatViewProps {\n messages: InboxMessage[];\n isLoading: boolean;\n inboxStatus?: string;\n onStatusChange?: (status: string) => void;\n onSend: (content: string) => void;\n onRetry?: (message: InboxMessage) => void;\n onRevoke?: (message: InboxMessage) => void;\n onEdit?: (message: InboxMessage, newContent: string) => void;\n sendDisabled?: boolean;\n renderHeader?: React.ReactNode;\n renderStatusDropdown?: React.ReactNode;\n}\n\nexport function ChatView({\n messages,\n isLoading,\n inboxStatus,\n onStatusChange,\n onSend,\n onRetry,\n onRevoke,\n onEdit,\n sendDisabled,\n renderHeader,\n renderStatusDropdown,\n}: ChatViewProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const prevMessageCount = useRef(0);\n\n useEffect(() => {\n if (messages && messages.length > prevMessageCount.current) {\n const el = scrollRef.current;\n if (el) {\n setTimeout(() => {\n el.scrollTop = el.scrollHeight;\n }, 50);\n }\n }\n prevMessageCount.current = messages?.length || 0;\n }, [messages]);\n\n const groups = messages ? groupMessagesByDate(messages) : [];\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Header */}\n {renderHeader !== undefined ? (\n renderHeader\n ) : (\n <div className=\"flex items-center justify-between border-b px-4 py-3\">\n <div className=\"flex-1\" />\n {renderStatusDropdown !== undefined ? (\n renderStatusDropdown\n ) : onStatusChange ? (\n <Select\n value={inboxStatus}\n onValueChange={onStatusChange}\n >\n <SelectTrigger className=\"w-[130px] h-8 text-xs\">\n <SelectValue placeholder=\"Status\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"open\">Aberta</SelectItem>\n <SelectItem value=\"pending\">Pendente</SelectItem>\n <SelectItem value=\"resolved\">Resolvida</SelectItem>\n </SelectContent>\n </Select>\n ) : null}\n </div>\n )}\n\n {/* Messages */}\n <div ref={scrollRef} className=\"flex-1 overflow-y-auto p-4\">\n {isLoading ? (\n <div className=\"space-y-4\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div\n key={i}\n className={`flex ${i % 2 === 0 ? \"justify-start\" : \"justify-end\"}`}\n >\n <Skeleton className=\"h-12 w-64 rounded-lg\" />\n </div>\n ))}\n </div>\n ) : groups.length === 0 ? (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n Nenhuma mensagem ainda\n </div>\n ) : (\n <div className=\"space-y-4\">\n {groups.map((group, gi) => (\n <div key={gi}>\n <div className=\"mb-3 flex justify-center\">\n <span className=\"rounded-full bg-muted px-3 py-1 text-[11px] text-muted-foreground\">\n {formatDateGroup(group.date)}\n </span>\n </div>\n <div className=\"space-y-1\">\n {group.messages.map((msg) => (\n <MessageBubble\n key={msg.id}\n message={msg}\n onRetry={onRetry}\n onRevoke={onRevoke}\n onEdit={onEdit}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Input */}\n <ChatInput onSend={onSend} disabled={sendDisabled} />\n </div>\n );\n}\n","import { useState } from \"react\";\nimport type { InboxMessage } from \"../types\";\nimport { cn } from \"../lib/utils\";\nimport { formatMessageTime } from \"../utils/format-date\";\nimport {\n Check,\n CheckCheck,\n AlertCircle,\n Clock,\n Video,\n File,\n MapPin,\n Headphones,\n RotateCcw,\n MoreHorizontal,\n Trash2,\n Pencil,\n Ban,\n} from \"lucide-react\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"./ui/dropdown-menu\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"./ui/alert-dialog\";\nimport { Button } from \"./ui/button\";\nimport { Textarea } from \"./ui/textarea\";\n\nconst statusIcons: Record<string, React.ReactNode> = {\n pending: <Clock className=\"h-3 w-3 animate-pulse\" />,\n sent: <Check className=\"h-3 w-3\" />,\n delivered: <CheckCheck className=\"h-3 w-3\" />,\n read: <CheckCheck className=\"h-3 w-3 text-blue-500\" />,\n failed: <AlertCircle className=\"h-3 w-3 text-destructive\" />,\n};\n\nfunction parseMetadata(metadata: string | null): Record<string, unknown> {\n if (!metadata) return {};\n try {\n return JSON.parse(metadata);\n } catch {\n return {};\n }\n}\n\nfunction MediaContent({ message }: { message: InboxMessage }) {\n switch (message.content_type) {\n case \"image\":\n return (\n <div className=\"space-y-1\">\n {message.content_url && (\n <img\n src={message.content_url}\n alt=\"Imagem\"\n className=\"max-w-[240px] rounded-md\"\n />\n )}\n {message.content && <p className=\"text-sm\">{message.content}</p>}\n </div>\n );\n case \"audio\":\n return (\n <div className=\"flex items-center gap-2\">\n <Headphones className=\"h-4 w-4\" />\n <span className=\"text-sm\">Mensagem de áudio</span>\n </div>\n );\n case \"video\":\n return (\n <div className=\"flex items-center gap-2\">\n <Video className=\"h-4 w-4\" />\n <span className=\"text-sm\">Vídeo</span>\n {message.content && <p className=\"text-sm\">{message.content}</p>}\n </div>\n );\n case \"document\": {\n const meta = parseMetadata(message.metadata);\n return (\n <div className=\"flex items-center gap-2\">\n <File className=\"h-4 w-4\" />\n <span className=\"text-sm\">\n {(meta.filename as string) || \"Documento\"}\n </span>\n </div>\n );\n }\n case \"location\":\n return (\n <div className=\"flex items-center gap-2\">\n <MapPin className=\"h-4 w-4\" />\n <span className=\"text-sm\">Localização</span>\n </div>\n );\n default:\n return null;\n }\n}\n\nexport interface MessageBubbleProps {\n message: InboxMessage;\n onRetry?: (message: InboxMessage) => void;\n onRevoke?: (message: InboxMessage) => void;\n onEdit?: (message: InboxMessage, newContent: string) => void;\n renderActions?: (message: InboxMessage) => React.ReactNode;\n}\n\nexport function MessageBubble({\n message,\n onRetry,\n onRevoke,\n onEdit,\n renderActions,\n}: MessageBubbleProps) {\n const [showRevokeDialog, setShowRevokeDialog] = useState(false);\n const [editing, setEditing] = useState(false);\n const [editContent, setEditContent] = useState(message.content || \"\");\n\n const isOutbound = message.direction === \"outbound\";\n const isPending = message.status === \"pending\";\n const isFailed = message.status === \"failed\";\n const time = formatMessageTime(message.datetime_add);\n\n const meta = parseMetadata(message.metadata);\n const isRevoked = meta.revoked === true;\n const isEdited = meta.edited === true;\n\n const agentLabel =\n isOutbound && message.source !== \"contact\"\n ? (meta.agent_name as string) ||\n (message.source === \"bot\" ? \"Bot\" : \"Agente\")\n : null;\n\n const canAct =\n isOutbound &&\n message.id > 0 &&\n !isPending &&\n !isFailed &&\n !isRevoked &&\n !!message.external_id;\n\n const canEdit = canAct && message.content_type === \"text\";\n\n function handleSaveEdit() {\n const trimmed = editContent.trim();\n if (!trimmed || trimmed === message.content) {\n setEditing(false);\n return;\n }\n onEdit?.(message, trimmed);\n setEditing(false);\n }\n\n if (isRevoked) {\n return (\n <div\n className={cn(\"flex\", isOutbound ? \"justify-end\" : \"justify-start\")}\n >\n <div className=\"max-w-[75%]\">\n <div\n className={cn(\n \"rounded-lg px-3 py-2\",\n isOutbound ? \"bg-primary/40\" : \"bg-muted/60\",\n )}\n >\n <div className=\"flex items-center gap-1.5\">\n <Ban\n className={cn(\n \"h-3.5 w-3.5\",\n isOutbound\n ? \"text-primary-foreground/50\"\n : \"text-muted-foreground\",\n )}\n />\n <p\n className={cn(\n \"text-sm italic\",\n isOutbound\n ? \"text-primary-foreground/50\"\n : \"text-muted-foreground\",\n )}\n >\n Mensagem apagada\n </p>\n </div>\n <div\n className={cn(\n \"mt-1 flex items-center justify-end gap-1\",\n isOutbound\n ? \"text-primary-foreground/40\"\n : \"text-muted-foreground/60\",\n )}\n >\n <span className=\"text-[10px]\">{time}</span>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"flex group\",\n isOutbound ? \"justify-end\" : \"justify-start\",\n )}\n >\n <div className=\"max-w-[75%] relative\">\n {canAct && (\n <div className=\"absolute -top-1 right-1 opacity-0 group-hover:opacity-100 transition-opacity z-10\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button className=\"h-6 w-6 rounded-full bg-background/80 shadow-sm flex items-center justify-center hover:bg-background\">\n <MoreHorizontal className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-40\">\n {canEdit && (\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n setEditing(true);\n setEditContent(message.content || \"\");\n }}\n >\n <Pencil className=\"h-4 w-4 mr-2\" />\n Editar\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n setShowRevokeDialog(true);\n }}\n className=\"text-destructive focus:text-destructive\"\n >\n <Trash2 className=\"h-4 w-4 mr-2\" />\n Apagar para todos\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )}\n\n {renderActions?.(message)}\n\n <div\n className={cn(\n \"rounded-lg px-3 py-2\",\n isOutbound ? \"bg-primary text-primary-foreground\" : \"bg-muted\",\n isPending && \"opacity-70\",\n isFailed && \"bg-destructive/10 border border-destructive/30\",\n )}\n >\n {agentLabel && (\n <p\n className={cn(\n \"mb-0.5 text-[10px] font-medium\",\n isFailed\n ? \"text-destructive/70\"\n : isOutbound\n ? \"text-primary-foreground/70\"\n : \"text-muted-foreground\",\n )}\n >\n {agentLabel}\n </p>\n )}\n\n {editing ? (\n <div className=\"space-y-2\">\n <Textarea\n value={editContent}\n onChange={(e) => setEditContent(e.target.value)}\n rows={2}\n className=\"min-h-[36px] max-h-[120px] resize-none bg-background text-foreground text-sm\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSaveEdit();\n }\n if (e.key === \"Escape\") {\n setEditing(false);\n }\n }}\n />\n <div className=\"flex justify-end gap-1.5\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 text-xs px-2\"\n onClick={() => setEditing(false)}\n >\n Cancelar\n </Button>\n <Button\n size=\"sm\"\n className=\"h-6 text-xs px-2\"\n onClick={handleSaveEdit}\n disabled={\n !editContent.trim() ||\n editContent.trim() === message.content\n }\n >\n Salvar\n </Button>\n </div>\n </div>\n ) : message.content_type === \"text\" ? (\n <p\n className={cn(\n \"text-sm whitespace-pre-wrap break-words\",\n isFailed && \"text-foreground\",\n )}\n >\n {message.content}\n </p>\n ) : (\n <MediaContent message={message} />\n )}\n\n {!editing && (\n <div\n className={cn(\n \"mt-1 flex items-center justify-end gap-1\",\n isFailed\n ? \"text-destructive\"\n : isOutbound\n ? \"text-primary-foreground/60\"\n : \"text-muted-foreground\",\n )}\n >\n {isEdited && (\n <span className=\"text-[10px] italic\">editada</span>\n )}\n <span className=\"text-[10px]\">{time}</span>\n {isOutbound && statusIcons[message.status]}\n </div>\n )}\n </div>\n\n {isFailed && (\n <div className=\"mt-1 flex items-center gap-1.5 justify-end px-1\">\n <AlertCircle className=\"h-3 w-3 shrink-0 text-destructive\" />\n <span className=\"text-[11px] text-destructive\">\n {message._error || \"Erro ao enviar\"}\n </span>\n {onRetry && (\n <button\n onClick={() => onRetry(message)}\n className=\"inline-flex items-center gap-0.5 text-[11px] text-destructive font-medium hover:text-destructive/80 hover:underline cursor-pointer ml-1\"\n >\n <RotateCcw className=\"h-3 w-3\" />\n Reenviar\n </button>\n )}\n </div>\n )}\n </div>\n\n <AlertDialog open={showRevokeDialog} onOpenChange={setShowRevokeDialog}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Apagar mensagem?</AlertDialogTitle>\n <AlertDialogDescription>\n A mensagem será apagada para todos no WhatsApp. Ela continuará\n visível aqui como "mensagem apagada".\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n onClick={() => onRevoke?.(message)}\n >\n Apagar para todos\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\";\nimport { Check, ChevronRight } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n );\n}\n\nfunction DropdownMenuContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n align={align}\n className={cn(\n \"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-32 rounded-md p-1 shadow-md ring-1 duration-100 z-50 overflow-x-hidden overflow-y-auto\",\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n );\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive gap-2 rounded-sm px-2 py-1.5 text-sm data-inset:pl-8 [&_svg:not([class*='size-'])]:size-4 relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm [&_svg:not([class*='size-'])]:size-4 relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute right-2 flex items-center justify-center pointer-events-none\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-open:bg-accent gap-2 rounded-sm px-2 py-1.5 text-sm data-inset:pl-8 [&_svg:not([class*='size-'])]:size-4 flex cursor-default items-center outline-hidden select-none [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 ring-foreground/10 bg-popover text-popover-foreground min-w-[96px] rounded-md p-1 shadow-lg ring-1 duration-100 z-50 overflow-hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n};\n","import * as React from \"react\";\nimport { AlertDialog as AlertDialogPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"./button\";\n\nfunction AlertDialog({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />;\n}\n\nfunction AlertDialogTrigger({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n );\n}\n\nfunction AlertDialogPortal({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n );\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 z-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDialogContent({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Content>) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n className={cn(\n \"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 bg-background ring-foreground/10 gap-6 rounded-xl p-6 ring-1 duration-100 sm:max-w-lg fixed top-1/2 left-1/2 z-50 grid w-full max-w-xs -translate-x-1/2 -translate-y-1/2 outline-none\",\n className,\n )}\n {...props}\n />\n </AlertDialogPortal>\n );\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\"grid gap-1.5 text-center sm:text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\"text-lg font-medium\", className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogAction({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Action> &\n Partial<Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">>) {\n return (\n <Button variant={variant} size={size} asChild>\n <AlertDialogPrimitive.Action\n data-slot=\"alert-dialog-action\"\n className={cn(className)}\n {...props}\n />\n </Button>\n );\n}\n\nfunction AlertDialogCancel({\n className,\n variant = \"outline\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> &\n Partial<Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">>) {\n return (\n <Button variant={variant} size={size} asChild>\n <AlertDialogPrimitive.Cancel\n data-slot=\"alert-dialog-cancel\"\n className={cn(className)}\n {...props}\n />\n </Button>\n );\n}\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n};\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"radix-ui\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"focus-visible:border-ring focus-visible:ring-ring/50 rounded-md border border-transparent text-sm font-medium focus-visible:ring-3 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none select-none\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 shadow-xs\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-muted hover:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:bg-destructive/20 text-destructive\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 gap-1.5 px-2.5\",\n xs: \"h-6 gap-1 px-2 text-xs [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 px-2.5\",\n lg: \"h-10 gap-1.5 px-2.5\",\n icon: \"size-9\",\n \"icon-xs\": \"size-6 [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot.Root : \"button\";\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"border-input dark:bg-input/30 focus-visible:border-ring focus-visible:ring-ring/50 rounded-md border bg-transparent px-2.5 py-2 text-base shadow-xs transition-[color,box-shadow] focus-visible:ring-3 md:text-sm placeholder:text-muted-foreground flex field-sizing-content min-h-16 w-full outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","import { useState, useRef } from \"react\";\nimport { Send } from \"lucide-react\";\nimport { Button } from \"./ui/button\";\nimport { Textarea } from \"./ui/textarea\";\n\nexport interface ChatInputProps {\n onSend: (content: string) => void;\n disabled?: boolean;\n}\n\nexport function ChatInput({ onSend, disabled }: ChatInputProps) {\n const [content, setContent] = useState(\"\");\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n function handleSend() {\n const text = content.trim();\n if (!text || disabled) return;\n\n setContent(\"\");\n onSend(text);\n textareaRef.current?.focus();\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n }\n\n return (\n <div className=\"border-t p-3\">\n <div className=\"flex items-end gap-2\">\n <Textarea\n ref={textareaRef}\n placeholder=\"Digite uma mensagem...\"\n value={content}\n onChange={(e) => setContent(e.target.value)}\n onKeyDown={handleKeyDown}\n rows={1}\n className=\"min-h-[40px] max-h-[120px] resize-none\"\n />\n <Button\n size=\"icon\"\n onClick={handleSend}\n disabled={!content.trim() || disabled}\n className=\"shrink-0\"\n >\n <Send className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n );\n}\n","import { cn } from \"../../lib/utils\";\n\nfunction Skeleton({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"bg-muted rounded-md animate-pulse\", className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","import * as React from \"react\";\nimport { Select as SelectPrimitive } from \"radix-ui\";\nimport { Check, ChevronDown, ChevronUp, ChevronsUpDown } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nfunction SelectGroup({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\";\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 focus-visible:border-ring focus-visible:ring-ring/50 gap-1.5 rounded-md border bg-transparent py-2 pr-2 pl-2.5 text-sm shadow-xs transition-[color,box-shadow] focus-visible:ring-3 data-[size=default]:h-9 data-[size=sm]:h-8 [&_svg:not([class*='size-'])]:size-4 flex w-fit items-center justify-between whitespace-nowrap outline-none disabled:cursor-not-allowed disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronsUpDown className=\"text-muted-foreground size-4 pointer-events-none\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 min-w-36 rounded-md shadow-md ring-1 duration-100 relative z-50 max-h-(--radix-select-content-available-height) overflow-x-hidden overflow-y-auto\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className,\n )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport>{children}</SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm [&_svg:not([class*='size-'])]:size-4 relative flex w-full cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"pointer-events-none\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <ChevronUp />\n </SelectPrimitive.ScrollUpButton>\n );\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <ChevronDown />\n </SelectPrimitive.ScrollDownButton>\n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectTrigger,\n SelectValue,\n};\n","import * as React from \"react\";\nimport { Avatar as AvatarPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n \"relative flex size-8 shrink-0 overflow-hidden rounded-full\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n );\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex size-full items-center justify-center rounded-full bg-muted\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","import { Avatar, AvatarFallback } from \"./ui/avatar\";\nimport { cn } from \"../lib/utils\";\n\nconst COLORS = [\n \"bg-red-100 text-red-700 dark:bg-red-900 dark:text-red-300\",\n \"bg-orange-100 text-orange-700 dark:bg-orange-900 dark:text-orange-300\",\n \"bg-amber-100 text-amber-700 dark:bg-amber-900 dark:text-amber-300\",\n \"bg-emerald-100 text-emerald-700 dark:bg-emerald-900 dark:text-emerald-300\",\n \"bg-cyan-100 text-cyan-700 dark:bg-cyan-900 dark:text-cyan-300\",\n \"bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-300\",\n \"bg-violet-100 text-violet-700 dark:bg-violet-900 dark:text-violet-300\",\n \"bg-pink-100 text-pink-700 dark:bg-pink-900 dark:text-pink-300\",\n];\n\nconst SIZE_MAP = {\n sm: \"h-8 w-8 text-xs\",\n md: \"h-10 w-10 text-xs\",\n lg: \"h-16 w-16 text-lg\",\n} as const;\n\nfunction hashCode(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n return Math.abs(hash);\n}\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n return (name[0] || \"?\").toUpperCase();\n}\n\nexport interface ContactAvatarProps {\n name: string | null;\n className?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nexport function ContactAvatar({\n name,\n className,\n size = \"md\",\n}: ContactAvatarProps) {\n const displayName = name || \"?\";\n const color = COLORS[hashCode(displayName) % COLORS.length];\n const initials = getInitials(displayName);\n\n return (\n <Avatar className={cn(SIZE_MAP[size], className)}>\n <AvatarFallback className={cn(\"font-medium\", color)}>\n {initials}\n </AvatarFallback>\n </Avatar>\n );\n}\n","import { useState } from \"react\";\nimport type { Inbox } from \"../types\";\nimport { ContactAvatar } from \"./contact-avatar\";\nimport { Badge } from \"./ui/badge\";\nimport { Tooltip, TooltipTrigger, TooltipContent } from \"./ui/tooltip\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"./ui/alert-dialog\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\nimport { Trash2 } from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\n\nconst statusColors: Record<string, string> = {\n open: \"bg-green-500/10 text-green-600 border-green-200\",\n pending: \"bg-yellow-500/10 text-yellow-600 border-yellow-200\",\n resolved: \"bg-zinc-500/10 text-zinc-500 border-zinc-200\",\n};\n\nconst statusLabels: Record<string, string> = {\n open: \"Aberta\",\n pending: \"Pendente\",\n resolved: \"Resolvida\",\n};\n\nexport interface InboxItemProps {\n inbox: Inbox;\n isSelected: boolean;\n onClick: () => void;\n onDelete?: (id: number) => void;\n renderActions?: (inbox: Inbox) => React.ReactNode;\n}\n\nexport function InboxItem({\n inbox,\n isSelected,\n onClick,\n onDelete,\n renderActions,\n}: InboxItemProps) {\n const [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\n const timestamp = inbox.last_message_at || inbox.datetime_add;\n const timeAgo = formatDistanceToNow(new Date(timestamp), {\n addSuffix: true,\n locale: ptBR,\n });\n\n const lastMessage =\n inbox.last_message_content_type === \"text\"\n ? inbox.last_message_content\n : inbox.last_message_content_type\n ? `[${inbox.last_message_content_type}]`\n : null;\n\n const directionPrefix =\n inbox.last_message_direction === \"outbound\" ? \"Você: \" : \"\";\n\n return (\n <>\n <div\n className={cn(\n \"flex w-full items-start gap-3 rounded-md p-3 text-left transition-colors hover:bg-accent group relative cursor-pointer\",\n isSelected && \"bg-accent\",\n )}\n onClick={onClick}\n >\n <ContactAvatar\n name={inbox.contact_name}\n className=\"mt-0.5\"\n size=\"md\"\n />\n\n <div className=\"flex-1 overflow-hidden\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"truncate font-medium text-sm\">\n {inbox.contact_name || \"Desconhecido\"}\n </span>\n <div className=\"flex items-center gap-1 shrink-0\">\n <span className=\"text-xs text-muted-foreground\">{timeAgo}</span>\n {renderActions?.(inbox)}\n {onDelete && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n className=\"h-5 w-5 rounded flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity hover:bg-muted text-destructive\"\n onClick={(e) => {\n e.stopPropagation();\n setShowDeleteDialog(true);\n }}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Excluir conversa</TooltipContent>\n </Tooltip>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center justify-between gap-2 mt-0.5\">\n <p className=\"truncate text-xs text-muted-foreground\">\n {lastMessage\n ? `${directionPrefix}${lastMessage}`\n : \"Sem mensagens\"}\n </p>\n <Badge\n variant=\"outline\"\n className={cn(\n \"shrink-0 text-[10px] px-1.5 py-0\",\n statusColors[inbox.status],\n )}\n >\n {statusLabels[inbox.status] || inbox.status}\n </Badge>\n </div>\n </div>\n </div>\n\n <AlertDialog open={showDeleteDialog} onOpenChange={setShowDeleteDialog}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Excluir conversa?</AlertDialogTitle>\n <AlertDialogDescription>\n A conversa com {inbox.contact_name || \"este contato\"} será removida\n da lista. As mensagens não serão apagadas do WhatsApp.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n onClick={() => onDelete?.(inbox.id)}\n >\n Excluir\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"radix-ui\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst badgeVariants = cva(\n \"h-5 gap-1 rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium transition-all [&>svg]:size-3! inline-flex items-center justify-center w-fit whitespace-nowrap shrink-0 [&>svg]:pointer-events-none overflow-hidden\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground\",\n secondary: \"bg-secondary text-secondary-foreground\",\n destructive:\n \"bg-destructive/10 text-destructive dark:bg-destructive/20\",\n outline: \"border-border text-foreground\",\n ghost: \"hover:bg-muted hover:text-muted-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\";\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\n","import * as React from \"react\";\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n );\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 4,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n >\n {children}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import { useState, useMemo } from \"react\";\nimport type { Inbox } from \"../types\";\nimport { InboxItem } from \"./inbox-item\";\nimport { Input } from \"./ui/input\";\nimport { Tabs, TabsList, TabsTrigger } from \"./ui/tabs\";\nimport { Button } from \"./ui/button\";\nimport { Skeleton } from \"./ui/skeleton\";\nimport { ScrollArea } from \"./ui/scroll-area\";\nimport { Search, Plus, Inbox as InboxIcon } from \"lucide-react\";\n\nconst STATUS_TABS = [\n { value: \"all\", label: \"Todas\" },\n { value: \"open\", label: \"Abertas\" },\n { value: \"pending\", label: \"Pendentes\" },\n { value: \"resolved\", label: \"Resolvidas\" },\n];\n\nexport interface InboxSidebarProps {\n inboxes: Inbox[] | undefined;\n isLoading: boolean;\n selectedInboxId: number | null;\n onSelectInbox: (inbox: Inbox) => void;\n onDeleteInbox?: (id: number) => void;\n onCreateInbox?: () => void;\n filterChannelId?: number | null;\n renderHeader?: React.ReactNode;\n renderFooter?: React.ReactNode;\n}\n\nexport function InboxSidebar({\n inboxes,\n isLoading,\n selectedInboxId,\n onSelectInbox,\n onDeleteInbox,\n onCreateInbox,\n filterChannelId,\n renderHeader,\n renderFooter,\n}: InboxSidebarProps) {\n const [search, setSearch] = useState(\"\");\n const [statusFilter, setStatusFilter] = useState(\"all\");\n\n const filtered = useMemo(() => {\n if (!inboxes) return [];\n let list = inboxes;\n\n if (filterChannelId != null) {\n list = list.filter((i) => i.id_channel === filterChannelId);\n }\n\n if (statusFilter !== \"all\") {\n list = list.filter((i) => i.status === statusFilter);\n }\n\n if (search) {\n const q = search.toLowerCase();\n list = list.filter(\n (i) =>\n i.contact_name?.toLowerCase().includes(q) ||\n i.contact_phone?.toLowerCase().includes(q) ||\n i.contact_identifier?.toLowerCase().includes(q) ||\n i.last_message_content?.toLowerCase().includes(q),\n );\n }\n\n return [...list].sort((a, b) => {\n const dateA = a.last_message_at || a.datetime_add;\n const dateB = b.last_message_at || b.datetime_add;\n return new Date(dateB).getTime() - new Date(dateA).getTime();\n });\n }, [inboxes, statusFilter, search, filterChannelId]);\n\n return (\n <div className=\"flex h-full flex-col\">\n {renderHeader}\n\n <div className=\"flex flex-col gap-3 p-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Buscar...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9 h-8 text-sm\"\n />\n </div>\n {onCreateInbox && (\n <Button\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n onClick={onCreateInbox}\n >\n <Plus className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n <Tabs value={statusFilter} onValueChange={setStatusFilter}>\n <TabsList className=\"w-full\">\n {STATUS_TABS.map((tab) => (\n <TabsTrigger\n key={tab.value}\n value={tab.value}\n className=\"flex-1 text-xs\"\n >\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n </div>\n\n <ScrollArea className=\"flex-1 px-2\">\n {isLoading ? (\n <div className=\"space-y-2 p-2\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 p-3\">\n <Skeleton className=\"h-10 w-10 rounded-full shrink-0\" />\n <div className=\"flex-1 space-y-1.5\">\n <Skeleton className=\"h-4 w-28\" />\n <Skeleton className=\"h-3 w-40\" />\n </div>\n </div>\n ))}\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center gap-2 py-8 text-sm text-muted-foreground\">\n <InboxIcon className=\"h-8 w-8 opacity-50\" />\n Nenhuma conversa encontrada\n </div>\n ) : (\n filtered.map((inbox) => (\n <InboxItem\n key={inbox.id}\n inbox={inbox}\n isSelected={inbox.id === selectedInboxId}\n onClick={() => onSelectInbox(inbox)}\n onDelete={onDeleteInbox}\n />\n ))\n )}\n </ScrollArea>\n\n {renderFooter}\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","import * as React from \"react\";\nimport { Tabs as TabsPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Tabs({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n );\n}\n\nfunction TabsList({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n className={cn(\n \"inline-flex h-9 w-fit items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"inline-flex items-center justify-center gap-1.5 rounded-md px-2.5 py-1 text-sm font-medium whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 outline-none\", className)}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import * as React from \"react\";\nimport { ScrollArea as ScrollAreaPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit] [&>div]:!block\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Scrollbar>) {\n return (\n <ScrollAreaPrimitive.Scrollbar\n data-slot=\"scroll-bar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Thumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.Scrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n","import * as React from \"react\";\nimport { Separator as SeparatorPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n","import type { Contact } from \"../types\";\nimport { ContactAvatar } from \"./contact-avatar\";\nimport { Button } from \"./ui/button\";\nimport { Skeleton } from \"./ui/skeleton\";\nimport { Separator } from \"./ui/separator\";\nimport {\n X,\n Phone,\n Fingerprint,\n Calendar,\n CalendarClock,\n Hash,\n} from \"lucide-react\";\nimport { format } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\nimport { cn } from \"../lib/utils\";\n\nfunction InfoRow({\n icon: Icon,\n label,\n value,\n}: {\n icon: React.ElementType;\n label: string;\n value: string | null | undefined;\n}) {\n if (!value) return null;\n return (\n <div className=\"flex items-start gap-3 py-2\">\n <Icon className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0\">\n <p className=\"text-xs text-muted-foreground\">{label}</p>\n <p className=\"text-sm break-all\">{value}</p>\n </div>\n </div>\n );\n}\n\nexport interface ContactInfoPanelProps {\n contact: Contact | null;\n isLoading?: boolean;\n onClose?: () => void;\n className?: string;\n}\n\nexport function ContactInfoPanel({\n contact,\n isLoading,\n onClose,\n className,\n}: ContactInfoPanelProps) {\n return (\n <div\n className={cn(\n \"flex h-full w-[320px] shrink-0 flex-col border-l\",\n className,\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b px-4 py-3\">\n <span className=\"text-sm font-medium\">Informações do contato</span>\n {onClose && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={onClose}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-4\">\n {isLoading ? (\n <div className=\"flex flex-col items-center gap-3 pt-4\">\n <Skeleton className=\"h-16 w-16 rounded-full\" />\n <Skeleton className=\"h-5 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n ) : contact ? (\n <>\n {/* Avatar + Name */}\n <div className=\"flex flex-col items-center gap-2 pb-4\">\n <ContactAvatar name={contact.name} size=\"lg\" />\n <h3 className=\"text-base font-medium text-center\">\n {contact.name || \"Desconhecido\"}\n </h3>\n </div>\n\n <Separator />\n\n {/* Details */}\n <div className=\"mt-3 space-y-1\">\n <InfoRow icon={Hash} label=\"ID\" value={contact.id?.toString()} />\n <InfoRow\n icon={Phone}\n label=\"Telefone\"\n value={contact.phone_number}\n />\n <InfoRow\n icon={Fingerprint}\n label=\"Identificador\"\n value={contact.identifier}\n />\n <InfoRow\n icon={Calendar}\n label=\"Criado em\"\n value={\n contact.datetime_add\n ? format(\n new Date(contact.datetime_add),\n \"dd/MM/yyyy 'às' HH:mm\",\n { locale: ptBR },\n )\n : null\n }\n />\n <InfoRow\n icon={CalendarClock}\n label=\"Atualizado em\"\n value={\n contact.datetime_alt\n ? format(\n new Date(contact.datetime_alt),\n \"dd/MM/yyyy 'às' HH:mm\",\n { locale: ptBR },\n )\n : null\n }\n />\n </div>\n </>\n ) : null}\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useEffect } from \"react\";\nimport type { Contact, Channel, Inbox } from \"../types\";\nimport { ContactAvatar } from \"./contact-avatar\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n} from \"./ui/dialog\";\nimport {\n Command,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n} from \"./ui/command\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./ui/select\";\nimport { Button } from \"./ui/button\";\nimport { Loader2 } from \"lucide-react\";\n\nexport interface NewConversationDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n contacts: Contact[];\n channels: Channel[];\n existingInboxes?: Inbox[];\n onCreateInbox: (contactId: number, channelId: number) => void;\n isCreating?: boolean;\n onCreated?: (inboxId: number) => void;\n}\n\nexport function NewConversationDialog({\n open,\n onOpenChange,\n contacts,\n channels,\n existingInboxes,\n onCreateInbox,\n isCreating,\n onCreated,\n}: NewConversationDialogProps) {\n const [selectedContact, setSelectedContact] = useState<Contact | null>(null);\n const [selectedChannelId, setSelectedChannelId] = useState<number | null>(\n null,\n );\n\n // Auto-select first channel if only one available\n const effectiveChannelId =\n selectedChannelId ?? (channels.length === 1 ? channels[0]?.id : null);\n\n // Reset state when dialog closes\n useEffect(() => {\n if (!open) {\n setSelectedContact(null);\n setSelectedChannelId(null);\n }\n }, [open]);\n\n const handleCreate = useCallback(() => {\n if (!selectedContact || !effectiveChannelId) return;\n\n // Dedup check\n if (existingInboxes) {\n const existing = existingInboxes.find(\n (i) =>\n i.id_contact === selectedContact.id &&\n i.id_channel === effectiveChannelId,\n );\n if (existing) {\n onCreated?.(existing.id);\n onOpenChange(false);\n return;\n }\n }\n\n onCreateInbox(selectedContact.id, effectiveChannelId);\n }, [\n selectedContact,\n effectiveChannelId,\n existingInboxes,\n onCreateInbox,\n onCreated,\n onOpenChange,\n ]);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md p-0 gap-0\">\n <DialogHeader className=\"px-4 pt-4 pb-2\">\n <DialogTitle>Nova conversa</DialogTitle>\n <DialogDescription>\n Selecione um contato para iniciar uma conversa\n </DialogDescription>\n </DialogHeader>\n\n {channels.length > 1 && (\n <div className=\"px-4 pb-2\">\n <Select\n value={selectedChannelId?.toString() ?? \"\"}\n onValueChange={(v) => setSelectedChannelId(Number(v))}\n >\n <SelectTrigger className=\"h-9\">\n <SelectValue placeholder=\"Selecione um canal\" />\n </SelectTrigger>\n <SelectContent>\n {channels.map((ch) => (\n <SelectItem key={ch.id} value={ch.id.toString()}>\n {ch.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n <Command className=\"rounded-none border-none shadow-none\">\n <div className=\"px-2\">\n <CommandInput placeholder=\"Buscar contato...\" />\n </div>\n <CommandList className=\"max-h-64 px-2\">\n <CommandEmpty>Nenhum contato encontrado</CommandEmpty>\n <CommandGroup>\n {contacts.map((contact) => (\n <CommandItem\n key={contact.id}\n value={`${contact.name} ${contact.phone_number || \"\"}`}\n onSelect={() => setSelectedContact(contact)}\n data-checked={selectedContact?.id === contact.id}\n className=\"gap-3\"\n >\n <ContactAvatar name={contact.name} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">\n {contact.name}\n </p>\n <p className=\"truncate text-xs text-muted-foreground\">\n {contact.phone_number ||\n contact.identifier ||\n \"Sem telefone\"}\n </p>\n </div>\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n\n <DialogFooter className=\"px-4 py-3 border-t\">\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancelar\n </Button>\n <Button\n disabled={!selectedContact || !effectiveChannelId || isCreating}\n onClick={handleCreate}\n >\n {isCreating && <Loader2 className=\"h-4 w-4 animate-spin\" />}\n Iniciar conversa\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import * as React from \"react\";\nimport { Dialog as DialogPrimitive } from \"radix-ui\";\nimport { X } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content>) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","import * as React from \"react\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { Search } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div className=\"flex h-9 items-center gap-2 border-b px-3\" data-slot=\"command-input-wrapper\">\n <Search className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n </div>\n );\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\n {...props}\n />\n );\n}\n\nfunction CommandEmpty({\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n );\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandItem({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Command,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n};\n","\"use client\";\n\nimport type { WhatsappStatus } from \"../types\";\nimport { Badge } from \"./ui/badge\";\n\nexport interface WhatsappStatusBadgeProps {\n status: WhatsappStatus | undefined | null;\n hasSession: boolean;\n}\n\nexport function WhatsappStatusBadge({\n status,\n hasSession,\n}: WhatsappStatusBadgeProps) {\n if (!hasSession) {\n return (\n <Badge variant=\"outline\" className=\"text-xs text-zinc-500 border-zinc-300\">\n Sem sessão\n </Badge>\n );\n }\n\n if (!status) {\n return (\n <Badge variant=\"outline\" className=\"text-xs text-zinc-500 border-zinc-300\">\n Verificando...\n </Badge>\n );\n }\n\n if (status.connected && status.logged_in) {\n return (\n <Badge\n variant=\"outline\"\n className=\"text-xs bg-green-500/10 text-green-600 border-green-200\"\n >\n Conectado\n </Badge>\n );\n }\n\n if (status.connected && !status.logged_in) {\n return (\n <Badge\n variant=\"outline\"\n className=\"text-xs bg-yellow-500/10 text-yellow-600 border-yellow-200\"\n >\n Reconectando...\n </Badge>\n );\n }\n\n if (status.logged_in && !status.connected) {\n return (\n <Badge\n variant=\"outline\"\n className=\"text-xs bg-yellow-500/10 text-yellow-600 border-yellow-200\"\n >\n Desconectado\n </Badge>\n );\n }\n\n return (\n <Badge\n variant=\"outline\"\n className=\"text-xs bg-red-500/10 text-red-600 border-red-200\"\n >\n Offline\n </Badge>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { Channel } from \"../types\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useChannelWhatsappStatus } from \"../hooks/use-channels\";\nimport { WhatsappStatusBadge } from \"./whatsapp-status-badge\";\nimport { Button } from \"./ui/button\";\n\nexport interface ChannelCardProps {\n channel: Channel;\n config: GchatHookConfig;\n onEdit?: () => void;\n onDelete?: () => void;\n linkedAgentName?: string;\n linkedAgentActive?: boolean;\n actions?: ReactNode;\n}\n\nexport function ChannelCard({\n channel,\n config,\n onEdit,\n onDelete,\n linkedAgentName,\n linkedAgentActive = true,\n actions,\n}: ChannelCardProps) {\n const { data: status } = useChannelWhatsappStatus(config, channel.id);\n const hasSession = !!channel.external_id;\n\n return (\n <div className=\"rounded-lg border bg-card text-card-foreground shadow-sm\">\n <div className=\"flex flex-row items-start justify-between p-4 pb-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-md bg-green-500/10\">\n <svg className=\"h-5 w-5 text-green-600\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\" />\n </svg>\n </div>\n <div>\n <h3 className=\"text-sm font-medium\">{channel.name}</h3>\n <p className=\"text-xs text-muted-foreground\">\n {channel.identifier || \"Sem número\"}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-1\">\n {onEdit && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={onEdit}\n >\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\" />\n <path d=\"m15 5 4 4\" />\n </svg>\n </Button>\n )}\n {onDelete && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7 text-destructive hover:text-destructive\"\n onClick={onDelete}\n >\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n </svg>\n </Button>\n )}\n <WhatsappStatusBadge status={status} hasSession={hasSession} />\n </div>\n </div>\n <div className=\"p-4 pt-0 space-y-3\">\n {linkedAgentName && (\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 8V4H8\" />\n <rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M15 13v2\" />\n <path d=\"M9 13v2\" />\n </svg>\n <span>Agent: <strong>{linkedAgentName}</strong></span>\n {!linkedAgentActive && (\n <span className=\"text-[10px] px-1 py-0 border rounded\">inativo</span>\n )}\n </div>\n )}\n {actions}\n </div>\n </div>\n );\n}\n","import type { SVGProps } from \"react\";\n\nexport function WhatsappIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M3 21l1.65 -3.8a9 9 0 1 1 3.4 2.9l-5.05 .9\" />\n <path d=\"M9 10a.5 .5 0 0 0 1 0v-1a.5 .5 0 0 0 -1 0v1a5 5 0 0 0 5 5h1a.5 .5 0 0 0 0 -1h-1a.5 .5 0 0 0 0 1\" />\n </svg>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState, useCallback } from \"react\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useConnectChannel, useChannelQR, useChannelWhatsappStatus } from \"../hooks/use-channels\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from \"./ui/dialog\";\nimport { Button } from \"./ui/button\";\nimport { Loader2, Check, AlertCircle, RefreshCw } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\ntype QRState = \"connecting\" | \"waiting_qr\" | \"showing_qr\" | \"connected\" | \"error\";\n\nexport interface WhatsappQrDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n channelId: number;\n config: GchatHookConfig;\n}\n\nexport function WhatsappQrDialog({\n open,\n onOpenChange,\n channelId,\n config,\n}: WhatsappQrDialogProps) {\n const connectChannel = useConnectChannel(config);\n const [state, setState] = useState<QRState>(\"connecting\");\n const [errorMsg, setErrorMsg] = useState(\"\");\n\n const { data: qrUrl } = useChannelQR(\n config,\n channelId,\n open && (state === \"waiting_qr\" || state === \"showing_qr\"),\n );\n\n const { data: status } = useChannelWhatsappStatus(\n config,\n channelId,\n open && state !== \"connected\",\n );\n\n const startConnect = useCallback(() => {\n setState(\"connecting\");\n setErrorMsg(\"\");\n connectChannel.mutate(channelId, {\n onSuccess: () => setState(\"waiting_qr\"),\n onError: (err) => {\n setState(\"error\");\n setErrorMsg(err.message || \"Erro ao conectar\");\n },\n });\n }, [channelId, connectChannel]);\n\n useEffect(() => {\n if (!open) {\n setState(\"connecting\");\n setErrorMsg(\"\");\n return;\n }\n startConnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, channelId]);\n\n useEffect(() => {\n if (qrUrl && (state === \"waiting_qr\" || state === \"showing_qr\")) {\n setState(\"showing_qr\");\n }\n }, [qrUrl, state]);\n\n useEffect(() => {\n if (status?.connected && status?.logged_in) {\n setState(\"connected\");\n toast.success(\"WhatsApp conectado com sucesso!\");\n setTimeout(() => onOpenChange(false), 1500);\n }\n }, [status, onOpenChange]);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Conectar WhatsApp</DialogTitle>\n <DialogDescription>\n Escaneie o QR code com seu WhatsApp para conectar\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex min-h-[300px] items-center justify-center\">\n {state === \"connecting\" && (\n <div className=\"flex flex-col items-center gap-3 text-muted-foreground\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n <p className=\"text-sm\">Iniciando conexão...</p>\n </div>\n )}\n\n {state === \"waiting_qr\" && (\n <div className=\"flex flex-col items-center gap-3 text-muted-foreground\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n <p className=\"text-sm\">Gerando QR code...</p>\n </div>\n )}\n\n {state === \"showing_qr\" && qrUrl && (\n <div className=\"flex flex-col items-center gap-3\">\n <img\n src={qrUrl}\n alt=\"QR Code WhatsApp\"\n className=\"h-64 w-64 rounded-lg border\"\n />\n <p className=\"text-sm text-muted-foreground\">\n Abra o WhatsApp > Aparelhos conectados > Conectar\n </p>\n </div>\n )}\n\n {state === \"connected\" && (\n <div className=\"flex flex-col items-center gap-3 text-green-600\">\n <Check className=\"h-12 w-12\" />\n <p className=\"text-lg font-medium\">Conectado!</p>\n </div>\n )}\n\n {state === \"error\" && (\n <div className=\"flex flex-col items-center gap-3 text-destructive\">\n <AlertCircle className=\"h-8 w-8\" />\n <p className=\"text-sm\">{errorMsg || \"Erro ao gerar QR code\"}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={startConnect}\n >\n <RefreshCw className=\"mr-2 h-4 w-4\" />\n Tentar novamente\n </Button>\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useCreateChannel } from \"../hooks/use-channels\";\nimport { WhatsappIcon } from \"./whatsapp-icon\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from \"./ui/dialog\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\nexport interface ChannelCreateDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n config: GchatHookConfig;\n renderAgentSelect?: (props: {\n value: number | null;\n onChange: (value: number | null) => void;\n disabled?: boolean;\n }) => ReactNode;\n}\n\nexport function ChannelCreateDialog({\n open,\n onOpenChange,\n config,\n renderAgentSelect,\n}: ChannelCreateDialogProps) {\n const createChannel = useCreateChannel(config);\n const [name, setName] = useState(\"\");\n const [identifier, setIdentifier] = useState(\"\");\n const [idAgent, setIdAgent] = useState<number | null>(null);\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n if (!name.trim()) return;\n\n try {\n await createChannel.mutateAsync({\n name: name.trim(),\n type: \"whatsapp_unofficial\",\n provider: \"gwhatsmeow\",\n identifier: identifier.trim() || undefined,\n id_agent: idAgent,\n });\n toast.success(\"Canal criado! Agora conecte via QR code.\");\n setName(\"\");\n setIdentifier(\"\");\n setIdAgent(null);\n onOpenChange(false);\n } catch {\n toast.error(\"Erro ao criar canal\");\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <WhatsappIcon className=\"h-5 w-5 text-green-600\" />\n Novo Canal WhatsApp\n </DialogTitle>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"channel-name\">Nome do canal *</Label>\n <Input\n id=\"channel-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Ex: WhatsApp Principal\"\n required\n disabled={createChannel.isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"channel-identifier\">\n Número do WhatsApp (opcional)\n </Label>\n <Input\n id=\"channel-identifier\"\n value={identifier}\n onChange={(e) => setIdentifier(e.target.value)}\n placeholder=\"5511999999999\"\n disabled={createChannel.isPending}\n />\n <p className=\"text-xs text-muted-foreground\">\n Será detectado automaticamente ao escanear o QR code\n </p>\n </div>\n {renderAgentSelect?.({\n value: idAgent,\n onChange: setIdAgent,\n disabled: createChannel.isPending,\n })}\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={createChannel.isPending}\n >\n Cancelar\n </Button>\n <Button type=\"submit\" disabled={createChannel.isPending || !name.trim()}>\n {createChannel.isPending && (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n )}\n Criar Canal\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"gap-2 text-sm leading-none font-medium group-data-[disabled=true]:opacity-50 peer-disabled:opacity-50 flex items-center select-none group-data-[disabled=true]:pointer-events-none peer-disabled:cursor-not-allowed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { Channel } from \"../types\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useUpdateChannel } from \"../hooks/use-channels\";\nimport { WhatsappIcon } from \"./whatsapp-icon\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from \"./ui/dialog\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\nexport interface ChannelEditDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n channel: Channel;\n config: GchatHookConfig;\n renderAgentSelect?: (props: {\n value: number | null;\n onChange: (value: number | null) => void;\n disabled?: boolean;\n }) => ReactNode;\n}\n\nexport function ChannelEditDialog({\n open,\n onOpenChange,\n channel,\n config,\n renderAgentSelect,\n}: ChannelEditDialogProps) {\n const updateChannel = useUpdateChannel(config);\n const [name, setName] = useState(channel.name);\n const [identifier, setIdentifier] = useState(channel.identifier || \"\");\n const [idAgent, setIdAgent] = useState<number | null>(channel.id_agent);\n\n useEffect(() => {\n if (open) {\n setName(channel.name);\n setIdentifier(channel.identifier || \"\");\n setIdAgent(channel.id_agent);\n }\n }, [open, channel]);\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n if (!name.trim()) return;\n\n try {\n await updateChannel.mutateAsync({\n id: channel.id,\n body: {\n name: name.trim(),\n identifier: identifier.trim() || undefined,\n id_agent: idAgent,\n },\n });\n toast.success(\"Canal atualizado\");\n onOpenChange(false);\n } catch {\n toast.error(\"Erro ao atualizar canal\");\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <WhatsappIcon className=\"h-5 w-5 text-green-600\" />\n Editar Canal\n </DialogTitle>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"edit-channel-name\">Nome do canal *</Label>\n <Input\n id=\"edit-channel-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Ex: WhatsApp Principal\"\n required\n disabled={updateChannel.isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"edit-channel-identifier\">\n Número do WhatsApp (opcional)\n </Label>\n <Input\n id=\"edit-channel-identifier\"\n value={identifier}\n onChange={(e) => setIdentifier(e.target.value)}\n placeholder=\"5511999999999\"\n disabled={updateChannel.isPending}\n />\n </div>\n {renderAgentSelect?.({\n value: idAgent,\n onChange: setIdAgent,\n disabled: updateChannel.isPending,\n })}\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={updateChannel.isPending}\n >\n Cancelar\n </Button>\n <Button type=\"submit\" disabled={updateChannel.isPending || !name.trim()}>\n {updateChannel.isPending && (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n )}\n Salvar\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { Contact } from \"../types\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useCreateContact, useUpdateContact } from \"../hooks/use-contacts\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from \"./ui/dialog\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\nexport interface ContactFormDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n contact?: Contact;\n config: GchatHookConfig;\n}\n\nexport function ContactFormDialog({\n open,\n onOpenChange,\n contact,\n config,\n}: ContactFormDialogProps) {\n const isEditing = !!contact;\n const createContact = useCreateContact(config);\n const updateContact = useUpdateContact(config);\n\n const [name, setName] = useState(\"\");\n const [phoneNumber, setPhoneNumber] = useState(\"\");\n const [identifier, setIdentifier] = useState(\"\");\n\n useEffect(() => {\n if (contact) {\n setName(contact.name);\n setPhoneNumber(contact.phone_number || \"\");\n setIdentifier(contact.identifier || \"\");\n } else {\n setName(\"\");\n setPhoneNumber(\"\");\n setIdentifier(\"\");\n }\n }, [contact, open]);\n\n const isPending = createContact.isPending || updateContact.isPending;\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n if (!name.trim()) return;\n\n const body = {\n name: name.trim(),\n phone_number: phoneNumber.trim() || undefined,\n identifier: identifier.trim() || undefined,\n };\n\n try {\n if (isEditing) {\n await updateContact.mutateAsync({ id: contact.id, body });\n toast.success(\"Contato atualizado\");\n } else {\n await createContact.mutateAsync(body);\n toast.success(\"Contato criado\");\n }\n onOpenChange(false);\n } catch {\n toast.error(isEditing ? \"Erro ao atualizar\" : \"Erro ao criar contato\");\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n {isEditing ? \"Editar Contato\" : \"Novo Contato\"}\n </DialogTitle>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"contact-name\">Nome *</Label>\n <Input\n id=\"contact-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Nome do contato\"\n required\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"contact-phone\">Telefone</Label>\n <Input\n id=\"contact-phone\"\n value={phoneNumber}\n onChange={(e) => setPhoneNumber(e.target.value)}\n placeholder=\"5511999999999\"\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"contact-identifier\">Identificador (WhatsApp ID)</Label>\n <Input\n id=\"contact-identifier\"\n value={identifier}\n onChange={(e) => setIdentifier(e.target.value)}\n placeholder=\"5511999999999@s.whatsapp.net\"\n disabled={isPending}\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={isPending}\n >\n Cancelar\n </Button>\n <Button type=\"submit\" disabled={isPending || !name.trim()}>\n {isPending ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : null}\n {isEditing ? \"Salvar\" : \"Criar\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport type { Contact } from \"../types\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useContacts, useDeleteContact } from \"../hooks/use-contacts\";\nimport { ContactFormDialog } from \"./contact-form-dialog\";\nimport { DataTable } from \"./data-table\";\nimport { Input } from \"./ui/input\";\nimport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n} from \"./ui/tooltip\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"./ui/alert-dialog\";\nimport { Button } from \"./ui/button\";\nimport { Pencil, Trash2, Search } from \"lucide-react\";\nimport { format } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\nimport { toast } from \"sonner\";\n\nfunction useColumns(\n onEdit: (contact: Contact) => void,\n onDelete: (id: number) => void,\n): ColumnDef<Contact>[] {\n return [\n {\n accessorKey: \"name\",\n header: \"Nome\",\n cell: ({ row }) => (\n <span className=\"font-medium\">{row.original.name}</span>\n ),\n sortingFn: (rowA, rowB) =>\n rowA.original.name.toLowerCase().localeCompare(rowB.original.name.toLowerCase()),\n },\n {\n accessorKey: \"phone_number\",\n header: \"Telefone\",\n cell: ({ row }) => row.original.phone_number || \"—\",\n sortingFn: (rowA, rowB) => {\n const a = rowA.original.phone_number || \"\";\n const b = rowB.original.phone_number || \"\";\n return a.localeCompare(b);\n },\n },\n {\n accessorKey: \"identifier\",\n header: \"Identificador\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-xs font-mono\">\n {row.original.identifier || \"—\"}\n </span>\n ),\n sortingFn: (rowA, rowB) => {\n const a = rowA.original.identifier || \"\";\n const b = rowB.original.identifier || \"\";\n return a.localeCompare(b);\n },\n },\n {\n accessorKey: \"datetime_add\",\n header: \"Criado em\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-sm\">\n {format(new Date(row.original.datetime_add), \"dd/MM/yyyy\", { locale: ptBR })}\n </span>\n ),\n },\n {\n id: \"actions\",\n size: 80,\n enableSorting: false,\n cell: ({ row }) => (\n <div className=\"flex items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => onEdit(row.original)}\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Editar</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n onClick={() => onDelete(row.original.id)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Excluir</TooltipContent>\n </Tooltip>\n </div>\n ),\n },\n ];\n}\n\nexport interface ContactsTableProps {\n config: GchatHookConfig;\n}\n\nexport function ContactsTable({ config }: ContactsTableProps) {\n const [search, setSearch] = useState(\"\");\n const [page, setPage] = useState(1);\n\n const queryParams = useMemo(() => {\n const params: Record<string, string> = {\n limit: \"15\",\n page: String(page),\n };\n if (search) {\n params.search = search;\n }\n return params;\n }, [search, page]);\n\n const { data, isLoading } = useContacts(config, queryParams);\n const deleteContact = useDeleteContact(config);\n const [editContact, setEditContact] = useState<Contact | null>(null);\n const [deleteId, setDeleteId] = useState<number | null>(null);\n\n const contacts = data?.data || [];\n const total = data?.total || 0;\n\n const columns = useColumns(\n (contact) => setEditContact(contact),\n (id) => setDeleteId(id),\n );\n\n function handleDelete() {\n if (!deleteId) return;\n deleteContact.mutate(deleteId, {\n onSuccess: () => {\n toast.success(\"Contato excluído\");\n setDeleteId(null);\n },\n onError: () => toast.error(\"Erro ao excluir contato\"),\n });\n }\n\n function handleSearchChange(value: string) {\n setSearch(value);\n setPage(1);\n }\n\n return (\n <>\n <div className=\"flex items-center gap-3\">\n <div className=\"relative flex-1 max-w-md\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Buscar por nome, telefone ou identificador...\"\n value={search}\n onChange={(e) => handleSearchChange(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n <DataTable\n columns={columns}\n data={contacts}\n isLoading={isLoading}\n emptyMessage=\"Nenhum contato encontrado\"\n total={total}\n page={page}\n onPageChange={setPage}\n pageSize={15}\n />\n\n <ContactFormDialog\n open={!!editContact}\n onOpenChange={(open) => !open && setEditContact(null)}\n contact={editContact ?? undefined}\n config={config}\n />\n\n <AlertDialog open={!!deleteId} onOpenChange={(open) => !open && setDeleteId(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Excluir contato?</AlertDialogTitle>\n <AlertDialogDescription>\n Esta ação não pode ser desfeita. O contato será removido permanentemente.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n onClick={handleDelete}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n Excluir\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n","\"use client\";\n\nimport {\n type ColumnDef,\n type SortingState,\n flexRender,\n getCoreRowModel,\n getSortedRowModel,\n useReactTable,\n} from \"@tanstack/react-table\";\nimport { useState } from \"react\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"./ui/table\";\nimport { Button } from \"./ui/button\";\nimport { Skeleton } from \"./ui/skeleton\";\nimport { ChevronLeft, ChevronRight, ArrowUp, ArrowDown, ArrowUpDown } from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[];\n data: TData[];\n isLoading?: boolean;\n emptyMessage?: string;\n total?: number;\n page?: number;\n onPageChange?: (page: number) => void;\n pageSize?: number;\n onRowClick?: (row: TData) => void;\n selectedRowId?: string | number | null;\n getRowId?: (row: TData) => string | number;\n compact?: boolean;\n}\n\nexport function DataTable<TData, TValue>({\n columns,\n data,\n isLoading,\n emptyMessage = \"Nenhum registro encontrado\",\n total,\n page = 1,\n onPageChange,\n pageSize = 15,\n onRowClick,\n selectedRowId,\n getRowId,\n compact,\n}: DataTableProps<TData, TValue>) {\n const [sorting, setSorting] = useState<SortingState>([]);\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: setSorting,\n state: { sorting },\n });\n\n const totalPages = total ? Math.ceil(total / pageSize) : 1;\n const showPagination = onPageChange && total && total > pageSize;\n\n return (\n <div className=\"space-y-4\">\n <div className=\"rounded-md border\">\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n className={cn(compact && \"py-1.5 text-xs\")}\n style={{ width: header.getSize() !== 150 ? header.getSize() : undefined }}\n >\n {header.isPlaceholder ? null : header.column.getCanSort() ? (\n <button\n type=\"button\"\n className=\"flex items-center gap-1 hover:text-foreground -ml-1 px-1 py-0.5 rounded cursor-pointer select-none\"\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n {{\n asc: <ArrowUp className=\"h-3.5 w-3.5\" />,\n desc: <ArrowDown className=\"h-3.5 w-3.5\" />,\n }[header.column.getIsSorted() as string] ?? (\n <ArrowUpDown className=\"h-3.5 w-3.5 text-muted-foreground/50\" />\n )}\n </button>\n ) : (\n flexRender(header.column.columnDef.header, header.getContext())\n )}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {isLoading ? (\n Array.from({ length: compact ? 3 : 5 }).map((_, i) => (\n <TableRow key={i}>\n {columns.map((_, j) => (\n <TableCell key={j} className={cn(compact && \"py-1.5\")}>\n <Skeleton className=\"h-4 w-full max-w-[120px]\" />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : table.getRowModel().rows.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className={cn(\n \"text-center text-muted-foreground\",\n compact ? \"py-4\" : \"py-8\",\n )}\n >\n {emptyMessage}\n </TableCell>\n </TableRow>\n ) : (\n table.getRowModel().rows.map((row) => {\n const rowId = getRowId ? getRowId(row.original) : undefined;\n const isSelected = selectedRowId != null && rowId != null && rowId === selectedRowId;\n\n return (\n <TableRow\n key={row.id}\n className={cn(\n onRowClick && \"cursor-pointer\",\n isSelected && \"bg-accent\",\n )}\n onClick={() => onRowClick?.(row.original)}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id} className={cn(compact && \"py-1.5\")}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n );\n })\n )}\n </TableBody>\n </Table>\n </div>\n\n {showPagination && (\n <div className=\"flex items-center justify-between px-2\">\n <p className=\"text-sm text-muted-foreground\">\n {total} registro{total !== 1 ? \"s\" : \"\"}\n </p>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n Anterior\n </Button>\n <span className=\"text-sm text-muted-foreground\">\n {page} de {totalPages}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n >\n Próximo\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div data-slot=\"table-container\" className=\"relative w-full overflow-x-auto\">\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\"bg-muted/50 border-t font-medium [&>tr]:last:border-b-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\"hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors\", className)}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\"text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"text-muted-foreground mt-4 text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport type { Inbox, InboxMessage } from \"../types\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport {\n useInboxes,\n useInboxStats,\n useUpdateInbox,\n useDeleteInbox,\n} from \"../hooks/use-inboxes\";\nimport {\n useInboxMessages,\n useSendMessage,\n useRetryMessage,\n useRevokeMessage,\n useEditMessage,\n} from \"../hooks/use-inbox-messages\";\nimport { useGetContact } from \"../hooks/use-contacts\";\nimport { InboxSidebar } from \"./inbox-sidebar\";\nimport { ChatView } from \"./chat-view\";\nimport { ContactInfoPanel } from \"./contact-info-panel\";\nimport { Button } from \"./ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./ui/select\";\nimport { MessageCircle, User } from \"lucide-react\";\n\nexport interface InboxPageProps {\n config: GchatHookConfig;\n filterChannelId?: number | null;\n}\n\nexport function InboxPage({ config, filterChannelId }: InboxPageProps) {\n const [selectedInbox, setSelectedInbox] = useState<Inbox | null>(null);\n const [showContactPanel, setShowContactPanel] = useState(false);\n\n const { data: inboxes, isLoading: inboxesLoading } = useInboxes(config);\n const { data: messages = [], isLoading: messagesLoading } =\n useInboxMessages(config, selectedInbox?.id ?? null);\n const { data: contact, isLoading: contactLoading } = useGetContact(\n config,\n showContactPanel && selectedInbox?.id_contact\n ? selectedInbox.id_contact\n : null,\n );\n\n const sendMessage = useSendMessage(config);\n const retryMessage = useRetryMessage(config);\n const revokeMessage = useRevokeMessage(config);\n const editMessage = useEditMessage(config);\n const updateInbox = useUpdateInbox(config);\n const deleteInbox = useDeleteInbox(config);\n\n const handleSend = useCallback(\n (content: string) => {\n if (!selectedInbox) return;\n sendMessage.mutate({ idInbox: selectedInbox.id, content });\n },\n [selectedInbox, sendMessage],\n );\n\n const handleStatusChange = useCallback(\n (status: \"open\" | \"pending\" | \"resolved\") => {\n if (!selectedInbox) return;\n updateInbox.mutate({ id: selectedInbox.id, body: { status } });\n },\n [selectedInbox, updateInbox],\n );\n\n const handleRevoke = useCallback(\n (message: InboxMessage) => {\n if (!selectedInbox) return;\n revokeMessage.mutate({ id: message.id, idInbox: selectedInbox.id });\n },\n [selectedInbox, revokeMessage],\n );\n\n const handleEdit = useCallback(\n (message: InboxMessage, newContent: string) => {\n if (!selectedInbox) return;\n editMessage.mutate({\n id: message.id,\n idInbox: selectedInbox.id,\n content: newContent,\n });\n },\n [selectedInbox, editMessage],\n );\n\n return (\n <div className=\"flex h-full\">\n <div className=\"w-[360px] shrink-0 border-r flex flex-col\">\n <InboxSidebar\n inboxes={inboxes}\n isLoading={inboxesLoading}\n selectedInboxId={selectedInbox?.id ?? null}\n onSelectInbox={(inbox) => {\n setSelectedInbox(inbox);\n setShowContactPanel(false);\n }}\n onDeleteInbox={(id) => deleteInbox.mutate(id)}\n filterChannelId={filterChannelId}\n />\n </div>\n\n <div className=\"flex-1 flex min-w-0\">\n {selectedInbox ? (\n <>\n <div className=\"flex-1 flex flex-col min-w-0\">\n <ChatView\n messages={messages}\n isLoading={messagesLoading}\n onSend={handleSend}\n onRetry={retryMessage}\n onRevoke={handleRevoke}\n onEdit={handleEdit}\n renderHeader={\n <div className=\"flex items-center justify-between border-b px-4 py-3\">\n <span className=\"text-sm font-medium\">\n {selectedInbox.contact_name || \"Conversa\"}\n </span>\n <div className=\"flex items-center gap-2\">\n <Select\n value={selectedInbox.status}\n onValueChange={handleStatusChange}\n >\n <SelectTrigger className=\"w-[130px] h-8 text-xs\">\n <SelectValue placeholder=\"Status\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"open\">Aberta</SelectItem>\n <SelectItem value=\"pending\">Pendente</SelectItem>\n <SelectItem value=\"resolved\">Resolvida</SelectItem>\n </SelectContent>\n </Select>\n {selectedInbox.id_contact && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => setShowContactPanel((v) => !v)}\n >\n <User className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </div>\n }\n />\n </div>\n\n {showContactPanel && selectedInbox.id_contact && (\n <ContactInfoPanel\n contact={contact ?? null}\n isLoading={contactLoading}\n onClose={() => setShowContactPanel(false)}\n />\n )}\n </>\n ) : (\n <div className=\"flex-1 flex flex-col items-center justify-center text-muted-foreground gap-3\">\n <MessageCircle className=\"h-12 w-12 opacity-20\" />\n <p className=\"text-sm\">Selecione uma conversa para começar</p>\n </div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { Channel } from \"../types\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useChannels, useDisconnectChannel, useLogoutChannel, useDeleteChannel, useChannelWhatsappStatus } from \"../hooks/use-channels\";\nimport { ChannelCard } from \"./channel-card\";\nimport { ChannelCreateDialog } from \"./channel-create-dialog\";\nimport { ChannelEditDialog } from \"./channel-edit-dialog\";\nimport { WhatsappQrDialog } from \"./whatsapp-qr-dialog\";\nimport { WhatsappIcon } from \"./whatsapp-icon\";\nimport { Button } from \"./ui/button\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"./ui/alert-dialog\";\nimport { Skeleton } from \"./ui/skeleton\";\nimport { Plus, QrCode, Unplug, LogOut } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\nexport interface ChannelsPageProps {\n config: GchatHookConfig;\n renderAgentSelect?: (props: {\n value: number | null;\n onChange: (value: number | null) => void;\n disabled?: boolean;\n }) => ReactNode;\n /** Optional: resolve agent info for a channel. Returns { name, active } */\n getAgentInfo?: (idAgent: number | null) => { name: string; active: boolean } | null;\n}\n\nfunction ChannelCardWrapper({\n channel,\n config,\n renderAgentSelect,\n getAgentInfo,\n}: {\n channel: Channel;\n config: GchatHookConfig;\n renderAgentSelect?: ChannelsPageProps[\"renderAgentSelect\"];\n getAgentInfo?: ChannelsPageProps[\"getAgentInfo\"];\n}) {\n const { data: status } = useChannelWhatsappStatus(config, channel.id);\n const disconnectChannel = useDisconnectChannel(config);\n const logoutChannel = useLogoutChannel(config);\n const deleteChannel = useDeleteChannel(config);\n const [qrOpen, setQrOpen] = useState(false);\n const [editOpen, setEditOpen] = useState(false);\n const [deleteOpen, setDeleteOpen] = useState(false);\n\n const isFullyConnected = status?.connected === true && status?.logged_in === true;\n const hasSession = !!channel.external_id;\n const agentInfo = getAgentInfo?.(channel.id_agent);\n\n function handleDisconnect() {\n disconnectChannel.mutate(channel.id, {\n onSuccess: () => toast.success(\"Canal desconectado\"),\n onError: () => toast.error(\"Erro ao desconectar\"),\n });\n }\n\n function handleLogout() {\n logoutChannel.mutate(channel.id, {\n onSuccess: () => toast.success(\"Logout realizado. Será necessário novo QR code.\"),\n onError: () => toast.error(\"Erro ao fazer logout\"),\n });\n }\n\n function handleDelete() {\n deleteChannel.mutate(channel.id, {\n onSuccess: () => {\n toast.success(\"Canal excluído\");\n setDeleteOpen(false);\n },\n onError: () => toast.error(\"Erro ao excluir canal\"),\n });\n }\n\n return (\n <>\n <ChannelCard\n channel={channel}\n config={config}\n onEdit={() => setEditOpen(true)}\n onDelete={() => setDeleteOpen(true)}\n linkedAgentName={agentInfo?.name}\n linkedAgentActive={agentInfo?.active !== false}\n actions={\n <div className=\"flex flex-wrap items-center gap-2\">\n {!isFullyConnected && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setQrOpen(true)}\n >\n <QrCode className=\"mr-1.5 h-3.5 w-3.5\" />\n Conectar via QR\n </Button>\n )}\n {isFullyConnected && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleDisconnect}\n disabled={disconnectChannel.isPending}\n >\n <Unplug className=\"mr-1.5 h-3.5 w-3.5\" />\n Desconectar\n </Button>\n )}\n {hasSession && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"text-destructive hover:text-destructive\"\n onClick={handleLogout}\n disabled={logoutChannel.isPending}\n >\n <LogOut className=\"mr-1.5 h-3.5 w-3.5\" />\n Logout\n </Button>\n )}\n </div>\n }\n />\n\n <WhatsappQrDialog\n open={qrOpen}\n onOpenChange={setQrOpen}\n channelId={channel.id}\n config={config}\n />\n\n <ChannelEditDialog\n open={editOpen}\n onOpenChange={setEditOpen}\n channel={channel}\n config={config}\n renderAgentSelect={renderAgentSelect}\n />\n\n <AlertDialog open={deleteOpen} onOpenChange={setDeleteOpen}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Excluir canal?</AlertDialogTitle>\n <AlertDialogDescription>\n O canal "{channel.name}" será removido permanentemente.\n Todas as conversas associadas serão perdidas.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n onClick={handleDelete}\n >\n Excluir\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n\nexport function ChannelsPage({\n config,\n renderAgentSelect,\n getAgentInfo,\n}: ChannelsPageProps) {\n const { data: channels, isLoading } = useChannels(config);\n const [createOpen, setCreateOpen] = useState(false);\n\n return (\n <div className=\"flex flex-col gap-6 p-4 flex-1 min-h-0 overflow-y-auto\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold\">Canais</h1>\n <p className=\"text-sm text-muted-foreground\">\n Gerencie seus canais de comunicação\n </p>\n </div>\n <Button onClick={() => setCreateOpen(true)}>\n <Plus className=\"mr-2 h-4 w-4\" />\n Novo Canal\n </Button>\n </div>\n\n {isLoading ? (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"rounded-lg border p-4 space-y-3\">\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-9 w-9 rounded-md\" />\n <div className=\"space-y-1\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-32\" />\n </div>\n </div>\n <Skeleton className=\"h-8 w-full\" />\n </div>\n ))}\n </div>\n ) : !channels?.length ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-muted-foreground gap-3\">\n <WhatsappIcon className=\"h-12 w-12 opacity-20\" />\n <p className=\"text-sm\">Nenhum canal configurado</p>\n <Button variant=\"outline\" onClick={() => setCreateOpen(true)}>\n <Plus className=\"mr-2 h-4 w-4\" />\n Criar primeiro canal\n </Button>\n </div>\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {channels.map((channel) => (\n <ChannelCardWrapper\n key={channel.id}\n channel={channel}\n config={config}\n renderAgentSelect={renderAgentSelect}\n getAgentInfo={getAgentInfo}\n />\n ))}\n </div>\n )}\n\n <ChannelCreateDialog\n open={createOpen}\n onOpenChange={setCreateOpen}\n config={config}\n renderAgentSelect={renderAgentSelect}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { ContactsTable } from \"./contacts-table\";\nimport { ContactFormDialog } from \"./contact-form-dialog\";\nimport { Button } from \"./ui/button\";\nimport { Plus } from \"lucide-react\";\n\nexport interface ContactsPageProps {\n config: GchatHookConfig;\n}\n\nexport function ContactsPage({ config }: ContactsPageProps) {\n const [createOpen, setCreateOpen] = useState(false);\n\n return (\n <div className=\"flex flex-col gap-6 p-4 flex-1 min-h-0 overflow-y-auto\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold\">Contatos</h1>\n <p className=\"text-sm text-muted-foreground\">\n Gerencie seus contatos de conversas\n </p>\n </div>\n <Button onClick={() => setCreateOpen(true)}>\n <Plus className=\"mr-2 h-4 w-4\" />\n Novo Contato\n </Button>\n </div>\n\n <ContactsTable config={config} />\n\n <ContactFormDialog\n open={createOpen}\n onOpenChange={setCreateOpen}\n config={config}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { Inbox, Channel } from \"../types\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useInboxStats, useInboxes } from \"../hooks/use-inboxes\";\nimport { useChannels, useChannelWhatsappStatus } from \"../hooks/use-channels\";\nimport { ContactAvatar } from \"./contact-avatar\";\nimport { WhatsappStatusBadge } from \"./whatsapp-status-badge\";\nimport { WhatsappIcon } from \"./whatsapp-icon\";\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"./ui/card\";\nimport { Badge } from \"./ui/badge\";\nimport { Progress } from \"./ui/progress\";\nimport { Skeleton } from \"./ui/skeleton\";\nimport {\n Inbox as InboxIcon,\n MessageCircle,\n Clock,\n CircleCheck,\n ArrowRight,\n} from \"lucide-react\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\nimport { cn } from \"../lib/utils\";\n\n// --- Helpers ---\n\nfunction getGreeting(userName?: string): string {\n const hour = new Date().getHours();\n const prefix = hour < 12 ? \"Bom dia\" : hour < 18 ? \"Boa tarde\" : \"Boa noite\";\n return userName ? `${prefix}, ${userName}!` : `${prefix}!`;\n}\n\nconst statusColors: Record<string, string> = {\n open: \"bg-green-500/10 text-green-600 border-green-200\",\n pending: \"bg-yellow-500/10 text-yellow-600 border-yellow-200\",\n resolved: \"bg-zinc-500/10 text-zinc-500 border-zinc-200\",\n};\n\nconst statusLabels: Record<string, string> = {\n open: \"Aberta\",\n pending: \"Pendente\",\n resolved: \"Resolvida\",\n};\n\n// --- Sub-components ---\n\nfunction StatCard({\n title,\n value,\n total,\n icon: Icon,\n loading,\n accentColor,\n onClick,\n}: {\n title: string;\n value: number | undefined;\n total: number | undefined;\n icon: React.ElementType;\n loading: boolean;\n accentColor: string;\n onClick: () => void;\n}) {\n const pct = total && value ? Math.round((value / total) * 100) : 0;\n\n return (\n <Card\n className={cn(\"cursor-pointer transition-shadow hover:shadow-md border-l-4\", accentColor)}\n onClick={onClick}\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"text-sm font-medium text-muted-foreground\">\n {title}\n </CardTitle>\n <Icon className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {loading ? (\n <Skeleton className=\"h-8 w-16\" />\n ) : (\n <>\n <div className=\"flex items-baseline gap-2\">\n <p className=\"text-2xl font-bold\">{value ?? 0}</p>\n {total !== undefined && total > 0 && title !== \"Total\" && (\n <span className=\"text-xs text-muted-foreground\">\n de {total}\n </span>\n )}\n </div>\n {title !== \"Total\" && (\n <Progress value={pct} className=\"h-1\" />\n )}\n </>\n )}\n </CardContent>\n </Card>\n );\n}\n\nfunction ChannelHealthCard({\n channel,\n config,\n onClick,\n}: {\n channel: Channel;\n config: GchatHookConfig;\n onClick: () => void;\n}) {\n const { data: status } = useChannelWhatsappStatus(config, channel.id);\n\n return (\n <div\n className=\"flex items-center gap-3 rounded-lg border p-3 cursor-pointer transition-colors hover:bg-accent\"\n onClick={onClick}\n >\n <div className=\"flex h-9 w-9 items-center justify-center rounded-md bg-green-500/10\">\n <WhatsappIcon className=\"h-5 w-5 text-green-600\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{channel.name}</p>\n <p className=\"text-xs text-muted-foreground truncate\">\n {channel.identifier || \"Sem número\"}\n </p>\n </div>\n <WhatsappStatusBadge status={status} hasSession={!!channel.external_id} />\n </div>\n );\n}\n\nfunction RecentConversationItem({\n inbox,\n onClick,\n}: {\n inbox: Inbox;\n onClick: () => void;\n}) {\n const timestamp = inbox.last_message_at || inbox.datetime_add;\n const timeAgo = formatDistanceToNow(new Date(timestamp), {\n addSuffix: true,\n locale: ptBR,\n });\n\n const lastMessage =\n inbox.last_message_content_type === \"text\"\n ? inbox.last_message_content\n : inbox.last_message_content_type\n ? `[${inbox.last_message_content_type}]`\n : null;\n\n const directionPrefix =\n inbox.last_message_direction === \"outbound\" ? \"Você: \" : \"\";\n\n return (\n <div\n className=\"flex items-center gap-3 rounded-lg p-3 cursor-pointer transition-colors hover:bg-accent\"\n onClick={onClick}\n >\n <ContactAvatar name={inbox.contact_name || \"?\"} className=\"h-9 w-9\" />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className=\"text-sm font-medium truncate\">\n {inbox.contact_name || \"Desconhecido\"}\n </span>\n {inbox.channel_name && (\n <Badge variant=\"outline\" className=\"shrink-0 text-[10px] px-1.5 py-0 text-muted-foreground\">\n {inbox.channel_name}\n </Badge>\n )}\n </div>\n <span className=\"text-xs text-muted-foreground shrink-0\">\n {timeAgo}\n </span>\n </div>\n <div className=\"flex items-center justify-between gap-2 mt-0.5\">\n <p className=\"text-xs text-muted-foreground truncate\">\n {lastMessage ? `${directionPrefix}${lastMessage}` : \"Sem mensagens\"}\n </p>\n <Badge\n variant=\"outline\"\n className={cn(\"shrink-0 text-[10px] px-1.5 py-0\", statusColors[inbox.status])}\n >\n {statusLabels[inbox.status] || inbox.status}\n </Badge>\n </div>\n </div>\n </div>\n );\n}\n\n// --- Main Component ---\n\nexport interface ChatDashboardProps {\n config: GchatHookConfig;\n userName?: string;\n onNavigateToInbox?: (filters?: { status?: string; channelId?: number }) => void;\n onNavigateToChannels?: () => void;\n renderExtraSection?: () => ReactNode;\n}\n\nexport function ChatDashboard({\n config,\n userName,\n onNavigateToInbox,\n onNavigateToChannels,\n renderExtraSection,\n}: ChatDashboardProps) {\n const [selectedChannelId, setSelectedChannelId] = useState<number | null>(null);\n\n const { data: stats, isLoading: statsLoading } = useInboxStats(config);\n const { data: inboxes, isLoading: inboxesLoading } = useInboxes(config);\n const { data: channels, isLoading: channelsLoading } = useChannels(config);\n\n const filteredInboxes = useMemo(() => {\n if (!inboxes) return [];\n if (!selectedChannelId) return inboxes;\n return inboxes.filter((i) => i.id_channel === selectedChannelId);\n }, [inboxes, selectedChannelId]);\n\n const filteredStats = useMemo(() => {\n if (!selectedChannelId) return stats;\n const open = filteredInboxes.filter((i) => i.status === \"open\").length;\n const pending = filteredInboxes.filter((i) => i.status === \"pending\").length;\n const resolved = filteredInboxes.filter((i) => i.status === \"resolved\").length;\n return { total: filteredInboxes.length, open, pending, resolved };\n }, [stats, filteredInboxes, selectedChannelId]);\n\n const recentInboxes = useMemo(() => {\n return [...filteredInboxes]\n .sort((a, b) => {\n const da = a.last_message_at || a.datetime_add;\n const db = b.last_message_at || b.datetime_add;\n return new Date(db).getTime() - new Date(da).getTime();\n })\n .slice(0, 5);\n }, [filteredInboxes]);\n\n return (\n <div className=\"flex flex-col gap-6 p-4 flex-1 min-h-0 overflow-y-auto\">\n {/* Greeting */}\n <div>\n <h1 className=\"text-xl font-semibold\">\n {getGreeting(userName)}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n Aqui está o resumo das suas conversas e canais.\n </p>\n </div>\n\n {/* Channel Filter */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <button\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-medium transition-colors\",\n !selectedChannelId\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"bg-background text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n )}\n onClick={() => setSelectedChannelId(null)}\n >\n Todos os canais\n </button>\n {channelsLoading ? (\n <>\n <Skeleton className=\"h-7 w-24 rounded-full\" />\n <Skeleton className=\"h-7 w-28 rounded-full\" />\n </>\n ) : (\n channels?.map((channel) => (\n <button\n key={channel.id}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-medium transition-colors\",\n selectedChannelId === channel.id\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"bg-background text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n )}\n onClick={() => setSelectedChannelId(channel.id)}\n >\n <WhatsappIcon className=\"h-3 w-3\" />\n {channel.name}\n </button>\n ))\n )}\n </div>\n\n {/* Stat Cards */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Total\"\n value={filteredStats?.total}\n total={filteredStats?.total}\n icon={InboxIcon}\n loading={statsLoading && !selectedChannelId}\n accentColor=\"border-l-blue-500\"\n onClick={() => onNavigateToInbox?.()}\n />\n <StatCard\n title=\"Abertas\"\n value={filteredStats?.open}\n total={filteredStats?.total}\n icon={MessageCircle}\n loading={statsLoading && !selectedChannelId}\n accentColor=\"border-l-green-500\"\n onClick={() => onNavigateToInbox?.({ status: \"open\" })}\n />\n <StatCard\n title=\"Pendentes\"\n value={filteredStats?.pending}\n total={filteredStats?.total}\n icon={Clock}\n loading={statsLoading && !selectedChannelId}\n accentColor=\"border-l-yellow-500\"\n onClick={() => onNavigateToInbox?.({ status: \"pending\" })}\n />\n <StatCard\n title=\"Resolvidas\"\n value={filteredStats?.resolved}\n total={filteredStats?.total}\n icon={CircleCheck}\n loading={statsLoading && !selectedChannelId}\n accentColor=\"border-l-zinc-400\"\n onClick={() => onNavigateToInbox?.({ status: \"resolved\" })}\n />\n </div>\n\n {/* Channel Health */}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle className=\"text-sm font-medium\">\n Saúde dos Canais\n </CardTitle>\n {onNavigateToChannels && (\n <button\n onClick={onNavigateToChannels}\n className=\"text-xs text-primary hover:underline flex items-center gap-1\"\n >\n Gerenciar\n <ArrowRight className=\"h-3 w-3\" />\n </button>\n )}\n </CardHeader>\n <CardContent>\n {channelsLoading ? (\n <div className=\"space-y-3\">\n {[1, 2].map((i) => (\n <div key={i} className=\"flex items-center gap-3 p-3\">\n <Skeleton className=\"h-8 w-8 rounded\" />\n <div className=\"flex-1 space-y-1\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-32\" />\n </div>\n </div>\n ))}\n </div>\n ) : !channels?.length ? (\n <div className=\"flex items-center justify-center h-full text-sm text-muted-foreground py-8\">\n Nenhum canal configurado\n </div>\n ) : (\n <div className=\"space-y-2\">\n {channels.map((channel) => (\n <ChannelHealthCard\n key={channel.id}\n channel={channel}\n config={config}\n onClick={() => onNavigateToInbox?.({ channelId: channel.id })}\n />\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Extra Section (e.g., MetaAgents in admin) */}\n {renderExtraSection?.()}\n\n {/* Recent Conversations */}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle className=\"text-sm font-medium\">\n Conversas Recentes\n </CardTitle>\n {onNavigateToInbox && (\n <button\n onClick={() => onNavigateToInbox()}\n className=\"text-xs text-primary hover:underline flex items-center gap-1\"\n >\n Ver todas\n <ArrowRight className=\"h-3 w-3\" />\n </button>\n )}\n </CardHeader>\n <CardContent className=\"p-0\">\n {inboxesLoading ? (\n <div className=\"space-y-2 p-4\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"flex items-center gap-3 p-3\">\n <Skeleton className=\"h-9 w-9 rounded-full shrink-0\" />\n <div className=\"flex-1 space-y-1.5\">\n <Skeleton className=\"h-4 w-28\" />\n <Skeleton className=\"h-3 w-40\" />\n </div>\n </div>\n ))}\n </div>\n ) : recentInboxes.length === 0 ? (\n <div className=\"flex items-center justify-center py-8 text-sm text-muted-foreground\">\n Nenhuma conversa encontrada\n </div>\n ) : (\n <div className=\"divide-y\">\n {recentInboxes.map((inbox) => (\n <RecentConversationItem\n key={inbox.id}\n inbox={inbox}\n onClick={() => onNavigateToInbox?.()}\n />\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\"ring-foreground/10 bg-card text-card-foreground gap-6 overflow-hidden rounded-xl py-6 text-sm shadow-xs ring-1 has-[>img:first-child]:pt-0 data-[size=sm]:gap-4 data-[size=sm]:py-4 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl group/card flex flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"gap-1 rounded-t-xl px-6 group-data-[size=sm]/card:px-4 [.border-b]:pb-6 group-data-[size=sm]/card:[.border-b]:pb-4 group/card-header @container/card-header grid auto-rows-min items-start has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"text-base leading-normal font-medium group-data-[size=sm]/card:text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6 group-data-[size=sm]/card:px-4\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"rounded-b-xl px-6 group-data-[size=sm]/card:px-4 [.border-t]:pt-6 group-data-[size=sm]/card:[.border-t]:pt-4 flex items-center\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Progress as ProgressPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Progress({\n className,\n value,\n ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root>) {\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"bg-muted h-1.5 rounded-full relative flex w-full items-center overflow-x-hidden\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"bg-primary size-full flex-1 transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n )\n}\n\nexport { Progress }\n"],"mappings":"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","names":["useMemo","useQuery","useMutation","useQueryClient","useQuery","useMemo","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useRef","Check","jsx","jsx","jsxs","jsx","jsxs","jsx","jsx","jsxs","Check","useState","jsx","jsxs","useState","jsx","Check","jsx","jsxs","jsx","jsxs","Check","jsx","jsxs","useRef","jsx","jsx","jsx","useState","cva","Slot","jsx","cva","Slot","jsx","ptBR","Trash2","jsx","jsxs","useState","ptBR","Trash2","useState","useMemo","jsx","jsx","jsx","jsxs","jsx","jsxs","useState","useMemo","jsx","format","ptBR","Fragment","jsx","jsxs","format","ptBR","useState","useEffect","X","jsx","jsxs","jsx","jsx","jsxs","X","Search","jsx","jsxs","Search","jsx","jsxs","useState","useEffect","jsx","jsx","jsxs","jsx","jsxs","useEffect","useState","useCallback","Loader2","Check","AlertCircle","jsx","jsxs","useState","useCallback","useEffect","useState","jsx","Loader2","toast","jsx","jsxs","useState","useState","useEffect","Loader2","toast","jsx","jsxs","useState","useEffect","useEffect","useState","Loader2","toast","jsx","jsxs","useState","useEffect","useMemo","useState","useState","jsx","jsx","ChevronRight","jsx","jsxs","useState","_","ChevronRight","Pencil","Trash2","Search","format","ptBR","toast","Fragment","jsx","jsxs","useState","useMemo","useState","useCallback","Fragment","jsx","jsxs","useState","useCallback","useState","Plus","toast","Fragment","jsx","jsxs","useState","useState","Plus","jsx","jsxs","useState","useState","useMemo","jsx","jsx","jsx","InboxIcon","MessageCircle","Clock","formatDistanceToNow","ptBR","Fragment","jsx","jsxs","statusColors","statusLabels","formatDistanceToNow","ptBR","useState","useMemo","InboxIcon","MessageCircle","Clock"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/index.ts","../src/index.ts","../src/utils/group-messages.ts","../src/utils/format-date.ts","../src/hooks/types.ts","../src/hooks/use-inboxes.ts","../src/hooks/use-inbox-messages.ts","../src/hooks/use-contacts.ts","../src/hooks/use-channels.ts","../src/components/chat-view.tsx","../src/components/message-bubble.tsx","../src/components/chat-input.tsx","../src/components/contact-avatar.tsx","../src/components/inbox-item.tsx","../src/components/inbox-sidebar.tsx","../src/components/contact-info-panel.tsx","../src/components/new-conversation-dialog.tsx","../src/components/whatsapp-status-badge.tsx","../src/components/channel-card.tsx","../src/components/whatsapp-icon.tsx","../src/components/whatsapp-qr-dialog.tsx","../src/components/channel-create-dialog.tsx","../src/components/channel-edit-dialog.tsx","../src/components/contact-form-dialog.tsx","../src/components/contacts-table.tsx","../src/components/data-table.tsx","../src/components/inbox-page.tsx","../src/components/channels-page.tsx","../src/components/contacts-page.tsx","../src/components/chat-dashboard.tsx"],"sourcesContent":["import type {\n ApiResponse,\n Channel,\n Contact,\n Inbox,\n InboxMessage,\n InboxStats,\n WhatsappStatus,\n} from \"../types\";\n\nexport interface GchatClientConfig {\n baseUrl: string;\n token: string;\n language?: string;\n idWl?: number;\n}\n\nexport function createGchatClient(config: GchatClientConfig) {\n const { baseUrl, token, language = \"pt-br\", idWl = 1 } = config;\n\n function buildUrl(idAccount: number, path: string): string {\n return `${baseUrl}/v1/${language}/${idWl}/accounts/${idAccount}/${path}`;\n }\n\n async function request<T>(\n method: string,\n idAccount: number,\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ApiResponse<T>> {\n const url = new URL(buildUrl(idAccount, path));\n if (params) {\n Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));\n }\n\n const res = await fetch(url.toString(), {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n let message = `HTTP ${res.status}: ${res.statusText}`;\n try {\n const errorBody = await res.json();\n message = errorBody.message || message;\n } catch {\n /* ignore parse errors */\n }\n throw new Error(message);\n }\n\n const json: ApiResponse<T> = await res.json();\n\n // For mutations, treat API-level failures as errors so TanStack Query\n // fires onError instead of onSuccess (API returns HTTP 200 even on failure)\n if (method !== \"GET\" && json.status === 0) {\n throw new Error(json.message || \"Operação falhou\");\n }\n\n return json;\n }\n\n return {\n // --- Inboxes ---\n listInboxes: (idAccount: number, params?: Record<string, string>) =>\n request<Inbox[]>(\"GET\", idAccount, \"inboxes\", undefined, params),\n getInbox: (idAccount: number, id: number) =>\n request<Inbox>(\"GET\", idAccount, `inboxes/${id}`),\n getInboxStats: (idAccount: number) =>\n request<InboxStats>(\"GET\", idAccount, \"inboxes/stats\"),\n createInbox: (\n idAccount: number,\n body: { id_channel: number; id_contact: number },\n ) => request<Inbox>(\"POST\", idAccount, \"inboxes\", body),\n updateInbox: (\n idAccount: number,\n id: number,\n body: Partial<Pick<Inbox, \"status\" | \"id_agent\">>,\n ) => request<Inbox>(\"PUT\", idAccount, `inboxes/${id}`, body),\n deleteInbox: (idAccount: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `inboxes/${id}`),\n\n // --- Inbox Messages ---\n listInboxMessages: (idAccount: number, params: Record<string, string>) =>\n request<InboxMessage[]>(\n \"GET\",\n idAccount,\n \"inbox-messages\",\n undefined,\n params,\n ),\n sendMessage: (\n idAccount: number,\n body: {\n id_inbox: number;\n content: string;\n content_type?: string;\n source?: string;\n direction: \"outbound\";\n },\n ) => request<InboxMessage>(\"POST\", idAccount, \"inbox-messages\", body),\n revokeMessage: (idAccount: number, id: number) =>\n request<void>(\"POST\", idAccount, `inbox-messages/${id}/revoke`),\n editMessage: (idAccount: number, id: number, body: { content: string }) =>\n request<void>(\"POST\", idAccount, `inbox-messages/${id}/edit`, body),\n\n // --- Contacts ---\n listContacts: (idAccount: number, params?: Record<string, string>) =>\n request<Contact[]>(\"GET\", idAccount, \"contacts\", undefined, params),\n getContact: (idAccount: number, id: number) =>\n request<Contact>(\"GET\", idAccount, `contacts/${id}`),\n createContact: (\n idAccount: number,\n body: Pick<Contact, \"name\"> &\n Partial<Pick<Contact, \"phone_number\" | \"identifier\">>,\n ) => request<Contact>(\"POST\", idAccount, \"contacts\", body),\n updateContact: (\n idAccount: number,\n id: number,\n body: Partial<Pick<Contact, \"name\" | \"phone_number\" | \"identifier\">>,\n ) => request<Contact>(\"PUT\", idAccount, `contacts/${id}`, body),\n deleteContact: (idAccount: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `contacts/${id}`),\n\n // --- Channels ---\n listChannels: (idAccount: number) =>\n request<Channel[]>(\"GET\", idAccount, \"channels\"),\n getChannel: (idAccount: number, id: number) =>\n request<Channel>(\"GET\", idAccount, `channels/${id}`),\n createChannel: (\n idAccount: number,\n body: Pick<Channel, \"name\" | \"type\" | \"provider\"> &\n Partial<Pick<Channel, \"identifier\" | \"id_agent\">>,\n ) => request<Channel>(\"POST\", idAccount, \"channels\", body),\n updateChannel: (\n idAccount: number,\n id: number,\n body: Partial<\n Pick<Channel, \"name\" | \"identifier\" | \"status\" | \"id_agent\">\n >,\n ) => request<Channel>(\"PUT\", idAccount, `channels/${id}`, body),\n deleteChannel: (idAccount: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `channels/${id}`),\n\n // --- WhatsApp Channel Management ---\n connectChannel: (idAccount: number, id: number) =>\n request<unknown>(\"POST\", idAccount, `channels/${id}/connect`),\n getChannelQR: async (\n idAccount: number,\n id: number,\n ): Promise<string | null> => {\n const url = buildUrl(idAccount, `channels/${id}/qr`);\n const res = await fetch(url, {\n headers: {\n Accept: \"image/png\",\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!res.ok) return null;\n\n const contentType = res.headers.get(\"content-type\") || \"\";\n if (!contentType.includes(\"image/\")) return null;\n\n const blob = await res.blob();\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.onerror = () => reject(new Error(\"Failed to read QR image\"));\n reader.readAsDataURL(blob);\n });\n },\n getChannelWhatsappStatus: (idAccount: number, id: number) =>\n request<WhatsappStatus>(\n \"GET\",\n idAccount,\n `channels/${id}/whatsapp-status`,\n ),\n disconnectChannel: (idAccount: number, id: number) =>\n request<unknown>(\"POST\", idAccount, `channels/${id}/disconnect`),\n logoutChannel: (idAccount: number, id: number) =>\n request<unknown>(\"POST\", idAccount, `channels/${id}/logout`),\n provisionChannel: (idAccount: number, id: number) =>\n request<unknown>(\"POST\", idAccount, `channels/${id}/provision`),\n };\n}\n","// Types\nexport type {\n ApiResponse,\n Channel,\n Contact,\n Inbox,\n InboxMessage,\n InboxStats,\n WhatsappStatus,\n MessageContentType,\n} from \"./types\";\n\n// Client\nexport { createGchatClient } from \"./client\";\nexport type { GchatClientConfig } from \"./client\";\n\n// Utils\nexport { cn } from \"@greatapps/greatauth-ui/ui\";\nexport { groupMessagesByDate, formatDateGroup, formatMessageTime } from \"./utils\";\n\n// Hooks\nexport * from \"./hooks\";\n\n// Base Components\nexport {\n ChatView,\n ChatInput,\n MessageBubble,\n ContactAvatar,\n InboxItem,\n InboxSidebar,\n ContactInfoPanel,\n NewConversationDialog,\n ChannelCard,\n WhatsappStatusBadge,\n} from \"./components\";\nexport type {\n ChatViewProps,\n ChatInputProps,\n MessageBubbleProps,\n ContactAvatarProps,\n InboxItemProps,\n InboxSidebarProps,\n ContactInfoPanelProps,\n NewConversationDialogProps,\n ChannelCardProps,\n WhatsappStatusBadgeProps,\n} from \"./components\";\n\n// Icons\nexport { WhatsappIcon } from \"./components/whatsapp-icon\";\n\n// Dialogs & Forms\nexport { WhatsappQrDialog } from \"./components/whatsapp-qr-dialog\";\nexport type { WhatsappQrDialogProps } from \"./components/whatsapp-qr-dialog\";\n\nexport { ChannelCreateDialog } from \"./components/channel-create-dialog\";\nexport type { ChannelCreateDialogProps } from \"./components/channel-create-dialog\";\n\nexport { ChannelEditDialog } from \"./components/channel-edit-dialog\";\nexport type { ChannelEditDialogProps } from \"./components/channel-edit-dialog\";\n\nexport { ContactFormDialog } from \"./components/contact-form-dialog\";\nexport type { ContactFormDialogProps } from \"./components/contact-form-dialog\";\n\nexport { ContactsTable } from \"./components/contacts-table\";\nexport type { ContactsTableProps } from \"./components/contacts-table\";\n\nexport { DataTable } from \"./components/data-table\";\nexport type { DataTableProps } from \"./components/data-table\";\n\n// Page Compositions\nexport { InboxPage } from \"./components/inbox-page\";\nexport type { InboxPageProps } from \"./components/inbox-page\";\n\nexport { ChannelsPage } from \"./components/channels-page\";\nexport type { ChannelsPageProps } from \"./components/channels-page\";\n\nexport { ContactsPage } from \"./components/contacts-page\";\nexport type { ContactsPageProps } from \"./components/contacts-page\";\n\nexport { ChatDashboard } from \"./components/chat-dashboard\";\nexport type { ChatDashboardProps } from \"./components/chat-dashboard\";\n","import type { InboxMessage } from \"../types\";\n\n/**\n * Groups messages by date. Assumes messages are pre-sorted by datetime_add (ascending).\n */\nexport function groupMessagesByDate(\n messages: InboxMessage[],\n): { date: string; messages: InboxMessage[] }[] {\n const groups: { date: string; messages: InboxMessage[] }[] = [];\n let currentDate = \"\";\n\n for (const msg of messages) {\n const dateStr = msg.datetime_add.split(\"T\")[0];\n if (dateStr !== currentDate) {\n currentDate = dateStr;\n groups.push({ date: msg.datetime_add, messages: [] });\n }\n groups[groups.length - 1].messages.push(msg);\n }\n\n return groups;\n}\n","import { format, isToday, isYesterday } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\n\nexport function formatDateGroup(dateStr: string): string {\n const date = new Date(dateStr);\n if (isToday(date)) return \"Hoje\";\n if (isYesterday(date)) return \"Ontem\";\n return format(date, \"dd 'de' MMMM\", { locale: ptBR });\n}\n\nexport function formatMessageTime(dateStr: string): string {\n return format(new Date(dateStr), \"HH:mm\");\n}\n","import { useMemo } from \"react\";\nimport { createGchatClient } from \"../client\";\n\n// ---------------------------------------------------------------------------\n// Hook Configuration\n// ---------------------------------------------------------------------------\n\nexport interface GchatHookConfig {\n accountId: number;\n token: string;\n baseUrl: string;\n language?: string;\n idWl?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Polling Defaults (ms)\n// ---------------------------------------------------------------------------\n\nexport const DEFAULT_INBOX_POLLING = 5000;\nexport const DEFAULT_MESSAGES_POLLING = 3000;\nexport const DEFAULT_CHANNEL_STATUS_POLLING = 5000;\nexport const DEFAULT_QR_POLLING = 2000;\n\n// ---------------------------------------------------------------------------\n// Internal helper — memoized client from config\n// ---------------------------------------------------------------------------\n\nexport function useGchatClient(config: GchatHookConfig) {\n return useMemo(\n () =>\n createGchatClient({\n baseUrl: config.baseUrl,\n token: config.token,\n language: config.language,\n idWl: config.idWl,\n }),\n [config.baseUrl, config.token, config.language, config.idWl],\n );\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { Inbox, InboxStats } from \"../types\";\nimport {\n type GchatHookConfig,\n DEFAULT_INBOX_POLLING,\n useGchatClient,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Queries\n// ---------------------------------------------------------------------------\n\nexport function useInboxes(\n config: GchatHookConfig,\n statusFilter?: string,\n pollingInterval?: number,\n) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"inboxes\", config.accountId, statusFilter],\n queryFn: () => {\n const params: Record<string, string> = {};\n if (statusFilter && statusFilter !== \"all\") {\n params.status = statusFilter;\n }\n return client.listInboxes(config.accountId, params);\n },\n enabled: !!config.accountId && !!config.token,\n refetchInterval: pollingInterval ?? DEFAULT_INBOX_POLLING,\n select: (res) => res.data || [],\n });\n}\n\nexport function useInbox(config: GchatHookConfig, id: number | null) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"inbox\", config.accountId, id],\n queryFn: () => client.getInbox(config.accountId, id!),\n enabled: !!config.accountId && !!config.token && !!id,\n select: (res) => {\n const d = res.data;\n return (Array.isArray(d) ? d[0] : d) as Inbox;\n },\n });\n}\n\nexport function useInboxStats(\n config: GchatHookConfig,\n pollingInterval?: number,\n) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"inbox-stats\", config.accountId],\n queryFn: () => client.getInboxStats(config.accountId),\n enabled: !!config.accountId && !!config.token,\n refetchInterval: pollingInterval ?? DEFAULT_INBOX_POLLING,\n select: (res) => {\n const d = res.data;\n return (Array.isArray(d) ? d[0] : d) as InboxStats;\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Mutations\n// ---------------------------------------------------------------------------\n\nexport function useCreateInbox(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (body: { id_channel: number; id_contact: number }) =>\n client.createInbox(config.accountId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inboxes\"],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inbox-stats\"],\n });\n },\n });\n}\n\nexport function useUpdateInbox(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n id,\n body,\n }: {\n id: number;\n body: Partial<Pick<Inbox, \"status\" | \"id_agent\">>;\n }) => client.updateInbox(config.accountId, id, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inboxes\"],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inbox-stats\"],\n });\n },\n });\n}\n\nexport function useDeleteInbox(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (id: number) => client.deleteInbox(config.accountId, id),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inboxes\"],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inbox-stats\"],\n });\n },\n });\n}\n","import { useMemo, useSyncExternalStore } from \"react\";\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { InboxMessage } from \"../types\";\nimport {\n type GchatHookConfig,\n DEFAULT_MESSAGES_POLLING,\n useGchatClient,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Optimistic message store (module-level — survives server refetches)\n// ---------------------------------------------------------------------------\n\nconst optimisticStore = new Map<string, InboxMessage[]>();\nlet nextOptimisticId = -1;\n\n// useSyncExternalStore subscription — guarantees synchronous re-renders\nlet storeVersion = 0;\nconst listeners = new Set<() => void>();\n\nfunction subscribeStore(listener: () => void) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nfunction getStoreVersion() {\n return storeVersion;\n}\n\nfunction storeKey(accountId: number, idInbox: number) {\n return `${accountId}:${idInbox}`;\n}\n\nfunction getOptimistic(accountId: number, idInbox: number): InboxMessage[] {\n return optimisticStore.get(storeKey(accountId, idInbox)) || [];\n}\n\nfunction setOptimistic(\n accountId: number,\n idInbox: number,\n msgs: InboxMessage[],\n) {\n const key = storeKey(accountId, idInbox);\n if (msgs.length === 0) {\n optimisticStore.delete(key);\n } else {\n optimisticStore.set(key, msgs);\n }\n storeVersion++;\n listeners.forEach((fn) => fn());\n}\n\n/**\n * Silently clean up the store without notifying listeners (avoids render loops).\n * Used inside useMemo to remove optimistic messages confirmed by the server.\n */\nfunction cleanupOptimistic(\n accountId: number,\n idInbox: number,\n msgs: InboxMessage[],\n) {\n const key = storeKey(accountId, idInbox);\n if (msgs.length === 0) {\n optimisticStore.delete(key);\n } else {\n optimisticStore.set(key, msgs);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Query\n// ---------------------------------------------------------------------------\n\nexport function useInboxMessages(\n config: GchatHookConfig,\n idInbox: number | null,\n pollingInterval?: number,\n) {\n const client = useGchatClient(config);\n\n // Subscribe to optimistic store — re-renders when store changes\n const optimisticVersion = useSyncExternalStore(\n subscribeStore,\n getStoreVersion,\n getStoreVersion,\n );\n\n const query = useQuery({\n queryKey: [\"greatchat\", \"inbox-messages\", config.accountId, idInbox],\n queryFn: () =>\n client.listInboxMessages(config.accountId, {\n id_inbox: String(idInbox!),\n sort: \"datetime_add:asc\",\n limit: \"100\",\n }),\n enabled: !!config.accountId && !!config.token && !!idInbox,\n refetchInterval: pollingInterval ?? DEFAULT_MESSAGES_POLLING,\n select: (res) => res.data || [],\n });\n\n // Merge server data with optimistic messages\n const messages = useMemo(() => {\n const serverMessages = query.data || [];\n if (!config.accountId || !idInbox) return serverMessages;\n\n const optimistic = getOptimistic(config.accountId, idInbox);\n if (!optimistic.length) return serverMessages;\n\n // Separate overrides (positive ID = retry) from new messages (negative ID = send)\n const overrides = new Map<number, InboxMessage>();\n const newOptimistic: InboxMessage[] = [];\n for (const om of optimistic) {\n if (om.id > 0) {\n overrides.set(om.id, om);\n } else {\n newOptimistic.push(om);\n }\n }\n\n // Apply overrides to server messages (replace in-place)\n const merged =\n overrides.size > 0\n ? serverMessages.map((sm) => overrides.get(sm.id) ?? sm)\n : serverMessages;\n\n // Auto-cleanup: remove overrides when server no longer shows \"failed\"\n if (overrides.size > 0) {\n for (const [id] of overrides) {\n const sm = serverMessages.find((s) => s.id === id);\n if (sm && sm.status !== \"failed\") {\n overrides.delete(id);\n }\n }\n }\n\n // One-to-one matching for new optimistic messages (negative IDs)\n const stillNeeded: InboxMessage[] = [];\n const claimed = new Set<number>();\n\n for (const om of newOptimistic) {\n // Always keep failed messages (until user retries or dismisses)\n if (om.status === \"failed\") {\n stillNeeded.push(om);\n continue;\n }\n\n // Find a matching server message that hasn't been claimed yet\n const matchIdx = merged.findIndex(\n (sm, i) =>\n !claimed.has(i) &&\n sm.direction === \"outbound\" &&\n sm.content === om.content &&\n sm.content_type === om.content_type &&\n sm.source === om.source,\n );\n\n if (matchIdx >= 0) {\n claimed.add(matchIdx); // server confirmed this one\n } else {\n stillNeeded.push(om); // keep showing optimistic\n }\n }\n\n // Silently clean up confirmed messages (no re-notification)\n const allKept = [...Array.from(overrides.values()), ...stillNeeded];\n if (allKept.length !== optimistic.length) {\n cleanupOptimistic(config.accountId, idInbox, allKept);\n }\n\n // Sort by datetime to keep chronological order\n const result = [...merged, ...stillNeeded];\n result.sort(\n (a, b) =>\n new Date(a.datetime_add).getTime() -\n new Date(b.datetime_add).getTime(),\n );\n return result;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query.data, config.accountId, idInbox, optimisticVersion]);\n\n return { ...query, data: messages };\n}\n\n// ---------------------------------------------------------------------------\n// Send mutation\n// ---------------------------------------------------------------------------\n\nexport function useSendMessage(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n idInbox,\n content,\n }: {\n idInbox: number;\n content: string;\n }) => {\n const result = await client.sendMessage(config.accountId, {\n id_inbox: idInbox,\n content,\n content_type: \"text\",\n source: \"agent\",\n direction: \"outbound\",\n });\n\n if (result.status === 0) {\n throw new Error(result.message || \"Erro desconhecido ao enviar\");\n }\n\n return result;\n },\n\n onMutate: (variables) => {\n const msg: InboxMessage = {\n id: nextOptimisticId--,\n id_account: config.accountId,\n id_inbox: variables.idInbox,\n id_contact: null,\n direction: \"outbound\",\n content: variables.content,\n content_type: \"text\",\n content_url: null,\n metadata: null,\n external_id: null,\n status: \"pending\",\n source: \"agent\",\n is_private: false,\n datetime_add: new Date().toISOString(),\n datetime_alt: null,\n };\n\n const current = getOptimistic(config.accountId, variables.idInbox);\n setOptimistic(config.accountId, variables.idInbox, [...current, msg]);\n\n return { optimisticMsg: msg };\n },\n\n onError: (error, variables, context) => {\n if (!context) return;\n const { optimisticMsg } = context;\n\n const current = getOptimistic(config.accountId, variables.idInbox);\n setOptimistic(\n config.accountId,\n variables.idInbox,\n current.map((m) =>\n m.id === optimisticMsg.id\n ? { ...m, status: \"failed\" as const, _error: error.message }\n : m,\n ),\n );\n },\n\n onSuccess: (_result, variables, context) => {\n if (!context) return;\n const { optimisticMsg } = context;\n\n const current = getOptimistic(config.accountId, variables.idInbox);\n setOptimistic(\n config.accountId,\n variables.idInbox,\n current.filter((m) => m.id !== optimisticMsg.id),\n );\n queryClient.invalidateQueries({\n queryKey: [\n \"greatchat\",\n \"inbox-messages\",\n config.accountId,\n variables.idInbox,\n ],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inboxes\"],\n });\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Retry failed message (updates in-place, same bubble transitions states)\n// ---------------------------------------------------------------------------\n\nexport function useRetryMessage(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return async (message: InboxMessage) => {\n if (!config.accountId || !config.token || !message.content) return;\n\n // Add as override with status \"pending\"\n const current = getOptimistic(config.accountId, message.id_inbox);\n setOptimistic(config.accountId, message.id_inbox, [\n ...current.filter((m) => m.id !== message.id),\n {\n ...message,\n status: \"pending\" as const,\n _error: undefined,\n datetime_add: new Date().toISOString(),\n },\n ]);\n\n try {\n const result = await client.sendMessage(config.accountId, {\n id_inbox: message.id_inbox,\n content: message.content,\n content_type: message.content_type,\n source: \"agent\",\n direction: \"outbound\",\n });\n\n if (result.status === 0) {\n throw new Error(result.message || \"Erro desconhecido ao enviar\");\n }\n\n const after = getOptimistic(config.accountId, message.id_inbox);\n setOptimistic(\n config.accountId,\n message.id_inbox,\n after.filter((m) => m.id !== message.id),\n );\n queryClient.invalidateQueries({\n queryKey: [\n \"greatchat\",\n \"inbox-messages\",\n config.accountId,\n message.id_inbox,\n ],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"inboxes\"],\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Erro ao enviar mensagem\";\n const after = getOptimistic(config.accountId, message.id_inbox);\n setOptimistic(\n config.accountId,\n message.id_inbox,\n after.map((m) =>\n m.id === message.id\n ? { ...m, status: \"failed\" as const, _error: errorMessage }\n : m,\n ),\n );\n }\n };\n}\n\n// ---------------------------------------------------------------------------\n// Revoke message\n// ---------------------------------------------------------------------------\n\nexport function useRevokeMessage(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({ id }: { id: number; idInbox: number }) =>\n client.revokeMessage(config.accountId, id),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [\n \"greatchat\",\n \"inbox-messages\",\n config.accountId,\n variables.idInbox,\n ],\n });\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Edit message\n// ---------------------------------------------------------------------------\n\nexport function useEditMessage(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n id,\n content,\n }: {\n id: number;\n idInbox: number;\n content: string;\n }) => client.editMessage(config.accountId, id, { content }),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [\n \"greatchat\",\n \"inbox-messages\",\n config.accountId,\n variables.idInbox,\n ],\n });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { Contact } from \"../types\";\nimport { type GchatHookConfig, useGchatClient } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Queries\n// ---------------------------------------------------------------------------\n\nexport function useContacts(\n config: GchatHookConfig,\n params?: Record<string, string>,\n) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"contacts\", config.accountId, params],\n queryFn: () => client.listContacts(config.accountId, params),\n enabled: !!config.accountId && !!config.token,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useGetContact(\n config: GchatHookConfig,\n contactId: number | null,\n) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"contact\", config.accountId, contactId],\n queryFn: () => client.getContact(config.accountId, contactId!),\n enabled: !!config.accountId && !!config.token && !!contactId,\n select: (res) => {\n const d = res.data;\n return (Array.isArray(d) ? d[0] : d) as Contact;\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Mutations\n// ---------------------------------------------------------------------------\n\nexport function useCreateContact(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (body: {\n name: string;\n phone_number?: string;\n identifier?: string;\n }) => client.createContact(config.accountId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"contacts\"],\n });\n },\n });\n}\n\nexport function useUpdateContact(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n id,\n body,\n }: {\n id: number;\n body: { name?: string; phone_number?: string; identifier?: string };\n }) => client.updateContact(config.accountId, id, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"contacts\"],\n });\n },\n });\n}\n\nexport function useDeleteContact(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (id: number) => client.deleteContact(config.accountId, id),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"contacts\"],\n });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { Channel, WhatsappStatus } from \"../types\";\nimport {\n type GchatHookConfig,\n DEFAULT_CHANNEL_STATUS_POLLING,\n DEFAULT_QR_POLLING,\n useGchatClient,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Queries\n// ---------------------------------------------------------------------------\n\nexport function useChannels(config: GchatHookConfig) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"channels\", config.accountId],\n queryFn: () => client.listChannels(config.accountId),\n enabled: !!config.accountId && !!config.token,\n select: (res) => res.data || [],\n });\n}\n\nexport function useChannelWhatsappStatus(\n config: GchatHookConfig,\n channelId: number | null,\n enabled = true,\n pollingInterval?: number,\n) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"channel-status\", config.accountId, channelId],\n queryFn: () =>\n client.getChannelWhatsappStatus(config.accountId, channelId!),\n enabled: !!config.accountId && !!config.token && !!channelId && enabled,\n refetchInterval: pollingInterval ?? DEFAULT_CHANNEL_STATUS_POLLING,\n select: (res) => {\n const d = res.data;\n return (Array.isArray(d) ? d[0] : d) as WhatsappStatus;\n },\n });\n}\n\nexport function useChannelQR(\n config: GchatHookConfig,\n channelId: number | null,\n enabled = false,\n pollingInterval?: number,\n) {\n const client = useGchatClient(config);\n\n return useQuery({\n queryKey: [\"greatchat\", \"channel-qr\", config.accountId, channelId],\n queryFn: () => client.getChannelQR(config.accountId, channelId!),\n enabled: !!config.accountId && !!config.token && !!channelId && enabled,\n refetchInterval: pollingInterval ?? DEFAULT_QR_POLLING,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Mutations\n// ---------------------------------------------------------------------------\n\nexport function useCreateChannel(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (\n body: Pick<Channel, \"name\" | \"type\" | \"provider\"> &\n Partial<Pick<Channel, \"identifier\" | \"id_agent\">>,\n ) => client.createChannel(config.accountId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"channels\"],\n });\n },\n });\n}\n\nexport function useUpdateChannel(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n id,\n body,\n }: {\n id: number;\n body: Partial<\n Pick<Channel, \"name\" | \"identifier\" | \"status\" | \"id_agent\">\n >;\n }) => client.updateChannel(config.accountId, id, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"channels\"],\n });\n },\n });\n}\n\nexport function useDeleteChannel(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (channelId: number) =>\n client.deleteChannel(config.accountId, channelId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"channels\"],\n });\n },\n });\n}\n\nexport function useConnectChannel(config: GchatHookConfig) {\n const client = useGchatClient(config);\n\n return useMutation({\n mutationFn: (channelId: number) =>\n client.connectChannel(config.accountId, channelId),\n });\n}\n\nexport function useDisconnectChannel(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (channelId: number) =>\n client.disconnectChannel(config.accountId, channelId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"channel-status\"],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"channels\"],\n });\n },\n });\n}\n\nexport function useLogoutChannel(config: GchatHookConfig) {\n const client = useGchatClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (channelId: number) =>\n client.logoutChannel(config.accountId, channelId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"channel-status\"],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatchat\", \"channels\"],\n });\n },\n });\n}\n","import { useRef, useEffect } from \"react\";\nimport type { InboxMessage } from \"../types\";\nimport { groupMessagesByDate } from \"../utils/group-messages\";\nimport { formatDateGroup } from \"../utils/format-date\";\nimport { MessageBubble } from \"./message-bubble\";\nimport { ChatInput } from \"./chat-input\";\nimport { Skeleton, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@greatapps/greatauth-ui/ui\";\n\nexport interface ChatViewProps {\n messages: InboxMessage[];\n isLoading: boolean;\n inboxStatus?: string;\n onStatusChange?: (status: string) => void;\n onSend: (content: string) => void;\n onRetry?: (message: InboxMessage) => void;\n onRevoke?: (message: InboxMessage) => void;\n onEdit?: (message: InboxMessage, newContent: string) => void;\n sendDisabled?: boolean;\n renderHeader?: React.ReactNode;\n renderStatusDropdown?: React.ReactNode;\n}\n\nexport function ChatView({\n messages,\n isLoading,\n inboxStatus,\n onStatusChange,\n onSend,\n onRetry,\n onRevoke,\n onEdit,\n sendDisabled,\n renderHeader,\n renderStatusDropdown,\n}: ChatViewProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const prevMessageCount = useRef(0);\n\n useEffect(() => {\n if (messages && messages.length > prevMessageCount.current) {\n const el = scrollRef.current;\n if (el) {\n setTimeout(() => {\n el.scrollTop = el.scrollHeight;\n }, 50);\n }\n }\n prevMessageCount.current = messages?.length || 0;\n }, [messages]);\n\n const groups = messages ? groupMessagesByDate(messages) : [];\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Header */}\n {renderHeader !== undefined ? (\n renderHeader\n ) : (\n <div className=\"flex items-center justify-between border-b px-4 py-3\">\n <div className=\"flex-1\" />\n {renderStatusDropdown !== undefined ? (\n renderStatusDropdown\n ) : onStatusChange ? (\n <Select\n value={inboxStatus}\n onValueChange={onStatusChange}\n >\n <SelectTrigger className=\"w-[130px] h-8 text-xs\">\n <SelectValue placeholder=\"Status\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"open\">Aberta</SelectItem>\n <SelectItem value=\"pending\">Pendente</SelectItem>\n <SelectItem value=\"resolved\">Resolvida</SelectItem>\n </SelectContent>\n </Select>\n ) : null}\n </div>\n )}\n\n {/* Messages */}\n <div ref={scrollRef} className=\"flex-1 overflow-y-auto p-4\">\n {isLoading ? (\n <div className=\"space-y-4\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div\n key={i}\n className={`flex ${i % 2 === 0 ? \"justify-start\" : \"justify-end\"}`}\n >\n <Skeleton className=\"h-12 w-64 rounded-lg\" />\n </div>\n ))}\n </div>\n ) : groups.length === 0 ? (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n Nenhuma mensagem ainda\n </div>\n ) : (\n <div className=\"space-y-4\">\n {groups.map((group, gi) => (\n <div key={gi}>\n <div className=\"mb-3 flex justify-center\">\n <span className=\"rounded-full bg-muted px-3 py-1 text-[11px] text-muted-foreground\">\n {formatDateGroup(group.date)}\n </span>\n </div>\n <div className=\"space-y-1\">\n {group.messages.map((msg) => (\n <MessageBubble\n key={msg.id}\n message={msg}\n onRetry={onRetry}\n onRevoke={onRevoke}\n onEdit={onEdit}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Input */}\n <ChatInput onSend={onSend} disabled={sendDisabled} />\n </div>\n );\n}\n","import { useState } from \"react\";\nimport type { InboxMessage } from \"../types\";\nimport { formatMessageTime } from \"../utils/format-date\";\nimport {\n Check,\n CheckCheck,\n AlertCircle,\n Clock,\n Video,\n File,\n MapPin,\n Headphones,\n RotateCcw,\n MoreHorizontal,\n Trash2,\n Pencil,\n Ban,\n} from \"lucide-react\";\nimport {\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n Textarea,\n} from \"@greatapps/greatauth-ui/ui\";\n\nconst statusIcons: Record<string, React.ReactNode> = {\n pending: <Clock className=\"h-3 w-3 animate-pulse\" />,\n sent: <Check className=\"h-3 w-3\" />,\n delivered: <CheckCheck className=\"h-3 w-3\" />,\n read: <CheckCheck className=\"h-3 w-3 text-blue-500\" />,\n failed: <AlertCircle className=\"h-3 w-3 text-destructive\" />,\n};\n\nfunction parseMetadata(metadata: string | null): Record<string, unknown> {\n if (!metadata) return {};\n try {\n return JSON.parse(metadata);\n } catch {\n return {};\n }\n}\n\nfunction MediaContent({ message }: { message: InboxMessage }) {\n switch (message.content_type) {\n case \"image\":\n return (\n <div className=\"space-y-1\">\n {message.content_url && (\n <img\n src={message.content_url}\n alt=\"Imagem\"\n className=\"max-w-[240px] rounded-md\"\n />\n )}\n {message.content && <p className=\"text-sm\">{message.content}</p>}\n </div>\n );\n case \"audio\":\n return (\n <div className=\"flex items-center gap-2\">\n <Headphones className=\"h-4 w-4\" />\n <span className=\"text-sm\">Mensagem de áudio</span>\n </div>\n );\n case \"video\":\n return (\n <div className=\"flex items-center gap-2\">\n <Video className=\"h-4 w-4\" />\n <span className=\"text-sm\">Vídeo</span>\n {message.content && <p className=\"text-sm\">{message.content}</p>}\n </div>\n );\n case \"document\": {\n const meta = parseMetadata(message.metadata);\n return (\n <div className=\"flex items-center gap-2\">\n <File className=\"h-4 w-4\" />\n <span className=\"text-sm\">\n {(meta.filename as string) || \"Documento\"}\n </span>\n </div>\n );\n }\n case \"location\":\n return (\n <div className=\"flex items-center gap-2\">\n <MapPin className=\"h-4 w-4\" />\n <span className=\"text-sm\">Localização</span>\n </div>\n );\n default:\n return null;\n }\n}\n\nexport interface MessageBubbleProps {\n message: InboxMessage;\n onRetry?: (message: InboxMessage) => void;\n onRevoke?: (message: InboxMessage) => void;\n onEdit?: (message: InboxMessage, newContent: string) => void;\n renderActions?: (message: InboxMessage) => React.ReactNode;\n}\n\nexport function MessageBubble({\n message,\n onRetry,\n onRevoke,\n onEdit,\n renderActions,\n}: MessageBubbleProps) {\n const [showRevokeDialog, setShowRevokeDialog] = useState(false);\n const [editing, setEditing] = useState(false);\n const [editContent, setEditContent] = useState(message.content || \"\");\n\n const isOutbound = message.direction === \"outbound\";\n const isPending = message.status === \"pending\";\n const isFailed = message.status === \"failed\";\n const time = formatMessageTime(message.datetime_add);\n\n const meta = parseMetadata(message.metadata);\n const isRevoked = meta.revoked === true;\n const isEdited = meta.edited === true;\n\n const agentLabel =\n isOutbound && message.source !== \"contact\"\n ? (meta.agent_name as string) ||\n (message.source === \"bot\" ? \"Bot\" : \"Agente\")\n : null;\n\n const canAct =\n isOutbound &&\n message.id > 0 &&\n !isPending &&\n !isFailed &&\n !isRevoked &&\n !!message.external_id;\n\n const canEdit = canAct && message.content_type === \"text\";\n\n function handleSaveEdit() {\n const trimmed = editContent.trim();\n if (!trimmed || trimmed === message.content) {\n setEditing(false);\n return;\n }\n onEdit?.(message, trimmed);\n setEditing(false);\n }\n\n if (isRevoked) {\n return (\n <div\n className={cn(\"flex\", isOutbound ? \"justify-end\" : \"justify-start\")}\n >\n <div className=\"max-w-[75%]\">\n <div\n className={cn(\n \"rounded-lg px-3 py-2\",\n isOutbound ? \"bg-primary/40\" : \"bg-muted/60\",\n )}\n >\n <div className=\"flex items-center gap-1.5\">\n <Ban\n className={cn(\n \"h-3.5 w-3.5\",\n isOutbound\n ? \"text-primary-foreground/50\"\n : \"text-muted-foreground\",\n )}\n />\n <p\n className={cn(\n \"text-sm italic\",\n isOutbound\n ? \"text-primary-foreground/50\"\n : \"text-muted-foreground\",\n )}\n >\n Mensagem apagada\n </p>\n </div>\n <div\n className={cn(\n \"mt-1 flex items-center justify-end gap-1\",\n isOutbound\n ? \"text-primary-foreground/40\"\n : \"text-muted-foreground/60\",\n )}\n >\n <span className=\"text-[10px]\">{time}</span>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"flex group\",\n isOutbound ? \"justify-end\" : \"justify-start\",\n )}\n >\n <div className=\"max-w-[75%] relative\">\n {canAct && (\n <div className=\"absolute -top-1 right-1 opacity-0 group-hover:opacity-100 transition-opacity z-10\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button className=\"h-6 w-6 rounded-full bg-background/80 shadow-sm flex items-center justify-center hover:bg-background\">\n <MoreHorizontal className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-40\">\n {canEdit && (\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n setEditing(true);\n setEditContent(message.content || \"\");\n }}\n >\n <Pencil className=\"h-4 w-4 mr-2\" />\n Editar\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n setShowRevokeDialog(true);\n }}\n className=\"text-destructive focus:text-destructive\"\n >\n <Trash2 className=\"h-4 w-4 mr-2\" />\n Apagar para todos\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )}\n\n {renderActions?.(message)}\n\n <div\n className={cn(\n \"rounded-lg px-3 py-2\",\n isOutbound ? \"bg-primary text-primary-foreground\" : \"bg-muted\",\n isPending && \"opacity-70\",\n isFailed && \"bg-destructive/10 border border-destructive/30\",\n )}\n >\n {agentLabel && (\n <p\n className={cn(\n \"mb-0.5 text-[10px] font-medium\",\n isFailed\n ? \"text-destructive/70\"\n : isOutbound\n ? \"text-primary-foreground/70\"\n : \"text-muted-foreground\",\n )}\n >\n {agentLabel}\n </p>\n )}\n\n {editing ? (\n <div className=\"space-y-2\">\n <Textarea\n value={editContent}\n onChange={(e) => setEditContent(e.target.value)}\n rows={2}\n className=\"min-h-[36px] max-h-[120px] resize-none bg-background text-foreground text-sm\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSaveEdit();\n }\n if (e.key === \"Escape\") {\n setEditing(false);\n }\n }}\n />\n <div className=\"flex justify-end gap-1.5\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 text-xs px-2\"\n onClick={() => setEditing(false)}\n >\n Cancelar\n </Button>\n <Button\n size=\"sm\"\n className=\"h-6 text-xs px-2\"\n onClick={handleSaveEdit}\n disabled={\n !editContent.trim() ||\n editContent.trim() === message.content\n }\n >\n Salvar\n </Button>\n </div>\n </div>\n ) : message.content_type === \"text\" ? (\n <p\n className={cn(\n \"text-sm whitespace-pre-wrap break-words\",\n isFailed && \"text-foreground\",\n )}\n >\n {message.content}\n </p>\n ) : (\n <MediaContent message={message} />\n )}\n\n {!editing && (\n <div\n className={cn(\n \"mt-1 flex items-center justify-end gap-1\",\n isFailed\n ? \"text-destructive\"\n : isOutbound\n ? \"text-primary-foreground/60\"\n : \"text-muted-foreground\",\n )}\n >\n {isEdited && (\n <span className=\"text-[10px] italic\">editada</span>\n )}\n <span className=\"text-[10px]\">{time}</span>\n {isOutbound && statusIcons[message.status]}\n </div>\n )}\n </div>\n\n {isFailed && (\n <div className=\"mt-1 flex items-center gap-1.5 justify-end px-1\">\n <AlertCircle className=\"h-3 w-3 shrink-0 text-destructive\" />\n <span className=\"text-[11px] text-destructive\">\n {message._error || \"Erro ao enviar\"}\n </span>\n {onRetry && (\n <button\n onClick={() => onRetry(message)}\n className=\"inline-flex items-center gap-0.5 text-[11px] text-destructive font-medium hover:text-destructive/80 hover:underline cursor-pointer ml-1\"\n >\n <RotateCcw className=\"h-3 w-3\" />\n Reenviar\n </button>\n )}\n </div>\n )}\n </div>\n\n <AlertDialog open={showRevokeDialog} onOpenChange={setShowRevokeDialog}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Apagar mensagem?</AlertDialogTitle>\n <AlertDialogDescription>\n A mensagem será apagada para todos no WhatsApp. Ela continuará\n visível aqui como "mensagem apagada".\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n onClick={() => onRevoke?.(message)}\n >\n Apagar para todos\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","import { useState, useRef } from \"react\";\nimport { Send } from \"lucide-react\";\nimport { Button, Textarea } from \"@greatapps/greatauth-ui/ui\";\n\nexport interface ChatInputProps {\n onSend: (content: string) => void;\n disabled?: boolean;\n}\n\nexport function ChatInput({ onSend, disabled }: ChatInputProps) {\n const [content, setContent] = useState(\"\");\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n function handleSend() {\n const text = content.trim();\n if (!text || disabled) return;\n\n setContent(\"\");\n onSend(text);\n textareaRef.current?.focus();\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n }\n\n return (\n <div className=\"border-t p-3\">\n <div className=\"flex items-end gap-2\">\n <Textarea\n ref={textareaRef}\n placeholder=\"Digite uma mensagem...\"\n value={content}\n onChange={(e) => setContent(e.target.value)}\n onKeyDown={handleKeyDown}\n rows={1}\n className=\"min-h-[40px] max-h-[120px] resize-none\"\n />\n <Button\n size=\"icon\"\n onClick={handleSend}\n disabled={!content.trim() || disabled}\n className=\"shrink-0\"\n >\n <Send className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n );\n}\n","import { Avatar, AvatarFallback, cn } from \"@greatapps/greatauth-ui/ui\";\n\nconst COLORS = [\n \"bg-red-100 text-red-700 dark:bg-red-900 dark:text-red-300\",\n \"bg-orange-100 text-orange-700 dark:bg-orange-900 dark:text-orange-300\",\n \"bg-amber-100 text-amber-700 dark:bg-amber-900 dark:text-amber-300\",\n \"bg-emerald-100 text-emerald-700 dark:bg-emerald-900 dark:text-emerald-300\",\n \"bg-cyan-100 text-cyan-700 dark:bg-cyan-900 dark:text-cyan-300\",\n \"bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-300\",\n \"bg-violet-100 text-violet-700 dark:bg-violet-900 dark:text-violet-300\",\n \"bg-pink-100 text-pink-700 dark:bg-pink-900 dark:text-pink-300\",\n];\n\nconst SIZE_MAP = {\n sm: \"h-8 w-8 text-xs\",\n md: \"h-10 w-10 text-xs\",\n lg: \"h-16 w-16 text-lg\",\n} as const;\n\nfunction hashCode(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n return Math.abs(hash);\n}\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n return (name[0] || \"?\").toUpperCase();\n}\n\nexport interface ContactAvatarProps {\n name: string | null;\n className?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nexport function ContactAvatar({\n name,\n className,\n size = \"md\",\n}: ContactAvatarProps) {\n const displayName = name || \"?\";\n const color = COLORS[hashCode(displayName) % COLORS.length];\n const initials = getInitials(displayName);\n\n return (\n <Avatar className={cn(SIZE_MAP[size], className)}>\n <AvatarFallback className={cn(\"font-medium\", color)}>\n {initials}\n </AvatarFallback>\n </Avatar>\n );\n}\n","import { useState } from \"react\";\nimport type { Inbox } from \"../types\";\nimport { ContactAvatar } from \"./contact-avatar\";\nimport {\n Badge,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n cn,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\nimport { Trash2 } from \"lucide-react\";\n\nconst statusColors: Record<string, string> = {\n open: \"bg-green-500/10 text-green-600 border-green-200\",\n pending: \"bg-yellow-500/10 text-yellow-600 border-yellow-200\",\n resolved: \"bg-zinc-500/10 text-zinc-500 border-zinc-200\",\n};\n\nconst statusLabels: Record<string, string> = {\n open: \"Aberta\",\n pending: \"Pendente\",\n resolved: \"Resolvida\",\n};\n\nexport interface InboxItemProps {\n inbox: Inbox;\n isSelected: boolean;\n onClick: () => void;\n onDelete?: (id: number) => void;\n renderActions?: (inbox: Inbox) => React.ReactNode;\n}\n\nexport function InboxItem({\n inbox,\n isSelected,\n onClick,\n onDelete,\n renderActions,\n}: InboxItemProps) {\n const [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\n const timestamp = inbox.last_message_at || inbox.datetime_add;\n const timeAgo = formatDistanceToNow(new Date(timestamp), {\n addSuffix: true,\n locale: ptBR,\n });\n\n const lastMessage =\n inbox.last_message_content_type === \"text\"\n ? inbox.last_message_content\n : inbox.last_message_content_type\n ? `[${inbox.last_message_content_type}]`\n : null;\n\n const directionPrefix =\n inbox.last_message_direction === \"outbound\" ? \"Você: \" : \"\";\n\n return (\n <>\n <div\n className={cn(\n \"flex w-full items-start gap-3 rounded-md p-3 text-left transition-colors hover:bg-accent group relative cursor-pointer\",\n isSelected && \"bg-accent\",\n )}\n onClick={onClick}\n >\n <ContactAvatar\n name={inbox.contact_name}\n className=\"mt-0.5\"\n size=\"md\"\n />\n\n <div className=\"flex-1 overflow-hidden\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"truncate font-medium text-sm\">\n {inbox.contact_name || \"Desconhecido\"}\n </span>\n <div className=\"flex items-center gap-1 shrink-0\">\n <span className=\"text-xs text-muted-foreground\">{timeAgo}</span>\n {renderActions?.(inbox)}\n {onDelete && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n className=\"h-5 w-5 rounded flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity hover:bg-muted text-destructive\"\n onClick={(e) => {\n e.stopPropagation();\n setShowDeleteDialog(true);\n }}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Excluir conversa</TooltipContent>\n </Tooltip>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center justify-between gap-2 mt-0.5\">\n <p className=\"truncate text-xs text-muted-foreground\">\n {lastMessage\n ? `${directionPrefix}${lastMessage}`\n : \"Sem mensagens\"}\n </p>\n <Badge\n variant=\"outline\"\n className={cn(\n \"shrink-0 text-[10px] px-1.5 py-0\",\n statusColors[inbox.status],\n )}\n >\n {statusLabels[inbox.status] || inbox.status}\n </Badge>\n </div>\n </div>\n </div>\n\n <AlertDialog open={showDeleteDialog} onOpenChange={setShowDeleteDialog}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Excluir conversa?</AlertDialogTitle>\n <AlertDialogDescription>\n A conversa com {inbox.contact_name || \"este contato\"} será removida\n da lista. As mensagens não serão apagadas do WhatsApp.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n onClick={() => onDelete?.(inbox.id)}\n >\n Excluir\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport type { Inbox } from \"../types\";\nimport { InboxItem } from \"./inbox-item\";\nimport { Input, Tabs, TabsList, TabsTrigger, Button, Skeleton, ScrollArea } from \"@greatapps/greatauth-ui/ui\";\nimport { Search, Plus, Inbox as InboxIcon } from \"lucide-react\";\n\nconst STATUS_TABS = [\n { value: \"all\", label: \"Todas\" },\n { value: \"open\", label: \"Abertas\" },\n { value: \"pending\", label: \"Pendentes\" },\n { value: \"resolved\", label: \"Resolvidas\" },\n];\n\nexport interface InboxSidebarProps {\n inboxes: Inbox[] | undefined;\n isLoading: boolean;\n selectedInboxId: number | null;\n onSelectInbox: (inbox: Inbox) => void;\n onDeleteInbox?: (id: number) => void;\n onCreateInbox?: () => void;\n filterChannelId?: number | null;\n renderHeader?: React.ReactNode;\n renderFooter?: React.ReactNode;\n}\n\nexport function InboxSidebar({\n inboxes,\n isLoading,\n selectedInboxId,\n onSelectInbox,\n onDeleteInbox,\n onCreateInbox,\n filterChannelId,\n renderHeader,\n renderFooter,\n}: InboxSidebarProps) {\n const [search, setSearch] = useState(\"\");\n const [statusFilter, setStatusFilter] = useState(\"all\");\n\n const filtered = useMemo(() => {\n if (!inboxes) return [];\n let list = inboxes;\n\n if (filterChannelId != null) {\n list = list.filter((i) => i.id_channel === filterChannelId);\n }\n\n if (statusFilter !== \"all\") {\n list = list.filter((i) => i.status === statusFilter);\n }\n\n if (search) {\n const q = search.toLowerCase();\n list = list.filter(\n (i) =>\n i.contact_name?.toLowerCase().includes(q) ||\n i.contact_phone?.toLowerCase().includes(q) ||\n i.contact_identifier?.toLowerCase().includes(q) ||\n i.last_message_content?.toLowerCase().includes(q),\n );\n }\n\n return [...list].sort((a, b) => {\n const dateA = a.last_message_at || a.datetime_add;\n const dateB = b.last_message_at || b.datetime_add;\n return new Date(dateB).getTime() - new Date(dateA).getTime();\n });\n }, [inboxes, statusFilter, search, filterChannelId]);\n\n return (\n <div className=\"flex h-full flex-col\">\n {renderHeader}\n\n <div className=\"flex flex-col gap-3 p-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Buscar...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9 h-8 text-sm\"\n />\n </div>\n {onCreateInbox && (\n <Button\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n onClick={onCreateInbox}\n >\n <Plus className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n <Tabs value={statusFilter} onValueChange={setStatusFilter}>\n <TabsList className=\"w-full\">\n {STATUS_TABS.map((tab) => (\n <TabsTrigger\n key={tab.value}\n value={tab.value}\n className=\"flex-1 text-xs\"\n >\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n </div>\n\n <ScrollArea className=\"flex-1 px-2\">\n {isLoading ? (\n <div className=\"space-y-2 p-2\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 p-3\">\n <Skeleton className=\"h-10 w-10 rounded-full shrink-0\" />\n <div className=\"flex-1 space-y-1.5\">\n <Skeleton className=\"h-4 w-28\" />\n <Skeleton className=\"h-3 w-40\" />\n </div>\n </div>\n ))}\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center gap-2 py-8 text-sm text-muted-foreground\">\n <InboxIcon className=\"h-8 w-8 opacity-50\" />\n Nenhuma conversa encontrada\n </div>\n ) : (\n filtered.map((inbox) => (\n <InboxItem\n key={inbox.id}\n inbox={inbox}\n isSelected={inbox.id === selectedInboxId}\n onClick={() => onSelectInbox(inbox)}\n onDelete={onDeleteInbox}\n />\n ))\n )}\n </ScrollArea>\n\n {renderFooter}\n </div>\n );\n}\n","import type { Contact } from \"../types\";\nimport { ContactAvatar } from \"./contact-avatar\";\nimport { Button, Skeleton, Separator, cn } from \"@greatapps/greatauth-ui/ui\";\nimport {\n X,\n Phone,\n Fingerprint,\n Calendar,\n CalendarClock,\n Hash,\n} from \"lucide-react\";\nimport { format } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\n\nfunction InfoRow({\n icon: Icon,\n label,\n value,\n}: {\n icon: React.ElementType;\n label: string;\n value: string | null | undefined;\n}) {\n if (!value) return null;\n return (\n <div className=\"flex items-start gap-3 py-2\">\n <Icon className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0\">\n <p className=\"text-xs text-muted-foreground\">{label}</p>\n <p className=\"text-sm break-all\">{value}</p>\n </div>\n </div>\n );\n}\n\nexport interface ContactInfoPanelProps {\n contact: Contact | null;\n isLoading?: boolean;\n onClose?: () => void;\n className?: string;\n}\n\nexport function ContactInfoPanel({\n contact,\n isLoading,\n onClose,\n className,\n}: ContactInfoPanelProps) {\n return (\n <div\n className={cn(\n \"flex h-full w-[320px] shrink-0 flex-col border-l\",\n className,\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b px-4 py-3\">\n <span className=\"text-sm font-medium\">Informações do contato</span>\n {onClose && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={onClose}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-4\">\n {isLoading ? (\n <div className=\"flex flex-col items-center gap-3 pt-4\">\n <Skeleton className=\"h-16 w-16 rounded-full\" />\n <Skeleton className=\"h-5 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n ) : contact ? (\n <>\n {/* Avatar + Name */}\n <div className=\"flex flex-col items-center gap-2 pb-4\">\n <ContactAvatar name={contact.name} size=\"lg\" />\n <h3 className=\"text-base font-medium text-center\">\n {contact.name || \"Desconhecido\"}\n </h3>\n </div>\n\n <Separator />\n\n {/* Details */}\n <div className=\"mt-3 space-y-1\">\n <InfoRow icon={Hash} label=\"ID\" value={contact.id?.toString()} />\n <InfoRow\n icon={Phone}\n label=\"Telefone\"\n value={contact.phone_number}\n />\n <InfoRow\n icon={Fingerprint}\n label=\"Identificador\"\n value={contact.identifier}\n />\n <InfoRow\n icon={Calendar}\n label=\"Criado em\"\n value={\n contact.datetime_add\n ? format(\n new Date(contact.datetime_add),\n \"dd/MM/yyyy 'às' HH:mm\",\n { locale: ptBR },\n )\n : null\n }\n />\n <InfoRow\n icon={CalendarClock}\n label=\"Atualizado em\"\n value={\n contact.datetime_alt\n ? format(\n new Date(contact.datetime_alt),\n \"dd/MM/yyyy 'às' HH:mm\",\n { locale: ptBR },\n )\n : null\n }\n />\n </div>\n </>\n ) : null}\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useEffect } from \"react\";\nimport type { Contact, Channel, Inbox } from \"../types\";\nimport { ContactAvatar } from \"./contact-avatar\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n Command,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Button,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2 } from \"lucide-react\";\n\nexport interface NewConversationDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n contacts: Contact[];\n channels: Channel[];\n existingInboxes?: Inbox[];\n onCreateInbox: (contactId: number, channelId: number) => void;\n isCreating?: boolean;\n onCreated?: (inboxId: number) => void;\n}\n\nexport function NewConversationDialog({\n open,\n onOpenChange,\n contacts,\n channels,\n existingInboxes,\n onCreateInbox,\n isCreating,\n onCreated,\n}: NewConversationDialogProps) {\n const [selectedContact, setSelectedContact] = useState<Contact | null>(null);\n const [selectedChannelId, setSelectedChannelId] = useState<number | null>(\n null,\n );\n\n // Auto-select first channel if only one available\n const effectiveChannelId =\n selectedChannelId ?? (channels.length === 1 ? channels[0]?.id : null);\n\n // Reset state when dialog closes\n useEffect(() => {\n if (!open) {\n setSelectedContact(null);\n setSelectedChannelId(null);\n }\n }, [open]);\n\n const handleCreate = useCallback(() => {\n if (!selectedContact || !effectiveChannelId) return;\n\n // Dedup check\n if (existingInboxes) {\n const existing = existingInboxes.find(\n (i) =>\n i.id_contact === selectedContact.id &&\n i.id_channel === effectiveChannelId,\n );\n if (existing) {\n onCreated?.(existing.id);\n onOpenChange(false);\n return;\n }\n }\n\n onCreateInbox(selectedContact.id, effectiveChannelId);\n }, [\n selectedContact,\n effectiveChannelId,\n existingInboxes,\n onCreateInbox,\n onCreated,\n onOpenChange,\n ]);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md p-0 gap-0\">\n <DialogHeader className=\"px-4 pt-4 pb-2\">\n <DialogTitle>Nova conversa</DialogTitle>\n <DialogDescription>\n Selecione um contato para iniciar uma conversa\n </DialogDescription>\n </DialogHeader>\n\n {channels.length > 1 && (\n <div className=\"px-4 pb-2\">\n <Select\n value={selectedChannelId?.toString() ?? \"\"}\n onValueChange={(v) => setSelectedChannelId(Number(v))}\n >\n <SelectTrigger className=\"h-9\">\n <SelectValue placeholder=\"Selecione um canal\" />\n </SelectTrigger>\n <SelectContent>\n {channels.map((ch) => (\n <SelectItem key={ch.id} value={ch.id.toString()}>\n {ch.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n <Command className=\"rounded-none border-none shadow-none\">\n <div className=\"px-2\">\n <CommandInput placeholder=\"Buscar contato...\" />\n </div>\n <CommandList className=\"max-h-64 px-2\">\n <CommandEmpty>Nenhum contato encontrado</CommandEmpty>\n <CommandGroup>\n {contacts.map((contact) => (\n <CommandItem\n key={contact.id}\n value={`${contact.name} ${contact.phone_number || \"\"}`}\n onSelect={() => setSelectedContact(contact)}\n data-checked={selectedContact?.id === contact.id}\n className=\"gap-3\"\n >\n <ContactAvatar name={contact.name} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">\n {contact.name}\n </p>\n <p className=\"truncate text-xs text-muted-foreground\">\n {contact.phone_number ||\n contact.identifier ||\n \"Sem telefone\"}\n </p>\n </div>\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n\n <DialogFooter className=\"px-4 py-3 border-t\">\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancelar\n </Button>\n <Button\n disabled={!selectedContact || !effectiveChannelId || isCreating}\n onClick={handleCreate}\n >\n {isCreating && <Loader2 className=\"h-4 w-4 animate-spin\" />}\n Iniciar conversa\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\nimport type { WhatsappStatus } from \"../types\";\nimport { Badge } from \"@greatapps/greatauth-ui/ui\";\n\nexport interface WhatsappStatusBadgeProps {\n status: WhatsappStatus | undefined | null;\n hasSession: boolean;\n}\n\nexport function WhatsappStatusBadge({\n status,\n hasSession,\n}: WhatsappStatusBadgeProps) {\n if (!hasSession) {\n return (\n <Badge variant=\"outline\" className=\"text-xs text-zinc-500 border-zinc-300\">\n Sem sessão\n </Badge>\n );\n }\n\n if (!status) {\n return (\n <Badge variant=\"outline\" className=\"text-xs text-zinc-500 border-zinc-300\">\n Verificando...\n </Badge>\n );\n }\n\n if (status.connected && status.logged_in) {\n return (\n <Badge\n variant=\"outline\"\n className=\"text-xs bg-green-500/10 text-green-600 border-green-200\"\n >\n Conectado\n </Badge>\n );\n }\n\n if (status.connected && !status.logged_in) {\n return (\n <Badge\n variant=\"outline\"\n className=\"text-xs bg-yellow-500/10 text-yellow-600 border-yellow-200\"\n >\n Reconectando...\n </Badge>\n );\n }\n\n if (status.logged_in && !status.connected) {\n return (\n <Badge\n variant=\"outline\"\n className=\"text-xs bg-yellow-500/10 text-yellow-600 border-yellow-200\"\n >\n Desconectado\n </Badge>\n );\n }\n\n return (\n <Badge\n variant=\"outline\"\n className=\"text-xs bg-red-500/10 text-red-600 border-red-200\"\n >\n Offline\n </Badge>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { Channel } from \"../types\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useChannelWhatsappStatus } from \"../hooks/use-channels\";\nimport { WhatsappStatusBadge } from \"./whatsapp-status-badge\";\nimport { Button } from \"@greatapps/greatauth-ui/ui\";\n\nexport interface ChannelCardProps {\n channel: Channel;\n config: GchatHookConfig;\n onEdit?: () => void;\n onDelete?: () => void;\n linkedAgentName?: string;\n linkedAgentActive?: boolean;\n actions?: ReactNode;\n}\n\nexport function ChannelCard({\n channel,\n config,\n onEdit,\n onDelete,\n linkedAgentName,\n linkedAgentActive = true,\n actions,\n}: ChannelCardProps) {\n const { data: status } = useChannelWhatsappStatus(config, channel.id);\n const hasSession = !!channel.external_id;\n\n return (\n <div className=\"rounded-lg border bg-card text-card-foreground shadow-sm\">\n <div className=\"flex flex-row items-start justify-between p-4 pb-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-md bg-green-500/10\">\n <svg className=\"h-5 w-5 text-green-600\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\" />\n </svg>\n </div>\n <div>\n <h3 className=\"text-sm font-medium\">{channel.name}</h3>\n <p className=\"text-xs text-muted-foreground\">\n {channel.identifier || \"Sem número\"}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-1\">\n {onEdit && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={onEdit}\n >\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\" />\n <path d=\"m15 5 4 4\" />\n </svg>\n </Button>\n )}\n {onDelete && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7 text-destructive hover:text-destructive\"\n onClick={onDelete}\n >\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n </svg>\n </Button>\n )}\n <WhatsappStatusBadge status={status} hasSession={hasSession} />\n </div>\n </div>\n <div className=\"p-4 pt-0 space-y-3\">\n {linkedAgentName && (\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 8V4H8\" />\n <rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M15 13v2\" />\n <path d=\"M9 13v2\" />\n </svg>\n <span>Agent: <strong>{linkedAgentName}</strong></span>\n {!linkedAgentActive && (\n <span className=\"text-[10px] px-1 py-0 border rounded\">inativo</span>\n )}\n </div>\n )}\n {actions}\n </div>\n </div>\n );\n}\n","import type { SVGProps } from \"react\";\n\nexport function WhatsappIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M3 21l1.65 -3.8a9 9 0 1 1 3.4 2.9l-5.05 .9\" />\n <path d=\"M9 10a.5 .5 0 0 0 1 0v-1a.5 .5 0 0 0 -1 0v1a5 5 0 0 0 5 5h1a.5 .5 0 0 0 0 -1h-1a.5 .5 0 0 0 0 1\" />\n </svg>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState, useCallback } from \"react\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useConnectChannel, useChannelQR, useChannelWhatsappStatus } from \"../hooks/use-channels\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n Button,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2, Check, AlertCircle, RefreshCw } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\ntype QRState = \"connecting\" | \"waiting_qr\" | \"showing_qr\" | \"connected\" | \"error\";\n\nexport interface WhatsappQrDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n channelId: number;\n config: GchatHookConfig;\n}\n\nexport function WhatsappQrDialog({\n open,\n onOpenChange,\n channelId,\n config,\n}: WhatsappQrDialogProps) {\n const connectChannel = useConnectChannel(config);\n const [state, setState] = useState<QRState>(\"connecting\");\n const [errorMsg, setErrorMsg] = useState(\"\");\n\n const { data: qrUrl } = useChannelQR(\n config,\n channelId,\n open && (state === \"waiting_qr\" || state === \"showing_qr\"),\n );\n\n const { data: status } = useChannelWhatsappStatus(\n config,\n channelId,\n open && state !== \"connected\",\n );\n\n const startConnect = useCallback(() => {\n setState(\"connecting\");\n setErrorMsg(\"\");\n connectChannel.mutate(channelId, {\n onSuccess: () => setState(\"waiting_qr\"),\n onError: (err) => {\n setState(\"error\");\n setErrorMsg(err.message || \"Erro ao conectar\");\n },\n });\n }, [channelId, connectChannel]);\n\n useEffect(() => {\n if (!open) {\n setState(\"connecting\");\n setErrorMsg(\"\");\n return;\n }\n startConnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, channelId]);\n\n useEffect(() => {\n if (qrUrl && (state === \"waiting_qr\" || state === \"showing_qr\")) {\n setState(\"showing_qr\");\n }\n }, [qrUrl, state]);\n\n useEffect(() => {\n if (status?.connected && status?.logged_in) {\n setState(\"connected\");\n toast.success(\"WhatsApp conectado com sucesso!\");\n setTimeout(() => onOpenChange(false), 1500);\n }\n }, [status, onOpenChange]);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Conectar WhatsApp</DialogTitle>\n <DialogDescription>\n Escaneie o QR code com seu WhatsApp para conectar\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex min-h-[300px] items-center justify-center\">\n {state === \"connecting\" && (\n <div className=\"flex flex-col items-center gap-3 text-muted-foreground\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n <p className=\"text-sm\">Iniciando conexão...</p>\n </div>\n )}\n\n {state === \"waiting_qr\" && (\n <div className=\"flex flex-col items-center gap-3 text-muted-foreground\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n <p className=\"text-sm\">Gerando QR code...</p>\n </div>\n )}\n\n {state === \"showing_qr\" && qrUrl && (\n <div className=\"flex flex-col items-center gap-3\">\n <img\n src={qrUrl}\n alt=\"QR Code WhatsApp\"\n className=\"h-64 w-64 rounded-lg border\"\n />\n <p className=\"text-sm text-muted-foreground\">\n Abra o WhatsApp > Aparelhos conectados > Conectar\n </p>\n </div>\n )}\n\n {state === \"connected\" && (\n <div className=\"flex flex-col items-center gap-3 text-green-600\">\n <Check className=\"h-12 w-12\" />\n <p className=\"text-lg font-medium\">Conectado!</p>\n </div>\n )}\n\n {state === \"error\" && (\n <div className=\"flex flex-col items-center gap-3 text-destructive\">\n <AlertCircle className=\"h-8 w-8\" />\n <p className=\"text-sm\">{errorMsg || \"Erro ao gerar QR code\"}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={startConnect}\n >\n <RefreshCw className=\"mr-2 h-4 w-4\" />\n Tentar novamente\n </Button>\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useCreateChannel } from \"../hooks/use-channels\";\nimport { WhatsappIcon } from \"./whatsapp-icon\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n Button,\n Input,\n Label,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\nexport interface ChannelCreateDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n config: GchatHookConfig;\n renderAgentSelect?: (props: {\n value: number | null;\n onChange: (value: number | null) => void;\n disabled?: boolean;\n }) => ReactNode;\n}\n\nexport function ChannelCreateDialog({\n open,\n onOpenChange,\n config,\n renderAgentSelect,\n}: ChannelCreateDialogProps) {\n const createChannel = useCreateChannel(config);\n const [name, setName] = useState(\"\");\n const [identifier, setIdentifier] = useState(\"\");\n const [idAgent, setIdAgent] = useState<number | null>(null);\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n if (!name.trim()) return;\n\n try {\n await createChannel.mutateAsync({\n name: name.trim(),\n type: \"whatsapp_unofficial\",\n provider: \"gwhatsmeow\",\n identifier: identifier.trim() || undefined,\n id_agent: idAgent,\n });\n toast.success(\"Canal criado! Agora conecte via QR code.\");\n setName(\"\");\n setIdentifier(\"\");\n setIdAgent(null);\n onOpenChange(false);\n } catch {\n toast.error(\"Erro ao criar canal\");\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <WhatsappIcon className=\"h-5 w-5 text-green-600\" />\n Novo Canal WhatsApp\n </DialogTitle>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"channel-name\">Nome do canal *</Label>\n <Input\n id=\"channel-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Ex: WhatsApp Principal\"\n required\n disabled={createChannel.isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"channel-identifier\">\n Número do WhatsApp (opcional)\n </Label>\n <Input\n id=\"channel-identifier\"\n value={identifier}\n onChange={(e) => setIdentifier(e.target.value)}\n placeholder=\"5511999999999\"\n disabled={createChannel.isPending}\n />\n <p className=\"text-xs text-muted-foreground\">\n Será detectado automaticamente ao escanear o QR code\n </p>\n </div>\n {renderAgentSelect?.({\n value: idAgent,\n onChange: setIdAgent,\n disabled: createChannel.isPending,\n })}\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={createChannel.isPending}\n >\n Cancelar\n </Button>\n <Button type=\"submit\" disabled={createChannel.isPending || !name.trim()}>\n {createChannel.isPending && (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n )}\n Criar Canal\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { Channel } from \"../types\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useUpdateChannel } from \"../hooks/use-channels\";\nimport { WhatsappIcon } from \"./whatsapp-icon\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n Button,\n Input,\n Label,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\nexport interface ChannelEditDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n channel: Channel;\n config: GchatHookConfig;\n renderAgentSelect?: (props: {\n value: number | null;\n onChange: (value: number | null) => void;\n disabled?: boolean;\n }) => ReactNode;\n}\n\nexport function ChannelEditDialog({\n open,\n onOpenChange,\n channel,\n config,\n renderAgentSelect,\n}: ChannelEditDialogProps) {\n const updateChannel = useUpdateChannel(config);\n const [name, setName] = useState(channel.name);\n const [identifier, setIdentifier] = useState(channel.identifier || \"\");\n const [idAgent, setIdAgent] = useState<number | null>(channel.id_agent);\n\n useEffect(() => {\n if (open) {\n setName(channel.name);\n setIdentifier(channel.identifier || \"\");\n setIdAgent(channel.id_agent);\n }\n }, [open, channel]);\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n if (!name.trim()) return;\n\n try {\n await updateChannel.mutateAsync({\n id: channel.id,\n body: {\n name: name.trim(),\n identifier: identifier.trim() || undefined,\n id_agent: idAgent,\n },\n });\n toast.success(\"Canal atualizado\");\n onOpenChange(false);\n } catch {\n toast.error(\"Erro ao atualizar canal\");\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <WhatsappIcon className=\"h-5 w-5 text-green-600\" />\n Editar Canal\n </DialogTitle>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"edit-channel-name\">Nome do canal *</Label>\n <Input\n id=\"edit-channel-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Ex: WhatsApp Principal\"\n required\n disabled={updateChannel.isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"edit-channel-identifier\">\n Número do WhatsApp (opcional)\n </Label>\n <Input\n id=\"edit-channel-identifier\"\n value={identifier}\n onChange={(e) => setIdentifier(e.target.value)}\n placeholder=\"5511999999999\"\n disabled={updateChannel.isPending}\n />\n </div>\n {renderAgentSelect?.({\n value: idAgent,\n onChange: setIdAgent,\n disabled: updateChannel.isPending,\n })}\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={updateChannel.isPending}\n >\n Cancelar\n </Button>\n <Button type=\"submit\" disabled={updateChannel.isPending || !name.trim()}>\n {updateChannel.isPending && (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n )}\n Salvar\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { Contact } from \"../types\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useCreateContact, useUpdateContact } from \"../hooks/use-contacts\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n Button,\n Input,\n Label,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\nexport interface ContactFormDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n contact?: Contact;\n config: GchatHookConfig;\n}\n\nexport function ContactFormDialog({\n open,\n onOpenChange,\n contact,\n config,\n}: ContactFormDialogProps) {\n const isEditing = !!contact;\n const createContact = useCreateContact(config);\n const updateContact = useUpdateContact(config);\n\n const [name, setName] = useState(\"\");\n const [phoneNumber, setPhoneNumber] = useState(\"\");\n const [identifier, setIdentifier] = useState(\"\");\n\n useEffect(() => {\n if (contact) {\n setName(contact.name);\n setPhoneNumber(contact.phone_number || \"\");\n setIdentifier(contact.identifier || \"\");\n } else {\n setName(\"\");\n setPhoneNumber(\"\");\n setIdentifier(\"\");\n }\n }, [contact]);\n\n const isPending = createContact.isPending || updateContact.isPending;\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n if (!name.trim()) return;\n\n const body = {\n name: name.trim(),\n phone_number: phoneNumber.trim() || undefined,\n identifier: identifier.trim() || undefined,\n };\n\n try {\n if (isEditing) {\n await updateContact.mutateAsync({ id: contact.id, body });\n toast.success(\"Contato atualizado\");\n } else {\n await createContact.mutateAsync(body);\n toast.success(\"Contato criado\");\n }\n onOpenChange(false);\n } catch {\n toast.error(isEditing ? \"Erro ao atualizar\" : \"Erro ao criar contato\");\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n {isEditing ? \"Editar Contato\" : \"Novo Contato\"}\n </DialogTitle>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"contact-name\">Nome *</Label>\n <Input\n id=\"contact-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Nome do contato\"\n required\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"contact-phone\">Telefone</Label>\n <Input\n id=\"contact-phone\"\n value={phoneNumber}\n onChange={(e) => setPhoneNumber(e.target.value)}\n placeholder=\"5511999999999\"\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"contact-identifier\">Identificador (WhatsApp ID)</Label>\n <Input\n id=\"contact-identifier\"\n value={identifier}\n onChange={(e) => setIdentifier(e.target.value)}\n placeholder=\"5511999999999@s.whatsapp.net\"\n disabled={isPending}\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={isPending}\n >\n Cancelar\n </Button>\n <Button type=\"submit\" disabled={isPending || !name.trim()}>\n {isPending ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : null}\n {isEditing ? \"Salvar\" : \"Criar\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport type { Contact } from \"../types\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useContacts, useDeleteContact } from \"../hooks/use-contacts\";\nimport { ContactFormDialog } from \"./contact-form-dialog\";\nimport { DataTable } from \"./data-table\";\nimport {\n Input,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Pencil, Trash2, Search } from \"lucide-react\";\nimport { format } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\nimport { toast } from \"sonner\";\n\nfunction useColumns(\n onEdit: (contact: Contact) => void,\n onDelete: (id: number) => void,\n): ColumnDef<Contact>[] {\n return [\n {\n accessorKey: \"name\",\n header: \"Nome\",\n cell: ({ row }) => (\n <span className=\"font-medium\">{row.original.name}</span>\n ),\n sortingFn: (rowA, rowB) =>\n rowA.original.name.toLowerCase().localeCompare(rowB.original.name.toLowerCase()),\n },\n {\n accessorKey: \"phone_number\",\n header: \"Telefone\",\n cell: ({ row }) => row.original.phone_number || \"—\",\n sortingFn: (rowA, rowB) => {\n const a = rowA.original.phone_number || \"\";\n const b = rowB.original.phone_number || \"\";\n return a.localeCompare(b);\n },\n },\n {\n accessorKey: \"identifier\",\n header: \"Identificador\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-xs font-mono\">\n {row.original.identifier || \"—\"}\n </span>\n ),\n sortingFn: (rowA, rowB) => {\n const a = rowA.original.identifier || \"\";\n const b = rowB.original.identifier || \"\";\n return a.localeCompare(b);\n },\n },\n {\n accessorKey: \"datetime_add\",\n header: \"Criado em\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-sm\">\n {format(new Date(row.original.datetime_add), \"dd/MM/yyyy\", { locale: ptBR })}\n </span>\n ),\n },\n {\n id: \"actions\",\n size: 80,\n enableSorting: false,\n cell: ({ row }) => (\n <div className=\"flex items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => onEdit(row.original)}\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Editar</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n onClick={() => onDelete(row.original.id)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Excluir</TooltipContent>\n </Tooltip>\n </div>\n ),\n },\n ];\n}\n\nexport interface ContactsTableProps {\n config: GchatHookConfig;\n}\n\nexport function ContactsTable({ config }: ContactsTableProps) {\n const [search, setSearch] = useState(\"\");\n const [page, setPage] = useState(1);\n\n const queryParams = useMemo(() => {\n const params: Record<string, string> = {\n limit: \"15\",\n page: String(page),\n };\n if (search) {\n params.search = search;\n }\n return params;\n }, [search, page]);\n\n const { data, isLoading } = useContacts(config, queryParams);\n const deleteContact = useDeleteContact(config);\n const [editContact, setEditContact] = useState<Contact | null>(null);\n const [deleteId, setDeleteId] = useState<number | null>(null);\n\n const contacts = data?.data || [];\n const total = data?.total || 0;\n\n const columns = useColumns(\n (contact) => setEditContact(contact),\n (id) => setDeleteId(id),\n );\n\n function handleDelete() {\n if (!deleteId) return;\n deleteContact.mutate(deleteId, {\n onSuccess: () => {\n toast.success(\"Contato excluído\");\n setDeleteId(null);\n },\n onError: () => toast.error(\"Erro ao excluir contato\"),\n });\n }\n\n function handleSearchChange(value: string) {\n setSearch(value);\n setPage(1);\n }\n\n return (\n <>\n <div className=\"flex items-center gap-3\">\n <div className=\"relative flex-1 max-w-md\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Buscar por nome, telefone ou identificador...\"\n value={search}\n onChange={(e) => handleSearchChange(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n <DataTable\n columns={columns}\n data={contacts}\n isLoading={isLoading}\n emptyMessage=\"Nenhum contato encontrado\"\n total={total}\n page={page}\n onPageChange={setPage}\n pageSize={15}\n />\n\n <ContactFormDialog\n open={!!editContact}\n onOpenChange={(open) => !open && setEditContact(null)}\n contact={editContact ?? undefined}\n config={config}\n />\n\n <AlertDialog open={!!deleteId} onOpenChange={(open) => !open && setDeleteId(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Excluir contato?</AlertDialogTitle>\n <AlertDialogDescription>\n Esta ação não pode ser desfeita. O contato será removido permanentemente.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n onClick={handleDelete}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n Excluir\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n","\"use client\";\n\nimport {\n type ColumnDef,\n type SortingState,\n flexRender,\n getCoreRowModel,\n getSortedRowModel,\n useReactTable,\n} from \"@tanstack/react-table\";\nimport { useState } from \"react\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Button,\n Skeleton,\n cn,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { ChevronLeft, ChevronRight, ArrowUp, ArrowDown, ArrowUpDown } from \"lucide-react\";\n\nexport interface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[];\n data: TData[];\n isLoading?: boolean;\n emptyMessage?: string;\n total?: number;\n page?: number;\n onPageChange?: (page: number) => void;\n pageSize?: number;\n onRowClick?: (row: TData) => void;\n selectedRowId?: string | number | null;\n getRowId?: (row: TData) => string | number;\n compact?: boolean;\n}\n\nexport function DataTable<TData, TValue>({\n columns,\n data,\n isLoading,\n emptyMessage = \"Nenhum registro encontrado\",\n total,\n page = 1,\n onPageChange,\n pageSize = 15,\n onRowClick,\n selectedRowId,\n getRowId,\n compact,\n}: DataTableProps<TData, TValue>) {\n const [sorting, setSorting] = useState<SortingState>([]);\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: setSorting,\n state: { sorting },\n });\n\n const totalPages = total ? Math.ceil(total / pageSize) : 1;\n const showPagination = onPageChange && total && total > pageSize;\n\n return (\n <div className=\"space-y-4\">\n <div className=\"rounded-md border\">\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n className={cn(compact && \"py-1.5 text-xs\")}\n style={{ width: header.getSize() !== 150 ? header.getSize() : undefined }}\n >\n {header.isPlaceholder ? null : header.column.getCanSort() ? (\n <button\n type=\"button\"\n className=\"flex items-center gap-1 hover:text-foreground -ml-1 px-1 py-0.5 rounded cursor-pointer select-none\"\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n {{\n asc: <ArrowUp className=\"h-3.5 w-3.5\" />,\n desc: <ArrowDown className=\"h-3.5 w-3.5\" />,\n }[header.column.getIsSorted() as string] ?? (\n <ArrowUpDown className=\"h-3.5 w-3.5 text-muted-foreground/50\" />\n )}\n </button>\n ) : (\n flexRender(header.column.columnDef.header, header.getContext())\n )}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {isLoading ? (\n Array.from({ length: compact ? 3 : 5 }).map((_, i) => (\n <TableRow key={i}>\n {columns.map((_, j) => (\n <TableCell key={j} className={cn(compact && \"py-1.5\")}>\n <Skeleton className=\"h-4 w-full max-w-[120px]\" />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : table.getRowModel().rows.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className={cn(\n \"text-center text-muted-foreground\",\n compact ? \"py-4\" : \"py-8\",\n )}\n >\n {emptyMessage}\n </TableCell>\n </TableRow>\n ) : (\n table.getRowModel().rows.map((row) => {\n const rowId = getRowId ? getRowId(row.original) : undefined;\n const isSelected = selectedRowId != null && rowId != null && rowId === selectedRowId;\n\n return (\n <TableRow\n key={row.id}\n className={cn(\n onRowClick && \"cursor-pointer\",\n isSelected && \"bg-accent\",\n )}\n onClick={() => onRowClick?.(row.original)}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id} className={cn(compact && \"py-1.5\")}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n );\n })\n )}\n </TableBody>\n </Table>\n </div>\n\n {showPagination && (\n <div className=\"flex items-center justify-between px-2\">\n <p className=\"text-sm text-muted-foreground\">\n {total} registro{total !== 1 ? \"s\" : \"\"}\n </p>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n Anterior\n </Button>\n <span className=\"text-sm text-muted-foreground\">\n {page} de {totalPages}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n >\n Próximo\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport type { Inbox, InboxMessage } from \"../types\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport {\n useInboxes,\n useInboxStats,\n useUpdateInbox,\n useDeleteInbox,\n} from \"../hooks/use-inboxes\";\nimport {\n useInboxMessages,\n useSendMessage,\n useRetryMessage,\n useRevokeMessage,\n useEditMessage,\n} from \"../hooks/use-inbox-messages\";\nimport { useGetContact } from \"../hooks/use-contacts\";\nimport { InboxSidebar } from \"./inbox-sidebar\";\nimport { ChatView } from \"./chat-view\";\nimport { ContactInfoPanel } from \"./contact-info-panel\";\nimport { Button, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@greatapps/greatauth-ui/ui\";\nimport { MessageCircle, User } from \"lucide-react\";\n\nexport interface InboxPageProps {\n config: GchatHookConfig;\n filterChannelId?: number | null;\n}\n\nexport function InboxPage({ config, filterChannelId }: InboxPageProps) {\n const [selectedInbox, setSelectedInbox] = useState<Inbox | null>(null);\n const [showContactPanel, setShowContactPanel] = useState(false);\n\n const { data: inboxes, isLoading: inboxesLoading } = useInboxes(config);\n const { data: messages = [], isLoading: messagesLoading } =\n useInboxMessages(config, selectedInbox?.id ?? null);\n const { data: contact, isLoading: contactLoading } = useGetContact(\n config,\n showContactPanel && selectedInbox?.id_contact\n ? selectedInbox.id_contact\n : null,\n );\n\n const sendMessage = useSendMessage(config);\n const retryMessage = useRetryMessage(config);\n const revokeMessage = useRevokeMessage(config);\n const editMessage = useEditMessage(config);\n const updateInbox = useUpdateInbox(config);\n const deleteInbox = useDeleteInbox(config);\n\n const handleSend = useCallback(\n (content: string) => {\n if (!selectedInbox) return;\n sendMessage.mutate({ idInbox: selectedInbox.id, content });\n },\n [selectedInbox, sendMessage],\n );\n\n const handleStatusChange = useCallback(\n (status: \"open\" | \"pending\" | \"resolved\") => {\n if (!selectedInbox) return;\n updateInbox.mutate({ id: selectedInbox.id, body: { status } });\n },\n [selectedInbox, updateInbox],\n );\n\n const handleRevoke = useCallback(\n (message: InboxMessage) => {\n if (!selectedInbox) return;\n revokeMessage.mutate({ id: message.id, idInbox: selectedInbox.id });\n },\n [selectedInbox, revokeMessage],\n );\n\n const handleEdit = useCallback(\n (message: InboxMessage, newContent: string) => {\n if (!selectedInbox) return;\n editMessage.mutate({\n id: message.id,\n idInbox: selectedInbox.id,\n content: newContent,\n });\n },\n [selectedInbox, editMessage],\n );\n\n return (\n <div className=\"flex h-full\">\n <div className=\"w-[360px] shrink-0 border-r flex flex-col\">\n <InboxSidebar\n inboxes={inboxes}\n isLoading={inboxesLoading}\n selectedInboxId={selectedInbox?.id ?? null}\n onSelectInbox={(inbox) => {\n setSelectedInbox(inbox);\n setShowContactPanel(false);\n }}\n onDeleteInbox={(id) => deleteInbox.mutate(id)}\n filterChannelId={filterChannelId}\n />\n </div>\n\n <div className=\"flex-1 flex min-w-0\">\n {selectedInbox ? (\n <>\n <div className=\"flex-1 flex flex-col min-w-0\">\n <ChatView\n messages={messages}\n isLoading={messagesLoading}\n onSend={handleSend}\n onRetry={retryMessage}\n onRevoke={handleRevoke}\n onEdit={handleEdit}\n renderHeader={\n <div className=\"flex items-center justify-between border-b px-4 py-3\">\n <span className=\"text-sm font-medium\">\n {selectedInbox.contact_name || \"Conversa\"}\n </span>\n <div className=\"flex items-center gap-2\">\n <Select\n value={selectedInbox.status}\n onValueChange={handleStatusChange}\n >\n <SelectTrigger className=\"w-[130px] h-8 text-xs\">\n <SelectValue placeholder=\"Status\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"open\">Aberta</SelectItem>\n <SelectItem value=\"pending\">Pendente</SelectItem>\n <SelectItem value=\"resolved\">Resolvida</SelectItem>\n </SelectContent>\n </Select>\n {selectedInbox.id_contact && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => setShowContactPanel((v) => !v)}\n >\n <User className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </div>\n }\n />\n </div>\n\n {showContactPanel && selectedInbox.id_contact && (\n <ContactInfoPanel\n contact={contact ?? null}\n isLoading={contactLoading}\n onClose={() => setShowContactPanel(false)}\n />\n )}\n </>\n ) : (\n <div className=\"flex-1 flex flex-col items-center justify-center text-muted-foreground gap-3\">\n <MessageCircle className=\"h-12 w-12 opacity-20\" />\n <p className=\"text-sm\">Selecione uma conversa para começar</p>\n </div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { Channel } from \"../types\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useChannels, useDisconnectChannel, useLogoutChannel, useDeleteChannel, useChannelWhatsappStatus } from \"../hooks/use-channels\";\nimport { ChannelCard } from \"./channel-card\";\nimport { ChannelCreateDialog } from \"./channel-create-dialog\";\nimport { ChannelEditDialog } from \"./channel-edit-dialog\";\nimport { WhatsappQrDialog } from \"./whatsapp-qr-dialog\";\nimport { WhatsappIcon } from \"./whatsapp-icon\";\nimport {\n Button,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Skeleton,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Plus, QrCode, Unplug, LogOut } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\nexport interface ChannelsPageProps {\n config: GchatHookConfig;\n renderAgentSelect?: (props: {\n value: number | null;\n onChange: (value: number | null) => void;\n disabled?: boolean;\n }) => ReactNode;\n /** Optional: resolve agent info for a channel. Returns { name, active } */\n getAgentInfo?: (idAgent: number | null) => { name: string; active: boolean } | null;\n}\n\nfunction ChannelCardWrapper({\n channel,\n config,\n renderAgentSelect,\n getAgentInfo,\n}: {\n channel: Channel;\n config: GchatHookConfig;\n renderAgentSelect?: ChannelsPageProps[\"renderAgentSelect\"];\n getAgentInfo?: ChannelsPageProps[\"getAgentInfo\"];\n}) {\n const { data: status } = useChannelWhatsappStatus(config, channel.id);\n const disconnectChannel = useDisconnectChannel(config);\n const logoutChannel = useLogoutChannel(config);\n const deleteChannel = useDeleteChannel(config);\n const [qrOpen, setQrOpen] = useState(false);\n const [editOpen, setEditOpen] = useState(false);\n const [deleteOpen, setDeleteOpen] = useState(false);\n\n const isFullyConnected = status?.connected === true && status?.logged_in === true;\n const hasSession = !!channel.external_id;\n const agentInfo = getAgentInfo?.(channel.id_agent);\n\n function handleDisconnect() {\n disconnectChannel.mutate(channel.id, {\n onSuccess: () => toast.success(\"Canal desconectado\"),\n onError: () => toast.error(\"Erro ao desconectar\"),\n });\n }\n\n function handleLogout() {\n logoutChannel.mutate(channel.id, {\n onSuccess: () => toast.success(\"Logout realizado. Será necessário novo QR code.\"),\n onError: () => toast.error(\"Erro ao fazer logout\"),\n });\n }\n\n function handleDelete() {\n deleteChannel.mutate(channel.id, {\n onSuccess: () => {\n toast.success(\"Canal excluído\");\n setDeleteOpen(false);\n },\n onError: () => toast.error(\"Erro ao excluir canal\"),\n });\n }\n\n return (\n <>\n <ChannelCard\n channel={channel}\n config={config}\n onEdit={() => setEditOpen(true)}\n onDelete={() => setDeleteOpen(true)}\n linkedAgentName={agentInfo?.name}\n linkedAgentActive={agentInfo?.active !== false}\n actions={\n <div className=\"flex flex-wrap items-center gap-2\">\n {!isFullyConnected && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setQrOpen(true)}\n >\n <QrCode className=\"mr-1.5 h-3.5 w-3.5\" />\n Conectar via QR\n </Button>\n )}\n {isFullyConnected && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleDisconnect}\n disabled={disconnectChannel.isPending}\n >\n <Unplug className=\"mr-1.5 h-3.5 w-3.5\" />\n Desconectar\n </Button>\n )}\n {hasSession && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"text-destructive hover:text-destructive\"\n onClick={handleLogout}\n disabled={logoutChannel.isPending}\n >\n <LogOut className=\"mr-1.5 h-3.5 w-3.5\" />\n Logout\n </Button>\n )}\n </div>\n }\n />\n\n <WhatsappQrDialog\n open={qrOpen}\n onOpenChange={setQrOpen}\n channelId={channel.id}\n config={config}\n />\n\n <ChannelEditDialog\n open={editOpen}\n onOpenChange={setEditOpen}\n channel={channel}\n config={config}\n renderAgentSelect={renderAgentSelect}\n />\n\n <AlertDialog open={deleteOpen} onOpenChange={setDeleteOpen}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Excluir canal?</AlertDialogTitle>\n <AlertDialogDescription>\n O canal "{channel.name}" será removido permanentemente.\n Todas as conversas associadas serão perdidas.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n onClick={handleDelete}\n >\n Excluir\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n\nexport function ChannelsPage({\n config,\n renderAgentSelect,\n getAgentInfo,\n}: ChannelsPageProps) {\n const { data: channels, isLoading } = useChannels(config);\n const [createOpen, setCreateOpen] = useState(false);\n\n return (\n <div className=\"flex flex-col gap-6 p-4 flex-1 min-h-0 overflow-y-auto\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold\">Canais</h1>\n <p className=\"text-sm text-muted-foreground\">\n Gerencie seus canais de comunicação\n </p>\n </div>\n <Button onClick={() => setCreateOpen(true)}>\n <Plus className=\"mr-2 h-4 w-4\" />\n Novo Canal\n </Button>\n </div>\n\n {isLoading ? (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"rounded-lg border p-4 space-y-3\">\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-9 w-9 rounded-md\" />\n <div className=\"space-y-1\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-32\" />\n </div>\n </div>\n <Skeleton className=\"h-8 w-full\" />\n </div>\n ))}\n </div>\n ) : !channels?.length ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-muted-foreground gap-3\">\n <WhatsappIcon className=\"h-12 w-12 opacity-20\" />\n <p className=\"text-sm\">Nenhum canal configurado</p>\n <Button variant=\"outline\" onClick={() => setCreateOpen(true)}>\n <Plus className=\"mr-2 h-4 w-4\" />\n Criar primeiro canal\n </Button>\n </div>\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {channels.map((channel) => (\n <ChannelCardWrapper\n key={channel.id}\n channel={channel}\n config={config}\n renderAgentSelect={renderAgentSelect}\n getAgentInfo={getAgentInfo}\n />\n ))}\n </div>\n )}\n\n <ChannelCreateDialog\n open={createOpen}\n onOpenChange={setCreateOpen}\n config={config}\n renderAgentSelect={renderAgentSelect}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { ContactsTable } from \"./contacts-table\";\nimport { ContactFormDialog } from \"./contact-form-dialog\";\nimport { Button } from \"@greatapps/greatauth-ui/ui\";\nimport { Plus } from \"lucide-react\";\n\nexport interface ContactsPageProps {\n config: GchatHookConfig;\n}\n\nexport function ContactsPage({ config }: ContactsPageProps) {\n const [createOpen, setCreateOpen] = useState(false);\n\n return (\n <div className=\"flex flex-col gap-6 p-4 flex-1 min-h-0 overflow-y-auto\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold\">Contatos</h1>\n <p className=\"text-sm text-muted-foreground\">\n Gerencie seus contatos de conversas\n </p>\n </div>\n <Button onClick={() => setCreateOpen(true)}>\n <Plus className=\"mr-2 h-4 w-4\" />\n Novo Contato\n </Button>\n </div>\n\n <ContactsTable config={config} />\n\n <ContactFormDialog\n open={createOpen}\n onOpenChange={setCreateOpen}\n config={config}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { Inbox, Channel } from \"../types\";\nimport type { GchatHookConfig } from \"../hooks/types\";\nimport { useInboxStats, useInboxes } from \"../hooks/use-inboxes\";\nimport { useChannels, useChannelWhatsappStatus } from \"../hooks/use-channels\";\nimport { ContactAvatar } from \"./contact-avatar\";\nimport { WhatsappStatusBadge } from \"./whatsapp-status-badge\";\nimport { WhatsappIcon } from \"./whatsapp-icon\";\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Badge,\n Progress,\n Skeleton,\n cn,\n} from \"@greatapps/greatauth-ui/ui\";\nimport {\n Inbox as InboxIcon,\n MessageCircle,\n Clock,\n CircleCheck,\n ArrowRight,\n} from \"lucide-react\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\n\n// --- Helpers ---\n\nfunction getGreeting(userName?: string): string {\n const hour = new Date().getHours();\n const prefix = hour < 12 ? \"Bom dia\" : hour < 18 ? \"Boa tarde\" : \"Boa noite\";\n return userName ? `${prefix}, ${userName}!` : `${prefix}!`;\n}\n\nconst statusColors: Record<string, string> = {\n open: \"bg-green-500/10 text-green-600 border-green-200\",\n pending: \"bg-yellow-500/10 text-yellow-600 border-yellow-200\",\n resolved: \"bg-zinc-500/10 text-zinc-500 border-zinc-200\",\n};\n\nconst statusLabels: Record<string, string> = {\n open: \"Aberta\",\n pending: \"Pendente\",\n resolved: \"Resolvida\",\n};\n\n// --- Sub-components ---\n\nfunction StatCard({\n title,\n value,\n total,\n icon: Icon,\n loading,\n accentColor,\n onClick,\n}: {\n title: string;\n value: number | undefined;\n total: number | undefined;\n icon: React.ElementType;\n loading: boolean;\n accentColor: string;\n onClick: () => void;\n}) {\n const pct = total && value ? Math.round((value / total) * 100) : 0;\n\n return (\n <Card\n className={cn(\"cursor-pointer transition-shadow hover:shadow-md border-l-4\", accentColor)}\n onClick={onClick}\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"text-sm font-medium text-muted-foreground\">\n {title}\n </CardTitle>\n <Icon className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {loading ? (\n <Skeleton className=\"h-8 w-16\" />\n ) : (\n <>\n <div className=\"flex items-baseline gap-2\">\n <p className=\"text-2xl font-bold\">{value ?? 0}</p>\n {total !== undefined && total > 0 && title !== \"Total\" && (\n <span className=\"text-xs text-muted-foreground\">\n de {total}\n </span>\n )}\n </div>\n {title !== \"Total\" && (\n <Progress value={pct} className=\"h-1\" />\n )}\n </>\n )}\n </CardContent>\n </Card>\n );\n}\n\nfunction ChannelHealthCard({\n channel,\n config,\n onClick,\n}: {\n channel: Channel;\n config: GchatHookConfig;\n onClick: () => void;\n}) {\n const { data: status } = useChannelWhatsappStatus(config, channel.id);\n\n return (\n <div\n className=\"flex items-center gap-3 rounded-lg border p-3 cursor-pointer transition-colors hover:bg-accent\"\n onClick={onClick}\n >\n <div className=\"flex h-9 w-9 items-center justify-center rounded-md bg-green-500/10\">\n <WhatsappIcon className=\"h-5 w-5 text-green-600\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{channel.name}</p>\n <p className=\"text-xs text-muted-foreground truncate\">\n {channel.identifier || \"Sem número\"}\n </p>\n </div>\n <WhatsappStatusBadge status={status} hasSession={!!channel.external_id} />\n </div>\n );\n}\n\nfunction RecentConversationItem({\n inbox,\n onClick,\n}: {\n inbox: Inbox;\n onClick: () => void;\n}) {\n const timestamp = inbox.last_message_at || inbox.datetime_add;\n const timeAgo = formatDistanceToNow(new Date(timestamp), {\n addSuffix: true,\n locale: ptBR,\n });\n\n const lastMessage =\n inbox.last_message_content_type === \"text\"\n ? inbox.last_message_content\n : inbox.last_message_content_type\n ? `[${inbox.last_message_content_type}]`\n : null;\n\n const directionPrefix =\n inbox.last_message_direction === \"outbound\" ? \"Você: \" : \"\";\n\n return (\n <div\n className=\"flex items-center gap-3 rounded-lg p-3 cursor-pointer transition-colors hover:bg-accent\"\n onClick={onClick}\n >\n <ContactAvatar name={inbox.contact_name || \"?\"} className=\"h-9 w-9\" />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className=\"text-sm font-medium truncate\">\n {inbox.contact_name || \"Desconhecido\"}\n </span>\n {inbox.channel_name && (\n <Badge variant=\"outline\" className=\"shrink-0 text-[10px] px-1.5 py-0 text-muted-foreground\">\n {inbox.channel_name}\n </Badge>\n )}\n </div>\n <span className=\"text-xs text-muted-foreground shrink-0\">\n {timeAgo}\n </span>\n </div>\n <div className=\"flex items-center justify-between gap-2 mt-0.5\">\n <p className=\"text-xs text-muted-foreground truncate\">\n {lastMessage ? `${directionPrefix}${lastMessage}` : \"Sem mensagens\"}\n </p>\n <Badge\n variant=\"outline\"\n className={cn(\"shrink-0 text-[10px] px-1.5 py-0\", statusColors[inbox.status])}\n >\n {statusLabels[inbox.status] || inbox.status}\n </Badge>\n </div>\n </div>\n </div>\n );\n}\n\n// --- Main Component ---\n\nexport interface ChatDashboardProps {\n config: GchatHookConfig;\n userName?: string;\n onNavigateToInbox?: (filters?: { status?: string; channelId?: number }) => void;\n onNavigateToChannels?: () => void;\n renderExtraSection?: () => ReactNode;\n}\n\nexport function ChatDashboard({\n config,\n userName,\n onNavigateToInbox,\n onNavigateToChannels,\n renderExtraSection,\n}: ChatDashboardProps) {\n const [selectedChannelId, setSelectedChannelId] = useState<number | null>(null);\n\n const { data: stats, isLoading: statsLoading } = useInboxStats(config);\n const { data: inboxes, isLoading: inboxesLoading } = useInboxes(config);\n const { data: channels, isLoading: channelsLoading } = useChannels(config);\n\n const filteredInboxes = useMemo(() => {\n if (!inboxes) return [];\n if (!selectedChannelId) return inboxes;\n return inboxes.filter((i) => i.id_channel === selectedChannelId);\n }, [inboxes, selectedChannelId]);\n\n const filteredStats = useMemo(() => {\n if (!selectedChannelId) return stats;\n const open = filteredInboxes.filter((i) => i.status === \"open\").length;\n const pending = filteredInboxes.filter((i) => i.status === \"pending\").length;\n const resolved = filteredInboxes.filter((i) => i.status === \"resolved\").length;\n return { total: filteredInboxes.length, open, pending, resolved };\n }, [stats, filteredInboxes, selectedChannelId]);\n\n const recentInboxes = useMemo(() => {\n return [...filteredInboxes]\n .sort((a, b) => {\n const da = a.last_message_at || a.datetime_add;\n const db = b.last_message_at || b.datetime_add;\n return new Date(db).getTime() - new Date(da).getTime();\n })\n .slice(0, 5);\n }, [filteredInboxes]);\n\n return (\n <div className=\"flex flex-col gap-6 p-4 flex-1 min-h-0 overflow-y-auto\">\n {/* Greeting */}\n <div>\n <h1 className=\"text-xl font-semibold\">\n {getGreeting(userName)}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n Aqui está o resumo das suas conversas e canais.\n </p>\n </div>\n\n {/* Channel Filter */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <button\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-medium transition-colors\",\n !selectedChannelId\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"bg-background text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n )}\n onClick={() => setSelectedChannelId(null)}\n >\n Todos os canais\n </button>\n {channelsLoading ? (\n <>\n <Skeleton className=\"h-7 w-24 rounded-full\" />\n <Skeleton className=\"h-7 w-28 rounded-full\" />\n </>\n ) : (\n channels?.map((channel) => (\n <button\n key={channel.id}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-medium transition-colors\",\n selectedChannelId === channel.id\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"bg-background text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n )}\n onClick={() => setSelectedChannelId(channel.id)}\n >\n <WhatsappIcon className=\"h-3 w-3\" />\n {channel.name}\n </button>\n ))\n )}\n </div>\n\n {/* Stat Cards */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Total\"\n value={filteredStats?.total}\n total={filteredStats?.total}\n icon={InboxIcon}\n loading={statsLoading && !selectedChannelId}\n accentColor=\"border-l-blue-500\"\n onClick={() => onNavigateToInbox?.()}\n />\n <StatCard\n title=\"Abertas\"\n value={filteredStats?.open}\n total={filteredStats?.total}\n icon={MessageCircle}\n loading={statsLoading && !selectedChannelId}\n accentColor=\"border-l-green-500\"\n onClick={() => onNavigateToInbox?.({ status: \"open\" })}\n />\n <StatCard\n title=\"Pendentes\"\n value={filteredStats?.pending}\n total={filteredStats?.total}\n icon={Clock}\n loading={statsLoading && !selectedChannelId}\n accentColor=\"border-l-yellow-500\"\n onClick={() => onNavigateToInbox?.({ status: \"pending\" })}\n />\n <StatCard\n title=\"Resolvidas\"\n value={filteredStats?.resolved}\n total={filteredStats?.total}\n icon={CircleCheck}\n loading={statsLoading && !selectedChannelId}\n accentColor=\"border-l-zinc-400\"\n onClick={() => onNavigateToInbox?.({ status: \"resolved\" })}\n />\n </div>\n\n {/* Channel Health */}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle className=\"text-sm font-medium\">\n Saúde dos Canais\n </CardTitle>\n {onNavigateToChannels && (\n <button\n onClick={onNavigateToChannels}\n className=\"text-xs text-primary hover:underline flex items-center gap-1\"\n >\n Gerenciar\n <ArrowRight className=\"h-3 w-3\" />\n </button>\n )}\n </CardHeader>\n <CardContent>\n {channelsLoading ? (\n <div className=\"space-y-3\">\n {[1, 2].map((i) => (\n <div key={i} className=\"flex items-center gap-3 p-3\">\n <Skeleton className=\"h-8 w-8 rounded\" />\n <div className=\"flex-1 space-y-1\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-32\" />\n </div>\n </div>\n ))}\n </div>\n ) : !channels?.length ? (\n <div className=\"flex items-center justify-center h-full text-sm text-muted-foreground py-8\">\n Nenhum canal configurado\n </div>\n ) : (\n <div className=\"space-y-2\">\n {channels.map((channel) => (\n <ChannelHealthCard\n key={channel.id}\n channel={channel}\n config={config}\n onClick={() => onNavigateToInbox?.({ channelId: channel.id })}\n />\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Extra Section (e.g., MetaAgents in admin) */}\n {renderExtraSection?.()}\n\n {/* Recent Conversations */}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle className=\"text-sm font-medium\">\n Conversas Recentes\n </CardTitle>\n {onNavigateToInbox && (\n <button\n onClick={() => onNavigateToInbox()}\n className=\"text-xs text-primary hover:underline flex items-center gap-1\"\n >\n Ver todas\n <ArrowRight className=\"h-3 w-3\" />\n </button>\n )}\n </CardHeader>\n <CardContent className=\"p-0\">\n {inboxesLoading ? (\n <div className=\"space-y-2 p-4\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"flex items-center gap-3 p-3\">\n <Skeleton className=\"h-9 w-9 rounded-full shrink-0\" />\n <div className=\"flex-1 space-y-1.5\">\n <Skeleton className=\"h-4 w-28\" />\n <Skeleton className=\"h-3 w-40\" />\n </div>\n </div>\n ))}\n </div>\n ) : recentInboxes.length === 0 ? (\n <div className=\"flex items-center justify-center py-8 text-sm text-muted-foreground\">\n Nenhuma conversa encontrada\n </div>\n ) : (\n <div className=\"divide-y\">\n {recentInboxes.map((inbox) => (\n <RecentConversationItem\n key={inbox.id}\n inbox={inbox}\n onClick={() => onNavigateToInbox?.()}\n />\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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","names":["cn","useMemo","useQuery","useMutation","useQueryClient","useQuery","useMemo","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useRef","useState","Button","Textarea","jsx","jsxs","jsx","jsxs","useRef","cn","jsx","useState","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","cn","ptBR","Trash2","jsx","jsxs","useState","useState","useMemo","Button","Skeleton","jsx","jsxs","useState","useMemo","Button","Skeleton","cn","format","ptBR","Fragment","jsx","jsxs","useState","useEffect","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","Button","jsx","jsxs","useState","useEffect","Badge","jsx","Button","jsx","jsxs","jsx","jsxs","useEffect","useState","useCallback","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Button","Loader2","Check","AlertCircle","jsx","jsxs","useState","useCallback","useEffect","useState","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","Button","Input","Loader2","toast","jsx","jsxs","useState","useState","useEffect","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","Button","Input","Label","Loader2","toast","jsx","jsxs","useState","useEffect","useEffect","useState","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","Button","Input","Label","Loader2","toast","jsx","jsxs","useState","useEffect","useMemo","useState","useState","Button","Skeleton","cn","jsx","jsxs","_","Input","Tooltip","TooltipTrigger","TooltipContent","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","Button","Pencil","Trash2","Search","format","ptBR","toast","Fragment","jsx","jsxs","useState","useMemo","useState","useCallback","Button","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","Fragment","jsx","jsxs","useState","useCallback","useState","Button","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","Skeleton","Plus","toast","Fragment","jsx","jsxs","useState","useState","Button","Plus","jsx","jsxs","useState","useState","useMemo","Badge","Skeleton","cn","InboxIcon","MessageCircle","Clock","formatDistanceToNow","ptBR","Fragment","jsx","jsxs","statusColors","statusLabels","useState","useMemo"]}
|