@greatapps/common 1.1.665 → 1.1.666
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.
|
@@ -30,6 +30,9 @@ function crispSegment(segment) {
|
|
|
30
30
|
function crispSessionData(key, value) {
|
|
31
31
|
safeCrispPush(["set", "session:data", [[[key, value]]]]);
|
|
32
32
|
}
|
|
33
|
+
function crispEvent(name, data, color = "blue") {
|
|
34
|
+
safeCrispPush(["set", "session:event", [[[name, data ?? {}, color]]]]);
|
|
35
|
+
}
|
|
33
36
|
function openCrispHelpdesk() {
|
|
34
37
|
crispDo("helpdesk:search");
|
|
35
38
|
}
|
|
@@ -41,8 +44,8 @@ function showCrisp() {
|
|
|
41
44
|
}
|
|
42
45
|
const FREE_PLAN_ID = 5;
|
|
43
46
|
const FREE_PLAN_SIGNUP_QUERY_FLAG = "createNew";
|
|
44
|
-
const
|
|
45
|
-
const
|
|
47
|
+
const FREE_PLAN_SIGNUP_EVENT = "cadastro_plano_free";
|
|
48
|
+
const FREE_PLAN_SIGNUP_FIRED_KEY = "crisp:free-plan-signup:fired";
|
|
46
49
|
function updateCrispUser(data) {
|
|
47
50
|
try {
|
|
48
51
|
if (data.email) safeCrispPush(["set", "user:email", data.email]);
|
|
@@ -134,10 +137,10 @@ function CrispEmbed() {
|
|
|
134
137
|
if (!user || !shouldLoadCrisp || !isFreshSignup) return;
|
|
135
138
|
if (subscription?.id_plan !== FREE_PLAN_ID) return;
|
|
136
139
|
try {
|
|
137
|
-
const
|
|
138
|
-
if (window.localStorage.getItem(
|
|
139
|
-
|
|
140
|
-
window.localStorage.setItem(
|
|
140
|
+
const firedKey = `${FREE_PLAN_SIGNUP_FIRED_KEY}:${user.id}`;
|
|
141
|
+
if (window.localStorage.getItem(firedKey)) return;
|
|
142
|
+
crispEvent(FREE_PLAN_SIGNUP_EVENT, { id_plan: FREE_PLAN_ID });
|
|
143
|
+
window.localStorage.setItem(firedKey, "1");
|
|
141
144
|
} catch {
|
|
142
145
|
}
|
|
143
146
|
}, [user, shouldLoadCrisp, isFreshSignup, subscription?.id_plan]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/embeds/CrispEmbed.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { useAuth } from '../../providers/auth.provider';\nimport { useIsDefaultWhitelabel, useWhitelabel } from '../../providers/whitelabel.provider';\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\n\nconst V4_WHITELABEL_ID = 367568;\n\nconst PROFILE_LABELS: Record<string, string> = {\n owner: 'Proprietário',\n admin: 'Administrador',\n editor: 'Colaborador',\n viewer: 'Visualizador',\n};\n\nconst CRISP_WEBSITE_ID = '3339a3ec-b4c6-4aac-8b86-45668fb7655c';\nconst CRISP_SCRIPT_URL = 'https://client.crisp.chat/l.js';\nconst CRISP_LOAD_DELAY = 800;\n\n// ── Crisp helpers ──────────────────────────────────────────────\n\nfunction safeCrispPush(args: unknown[]) {\n try {\n const win = window as any;\n if (!win.$crisp) win.$crisp = [];\n win.$crisp.push(args);\n } catch {}\n}\n\nfunction crispDo(action: string) {\n safeCrispPush(['do', action]);\n}\n\nfunction crispSegment(segment: string) {\n safeCrispPush(['set', 'session:segments', [[segment]]]);\n}\n\nfunction crispSessionData(key: string, value: string) {\n safeCrispPush(['set', 'session:data', [[[key, value]]]]);\n}\n\n// ── Public API ─────────────────────────────────────────────────\n\nexport function openCrispHelpdesk() {\n crispDo('helpdesk:search');\n}\n\nexport function hideCrisp() {\n crispDo('chat:hide');\n}\n\nexport function showCrisp() {\n crispDo('chat:show');\n}\n\nconst FREE_PLAN_ID = 5;\nconst FREE_PLAN_SIGNUP_QUERY_FLAG = 'createNew';\nconst
|
|
1
|
+
{"version":3,"sources":["../../../src/components/embeds/CrispEmbed.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { useAuth } from '../../providers/auth.provider';\nimport { useIsDefaultWhitelabel, useWhitelabel } from '../../providers/whitelabel.provider';\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\n\nconst V4_WHITELABEL_ID = 367568;\n\nconst PROFILE_LABELS: Record<string, string> = {\n owner: 'Proprietário',\n admin: 'Administrador',\n editor: 'Colaborador',\n viewer: 'Visualizador',\n};\n\nconst CRISP_WEBSITE_ID = '3339a3ec-b4c6-4aac-8b86-45668fb7655c';\nconst CRISP_SCRIPT_URL = 'https://client.crisp.chat/l.js';\nconst CRISP_LOAD_DELAY = 800;\n\n// ── Crisp helpers ──────────────────────────────────────────────\n\nfunction safeCrispPush(args: unknown[]) {\n try {\n const win = window as any;\n if (!win.$crisp) win.$crisp = [];\n win.$crisp.push(args);\n } catch {}\n}\n\nfunction crispDo(action: string) {\n safeCrispPush(['do', action]);\n}\n\nfunction crispSegment(segment: string) {\n safeCrispPush(['set', 'session:segments', [[segment]]]);\n}\n\nfunction crispSessionData(key: string, value: string) {\n safeCrispPush(['set', 'session:data', [[[key, value]]]]);\n}\n\nfunction crispEvent(name: string, data?: Record<string, unknown>, color = 'blue') {\n safeCrispPush(['set', 'session:event', [[[name, data ?? {}, color]]]]);\n}\n\n// ── Public API ─────────────────────────────────────────────────\n\nexport function openCrispHelpdesk() {\n crispDo('helpdesk:search');\n}\n\nexport function hideCrisp() {\n crispDo('chat:hide');\n}\n\nexport function showCrisp() {\n crispDo('chat:show');\n}\n\nconst FREE_PLAN_ID = 5;\nconst FREE_PLAN_SIGNUP_QUERY_FLAG = 'createNew';\nconst FREE_PLAN_SIGNUP_EVENT = 'cadastro_plano_free';\nconst FREE_PLAN_SIGNUP_FIRED_KEY = 'crisp:free-plan-signup:fired';\n\nexport function updateCrispUser(data: {\n email?: string;\n name?: string;\n lastName?: string;\n company?: string;\n ddi?: string;\n phone?: string;\n photo?: string;\n}) {\n try {\n if (data.email) safeCrispPush(['set', 'user:email', data.email]);\n\n const fullName = `${data.name ?? ''} ${data.lastName ?? ''}`.trim();\n if (fullName) safeCrispPush(['set', 'user:nickname', fullName]);\n\n if (data.company) safeCrispPush(['set', 'user:company', data.company]);\n\n const phone = `${data.ddi ?? ''}${data.phone ?? ''}`.trim();\n if (phone) safeCrispPush(['set', 'user:phone', phone]);\n\n if (data.photo?.startsWith('http')) {\n safeCrispPush(['set', 'user:avatar', data.photo]);\n }\n } catch {}\n}\n\n// ── Component ──────────────────────────────────────────────────\n\nexport function CrispEmbed() {\n const { user, account } = useAuth();\n const { whitelabel } = useWhitelabel();\n const { data: subscriptionData } = useActiveSubscription();\n const scriptLoadedRef = useRef(false);\n\n const isGreat = useIsDefaultWhitelabel();\n const subscription = subscriptionData?.data?.[0] ?? null;\n const isV4 = whitelabel?.id === V4_WHITELABEL_ID;\n const shouldLoadCrisp = isV4 || isGreat;\n\n // Load Crisp script (once, with 800ms delay)\n useEffect(() => {\n if (!user || !shouldLoadCrisp || scriptLoadedRef.current) return;\n\n try {\n const win = window as any;\n\n if (!win.$crisp) {\n win.$crisp = [];\n win.CRISP_WEBSITE_ID = CRISP_WEBSITE_ID;\n win.$crisp.push(['config', 'container:index', [100]]);\n }\n\n if (document.querySelector(`script[src=\"${CRISP_SCRIPT_URL}\"]`)) {\n scriptLoadedRef.current = true;\n return;\n }\n\n const timeout = setTimeout(() => {\n try {\n if (document.querySelector(`script[src=\"${CRISP_SCRIPT_URL}\"]`)) return;\n const s = document.createElement('script');\n s.src = CRISP_SCRIPT_URL;\n s.async = true;\n document.head.appendChild(s);\n scriptLoadedRef.current = true;\n } catch {}\n }, CRISP_LOAD_DELAY);\n\n return () => clearTimeout(timeout);\n } catch {}\n }, [user, shouldLoadCrisp]);\n\n // Identify user\n useEffect(() => {\n try {\n if (!user || !shouldLoadCrisp || !(window as any)?.$crisp) return;\n\n updateCrispUser({\n email: user.email,\n name: user.name,\n lastName: user.last_name,\n company: account?.name,\n ddi: user.ddi,\n phone: user.phone,\n photo: user.photo ?? undefined,\n });\n\n if (isV4) {\n crispSegment('company_v4');\n crispSessionData('Company', 'V4');\n } else {\n const planName = subscription?.plan_name ?? '';\n const profileLabel = PROFILE_LABELS[user.profile ?? ''] ?? user.profile ?? '';\n if (planName) crispSegment(`plano_${planName}`);\n if (profileLabel) crispSegment(`usuario_${profileLabel}`);\n if (planName) crispSessionData('Plano', planName);\n if (profileLabel) crispSessionData('Usuario', profileLabel);\n }\n } catch {}\n }, [user, account, isV4, shouldLoadCrisp, subscription?.plan_name]);\n\n // Captura `?createNew=true` da URL inicial. O register do gapps redireciona\n // para pages com esse flag, e localStorage não cruza origens — então o\n // sinal de \"acabou de se cadastrar\" vem via query string.\n const [isFreshSignup, setIsFreshSignup] = useState(false);\n useEffect(() => {\n try {\n const params = new URLSearchParams(window.location.search);\n if (params.get(FREE_PLAN_SIGNUP_QUERY_FLAG) === 'true') {\n setIsFreshSignup(true);\n }\n } catch {}\n }, []);\n\n // Dispara user event de cadastro free para o trigger do Crisp.\n // A mensagem em si é configurada lá no Crisp (Message Trigger com condição\n // \"User Event = cadastro_plano_free\").\n useEffect(() => {\n if (!user || !shouldLoadCrisp || !isFreshSignup) return;\n if (subscription?.id_plan !== FREE_PLAN_ID) return;\n try {\n const firedKey = `${FREE_PLAN_SIGNUP_FIRED_KEY}:${user.id}`;\n if (window.localStorage.getItem(firedKey)) return;\n crispEvent(FREE_PLAN_SIGNUP_EVENT, { id_plan: FREE_PLAN_ID });\n window.localStorage.setItem(firedKey, '1');\n } catch {}\n }, [user, shouldLoadCrisp, isFreshSignup, subscription?.id_plan]);\n\n return null;\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -40,6 +40,10 @@ function crispSessionData(key: string, value: string) {
|
|
|
40
40
|
safeCrispPush(['set', 'session:data', [[[key, value]]]]);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
function crispEvent(name: string, data?: Record<string, unknown>, color = 'blue') {
|
|
44
|
+
safeCrispPush(['set', 'session:event', [[[name, data ?? {}, color]]]]);
|
|
45
|
+
}
|
|
46
|
+
|
|
43
47
|
// ── Public API ─────────────────────────────────────────────────
|
|
44
48
|
|
|
45
49
|
export function openCrispHelpdesk() {
|
|
@@ -56,8 +60,8 @@ export function showCrisp() {
|
|
|
56
60
|
|
|
57
61
|
const FREE_PLAN_ID = 5;
|
|
58
62
|
const FREE_PLAN_SIGNUP_QUERY_FLAG = 'createNew';
|
|
59
|
-
const
|
|
60
|
-
const
|
|
63
|
+
const FREE_PLAN_SIGNUP_EVENT = 'cadastro_plano_free';
|
|
64
|
+
const FREE_PLAN_SIGNUP_FIRED_KEY = 'crisp:free-plan-signup:fired';
|
|
61
65
|
|
|
62
66
|
export function updateCrispUser(data: {
|
|
63
67
|
email?: string;
|
|
@@ -173,17 +177,17 @@ export function CrispEmbed() {
|
|
|
173
177
|
} catch {}
|
|
174
178
|
}, []);
|
|
175
179
|
|
|
176
|
-
//
|
|
180
|
+
// Dispara user event de cadastro free para o trigger do Crisp.
|
|
177
181
|
// A mensagem em si é configurada lá no Crisp (Message Trigger com condição
|
|
178
|
-
//
|
|
182
|
+
// "User Event = cadastro_plano_free").
|
|
179
183
|
useEffect(() => {
|
|
180
184
|
if (!user || !shouldLoadCrisp || !isFreshSignup) return;
|
|
181
185
|
if (subscription?.id_plan !== FREE_PLAN_ID) return;
|
|
182
186
|
try {
|
|
183
|
-
const
|
|
184
|
-
if (window.localStorage.getItem(
|
|
185
|
-
|
|
186
|
-
window.localStorage.setItem(
|
|
187
|
+
const firedKey = `${FREE_PLAN_SIGNUP_FIRED_KEY}:${user.id}`;
|
|
188
|
+
if (window.localStorage.getItem(firedKey)) return;
|
|
189
|
+
crispEvent(FREE_PLAN_SIGNUP_EVENT, { id_plan: FREE_PLAN_ID });
|
|
190
|
+
window.localStorage.setItem(firedKey, '1');
|
|
187
191
|
} catch {}
|
|
188
192
|
}, [user, shouldLoadCrisp, isFreshSignup, subscription?.id_plan]);
|
|
189
193
|
|