@uptrademedia/site-kit 1.0.20 → 1.0.24

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.
Files changed (81) hide show
  1. package/dist/analytics/index.js +6 -6
  2. package/dist/analytics/index.mjs +2 -2
  3. package/dist/{chunk-BZBJVG5Y.js → chunk-4KKQQRZV.js} +4 -4
  4. package/dist/{chunk-BZBJVG5Y.js.map → chunk-4KKQQRZV.js.map} +1 -1
  5. package/dist/{chunk-D5VBZVOE.js → chunk-6J26EHDM.js} +79 -30
  6. package/dist/chunk-6J26EHDM.js.map +1 -0
  7. package/dist/{chunk-VDMZZL2O.mjs → chunk-ASVFZY6X.mjs} +4 -4
  8. package/dist/{chunk-VDMZZL2O.mjs.map → chunk-ASVFZY6X.mjs.map} +1 -1
  9. package/dist/{chunk-KBS3KW2U.js → chunk-GKABCBZE.js} +2 -2
  10. package/dist/{chunk-KBS3KW2U.js.map → chunk-GKABCBZE.js.map} +1 -1
  11. package/dist/{chunk-SQHDILBN.js → chunk-HGTTGJVZ.js} +4 -2
  12. package/dist/chunk-HGTTGJVZ.js.map +1 -0
  13. package/dist/{chunk-DOHML47I.mjs → chunk-HHAJAANV.mjs} +46 -4
  14. package/dist/chunk-HHAJAANV.mjs.map +1 -0
  15. package/dist/{chunk-IJVPYQAB.mjs → chunk-JTLOJLWQ.mjs} +3 -50
  16. package/dist/chunk-JTLOJLWQ.mjs.map +1 -0
  17. package/dist/{chunk-BV4YYSAZ.js → chunk-KUGMH4ZF.js} +2 -50
  18. package/dist/chunk-KUGMH4ZF.js.map +1 -0
  19. package/dist/chunk-M5VNAX5I.mjs +54 -0
  20. package/dist/chunk-M5VNAX5I.mjs.map +1 -0
  21. package/dist/{chunk-UWUYO5DJ.mjs → chunk-MDOHOEME.mjs} +80 -31
  22. package/dist/chunk-MDOHOEME.mjs.map +1 -0
  23. package/dist/chunk-MXBDMOVK.js +56 -0
  24. package/dist/chunk-MXBDMOVK.js.map +1 -0
  25. package/dist/{chunk-YHQHSM76.mjs → chunk-OW2C3ATV.mjs} +4 -2
  26. package/dist/chunk-OW2C3ATV.mjs.map +1 -0
  27. package/dist/{chunk-K2HWVOEO.js → chunk-RM4XFDE6.js} +46 -3
  28. package/dist/chunk-RM4XFDE6.js.map +1 -0
  29. package/dist/{chunk-IT6R5VAZ.mjs → chunk-VZHEJXDY.mjs} +2 -2
  30. package/dist/{chunk-IT6R5VAZ.mjs.map → chunk-VZHEJXDY.mjs.map} +1 -1
  31. package/dist/cli/index.js +1 -1
  32. package/dist/cli/index.mjs +1 -1
  33. package/dist/commerce/index.d.mts +1 -1
  34. package/dist/commerce/index.d.ts +1 -1
  35. package/dist/commerce/index.js +42 -38
  36. package/dist/commerce/index.mjs +1 -1
  37. package/dist/engage/index.d.mts +3 -2
  38. package/dist/engage/index.d.ts +3 -2
  39. package/dist/engage/index.js +4 -4
  40. package/dist/engage/index.mjs +1 -1
  41. package/dist/forms/index.js +5 -7
  42. package/dist/forms/index.js.map +1 -1
  43. package/dist/forms/index.mjs +5 -7
  44. package/dist/forms/index.mjs.map +1 -1
  45. package/dist/images/index.d.mts +2 -54
  46. package/dist/images/index.d.ts +2 -54
  47. package/dist/images/index.js +13 -12
  48. package/dist/images/index.mjs +2 -1
  49. package/dist/images/server.d.mts +54 -0
  50. package/dist/images/server.d.ts +54 -0
  51. package/dist/images/server.js +13 -0
  52. package/dist/images/server.js.map +1 -0
  53. package/dist/images/server.mjs +4 -0
  54. package/dist/images/server.mjs.map +1 -0
  55. package/dist/index.d.mts +1 -1
  56. package/dist/index.d.ts +1 -1
  57. package/dist/index.js +43 -42
  58. package/dist/index.js.map +1 -1
  59. package/dist/index.mjs +6 -5
  60. package/dist/index.mjs.map +1 -1
  61. package/dist/redirects/index.js +5 -5
  62. package/dist/redirects/index.mjs +1 -1
  63. package/dist/setup/index.js +2 -2
  64. package/dist/setup/index.mjs +1 -1
  65. package/dist/setup/server.js +2 -2
  66. package/dist/setup/server.mjs +1 -1
  67. package/dist/socket-loader-3FWQWPDQ.js +16 -0
  68. package/dist/socket-loader-3FWQWPDQ.js.map +1 -0
  69. package/dist/socket-loader-N5ETWMXW.mjs +14 -0
  70. package/dist/socket-loader-N5ETWMXW.mjs.map +1 -0
  71. package/dist/{useEventModal-CaePVcfW.d.ts → useEventModal-DHO4-xhg.d.ts} +6 -1
  72. package/dist/{useEventModal-Dt6y1L0o.d.mts → useEventModal-Dbg2fYYk.d.mts} +6 -1
  73. package/package.json +6 -1
  74. package/dist/chunk-BV4YYSAZ.js.map +0 -1
  75. package/dist/chunk-D5VBZVOE.js.map +0 -1
  76. package/dist/chunk-DOHML47I.mjs.map +0 -1
  77. package/dist/chunk-IJVPYQAB.mjs.map +0 -1
  78. package/dist/chunk-K2HWVOEO.js.map +0 -1
  79. package/dist/chunk-SQHDILBN.js.map +0 -1
  80. package/dist/chunk-UWUYO5DJ.mjs.map +0 -1
  81. package/dist/chunk-YHQHSM76.mjs.map +0 -1
@@ -1,5 +1,4 @@
1
- import React2, { useState, useRef, useCallback, useEffect, createElement } from 'react';
2
- import { io } from 'socket.io-client';
1
+ import React2, { useState, useRef, useEffect, useCallback, createElement } from 'react';
3
2
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
3
  import { usePathname } from 'next/navigation';
5
4
 
@@ -30,7 +29,9 @@ function isLightColor(hex) {
30
29
  const b = num & 255;
31
30
  return (r * 299 + g * 587 + b * 114) / 1e3 > 160;
32
31
  }
33
- function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
32
+ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl }) {
33
+ const [resolvedProjectId, setResolvedProjectId] = useState(propProjectId || null);
34
+ const projectId = propProjectId || resolvedProjectId || "";
34
35
  const [isOpen, setIsOpen] = useState(false);
35
36
  const [messages, setMessages] = useState([]);
36
37
  const [inputValue, setInputValue] = useState("");
@@ -50,6 +51,7 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
50
51
  const [showWelcome, setShowWelcome] = useState(true);
51
52
  const [checkingAvailability, setCheckingAvailability] = useState(false);
52
53
  useRef(null);
54
+ const pendingInitialMessageRef = useRef(null);
53
55
  const messagesEndRef = useRef(null);
54
56
  const inputRef = useRef(null);
55
57
  const socketRef = useRef(null);
@@ -66,7 +68,24 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
66
68
  const offlineHeading = widgetConfig?.offline_heading ?? "No agents available right now";
67
69
  const offlineSubheading = handoffOfflinePrompt ?? widgetConfig?.offline_subheading ?? widgetConfig?.form_description ?? widgetConfig?.offline_message ?? config?.offlineMessage ?? "Leave us a message and we'll get back to you!";
68
70
  const baseUrl = propApiUrl || getApiConfig().apiUrl;
71
+ useEffect(() => {
72
+ if (propProjectId || resolvedProjectId) return;
73
+ const { apiKey } = getApiConfig();
74
+ if (!apiKey) return;
75
+ let cancelled = false;
76
+ fetch(`${baseUrl}/api/public/seo/project-info`, {
77
+ headers: { "x-api-key": apiKey }
78
+ }).then((res) => res.ok ? res.json() : null).then((data) => {
79
+ if (cancelled || !data?.valid || !data?.project_id) return;
80
+ setResolvedProjectId(data.project_id);
81
+ }).catch(() => {
82
+ });
83
+ return () => {
84
+ cancelled = true;
85
+ };
86
+ }, [propProjectId, resolvedProjectId, baseUrl]);
69
87
  const fetchWidgetConfig = useCallback(async () => {
88
+ if (!projectId) return;
70
89
  try {
71
90
  const { apiKey } = getApiConfig();
72
91
  const response = await fetch(`${baseUrl}/engage/widget/config?projectId=${projectId}`, {
@@ -77,10 +96,13 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
77
96
  setWidgetConfig(data ?? null);
78
97
  }
79
98
  } catch (error) {
80
- console.error("[ChatWidget] Config fetch failed:", error);
99
+ if (process.env.NODE_ENV === "development") {
100
+ console.warn("[ChatWidget] Config fetch failed:", error instanceof Error ? error.message : error);
101
+ }
81
102
  }
82
103
  }, [projectId, baseUrl]);
83
104
  const checkAvailability = useCallback(async () => {
105
+ if (!projectId) return null;
84
106
  try {
85
107
  const { apiKey } = getApiConfig();
86
108
  const response = await fetch(`${baseUrl}/engage/widget/availability?projectId=${projectId}`, {
@@ -92,7 +114,9 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
92
114
  return data;
93
115
  }
94
116
  } catch (error) {
95
- console.error("[ChatWidget] Availability check failed:", error);
117
+ if (process.env.NODE_ENV === "development") {
118
+ console.warn("[ChatWidget] Availability check failed:", error instanceof Error ? error.message : error);
119
+ }
96
120
  }
97
121
  return null;
98
122
  }, [projectId, baseUrl]);
@@ -180,14 +204,15 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
180
204
  }
181
205
  }, []);
182
206
  const connectSocket = useCallback(
183
- (currentSessionId) => {
207
+ async (currentSessionId) => {
184
208
  if (socketRef.current?.connected) return;
185
209
  if (socketRef.current) {
186
210
  socketRef.current.disconnect();
187
211
  socketRef.current = null;
188
212
  }
213
+ const { createSocket } = await import('./socket-loader-N5ETWMXW.mjs');
189
214
  const namespaceUrl = `${baseUrl.replace(/\/$/, "")}/engage/chat`;
190
- const socket = io(namespaceUrl, {
215
+ const socket = await createSocket(namespaceUrl, {
191
216
  query: { projectId, visitorId, sessionId: currentSessionId },
192
217
  transports: ["websocket", "polling"],
193
218
  // Auto-reconnect config
@@ -314,18 +339,35 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
314
339
  };
315
340
  }, [fetchWidgetConfig, checkAvailability]);
316
341
  useEffect(() => {
317
- if (isOpen && !showWelcome && !checkingAvailability && !showOfflineForm && !sessionId && availability?.mode !== "offline") {
318
- initSession().then((id) => {
319
- if (id && (availability?.mode === "live" || availability?.mode === "ai")) {
320
- setConnectionStatus("connecting");
321
- connectSocket(id);
342
+ if (isOpen && !showWelcome && !checkingAvailability && !showOfflineForm && !sessionId) {
343
+ initSession().then(async (id) => {
344
+ if (!id) return;
345
+ setConnectionStatus("connecting");
346
+ await connectSocket(id);
347
+ const pending = pendingInitialMessageRef.current;
348
+ if (pending) {
349
+ pendingInitialMessageRef.current = null;
350
+ const waitForSocket = () => new Promise((resolve) => {
351
+ const check = (attempts = 0) => {
352
+ if (socketRef.current?.connected || attempts > 20) {
353
+ resolve();
354
+ return;
355
+ }
356
+ setTimeout(() => check(attempts + 1), 150);
357
+ };
358
+ check();
359
+ });
360
+ await waitForSocket();
361
+ if (socketRef.current?.connected) {
362
+ socketRef.current.emit("visitor:message", { content: pending });
363
+ }
322
364
  }
323
365
  });
324
366
  }
325
367
  return () => {
326
368
  if (pollingIntervalRef.current) clearInterval(pollingIntervalRef.current);
327
369
  };
328
- }, [isOpen, showWelcome, checkingAvailability, showOfflineForm, sessionId, availability?.mode, initSession, connectSocket]);
370
+ }, [isOpen, showWelcome, checkingAvailability, showOfflineForm, sessionId, initSession, connectSocket]);
329
371
  const handleToggle = useCallback(() => {
330
372
  setIsOpen((prev) => !prev);
331
373
  }, []);
@@ -335,17 +377,13 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
335
377
  const beginChatSession = () => {
336
378
  setMessages([{ id: "welcome", role: "assistant", content: welcomeMessage, timestamp: /* @__PURE__ */ new Date() }]);
337
379
  if (initialMessage) {
338
- setInputValue(initialMessage);
339
- setTimeout(() => {
340
- setInputValue("");
341
- const userMsg = { id: `user-${Date.now()}`, role: "user", content: initialMessage, timestamp: /* @__PURE__ */ new Date() };
342
- setMessages((prev) => [...prev, userMsg]);
343
- setIsLoading(true);
344
- setLastFailedSend({ content: initialMessage, attachments: [] });
345
- }, 100);
380
+ pendingInitialMessageRef.current = initialMessage;
381
+ const userMsg = { id: `user-${Date.now()}`, role: "user", content: initialMessage, timestamp: /* @__PURE__ */ new Date() };
382
+ setMessages((prev) => [...prev, userMsg]);
383
+ setIsLoading(true);
346
384
  }
347
385
  };
348
- if (availability?.mode === "ai") {
386
+ if (widgetConfig?.signal_enabled) {
349
387
  beginChatSession();
350
388
  return;
351
389
  }
@@ -365,7 +403,7 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
365
403
  setShowOfflineForm(true);
366
404
  }
367
405
  },
368
- [availability, welcomeMessage, checkAvailability]
406
+ [widgetConfig?.signal_enabled, welcomeMessage, checkAvailability]
369
407
  );
370
408
  const uploadWidgetFile = useCallback(
371
409
  async (file) => {
@@ -479,11 +517,13 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
479
517
  console.error("[ChatWidget] Handoff request failed:", error);
480
518
  }
481
519
  }, [sessionId, baseUrl, projectId, widgetConfig, offlineHeading]);
520
+ const [offlineError, setOfflineError] = useState(null);
482
521
  const handleOfflineSubmit = useCallback(
483
522
  async (e) => {
484
523
  e.preventDefault();
485
524
  if (!offlineForm.name || !offlineForm.email || !offlineForm.message) return;
486
525
  setIsLoading(true);
526
+ setOfflineError(null);
487
527
  try {
488
528
  const { apiKey } = getApiConfig();
489
529
  const response = await fetch(`${baseUrl}/engage/widget/offline-form`, {
@@ -497,9 +537,16 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
497
537
  ...widgetConfig?.offlineFormSlug && { formSlug: widgetConfig.offlineFormSlug }
498
538
  })
499
539
  });
500
- if (response.ok) setOfflineSubmitted(true);
540
+ if (response.ok) {
541
+ setOfflineSubmitted(true);
542
+ } else {
543
+ const errorBody = await response.text().catch(() => "");
544
+ console.error(`[ChatWidget] Offline form returned ${response.status}:`, errorBody);
545
+ setOfflineError("Something went wrong. Please try again.");
546
+ }
501
547
  } catch (error) {
502
548
  console.error("[ChatWidget] Offline form submission failed:", error);
549
+ setOfflineError("Unable to send message. Please check your connection and try again.");
503
550
  } finally {
504
551
  setIsLoading(false);
505
552
  }
@@ -523,9 +570,9 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
523
570
  }, []);
524
571
  const statusLabel = (() => {
525
572
  if (showOfflineForm) return null;
526
- if (checkingAvailability) return { dot: "#f59e0b", text: "Checking availability..." };
527
- if (availability?.mode === "live" && availability.agentsOnline > 0) return { dot: "#22c55e", text: "Online" };
528
- if (availability?.mode === "ai") return { dot: "#a78bfa", text: "AI Assistant" };
573
+ if (checkingAvailability) return { dot: "#f59e0b", text: "Checking for a team member..." };
574
+ if (widgetConfig?.signal_enabled) return { dot: "#a78bfa", text: "AI Assistant" };
575
+ if (availability && availability.agentsOnline > 0) return { dot: "#22c55e", text: "Online" };
529
576
  return { dot: "#9ca3af", text: "We'll respond soon" };
530
577
  })();
531
578
  const ChatButton = /* @__PURE__ */ jsx(
@@ -699,6 +746,7 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
699
746
  onBlur: (e) => e.currentTarget.style.borderColor = "#e5e7eb"
700
747
  }
701
748
  ) }),
749
+ offlineError && /* @__PURE__ */ jsx("div", { style: { padding: "8px 12px", borderRadius: 8, backgroundColor: "#fef2f2", border: "1px solid #fecaca", color: "#dc2626", fontSize: 13, marginBottom: 12 }, children: offlineError }),
702
750
  /* @__PURE__ */ jsx(
703
751
  "button",
704
752
  {
@@ -768,7 +816,7 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
768
816
  )
769
817
  ] }),
770
818
  /* @__PURE__ */ jsxs("div", { children: [
771
- /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 600, color: "#111827", marginBottom: 6 }, children: "Checking if any agents are available" }),
819
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 16, fontWeight: 600, color: "#111827", marginBottom: 6 }, children: "Checking for a team member" }),
772
820
  /* @__PURE__ */ jsxs("div", { style: { fontSize: 14, color: "#6b7280", lineHeight: 1.5 }, children: [
773
821
  "One moment please",
774
822
  /* @__PURE__ */ jsx("span", { style: { display: "inline-flex", width: 20 }, children: /* @__PURE__ */ jsx("span", { style: { animation: "checkDots 1.5s infinite steps(4, end)" }, children: "..." }) })
@@ -850,7 +898,7 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
850
898
  children: "Retry send"
851
899
  }
852
900
  ) }),
853
- message.role === "assistant" && widgetConfig?.handoff_enabled !== false && messages.filter((m) => m.role === "user").length >= 2 && message.id === messages.filter((m) => m.role === "assistant").slice(-1)[0]?.id && /* @__PURE__ */ jsx(
901
+ widgetConfig?.signal_enabled && message.role === "assistant" && !message.suggestions?.length && widgetConfig?.handoff_enabled !== false && messages.filter((m) => m.role === "user").length >= 2 && message.id === messages.filter((m) => m.role === "assistant").slice(-1)[0]?.id && /* @__PURE__ */ jsx(
854
902
  "button",
855
903
  {
856
904
  onClick: requestHandoff,
@@ -1004,6 +1052,7 @@ function ChatWidget({ projectId, config, apiUrl: propApiUrl }) {
1004
1052
  ]
1005
1053
  }
1006
1054
  );
1055
+ if (!projectId) return null;
1007
1056
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1008
1057
  ChatPopup,
1009
1058
  ChatButton
@@ -1624,5 +1673,5 @@ function getDeviceType() {
1624
1673
  }
1625
1674
 
1626
1675
  export { ChatWidget, DesignRenderer, EngageWidget };
1627
- //# sourceMappingURL=chunk-UWUYO5DJ.mjs.map
1628
- //# sourceMappingURL=chunk-UWUYO5DJ.mjs.map
1676
+ //# sourceMappingURL=chunk-MDOHOEME.mjs.map
1677
+ //# sourceMappingURL=chunk-MDOHOEME.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engage/ChatWidget.tsx","../src/engage/DesignRenderer.tsx","../src/engage/EngageWidget.tsx"],"names":["useState","jsx","jsxs","React","getApiConfig","useEffect","useCallback","Fragment"],"mappings":"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","file":"chunk-MDOHOEME.mjs","sourcesContent":["/**\n * @uptrade/site-kit/engage - Chat Widget (Redesigned)\n *\n * Features:\n * - Pulls brand colors (primary/secondary) + business info from project settings via API\n * - Welcome screen with quick-action chips before first message\n * - Echo (AI) chat when mode is ai / hybrid; gateway returns Echo responses\n * - Automated handoff to live agent (re-checks availability; if agents online, POST handoff)\n * - Managed offline form when nobody is online (configurable heading/subheading)\n * - Socket.io with auto-reconnect for real-time live chat\n * - Proper AI → Live → Offline sequence routing\n */\n\n'use client'\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react'\nimport type { ChatConfig } from './types'\n\n// Socket type — the actual library is lazy-loaded via socket-loader.ts\n// to keep socket.io-client out of the main bundle entirely.\ntype Socket = { connected: boolean; disconnect: () => void; on: (ev: string, fn: (...args: any[]) => void) => void; emit: (ev: string, data?: any) => void }\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface ChatWidgetProps {\n /** Optional: resolved from API key via project-info when not provided */\n projectId?: string\n config?: Partial<ChatConfig>\n apiUrl?: string\n}\n\ninterface MessageAttachment {\n name: string\n url: string\n size?: number\n mimeType?: string\n}\n\ninterface Message {\n id: string\n role: 'user' | 'assistant' | 'agent' | 'system'\n content: string\n timestamp: Date\n agentName?: string\n attachments?: MessageAttachment[]\n suggestions?: string[]\n sendFailed?: boolean\n}\n\ninterface AvailabilityStatus {\n available: boolean\n mode: 'live' | 'ai' | 'offline'\n agentsOnline: number\n operatingHoursActive: boolean\n}\n\ninterface OfflineFormData {\n name: string\n email: string\n phone: string\n message: string\n}\n\n/** Enriched widget config from API (engage_chat_config + project settings) */\ninterface WidgetConfigFromApi {\n // Chat config fields\n is_enabled?: boolean\n position?: string\n initial_message?: string\n welcome_message?: string\n form_heading?: string\n form_description?: string\n offline_message?: string\n offlineFormSlug?: string\n chat_mode?: string\n signal_enabled?: boolean\n offline_mode?: string\n offline_heading?: string\n offline_subheading?: string\n welcome_screen_enabled?: boolean\n welcome_quick_actions?: string[]\n handoff_enabled?: boolean\n show_powered_by?: boolean\n business_hours?: any\n // Branding from Project Settings\n brand_primary?: string\n brand_secondary?: string\n logo_url?: string\n project_name?: string\n // Business info from Project Settings\n business_info?: {\n name?: string\n phone?: string\n domain?: string\n address?: string\n hours?: any\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getApiConfig() {\n const apiUrl =\n typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.uptrademedia.com'\n : 'https://api.uptrademedia.com'\n const apiKey = typeof window !== 'undefined' ? (window as any).__SITE_KIT_API_KEY__ : undefined\n return { apiUrl, apiKey }\n}\n\nfunction generateVisitorId(): string {\n const stored = typeof localStorage !== 'undefined' ? localStorage.getItem('engage_visitor_id') : null\n if (stored) return stored\n const id = `visitor_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n if (typeof localStorage !== 'undefined') localStorage.setItem('engage_visitor_id', id)\n return id\n}\n\n/** Darken / lighten a hex colour */\nfunction adjustColor(hex: string, amount: number): string {\n const num = parseInt(hex.replace('#', ''), 16)\n const r = Math.min(255, Math.max(0, (num >> 16) + amount))\n const g = Math.min(255, Math.max(0, ((num >> 8) & 0x00ff) + amount))\n const b = Math.min(255, Math.max(0, (num & 0x0000ff) + amount))\n return `#${((1 << 24) | (r << 16) | (g << 8) | b).toString(16).slice(1)}`\n}\n\n/** Determine if a hex colour is light enough to need dark text */\nfunction isLightColor(hex: string): boolean {\n const num = parseInt(hex.replace('#', ''), 16)\n const r = num >> 16\n const g = (num >> 8) & 0x00ff\n const b = num & 0x0000ff\n return (r * 299 + g * 587 + b * 114) / 1000 > 160\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl }: ChatWidgetProps) {\n // Resolve projectId from API key when not provided (backend derives project from key)\n const [resolvedProjectId, setResolvedProjectId] = useState<string | null>(propProjectId || null)\n const projectId = propProjectId || resolvedProjectId || ''\n\n // State -------------------------------------------------------------------\n const [isOpen, setIsOpen] = useState(false)\n const [messages, setMessages] = useState<Message[]>([])\n const [inputValue, setInputValue] = useState('')\n const [isLoading, setIsLoading] = useState(false)\n const [availability, setAvailability] = useState<AvailabilityStatus | null>(null)\n const [sessionId, setSessionId] = useState<string | null>(null)\n const [visitorId] = useState(generateVisitorId)\n const [agentTyping, setAgentTyping] = useState(false)\n const [showOfflineForm, setShowOfflineForm] = useState(false)\n const [offlineForm, setOfflineForm] = useState<OfflineFormData>({ name: '', email: '', phone: '', message: '' })\n const [offlineSubmitted, setOfflineSubmitted] = useState(false)\n const [connectionStatus, setConnectionStatus] = useState<'connecting' | 'connected' | 'disconnected'>('disconnected')\n const [widgetConfig, setWidgetConfig] = useState<WidgetConfigFromApi | null>(null)\n const [handoffOfflinePrompt, setHandoffOfflinePrompt] = useState<string | null>(null)\n const [pendingFiles, setPendingFiles] = useState<File[]>([])\n const [lastFailedSend, setLastFailedSend] = useState<{ content: string; attachments: MessageAttachment[] } | null>(null)\n const [showWelcome, setShowWelcome] = useState(true)\n const [checkingAvailability, setCheckingAvailability] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const pendingInitialMessageRef = useRef<string | null>(null)\n\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const socketRef = useRef<Socket | null>(null)\n const pollingIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n // Derived values ----------------------------------------------------------\n const position = config?.position || widgetConfig?.position || 'bottom-right'\n const primaryColor = widgetConfig?.brand_primary || config?.buttonColor || '#00afab'\n const secondaryColor = widgetConfig?.brand_secondary || config?.brandSecondary || adjustColor(primaryColor, -30)\n const businessName = widgetConfig?.project_name || widgetConfig?.business_info?.name || 'Chat with us'\n const logoUrl = widgetConfig?.logo_url || null\n const welcomeEnabled = widgetConfig?.welcome_screen_enabled !== false\n const quickActions: string[] = Array.isArray(widgetConfig?.welcome_quick_actions) ? widgetConfig.welcome_quick_actions : []\n const showPoweredBy = widgetConfig?.show_powered_by !== false\n const welcomeMessage =\n widgetConfig?.initial_message ?? widgetConfig?.welcome_message ?? config?.welcomeMessage ?? 'Hi! How can I help you today?'\n const offlineHeading = widgetConfig?.offline_heading ?? 'No agents available right now'\n const offlineSubheading =\n handoffOfflinePrompt ?? widgetConfig?.offline_subheading ?? widgetConfig?.form_description ?? widgetConfig?.offline_message ?? config?.offlineMessage ?? \"Leave us a message and we'll get back to you!\"\n\n const baseUrl = propApiUrl || getApiConfig().apiUrl\n\n // Resolve projectId from API key when not provided\n useEffect(() => {\n if (propProjectId || resolvedProjectId) return\n const { apiKey } = getApiConfig()\n if (!apiKey) return\n let cancelled = false\n fetch(`${baseUrl}/api/public/seo/project-info`, {\n headers: { 'x-api-key': apiKey },\n })\n .then((res) => (res.ok ? res.json() : null))\n .then((data) => {\n if (cancelled || !data?.valid || !data?.project_id) return\n setResolvedProjectId(data.project_id)\n })\n .catch(() => {})\n return () => { cancelled = true }\n }, [propProjectId, resolvedProjectId, baseUrl])\n\n // -------------------------------------------------------------------------\n // API calls\n // -------------------------------------------------------------------------\n\n const fetchWidgetConfig = useCallback(async () => {\n if (!projectId) return\n try {\n const { apiKey } = getApiConfig()\n const response = await fetch(`${baseUrl}/engage/widget/config?projectId=${projectId}`, {\n headers: apiKey ? { 'x-api-key': apiKey } : {},\n })\n if (response.ok) {\n const { data } = await response.json()\n setWidgetConfig(data ?? null)\n }\n } catch (error) {\n // Silently degrade when API unreachable (e.g. local dev, CORS, network)\n if (process.env.NODE_ENV === 'development') {\n console.warn('[ChatWidget] Config fetch failed:', error instanceof Error ? error.message : error)\n }\n }\n }, [projectId, baseUrl])\n\n const checkAvailability = useCallback(async (): Promise<AvailabilityStatus | null> => {\n if (!projectId) return null\n try {\n const { apiKey } = getApiConfig()\n const response = await fetch(`${baseUrl}/engage/widget/availability?projectId=${projectId}`, {\n headers: apiKey ? { 'x-api-key': apiKey } : {},\n })\n if (response.ok) {\n const { data } = await response.json()\n setAvailability(data)\n return data\n }\n } catch (error) {\n // Silently degrade when API unreachable (e.g. local dev, CORS, network)\n if (process.env.NODE_ENV === 'development') {\n console.warn('[ChatWidget] Availability check failed:', error instanceof Error ? error.message : error)\n }\n }\n return null\n }, [projectId, baseUrl])\n\n const initSession = useCallback(async () => {\n try {\n const { apiKey } = getApiConfig()\n const response = await fetch(`${baseUrl}/engage/widget/session`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...(apiKey && { 'x-api-key': apiKey }) },\n body: JSON.stringify({\n projectId,\n visitorId,\n sourceUrl: typeof window !== 'undefined' ? window.location.href : '',\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n }),\n })\n if (response.ok) {\n const { data } = await response.json()\n const sid = data.id || data.session_id\n setSessionId(sid)\n if (data.messages?.length > 0) {\n setMessages(\n data.messages.map((m: any) => ({\n id: m.id,\n role: m.role === 'visitor' ? 'user' : m.role,\n content: m.content,\n timestamp: new Date(m.created_at),\n agentName: m.sender_name,\n })),\n )\n }\n return sid\n }\n } catch (error) {\n console.error('[ChatWidget] Session init failed:', error)\n }\n return null\n }, [projectId, visitorId, baseUrl])\n\n // -------------------------------------------------------------------------\n // Socket.io message handler\n // -------------------------------------------------------------------------\n\n const handleSocketMessage = useCallback((data: any) => {\n switch (data.type || data.event) {\n case 'message': {\n const role = data.role === 'visitor' ? 'user' : data.role === 'ai' ? 'assistant' : (data.role as Message['role'])\n const newMessage: Message = {\n id: data.id || `msg-${Date.now()}`,\n role,\n content: data.content ?? '',\n timestamp: new Date(),\n agentName: data.agentName,\n ...(data.attachments?.length ? { attachments: data.attachments } : {}),\n ...(data.suggestions?.length ? { suggestions: data.suggestions as string[] } : {}),\n }\n setMessages((prev) => [...prev, newMessage])\n if (role === 'assistant' || role === 'agent') {\n setAgentTyping(false)\n setIsLoading(false)\n }\n break\n }\n case 'agent:joined':\n setMessages((prev) => [\n ...prev,\n {\n id: `system-${Date.now()}`,\n role: 'system',\n content: data.agentName ? `${data.agentName} has joined the chat.` : 'An agent has joined the chat.',\n timestamp: new Date(),\n },\n ])\n break\n case 'typing':\n setAgentTyping(data.isTyping)\n break\n case 'handoff:initiated':\n setMessages((prev) => [\n ...prev,\n { id: `system-${Date.now()}`, role: 'system', content: data.message || 'Connecting you with a team member...', timestamp: new Date() },\n ])\n break\n case 'chat:closed':\n setMessages((prev) => [\n ...prev,\n { id: `system-${Date.now()}`, role: 'system', content: data.message || 'This chat has been closed.', timestamp: new Date() },\n ])\n break\n }\n }, [])\n\n // -------------------------------------------------------------------------\n // Socket.io connection (with auto-reconnect)\n // -------------------------------------------------------------------------\n\n const connectSocket = useCallback(\n async (currentSessionId: string) => {\n if (socketRef.current?.connected) return\n\n // Disconnect any stale socket first\n if (socketRef.current) {\n socketRef.current.disconnect()\n socketRef.current = null\n }\n\n // Lazy-load socket.io via separate module so bundlers never pull it\n // into the main engage chunk (avoids massive client bundle).\n const { createSocket } = await import('./socket-loader')\n\n const namespaceUrl = `${baseUrl.replace(/\\/$/, '')}/engage/chat`\n const socket = await createSocket(namespaceUrl, {\n query: { projectId, visitorId, sessionId: currentSessionId },\n transports: ['websocket', 'polling'],\n // Auto-reconnect config\n reconnection: true,\n reconnectionAttempts: 10,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 10000,\n timeout: 15000,\n })\n\n socket.on('connect', () => {\n setConnectionStatus('connected')\n console.log('[ChatWidget] Socket.io connected')\n // Re-fetch messages to catch anything missed while disconnected\n if (currentSessionId) {\n const { apiKey } = getApiConfig()\n fetch(`${baseUrl}/engage/widget/messages?sessionId=${currentSessionId}`, {\n headers: apiKey ? { 'x-api-key': apiKey } : {},\n })\n .then((res) => (res.ok ? res.json() : null))\n .then((json) => {\n const data = json?.data ?? json\n if (Array.isArray(data) && data.length) {\n setMessages((prev) => {\n const byId = new Map(prev.map((m) => [m.id, m]))\n data.forEach((m: any) =>\n byId.set(m.id, {\n id: m.id,\n role: m.role === 'visitor' ? 'user' : m.role,\n content: m.content,\n timestamp: new Date(m.created_at),\n agentName: m.sender_name,\n attachments: m.attachments,\n }),\n )\n return Array.from(byId.values()).sort((a, b) => (a.timestamp as Date).getTime() - (b.timestamp as Date).getTime())\n })\n }\n })\n .catch((err) => console.warn('[ChatWidget] Refetch messages on reconnect failed', err))\n }\n\n // Retry any buffered message\n if (lastFailedSend) {\n socket.emit('visitor:message', {\n content: lastFailedSend.content,\n attachments: lastFailedSend.attachments?.length ? lastFailedSend.attachments : undefined,\n })\n setLastFailedSend(null)\n setMessages((prev) => prev.filter((m) => !m.sendFailed))\n setIsLoading(true)\n }\n })\n\n socket.on('message', (data: any) => handleSocketMessage({ type: 'message', ...data }))\n socket.on('agent:joined', (data: any) => handleSocketMessage({ type: 'agent:joined', ...data }))\n socket.on('typing', (data: any) => handleSocketMessage({ type: 'typing', ...data }))\n socket.on('handoff:initiated', (data: any) => handleSocketMessage({ type: 'handoff:initiated', ...data }))\n socket.on('chat:closed', (data: any) => handleSocketMessage({ type: 'chat:closed', ...data }))\n\n socket.on('disconnect', (reason) => {\n setConnectionStatus('disconnected')\n console.log('[ChatWidget] Socket disconnected:', reason)\n })\n\n socket.on('reconnect_attempt', (attempt) => {\n setConnectionStatus('connecting')\n console.log(`[ChatWidget] Reconnect attempt #${attempt}`)\n })\n\n socket.on('reconnect_failed', () => {\n console.warn('[ChatWidget] All reconnect attempts failed, falling back to polling')\n if (isOpen && currentSessionId) startPolling(currentSessionId)\n })\n\n socket.on('connect_error', (err) => {\n console.error('[ChatWidget] Socket connect error:', err)\n setConnectionStatus('connecting') // socket.io will auto-retry\n })\n\n socketRef.current = socket\n },\n [projectId, visitorId, baseUrl, isOpen, handleSocketMessage, lastFailedSend],\n )\n\n // Polling fallback\n const startPolling = useCallback(\n (currentSessionId: string) => {\n if (pollingIntervalRef.current) return\n pollingIntervalRef.current = setInterval(async () => {\n try {\n const { apiKey } = getApiConfig()\n const response = await fetch(`${baseUrl}/engage/widget/messages?sessionId=${currentSessionId}`, {\n headers: apiKey ? { 'x-api-key': apiKey } : {},\n })\n if (response.ok) {\n const { data } = await response.json()\n setMessages((prev) => {\n const existingIds = new Set(prev.map((m) => m.id))\n const newMessages = data.filter((m: any) => !existingIds.has(m.id))\n if (newMessages.length > 0) {\n return [\n ...prev,\n ...newMessages.map((m: any) => ({\n id: m.id,\n role: m.role === 'visitor' ? 'user' : m.role,\n content: m.content,\n timestamp: new Date(m.created_at),\n agentName: m.sender_name,\n })),\n ]\n }\n return prev\n })\n }\n } catch (error) {\n console.error('[ChatWidget] Polling failed:', error)\n }\n }, 3000)\n },\n [baseUrl],\n )\n\n // -------------------------------------------------------------------------\n // Effects\n // -------------------------------------------------------------------------\n\n // Scroll to bottom on new messages\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [messages, agentTyping])\n\n // Focus input when chat opens and welcome screen is hidden\n useEffect(() => {\n if (isOpen && !showWelcome && inputRef.current) inputRef.current.focus()\n }, [isOpen, showWelcome])\n\n // Fetch config + availability on mount\n useEffect(() => {\n fetchWidgetConfig()\n checkAvailability()\n const interval = setInterval(checkAvailability, 60000)\n return () => {\n clearInterval(interval)\n if (socketRef.current) {\n socketRef.current.disconnect()\n socketRef.current = null\n }\n }\n }, [fetchWidgetConfig, checkAvailability])\n\n // Init session and connect when chat opens (after welcome dismissed and routing decided)\n useEffect(() => {\n if (isOpen && !showWelcome && !checkingAvailability && !showOfflineForm && !sessionId) {\n initSession().then(async (id) => {\n if (!id) return\n // Connect for any non-offline mode (live, ai, or default/undefined)\n setConnectionStatus('connecting')\n await connectSocket(id)\n\n // If there's a pending initial message (from quick action chip), send it\n // once the socket is ready. Give it a short moment to finish connecting.\n const pending = pendingInitialMessageRef.current\n if (pending) {\n pendingInitialMessageRef.current = null\n // Wait briefly for socket to be ready\n const waitForSocket = () => new Promise<void>((resolve) => {\n const check = (attempts = 0) => {\n if (socketRef.current?.connected || attempts > 20) { resolve(); return }\n setTimeout(() => check(attempts + 1), 150)\n }\n check()\n })\n await waitForSocket()\n if (socketRef.current?.connected) {\n socketRef.current.emit('visitor:message', { content: pending })\n }\n }\n })\n }\n return () => {\n if (pollingIntervalRef.current) clearInterval(pollingIntervalRef.current)\n }\n }, [isOpen, showWelcome, checkingAvailability, showOfflineForm, sessionId, initSession, connectSocket])\n\n // -------------------------------------------------------------------------\n // Handlers\n // -------------------------------------------------------------------------\n\n const handleToggle = useCallback(() => {\n setIsOpen((prev) => !prev)\n }, [])\n\n /** Start chatting (dismiss welcome screen) with availability routing */\n const startChat = useCallback(\n async (initialMessage?: string) => {\n setShowWelcome(false)\n\n const beginChatSession = () => {\n setMessages([{ id: 'welcome', role: 'assistant', content: welcomeMessage, timestamp: new Date() }])\n if (initialMessage) {\n // Stash the initial message — the session-init effect will send it\n // once the socket is connected. This avoids duplicate messages.\n pendingInitialMessageRef.current = initialMessage\n const userMsg: Message = { id: `user-${Date.now()}`, role: 'user', content: initialMessage, timestamp: new Date() }\n setMessages((prev) => [...prev, userMsg])\n setIsLoading(true)\n }\n }\n\n // Signal/AI mode → go straight to chat (AI is always available)\n if (widgetConfig?.signal_enabled) {\n beginChatSession()\n return\n }\n\n // ─── Live-only mode: check agent availability ───────────────────\n // No Signal → live chat with human agents or offline form.\n setCheckingAvailability(true)\n\n // First real-time check\n const firstCheck = await checkAvailability()\n if (firstCheck?.available && firstCheck.agentsOnline > 0) {\n setCheckingAvailability(false)\n beginChatSession()\n return\n }\n\n // No agents online – wait ~5 seconds for push notification response.\n // Future: this is where we send a push notification to agents via\n // the Uptrade Messenger app. Agents get 5-6 seconds to open the\n // notification and come online before we fall through to the offline form.\n await new Promise((resolve) => setTimeout(resolve, 5000))\n\n // Re-check after the grace period\n const secondCheck = await checkAvailability()\n setCheckingAvailability(false)\n\n if (secondCheck?.available && secondCheck.agentsOnline > 0) {\n // An agent responded – start live chat\n beginChatSession()\n } else {\n // Still no agents – show offline form\n setShowOfflineForm(true)\n }\n },\n [widgetConfig?.signal_enabled, welcomeMessage, checkAvailability],\n )\n\n const uploadWidgetFile = useCallback(\n async (file: File): Promise<MessageAttachment | null> => {\n if (!sessionId || !visitorId) return null\n const { apiKey } = getApiConfig()\n const form = new FormData()\n form.append('file', file)\n form.append('sessionId', sessionId)\n form.append('visitorId', visitorId)\n const res = await fetch(`${baseUrl}/engage/widget/upload`, {\n method: 'POST',\n headers: apiKey ? { 'x-api-key': apiKey } : {},\n body: form,\n })\n if (!res.ok) throw new Error('Upload failed')\n const json = await res.json()\n const d = json?.data ?? json\n return d?.url ? { name: d.name ?? file.name, url: d.url, size: d.size, mimeType: d.mimeType } : null\n },\n [sessionId, visitorId, baseUrl],\n )\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault()\n const hasText = !!inputValue.trim()\n const hasFiles = pendingFiles.length > 0\n if ((!hasText && !hasFiles) || isLoading) return\n\n const content = inputValue.trim() || ''\n let attachments: MessageAttachment[] = []\n if (pendingFiles.length) {\n try {\n for (const file of pendingFiles) {\n const att = await uploadWidgetFile(file)\n if (att) attachments.push(att)\n }\n setPendingFiles([])\n } catch (err) {\n console.error('[ChatWidget] File upload failed', err)\n setMessages((prev) => [...prev, { id: `err-${Date.now()}`, role: 'assistant', content: 'Failed to upload file. Please try again.', timestamp: new Date() }])\n return\n }\n }\n\n const userMessage: Message = {\n id: `user-${Date.now()}`,\n role: 'user',\n content,\n timestamp: new Date(),\n ...(attachments.length ? { attachments } : {}),\n }\n setMessages((prev) => [...prev, userMessage])\n setInputValue('')\n setIsLoading(true)\n\n const socket = socketRef.current\n if (socket?.connected) {\n socket.emit('visitor:message', { content: userMessage.content, attachments: attachments.length ? attachments : undefined })\n setLastFailedSend(null)\n return\n }\n\n // Buffer for retry on reconnect instead of showing error immediately\n setLastFailedSend({ content: userMessage.content, attachments })\n // Give socket.io a moment to reconnect before showing error\n setTimeout(() => {\n if (!socketRef.current?.connected) {\n setMessages((prev) => [\n ...prev,\n { id: `error-${Date.now()}`, role: 'system', content: 'Reconnecting...', timestamp: new Date(), sendFailed: true },\n ])\n setIsLoading(false)\n }\n }, 3000)\n },\n [inputValue, isLoading, pendingFiles, uploadWidgetFile],\n )\n\n const retryFailedSend = useCallback(() => {\n if (!lastFailedSend || !sessionId) return\n const socket = socketRef.current\n if (socket?.connected) {\n socket.emit('visitor:message', { content: lastFailedSend.content, attachments: lastFailedSend.attachments?.length ? lastFailedSend.attachments : undefined })\n setLastFailedSend(null)\n setMessages((prev) => prev.filter((m) => !m.sendFailed))\n setIsLoading(true)\n } else {\n connectSocket(sessionId)\n }\n }, [lastFailedSend, sessionId, connectSocket])\n\n const requestHandoff = useCallback(async () => {\n if (!sessionId) return\n try {\n const { apiKey } = getApiConfig()\n const availRes = await fetch(`${baseUrl}/engage/widget/availability?projectId=${projectId}`, {\n headers: apiKey ? { 'x-api-key': apiKey } : {},\n })\n const avail = availRes.ok ? (await availRes.json()).data : null\n\n if (avail?.agentsOnline === 0) {\n setHandoffOfflinePrompt(widgetConfig?.offline_subheading ?? \"Nobody is online right now. Leave your details and we'll get back to you.\")\n setShowOfflineForm(true)\n setMessages((prev) => [\n ...prev,\n { id: `handoff-offline-${Date.now()}`, role: 'system', content: offlineHeading, timestamp: new Date() },\n ])\n return\n }\n\n await fetch(`${baseUrl}/engage/widget/handoff`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...(apiKey && { 'x-api-key': apiKey }) },\n body: JSON.stringify({ sessionId }),\n })\n setMessages((prev) => [\n ...prev,\n { id: `handoff-${Date.now()}`, role: 'system', content: 'Connecting you with a team member. Please hold on!', timestamp: new Date() },\n ])\n } catch (error) {\n console.error('[ChatWidget] Handoff request failed:', error)\n }\n }, [sessionId, baseUrl, projectId, widgetConfig, offlineHeading])\n\n const [offlineError, setOfflineError] = useState<string | null>(null)\n\n const handleOfflineSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault()\n if (!offlineForm.name || !offlineForm.email || !offlineForm.message) return\n setIsLoading(true)\n setOfflineError(null)\n try {\n const { apiKey } = getApiConfig()\n const response = await fetch(`${baseUrl}/engage/widget/offline-form`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...(apiKey && { 'x-api-key': apiKey }) },\n body: JSON.stringify({\n projectId,\n visitorId,\n ...offlineForm,\n pageUrl: typeof window !== 'undefined' ? window.location.href : '',\n ...(widgetConfig?.offlineFormSlug && { formSlug: widgetConfig.offlineFormSlug }),\n }),\n })\n if (response.ok) {\n setOfflineSubmitted(true)\n } else {\n const errorBody = await response.text().catch(() => '')\n console.error(`[ChatWidget] Offline form returned ${response.status}:`, errorBody)\n setOfflineError('Something went wrong. Please try again.')\n }\n } catch (error) {\n console.error('[ChatWidget] Offline form submission failed:', error)\n setOfflineError('Unable to send message. Please check your connection and try again.')\n } finally {\n setIsLoading(false)\n }\n },\n [offlineForm, projectId, visitorId, baseUrl, widgetConfig],\n )\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmit(e as any)\n }\n }, [handleSubmit])\n\n const handleTyping = useCallback(() => {\n const socket = socketRef.current\n if (socket?.connected) {\n socket.emit('visitor:typing', { isTyping: true })\n setTimeout(() => {\n if (socketRef.current?.connected) socketRef.current.emit('visitor:typing', { isTyping: false })\n }, 2000)\n }\n }, [])\n\n // -------------------------------------------------------------------------\n // Status label\n // -------------------------------------------------------------------------\n\n const statusLabel = (() => {\n if (showOfflineForm) return null\n if (checkingAvailability) return { dot: '#f59e0b', text: 'Checking for a team member...' }\n if (widgetConfig?.signal_enabled) return { dot: '#a78bfa', text: 'AI Assistant' }\n if (availability && availability.agentsOnline > 0) return { dot: '#22c55e', text: 'Online' }\n return { dot: '#9ca3af', text: \"We'll respond soon\" }\n })()\n\n // -------------------------------------------------------------------------\n // Render: Chat Button\n // -------------------------------------------------------------------------\n\n const ChatButton = (\n <button\n onClick={handleToggle}\n aria-label={isOpen ? 'Close chat' : 'Open chat'}\n style={{\n position: 'fixed',\n [position === 'bottom-left' ? 'left' : 'right']: 20,\n bottom: 20,\n width: 60,\n height: 60,\n borderRadius: '50%',\n backgroundColor: primaryColor,\n border: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.25)',\n transition: 'transform 0.2s, box-shadow 0.2s',\n zIndex: 9999,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'scale(1.05)'\n e.currentTarget.style.boxShadow = '0 6px 16px rgba(0, 0, 0, 0.3)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'scale(1)'\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.25)'\n }}\n >\n {isOpen ? (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n ) : (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n )}\n </button>\n )\n\n // -------------------------------------------------------------------------\n // Render: Header (shared across all views)\n // -------------------------------------------------------------------------\n\n const Header = (\n <div\n style={{\n padding: '16px 20px',\n background: `linear-gradient(135deg, ${primaryColor}, ${adjustColor(primaryColor, -25)})`,\n color: isLightColor(primaryColor) ? '#1a1a1a' : 'white',\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n }}\n >\n {/* Logo or icon */}\n <div\n style={{\n width: 40,\n height: 40,\n borderRadius: '50%',\n backgroundColor: 'rgba(255,255,255,0.2)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n flexShrink: 0,\n }}\n >\n {logoUrl ? (\n <img src={logoUrl} alt=\"\" style={{ width: 28, height: 28, objectFit: 'contain', filter: isLightColor(primaryColor) ? 'none' : 'brightness(0) invert(1)' }} />\n ) : (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontWeight: 600, fontSize: 16, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>\n {showOfflineForm ? offlineHeading : businessName}\n </div>\n {statusLabel && (\n <div style={{ fontSize: 13, opacity: 0.9, display: 'flex', alignItems: 'center', gap: 6, marginTop: 2 }}>\n <span style={{ width: 8, height: 8, borderRadius: '50%', backgroundColor: statusLabel.dot, flexShrink: 0 }} />\n {statusLabel.text}\n </div>\n )}\n </div>\n\n {/* Connection status indicator */}\n {connectionStatus === 'connecting' && !showWelcome && !showOfflineForm && (\n <div style={{ fontSize: 11, opacity: 0.7, display: 'flex', alignItems: 'center', gap: 4 }}>\n <span style={{ animation: 'chatDot 1s infinite ease-in-out' }}>●</span>\n Connecting\n </div>\n )}\n </div>\n )\n\n // -------------------------------------------------------------------------\n // Render: Welcome Screen\n // -------------------------------------------------------------------------\n\n const WelcomeScreen = (\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', padding: 20, gap: 16 }}>\n <div style={{ textAlign: 'center', paddingTop: 8 }}>\n <div style={{ fontSize: 15, color: '#374151', lineHeight: 1.5 }}>\n {welcomeMessage}\n </div>\n </div>\n\n {/* Quick action chips */}\n {quickActions.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {quickActions.map((action, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => startChat(action)}\n style={{\n padding: '12px 16px',\n borderRadius: 12,\n border: `1px solid ${primaryColor}33`,\n backgroundColor: `${primaryColor}08`,\n color: primaryColor,\n fontSize: 14,\n cursor: 'pointer',\n textAlign: 'left',\n transition: 'background-color 0.15s, border-color 0.15s',\n lineHeight: 1.4,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = `${primaryColor}15`\n e.currentTarget.style.borderColor = `${primaryColor}55`\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = `${primaryColor}08`\n e.currentTarget.style.borderColor = `${primaryColor}33`\n }}\n >\n {action}\n </button>\n ))}\n </div>\n )}\n\n {/* Start chat button */}\n <button\n type=\"button\"\n onClick={() => startChat()}\n style={{\n padding: '12px 20px',\n borderRadius: 12,\n border: 'none',\n backgroundColor: primaryColor,\n color: isLightColor(primaryColor) ? '#1a1a1a' : 'white',\n fontSize: 14,\n fontWeight: 600,\n cursor: 'pointer',\n marginTop: 'auto',\n }}\n >\n Start a conversation\n </button>\n\n {/* Business phone */}\n {widgetConfig?.business_info?.phone && (\n <div style={{ textAlign: 'center', fontSize: 13, color: '#6b7280' }}>\n Or call us at{' '}\n <a href={`tel:${widgetConfig.business_info.phone}`} style={{ color: primaryColor, textDecoration: 'none', fontWeight: 500 }}>\n {widgetConfig.business_info.phone}\n </a>\n </div>\n )}\n </div>\n )\n\n // -------------------------------------------------------------------------\n // Render: Offline Form\n // -------------------------------------------------------------------------\n\n const OfflineFormView = (\n <div style={{ padding: 20, flex: 1, overflowY: 'auto' }}>\n {offlineSubmitted ? (\n <div style={{ textAlign: 'center', padding: 20 }}>\n <div style={{ width: 56, height: 56, borderRadius: '50%', backgroundColor: `${primaryColor}15`, display: 'flex', alignItems: 'center', justifyContent: 'center', margin: '0 auto 16px' }}>\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={primaryColor} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </div>\n <h3 style={{ margin: '0 0 8px', fontSize: 18, fontWeight: 600, color: '#111827' }}>Message Sent!</h3>\n <p style={{ margin: 0, color: '#6b7280', fontSize: 14 }}>{offlineSubheading}</p>\n </div>\n ) : (\n <form onSubmit={handleOfflineSubmit}>\n <p style={{ margin: '0 0 16px', color: '#6b7280', fontSize: 14 }}>{offlineSubheading}</p>\n {[\n { name: 'name' as const, type: 'text', placeholder: 'Your name *', required: true },\n { name: 'email' as const, type: 'email', placeholder: 'Your email *', required: true },\n { name: 'phone' as const, type: 'tel', placeholder: 'Phone (optional)', required: false },\n ].map((field) => (\n <div key={field.name} style={{ marginBottom: 12 }}>\n <input\n type={field.type}\n placeholder={field.placeholder}\n value={offlineForm[field.name]}\n onChange={(e) => setOfflineForm((prev) => ({ ...prev, [field.name]: e.target.value }))}\n required={field.required}\n style={{ width: '100%', padding: '10px 12px', borderRadius: 8, border: '1px solid #e5e7eb', fontSize: 14, outline: 'none', boxSizing: 'border-box' }}\n onFocus={(e) => (e.currentTarget.style.borderColor = primaryColor)}\n onBlur={(e) => (e.currentTarget.style.borderColor = '#e5e7eb')}\n />\n </div>\n ))}\n <div style={{ marginBottom: 16 }}>\n <textarea\n placeholder=\"How can we help? *\"\n value={offlineForm.message}\n onChange={(e) => setOfflineForm((prev) => ({ ...prev, message: e.target.value }))}\n required\n rows={4}\n style={{ width: '100%', padding: '10px 12px', borderRadius: 8, border: '1px solid #e5e7eb', fontSize: 14, outline: 'none', resize: 'vertical', boxSizing: 'border-box' }}\n onFocus={(e) => (e.currentTarget.style.borderColor = primaryColor)}\n onBlur={(e) => (e.currentTarget.style.borderColor = '#e5e7eb')}\n />\n </div>\n {offlineError && (\n <div style={{ padding: '8px 12px', borderRadius: 8, backgroundColor: '#fef2f2', border: '1px solid #fecaca', color: '#dc2626', fontSize: 13, marginBottom: 12 }}>\n {offlineError}\n </div>\n )}\n <button\n type=\"submit\"\n disabled={isLoading}\n style={{\n width: '100%',\n padding: '12px',\n borderRadius: 8,\n border: 'none',\n backgroundColor: primaryColor,\n color: isLightColor(primaryColor) ? '#1a1a1a' : 'white',\n fontSize: 14,\n fontWeight: 600,\n cursor: isLoading ? 'wait' : 'pointer',\n opacity: isLoading ? 0.7 : 1,\n }}\n >\n {isLoading ? 'Sending...' : 'Send Message'}\n </button>\n </form>\n )}\n </div>\n )\n\n // -------------------------------------------------------------------------\n // Render: Checking Availability Screen\n // -------------------------------------------------------------------------\n\n const CheckingScreen = (\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', padding: 32, gap: 20, textAlign: 'center' }}>\n {/* Pulsing radar icon */}\n <div style={{ position: 'relative', width: 64, height: 64 }}>\n <div\n style={{\n position: 'absolute',\n inset: 0,\n borderRadius: '50%',\n backgroundColor: `${primaryColor}15`,\n animation: 'checkPulse 2s infinite ease-out',\n }}\n />\n <div\n style={{\n position: 'absolute',\n inset: 8,\n borderRadius: '50%',\n backgroundColor: `${primaryColor}25`,\n animation: 'checkPulse 2s infinite ease-out 0.4s',\n }}\n />\n <div\n style={{\n position: 'absolute',\n inset: 16,\n borderRadius: '50%',\n backgroundColor: primaryColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={isLightColor(primaryColor) ? '#1a1a1a' : 'white'} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\" />\n <circle cx=\"8.5\" cy=\"7\" r=\"4\" />\n <line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"14\" />\n <line x1=\"23\" y1=\"11\" x2=\"17\" y2=\"11\" />\n </svg>\n </div>\n </div>\n\n <div>\n <div style={{ fontSize: 16, fontWeight: 600, color: '#111827', marginBottom: 6 }}>\n Checking for a team member\n </div>\n <div style={{ fontSize: 14, color: '#6b7280', lineHeight: 1.5 }}>\n One moment please\n <span style={{ display: 'inline-flex', width: 20 }}>\n <span style={{ animation: 'checkDots 1.5s infinite steps(4, end)' }}>...</span>\n </span>\n </div>\n </div>\n\n {/* Progress bar */}\n <div style={{ width: '80%', height: 3, backgroundColor: '#e5e7eb', borderRadius: 2, overflow: 'hidden' }}>\n <div\n style={{\n width: '100%',\n height: '100%',\n backgroundColor: primaryColor,\n borderRadius: 2,\n animation: 'checkProgress 5s linear forwards',\n transformOrigin: 'left',\n }}\n />\n </div>\n\n <div style={{ fontSize: 12, color: '#9ca3af' }}>\n This usually takes just a few seconds\n </div>\n </div>\n )\n\n // -------------------------------------------------------------------------\n // Render: Messages View\n // -------------------------------------------------------------------------\n\n const MessagesView = (\n <>\n {/* Messages area */}\n <div\n style={{ flex: 1, overflowY: 'auto', padding: 16, display: 'flex', flexDirection: 'column', gap: 12, backgroundColor: '#f9fafb' }}\n >\n {messages.map((message) => (\n <div key={message.id} style={{ display: 'flex', justifyContent: message.role === 'user' ? 'flex-end' : 'flex-start' }}>\n <div\n style={{\n maxWidth: '80%',\n padding: message.role === 'system' ? '8px 12px' : '10px 14px',\n borderRadius: message.role === 'user' ? '16px 16px 4px 16px' : message.role === 'system' ? '8px' : '16px 16px 16px 4px',\n backgroundColor: message.role === 'user' ? primaryColor : message.role === 'system' ? '#e5e7eb' : '#ffffff',\n color: message.role === 'user' ? (isLightColor(primaryColor) ? '#1a1a1a' : 'white') : message.role === 'system' ? '#6b7280' : '#111827',\n boxShadow: message.role === 'system' ? 'none' : '0 1px 2px rgba(0,0,0,0.08)',\n fontSize: message.role === 'system' ? 13 : 14,\n fontStyle: message.role === 'system' ? 'italic' : 'normal',\n lineHeight: 1.5,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}\n >\n {message.agentName && message.role === 'agent' && (\n <div style={{ fontSize: 12, opacity: 0.6, marginBottom: 4 }}>{message.agentName}</div>\n )}\n {message.content}\n {/* Attachments */}\n {message.attachments?.length ? (\n <div style={{ marginTop: 8, display: 'flex', flexDirection: 'column', gap: 6 }}>\n {message.attachments.map((att, i) =>\n att.mimeType?.startsWith('image/') ? (\n <a key={i} href={att.url} target=\"_blank\" rel=\"noopener noreferrer\" style={{ display: 'block' }}>\n <img src={att.url} alt={att.name} style={{ maxWidth: '100%', maxHeight: 200, borderRadius: 8, objectFit: 'contain' }} />\n </a>\n ) : (\n <a key={i} href={att.url} target=\"_blank\" rel=\"noopener noreferrer\" style={{ fontSize: 13, wordBreak: 'break-all' }}>\n 📎 {att.name}\n </a>\n ),\n )}\n </div>\n ) : null}\n {/* Suggestion chips */}\n {message.suggestions?.length ? (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, marginTop: 8 }}>\n {message.suggestions.map((s, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => {\n setInputValue(s)\n inputRef.current?.focus()\n }}\n style={{\n padding: '6px 12px',\n borderRadius: 16,\n border: `1px solid ${secondaryColor}`,\n backgroundColor: `${secondaryColor}10`,\n color: secondaryColor,\n fontSize: 13,\n cursor: 'pointer',\n }}\n >\n {s}\n </button>\n ))}\n </div>\n ) : null}\n {/* Retry on failed send */}\n {message.sendFailed && lastFailedSend && (\n <div style={{ marginTop: 8 }}>\n <button\n type=\"button\"\n onClick={retryFailedSend}\n style={{ padding: '6px 12px', borderRadius: 6, border: '1px solid #ef4444', backgroundColor: '#fef2f2', color: '#dc2626', fontSize: 13, cursor: 'pointer' }}\n >\n Retry send\n </button>\n </div>\n )}\n {/* Handoff button — only in AI mode, skip if message already has suggestion chips */}\n {widgetConfig?.signal_enabled && message.role === 'assistant' && !message.suggestions?.length && widgetConfig?.handoff_enabled !== false && messages.filter((m) => m.role === 'user').length >= 2 && message.id === messages.filter((m) => m.role === 'assistant').slice(-1)[0]?.id && (\n <button\n onClick={requestHandoff}\n style={{\n display: 'inline-block',\n marginTop: 8,\n padding: '6px 12px',\n borderRadius: 6,\n border: `1px solid ${secondaryColor}`,\n backgroundColor: 'transparent',\n color: secondaryColor,\n fontSize: 13,\n cursor: 'pointer',\n }}\n >\n Talk to a person\n </button>\n )}\n </div>\n </div>\n ))}\n\n {/* Typing indicator */}\n {(isLoading || agentTyping) && (\n <div style={{ display: 'flex', justifyContent: 'flex-start' }}>\n <div\n style={{\n padding: '10px 14px',\n borderRadius: '16px 16px 16px 4px',\n backgroundColor: '#ffffff',\n boxShadow: '0 1px 2px rgba(0,0,0,0.08)',\n display: 'flex',\n gap: 4,\n color: '#9ca3af',\n }}\n >\n <span style={{ animation: 'chatDot 1.4s infinite ease-in-out', animationDelay: '0s' }}>●</span>\n <span style={{ animation: 'chatDot 1.4s infinite ease-in-out', animationDelay: '0.2s' }}>●</span>\n <span style={{ animation: 'chatDot 1.4s infinite ease-in-out', animationDelay: '0.4s' }}>●</span>\n </div>\n </div>\n )}\n\n <div ref={messagesEndRef} />\n </div>\n\n {/* Failed send bar */}\n {lastFailedSend && (\n <div style={{ padding: '8px 12px', backgroundColor: '#fef2f2', borderTop: '1px solid #fecaca', display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <span style={{ fontSize: 13, color: '#dc2626' }}>Failed to send</span>\n <button type=\"button\" onClick={retryFailedSend} style={{ padding: '4px 10px', borderRadius: 6, border: '1px solid #dc2626', background: '#fff', color: '#dc2626', fontSize: 12, cursor: 'pointer' }}>\n Retry\n </button>\n </div>\n )}\n\n {/* Input */}\n <form onSubmit={handleSubmit} style={{ padding: 12, borderTop: '1px solid #e5e7eb', backgroundColor: '#ffffff' }}>\n <div style={{ display: 'flex', gap: 8 }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value)\n handleTyping()\n }}\n onKeyDown={handleKeyDown}\n placeholder=\"Type a message...\"\n disabled={isLoading}\n style={{\n flex: 1,\n padding: '10px 14px',\n borderRadius: 24,\n border: '1px solid #e5e7eb',\n fontSize: 14,\n outline: 'none',\n transition: 'border-color 0.2s',\n }}\n onFocus={(e) => (e.currentTarget.style.borderColor = primaryColor)}\n onBlur={(e) => (e.currentTarget.style.borderColor = '#e5e7eb')}\n />\n <button\n type=\"submit\"\n disabled={!inputValue.trim() || isLoading}\n style={{\n width: 40,\n height: 40,\n borderRadius: '50%',\n border: 'none',\n backgroundColor: (inputValue.trim() || pendingFiles.length) && !isLoading ? primaryColor : '#e5e7eb',\n color: (inputValue.trim() || pendingFiles.length) && !isLoading && isLightColor(primaryColor) ? '#1a1a1a' : 'white',\n cursor: inputValue.trim() && !isLoading ? 'pointer' : 'not-allowed',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background-color 0.2s',\n flexShrink: 0,\n }}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\n </svg>\n </button>\n </div>\n </form>\n </>\n )\n\n // -------------------------------------------------------------------------\n // Render: Popup\n // -------------------------------------------------------------------------\n\n const ChatPopup = isOpen && (\n <div\n style={{\n position: 'fixed',\n [position === 'bottom-left' ? 'left' : 'right']: 20,\n bottom: 90,\n width: 380,\n maxWidth: 'calc(100vw - 40px)',\n height: 520,\n maxHeight: 'calc(100vh - 120px)',\n backgroundColor: '#ffffff',\n borderRadius: 16,\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.2)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n zIndex: 9998,\n animation: 'chatSlideUp 0.3s ease-out',\n }}\n >\n {Header}\n\n {/* Content: Welcome → Checking → Chat → Offline */}\n {checkingAvailability ? CheckingScreen : showOfflineForm ? OfflineFormView : showWelcome && welcomeEnabled && messages.length === 0 ? WelcomeScreen : MessagesView}\n\n {/* Powered by */}\n {showPoweredBy && (\n <div style={{ padding: '6px 0', textAlign: 'center', fontSize: 11, color: '#9ca3af', backgroundColor: '#ffffff', borderTop: '1px solid #f3f4f6' }}>\n Powered by{' '}\n <a href=\"https://uptrademedia.com\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: '#6b7280', textDecoration: 'none', fontWeight: 500 }}>\n Uptrade\n </a>\n </div>\n )}\n\n {/* CSS animations */}\n <style>{`\n @keyframes chatSlideUp {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes chatDot {\n 0%, 80%, 100% { opacity: 0.3; }\n 40% { opacity: 1; }\n }\n @keyframes checkPulse {\n 0% { transform: scale(1); opacity: 1; }\n 100% { transform: scale(1.8); opacity: 0; }\n }\n @keyframes checkDots {\n 0% { content: ''; }\n 25% { content: '.'; }\n 50% { content: '..'; }\n 75% { content: '...'; }\n }\n @keyframes checkProgress {\n from { transform: scaleX(0); }\n to { transform: scaleX(1); }\n }\n `}</style>\n </div>\n )\n\n // Don't render until we have projectId (from props or resolved from API key)\n if (!projectId) return null\n\n return (\n <>\n {ChatPopup}\n {ChatButton}\n </>\n )\n}\n","/**\n * @uptrade/site-kit/engage - Design Renderer\n * \n * Renders design_json from Engage Studio as React components.\n * This is the runtime renderer that converts the visual builder's\n * JSON structure into actual React elements.\n */\n\n'use client'\n\nimport React, { createElement, CSSProperties, MouseEvent, useState } from 'react'\n\n// ============================================\n// Types\n// ============================================\n\nexport interface DesignNode {\n id: string\n type: string\n name: string\n children?: DesignNode[]\n props?: Record<string, any>\n style?: CSSProperties\n}\n\nexport interface DesignDocument {\n id: string\n type: string\n name: string\n children: DesignNode[]\n style?: CSSProperties\n props?: Record<string, any>\n}\n\nexport interface DesignRendererProps {\n design: DesignDocument\n onClose?: () => void\n onAction?: (action: ActionConfig, node: DesignNode) => void\n context?: EngageContext\n}\n\nexport interface ActionConfig {\n action: string\n url?: string\n newTab?: boolean\n target?: string\n text?: string\n productId?: string\n formId?: string\n}\n\nexport interface EngageContext {\n // Site-Kit context data that can be bound to elements\n user?: {\n name?: string\n email?: string\n isLoggedIn?: boolean\n }\n cart?: {\n itemCount?: number\n total?: number\n }\n page?: {\n url?: string\n title?: string\n }\n // Custom data from the page\n [key: string]: any\n}\n\n// ============================================\n// Action Handlers\n// ============================================\n\nfunction handleAction(\n action: ActionConfig,\n node: DesignNode,\n onClose?: () => void,\n onAction?: (action: ActionConfig, node: DesignNode) => void,\n): void {\n if (!action?.action || action.action === 'none') return\n\n // Let parent handle custom actions\n if (onAction) {\n onAction(action, node)\n }\n\n switch (action.action) {\n case 'link':\n if (action.url) {\n if (action.newTab) {\n window.open(action.url, '_blank', 'noopener,noreferrer')\n } else {\n window.location.href = action.url\n }\n }\n break\n\n case 'scroll':\n if (action.target) {\n const element = document.querySelector(action.target)\n element?.scrollIntoView({ behavior: 'smooth' })\n }\n break\n\n case 'close':\n onClose?.()\n break\n\n case 'copy':\n if (action.text) {\n navigator.clipboard.writeText(action.text).catch(console.error)\n }\n break\n\n case 'share':\n if (navigator.share) {\n navigator.share({\n title: document.title,\n url: window.location.href,\n }).catch(console.error)\n }\n break\n\n case 'download':\n if (action.url) {\n const a = document.createElement('a')\n a.href = action.url\n a.download = ''\n a.click()\n }\n break\n\n // Commerce actions - these should be handled by onAction callback\n case 'add_to_cart':\n case 'checkout':\n case 'book':\n case 'submit_form':\n case 'open_form':\n // Handled by parent via onAction\n break\n }\n}\n\n// ============================================\n// Animation Styles\n// ============================================\n\nconst animationKeyframes = `\n@keyframes engageFadeIn { from { opacity: 0; } to { opacity: 1; } }\n@keyframes engageFadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes engageFadeInDown { from { opacity: 0; transform: translateY(-20px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes engageSlideInLeft { from { opacity: 0; transform: translateX(-20px); } to { opacity: 1; transform: translateX(0); } }\n@keyframes engageSlideInRight { from { opacity: 0; transform: translateX(20px); } to { opacity: 1; transform: translateX(0); } }\n@keyframes engageSlideInUp { from { opacity: 0; transform: translateY(100%); } to { opacity: 1; transform: translateY(0); } }\n@keyframes engageScaleIn { from { opacity: 0; transform: scale(0.9); } to { opacity: 1; transform: scale(1); } }\n@keyframes engageBounceIn { 0% { opacity: 0; transform: scale(0.3); } 50% { transform: scale(1.05); } 70% { transform: scale(0.9); } 100% { opacity: 1; transform: scale(1); } }\n`\n\nfunction getAnimationStyle(animation?: string, delay?: number, duration?: number): CSSProperties {\n if (!animation || animation === 'none') return {}\n \n const animationMap: Record<string, string> = {\n fadeIn: 'engageFadeIn',\n fadeInUp: 'engageFadeInUp',\n fadeInDown: 'engageFadeInDown',\n slideInLeft: 'engageSlideInLeft',\n slideInRight: 'engageSlideInRight',\n slideInUp: 'engageSlideInUp',\n scaleIn: 'engageScaleIn',\n bounceIn: 'engageBounceIn',\n }\n \n const animationName = animationMap[animation]\n if (!animationName) return {}\n \n return {\n animation: `${animationName} ${duration || 300}ms ease-out ${delay || 0}ms forwards`,\n opacity: 0, // Start invisible, animation will show it\n }\n}\n\n// ============================================\n// Node Renderer\n// ============================================\n\ninterface NodeRendererProps {\n node: DesignNode\n onClose?: () => void\n onAction?: (action: ActionConfig, node: DesignNode) => void\n context?: EngageContext\n}\n\nfunction NodeRenderer({ node, onClose, onAction, context }: NodeRendererProps): React.ReactElement | null {\n const [isHovered, setIsHovered] = useState(false)\n const { type, props = {}, style = {}, children } = node\n\n // Build styles with hover effects\n const computedStyle: CSSProperties = { ...style }\n \n // Apply animation\n if (props.animation) {\n Object.assign(computedStyle, getAnimationStyle(\n props.animation,\n props.animationDelay,\n props.animationDuration\n ))\n }\n \n // Apply hover effects\n if (isHovered) {\n if (props.hoverScale && props.hoverScale !== 'none') {\n computedStyle.transform = `scale(${props.hoverScale})`\n computedStyle.transition = 'transform 0.2s ease'\n }\n if (props.hoverShadow && props.hoverShadow !== 'none') {\n const shadowMap: Record<string, string> = {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1)',\n }\n computedStyle.boxShadow = shadowMap[props.hoverShadow]\n }\n }\n\n // Event handlers\n const eventHandlers: Record<string, (e: MouseEvent) => void> = {\n onMouseEnter: () => setIsHovered(true),\n onMouseLeave: () => setIsHovered(false),\n }\n \n // Click handler\n if (props.onClick) {\n eventHandlers.onClick = (e: MouseEvent) => {\n e.preventDefault()\n handleAction(props.onClick, node, onClose, onAction)\n }\n computedStyle.cursor = 'pointer'\n }\n\n // Render children recursively\n const renderedChildren = children?.map((child) => (\n <NodeRenderer\n key={child.id}\n node={child}\n onClose={onClose}\n onAction={onAction}\n context={context}\n />\n ))\n\n // Render based on type\n switch (type) {\n case 'Container':\n case 'Box':\n case 'Section':\n return (\n <div style={computedStyle} {...eventHandlers}>\n {renderedChildren}\n </div>\n )\n\n case 'Text':\n return (\n <p style={computedStyle} {...eventHandlers}>\n {resolveText(props.text, context)}\n </p>\n )\n\n case 'Heading':\n const HeadingTag = `h${props.level || 2}` as keyof JSX.IntrinsicElements\n return createElement(\n HeadingTag,\n { style: computedStyle, ...eventHandlers },\n resolveText(props.text, context)\n )\n\n case 'Button':\n case 'BookingButton':\n case 'BuyNow':\n case 'AddToCart':\n case 'EventRSVP':\n return (\n <button\n style={computedStyle}\n {...eventHandlers}\n type=\"button\"\n >\n {resolveText(props.text || props.label, context) || 'Button'}\n </button>\n )\n\n case 'Image':\n return (\n <img\n src={props.src}\n alt={props.alt || ''}\n style={computedStyle}\n {...eventHandlers}\n />\n )\n\n case 'Link':\n return (\n <a\n href={props.href || '#'}\n target={props.newTab ? '_blank' : undefined}\n rel={props.newTab ? 'noopener noreferrer' : undefined}\n style={computedStyle}\n {...eventHandlers}\n >\n {resolveText(props.text, context) || renderedChildren}\n </a>\n )\n\n case 'Input':\n return (\n <input\n type={props.inputType || 'text'}\n placeholder={props.placeholder}\n style={computedStyle}\n {...eventHandlers}\n />\n )\n\n case 'Divider':\n return <hr style={{ border: 'none', borderTop: '1px solid #e5e7eb', ...computedStyle }} />\n\n case 'Spacer':\n return <div style={{ ...computedStyle, width: props.width, height: props.height }} />\n\n case 'Icon':\n // Simple emoji/text icon rendering\n return (\n <span style={computedStyle} {...eventHandlers}>\n {props.icon || '★'}\n </span>\n )\n\n case 'FormEmbed':\n // For form embeds, we need to render the form from Forms module\n // This would integrate with the ManagedForm component\n return (\n <div \n style={computedStyle} \n data-engage-form={props.form_id}\n {...eventHandlers}\n >\n {/* ManagedForm would be rendered here by the parent */}\n <div style={{ padding: '16px', background: '#f5f5f5', borderRadius: '8px', textAlign: 'center' }}>\n Form: {props.form_id || 'Not configured'}\n </div>\n </div>\n )\n\n case 'ProductCard':\n case 'EventCard':\n // Product/event cards need data binding from Commerce\n return (\n <div \n style={computedStyle} \n data-engage-offering={props.offering_id}\n {...eventHandlers}\n >\n {renderedChildren}\n </div>\n )\n\n default:\n // Unknown type - render as div with children\n console.warn(`[DesignRenderer] Unknown node type: ${type}`)\n return (\n <div style={computedStyle} {...eventHandlers}>\n {renderedChildren}\n </div>\n )\n }\n}\n\n// ============================================\n// Text Resolution (Data Bindings)\n// ============================================\n\nfunction resolveText(text: string | undefined, context?: EngageContext): string {\n if (!text) return ''\n if (!context) return text\n \n // Replace {{variable}} patterns with context values\n return text.replace(/\\{\\{(\\w+(?:\\.\\w+)*)\\}\\}/g, (match, path) => {\n const value = getNestedValue(context, path)\n return value !== undefined ? String(value) : match\n })\n}\n\nfunction getNestedValue(obj: Record<string, any>, path: string): any {\n return path.split('.').reduce((acc, key) => acc?.[key], obj)\n}\n\n// ============================================\n// Main Component\n// ============================================\n\nexport function DesignRenderer({\n design,\n onClose,\n onAction,\n context,\n}: DesignRendererProps): React.ReactElement {\n // Inject animation keyframes\n React.useEffect(() => {\n if (typeof document === 'undefined') return\n \n const styleId = 'engage-design-renderer-animations'\n if (!document.getElementById(styleId)) {\n const styleSheet = document.createElement('style')\n styleSheet.id = styleId\n styleSheet.textContent = animationKeyframes\n document.head.appendChild(styleSheet)\n }\n }, [])\n\n // Render the root container\n const rootStyle: CSSProperties = {\n ...design.style,\n }\n\n return (\n <div style={rootStyle} data-engage-design={design.id}>\n {design.children?.map((node) => (\n <NodeRenderer\n key={node.id}\n node={node}\n onClose={onClose}\n onAction={onAction}\n context={context}\n />\n ))}\n </div>\n )\n}\n\nexport default DesignRenderer\n","/**\n * @uptrade/site-kit/engage - Engage Widget\n * \n * Loads and renders engagement widgets (popups, nudges, bars, chat) via Portal API\n * Supports both legacy config-based rendering and new design_json from Engage Studio\n */\n\n'use client'\n\nimport React, { useEffect, useState, useCallback } from 'react'\nimport { usePathname } from 'next/navigation'\nimport type { EngageElement } from './types'\nimport { ChatWidget } from './ChatWidget'\nimport { DesignRenderer, type ActionConfig, type DesignDocument } from './DesignRenderer'\n\ninterface EngageWidgetProps {\n apiUrl?: string\n apiKey?: string\n position?: 'bottom-right' | 'bottom-left'\n zIndex?: number\n chatEnabled?: boolean\n debug?: boolean\n}\n\nfunction getApiConfig() {\n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.uptrademedia.com'\n : 'https://api.uptrademedia.com'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__\n : undefined\n return { apiUrl, apiKey }\n}\n\nexport function EngageWidget({\n apiUrl: propApiUrl,\n apiKey: propApiKey,\n position = 'bottom-right',\n zIndex = 9999,\n chatEnabled = true,\n debug = false,\n}: EngageWidgetProps) {\n const pathname = usePathname()\n const [elements, setElements] = useState<EngageElement[]>([])\n const [activeElements, setActiveElements] = useState<string[]>([])\n const [dismissedElements, setDismissedElements] = useState<Set<string>>(new Set())\n \n // Load elements from API\n useEffect(() => {\n async function loadElements() {\n const { apiUrl: globalApiUrl, apiKey: globalApiKey } = getApiConfig()\n const apiUrl = propApiUrl || globalApiUrl\n const apiKey = propApiKey || globalApiKey\n \n if (!apiKey) {\n if (debug) console.warn('[Engage] No API key configured')\n return\n }\n \n try {\n const response = await fetch(`${apiUrl}/api/public/engage/elements`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({}),\n })\n \n if (!response.ok) {\n if (debug) console.error('[Engage] Error loading elements:', response.statusText)\n return\n }\n \n const data = await response.json()\n if (debug) console.log('[Engage] Loaded elements:', data.elements)\n setElements(data.elements || [])\n } catch (error) {\n if (debug) console.error('[Engage] Error loading elements:', error)\n }\n }\n \n loadElements()\n }, [propApiUrl, propApiKey, debug])\n \n // Check targeting and trigger for each element\n useEffect(() => {\n if (!elements.length) return\n \n const checkElement = (element: EngageElement): boolean => {\n // Check if dismissed\n if (dismissedElements.has(element.id)) return false\n \n // Check page targeting\n if (element.targeting?.pages) {\n const { include, exclude } = element.targeting.pages\n \n if (exclude?.some(p => matchPath(pathname, p))) return false\n if (include && !include.some(p => matchPath(pathname, p))) return false\n }\n \n // Check device targeting\n if (element.targeting?.devices) {\n const device = getDeviceType()\n if (!element.targeting.devices.includes(device)) return false\n }\n \n // Check frequency capping\n if (element.trigger?.frequency) {\n const { type, days } = element.trigger.frequency\n const key = `_engage_${element.id}`\n \n if (type === 'once') {\n if (localStorage.getItem(key)) return false\n } else if (type === 'once-per-session') {\n if (sessionStorage.getItem(key)) return false\n } else if (type === 'every-n-days' && days) {\n const lastShown = localStorage.getItem(key)\n if (lastShown) {\n const elapsed = Date.now() - parseInt(lastShown, 10)\n if (elapsed < days * 24 * 60 * 60 * 1000) return false\n }\n }\n }\n \n return true\n }\n \n // Filter elements that pass targeting\n const eligible = elements.filter(checkElement)\n \n if (debug) console.log('[Engage] Eligible elements:', eligible)\n \n // Set up triggers for eligible elements\n eligible.forEach(element => {\n const trigger = element.trigger\n \n if (trigger?.type === 'immediate' || !trigger?.type) {\n setActiveElements(prev => [...prev, element.id])\n } else if (trigger?.type === 'delay' && trigger.delay) {\n setTimeout(() => {\n setActiveElements(prev => [...prev, element.id])\n }, trigger.delay * 1000)\n } else if (trigger?.type === 'exit-intent') {\n const handleMouseLeave = (e: MouseEvent) => {\n if (e.clientY < 10) {\n setActiveElements(prev => [...prev, element.id])\n document.removeEventListener('mouseleave', handleMouseLeave)\n }\n }\n document.addEventListener('mouseleave', handleMouseLeave)\n } else if (trigger?.type === 'scroll' && trigger.scrollPercentage) {\n const handleScroll = () => {\n const scrollPercent = (window.scrollY / (document.body.scrollHeight - window.innerHeight)) * 100\n if (scrollPercent >= (trigger.scrollPercentage || 50)) {\n setActiveElements(prev => [...prev, element.id])\n window.removeEventListener('scroll', handleScroll)\n }\n }\n window.addEventListener('scroll', handleScroll)\n }\n })\n }, [elements, pathname, dismissedElements, debug])\n \n const handleDismiss = useCallback((elementId: string) => {\n setDismissedElements(prev => new Set([...prev, elementId]))\n setActiveElements(prev => prev.filter(id => id !== elementId))\n \n // Record dismissal in storage\n const element = elements.find(e => e.id === elementId)\n if (element?.trigger?.frequency) {\n const key = `_engage_${elementId}`\n if (element.trigger.frequency.type === 'once-per-session') {\n sessionStorage.setItem(key, 'true')\n } else {\n localStorage.setItem(key, Date.now().toString())\n }\n }\n }, [elements])\n \n // Render active elements + chat widget\n return (\n <>\n {activeElements.map(elementId => {\n const element = elements.find(e => e.id === elementId)\n if (!element) return null\n \n return (\n <EngageElementRenderer\n key={element.id}\n element={element}\n onDismiss={() => handleDismiss(element.id)}\n zIndex={zIndex}\n />\n )\n })}\n \n {/* Chat Widget - always rendered when chatEnabled */}\n {chatEnabled && (\n <ChatWidget\n projectId={propApiKey || ''}\n config={{\n position,\n buttonColor: '#00afab', // Default teal, can be customized later\n }}\n />\n )}\n </>\n )\n}\n\n// Helper components\nfunction EngageElementRenderer({ \n element, \n onDismiss,\n zIndex,\n}: { \n element: EngageElement\n onDismiss: () => void\n zIndex: number\n}) {\n // If element has design_json from Engage Studio, use DesignRenderer\n if (element.design_json) {\n // Wrap in appropriate container based on element type\n if (element.type === 'popup') {\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0,0,0,0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex,\n }}\n onClick={onDismiss}\n >\n <div onClick={e => e.stopPropagation()}>\n <DesignRenderer\n design={element.design_json}\n onClose={onDismiss}\n onAction={(action, node) => {\n // Handle commerce/form actions here\n console.log('[Engage] Action:', action, node)\n }}\n />\n </div>\n </div>\n )\n }\n \n if (element.type === 'bar') {\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n zIndex,\n }}\n >\n <DesignRenderer\n design={element.design_json}\n onClose={onDismiss}\n onAction={(action, node) => {\n console.log('[Engage] Action:', action, node)\n }}\n />\n </div>\n )\n }\n \n if (element.type === 'nudge' || element.type === 'slide-in') {\n const position = element.config?.position || 'bottom-right'\n const positionStyles: Record<string, React.CSSProperties> = {\n 'bottom-right': { bottom: 20, right: 20 },\n 'bottom-left': { bottom: 20, left: 20 },\n 'top-right': { top: 20, right: 20 },\n 'top-left': { top: 20, left: 20 },\n }\n \n return (\n <div\n style={{\n position: 'fixed',\n zIndex,\n ...positionStyles[position],\n }}\n >\n <DesignRenderer\n design={element.design_json}\n onClose={onDismiss}\n onAction={(action, node) => {\n console.log('[Engage] Action:', action, node)\n }}\n />\n </div>\n )\n }\n \n // Default: render design_json directly\n return (\n <DesignRenderer\n design={element.design_json}\n onClose={onDismiss}\n onAction={(action, node) => {\n console.log('[Engage] Action:', action, node)\n }}\n />\n )\n }\n\n // Legacy: Simple popup rendering for elements without design_json\n if (element.type === 'popup') {\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0,0,0,0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex,\n }}\n onClick={onDismiss}\n >\n <div\n style={{\n backgroundColor: 'white',\n padding: 24,\n borderRadius: 8,\n maxWidth: 500,\n width: '90%',\n }}\n onClick={e => e.stopPropagation()}\n >\n <button\n onClick={onDismiss}\n style={{\n position: 'absolute',\n top: 8,\n right: 8,\n background: 'none',\n border: 'none',\n fontSize: 24,\n cursor: 'pointer',\n }}\n >\n ×\n </button>\n {element.config?.title && <h2>{element.config.title}</h2>}\n {element.config?.message && <p>{element.config.message}</p>}\n </div>\n </div>\n )\n }\n \n // Bar/banner rendering\n if (element.type === 'bar') {\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n backgroundColor: element.config?.backgroundColor || '#3b82f6',\n color: element.config?.textColor || 'white',\n padding: '12px 24px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 16,\n zIndex,\n }}\n >\n <span>{element.config?.message}</span>\n <button\n onClick={onDismiss}\n style={{\n background: 'none',\n border: 'none',\n color: 'inherit',\n fontSize: 20,\n cursor: 'pointer',\n }}\n >\n ×\n </button>\n </div>\n )\n }\n \n return null\n}\n\n// Utilities\nfunction matchPath(pathname: string, pattern: string): boolean {\n if (pattern.endsWith('*')) {\n return pathname.startsWith(pattern.slice(0, -1))\n }\n return pathname === pattern\n}\n\nfunction getDeviceType(): 'desktop' | 'mobile' | 'tablet' {\n if (typeof window === 'undefined') return 'desktop'\n const ua = navigator.userAgent\n if (/tablet|ipad|playbook|silk/i.test(ua)) return 'tablet'\n if (/mobile|iphone|ipod|android|blackberry|opera mini|iemobile/i.test(ua)) return 'mobile'\n return 'desktop'\n}\n"]}