@greatapps/common 1.1.595 → 1.1.597
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/embeds/FrillEmbed.mjs +2 -0
- package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
- package/dist/components/navigation/subcomponents/BottomLinks.mjs +42 -15
- package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
- package/dist/modules/charges/types/charge.type.mjs +4 -4
- package/dist/modules/charges/types/charge.type.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/embeds/FrillEmbed.tsx +2 -0
- package/src/components/navigation/subcomponents/BottomLinks.tsx +52 -16
- package/src/modules/charges/types/charge.type.ts +4 -4
|
@@ -94,6 +94,7 @@ function FrillEmbed() {
|
|
|
94
94
|
win.Frill("identify", userData);
|
|
95
95
|
containerPromise.then((widget) => {
|
|
96
96
|
containerRef.current = widget;
|
|
97
|
+
window.__frillContainer = widget;
|
|
97
98
|
}).catch(() => {
|
|
98
99
|
});
|
|
99
100
|
} catch {
|
|
@@ -102,6 +103,7 @@ function FrillEmbed() {
|
|
|
102
103
|
try {
|
|
103
104
|
containerPromise?.destroy();
|
|
104
105
|
containerRef.current = null;
|
|
106
|
+
window.__frillContainer = null;
|
|
105
107
|
document.removeEventListener("DOMContentLoaded", loadFrillScript);
|
|
106
108
|
} catch {
|
|
107
109
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/embeds/FrillEmbed.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef } 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 FRILL_SCRIPT_URL = 'https://widget.frill.co/v2/container.js';\nconst FRILL_KEY = '2f77f232-a120-438e-8ef6-01912ffd1b99';\n\nconst SURVEYS = [{ key: '7f59dbf6-b665-458a-80e2-778de47efe1c' }];\nconst WIDGETS = [\n { key: '4a5ba13b-1150-49fe-aa15-f9a2da0ba909' },\n { key: '720c0912-e6a4-495c-835e-3ff1f59d6dfc' },\n];\n\nfunction initFrillLoader() {\n try {\n const win = window as any;\n if (win.Frill) return;\n\n let counter = 0;\n const queue: Record<number, any> = {};\n\n win.Frill = function (action: string, params: any) {\n let instance: any;\n const id = counter++;\n const promise: any = new Promise((resolve, reject) => {\n queue[id] = {\n params: [action, params],\n resolve: (f: any) => {\n instance = f;\n resolve(f);\n },\n reject,\n };\n });\n promise.destroy = () => {\n delete queue[id];\n instance?.destroy();\n };\n return promise;\n };\n win.Frill.q = queue;\n } catch {}\n}\n\nfunction loadFrillScript() {\n try {\n if (document.querySelector(`script[src=\"${FRILL_SCRIPT_URL}\"]`)) return;\n const anchor = document.getElementsByTagName('script')[0];\n const script = document.createElement('script');\n script.type = 'text/javascript';\n script.async = true;\n script.src = FRILL_SCRIPT_URL;\n anchor?.parentNode?.insertBefore(script, anchor);\n } catch {}\n}\n\nexport function FrillEmbed() {\n const { user } = useAuth();\n const { whitelabel } = useWhitelabel();\n const { data: subscriptionData } = useActiveSubscription();\n const containerRef = useRef<any>(null);\n\n const isMainWhitelabel = useIsDefaultWhitelabel();\n const subscription = subscriptionData?.data?.[0] ?? null;\n const isV4 = whitelabel?.id === V4_WHITELABEL_ID;\n\n useEffect(() => {\n if (!user || (!isMainWhitelabel && !isV4)) return;\n\n let containerPromise: any = null;\n\n try {\n initFrillLoader();\n\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\n loadFrillScript();\n } else {\n document.addEventListener('DOMContentLoaded', loadFrillScript);\n }\n\n const userData: Record<string, any> = {\n id: String(user.id ?? ''),\n };\n if (user.email) userData.email = user.email;\n if (user.name || user.last_name) {\n userData.name = `${user.name ?? ''} ${user.last_name ?? ''}`.trim();\n }\n userData.attributes = isV4\n ? { company: 'V4' }\n : { profile: PROFILE_LABELS[user.profile ?? ''] ?? user.profile ?? '', plan: subscription?.plan_name ?? '' };\n\n const config: Record<string, any> = { key: FRILL_KEY, user: userData };\n if (!isV4) {\n config.surveys = SURVEYS;\n config.widgets = WIDGETS;\n }\n\n const win = window as any;\n containerPromise = win.Frill('container', config);\n win.Frill('identify', userData);\n\n containerPromise.then((widget: any) => {\n containerRef.current = widget;\n }).catch(() => {});\n } catch {}\n\n return () => {\n try {\n // Destroy via promise — handles both pending and resolved containers\n containerPromise?.destroy();\n containerRef.current = null;\n document.removeEventListener('DOMContentLoaded', loadFrillScript);\n } catch {}\n };\n }, [user, isMainWhitelabel, isV4, subscription?.plan_name]);\n\n return null;\n}\n"],"mappings":"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
|
|
1
|
+
{"version":3,"sources":["../../../src/components/embeds/FrillEmbed.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef } 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 FRILL_SCRIPT_URL = 'https://widget.frill.co/v2/container.js';\nconst FRILL_KEY = '2f77f232-a120-438e-8ef6-01912ffd1b99';\n\nconst SURVEYS = [{ key: '7f59dbf6-b665-458a-80e2-778de47efe1c' }];\nconst WIDGETS = [\n { key: '4a5ba13b-1150-49fe-aa15-f9a2da0ba909' },\n { key: '720c0912-e6a4-495c-835e-3ff1f59d6dfc' },\n];\n\nfunction initFrillLoader() {\n try {\n const win = window as any;\n if (win.Frill) return;\n\n let counter = 0;\n const queue: Record<number, any> = {};\n\n win.Frill = function (action: string, params: any) {\n let instance: any;\n const id = counter++;\n const promise: any = new Promise((resolve, reject) => {\n queue[id] = {\n params: [action, params],\n resolve: (f: any) => {\n instance = f;\n resolve(f);\n },\n reject,\n };\n });\n promise.destroy = () => {\n delete queue[id];\n instance?.destroy();\n };\n return promise;\n };\n win.Frill.q = queue;\n } catch {}\n}\n\nfunction loadFrillScript() {\n try {\n if (document.querySelector(`script[src=\"${FRILL_SCRIPT_URL}\"]`)) return;\n const anchor = document.getElementsByTagName('script')[0];\n const script = document.createElement('script');\n script.type = 'text/javascript';\n script.async = true;\n script.src = FRILL_SCRIPT_URL;\n anchor?.parentNode?.insertBefore(script, anchor);\n } catch {}\n}\n\nexport function FrillEmbed() {\n const { user } = useAuth();\n const { whitelabel } = useWhitelabel();\n const { data: subscriptionData } = useActiveSubscription();\n const containerRef = useRef<any>(null);\n\n const isMainWhitelabel = useIsDefaultWhitelabel();\n const subscription = subscriptionData?.data?.[0] ?? null;\n const isV4 = whitelabel?.id === V4_WHITELABEL_ID;\n\n useEffect(() => {\n if (!user || (!isMainWhitelabel && !isV4)) return;\n\n let containerPromise: any = null;\n\n try {\n initFrillLoader();\n\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\n loadFrillScript();\n } else {\n document.addEventListener('DOMContentLoaded', loadFrillScript);\n }\n\n const userData: Record<string, any> = {\n id: String(user.id ?? ''),\n };\n if (user.email) userData.email = user.email;\n if (user.name || user.last_name) {\n userData.name = `${user.name ?? ''} ${user.last_name ?? ''}`.trim();\n }\n userData.attributes = isV4\n ? { company: 'V4' }\n : { profile: PROFILE_LABELS[user.profile ?? ''] ?? user.profile ?? '', plan: subscription?.plan_name ?? '' };\n\n const config: Record<string, any> = { key: FRILL_KEY, user: userData };\n if (!isV4) {\n config.surveys = SURVEYS;\n config.widgets = WIDGETS;\n }\n\n const win = window as any;\n containerPromise = win.Frill('container', config);\n win.Frill('identify', userData);\n\n containerPromise.then((widget: any) => {\n containerRef.current = widget;\n (window as any).__frillContainer = widget;\n }).catch(() => {});\n } catch {}\n\n return () => {\n try {\n // Destroy via promise — handles both pending and resolved containers\n containerPromise?.destroy();\n containerRef.current = null;\n (window as any).__frillContainer = null;\n document.removeEventListener('DOMContentLoaded', loadFrillScript);\n } catch {}\n };\n }, [user, isMainWhitelabel, isV4, subscription?.plan_name]);\n\n return null;\n}\n"],"mappings":";AAEA,SAAS,WAAW,cAAc;AAClC,SAAS,eAAe;AACxB,SAAS,wBAAwB,qBAAqB;AACtD,SAAS,6BAA6B;AAEtC,MAAM,mBAAmB;AAEzB,MAAM,iBAAyC;AAAA,EAC7C,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,MAAM,mBAAmB;AACzB,MAAM,YAAY;AAElB,MAAM,UAAU,CAAC,EAAE,KAAK,uCAAuC,CAAC;AAChE,MAAM,UAAU;AAAA,EACd,EAAE,KAAK,uCAAuC;AAAA,EAC9C,EAAE,KAAK,uCAAuC;AAChD;AAEA,SAAS,kBAAkB;AACzB,MAAI;AACF,UAAM,MAAM;AACZ,QAAI,IAAI,MAAO;AAEf,QAAI,UAAU;AACd,UAAM,QAA6B,CAAC;AAEpC,QAAI,QAAQ,SAAU,QAAgB,QAAa;AACjD,UAAI;AACJ,YAAM,KAAK;AACX,YAAM,UAAe,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpD,cAAM,EAAE,IAAI;AAAA,UACV,QAAQ,CAAC,QAAQ,MAAM;AAAA,UACvB,SAAS,CAAC,MAAW;AACnB,uBAAW;AACX,oBAAQ,CAAC;AAAA,UACX;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AACD,cAAQ,UAAU,MAAM;AACtB,eAAO,MAAM,EAAE;AACf,kBAAU,QAAQ;AAAA,MACpB;AACA,aAAO;AAAA,IACT;AACA,QAAI,MAAM,IAAI;AAAA,EAChB,QAAQ;AAAA,EAAC;AACX;AAEA,SAAS,kBAAkB;AACzB,MAAI;AACF,QAAI,SAAS,cAAc,eAAe,gBAAgB,IAAI,EAAG;AACjE,UAAM,SAAS,SAAS,qBAAqB,QAAQ,EAAE,CAAC;AACxD,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,OAAO;AACd,WAAO,QAAQ;AACf,WAAO,MAAM;AACb,YAAQ,YAAY,aAAa,QAAQ,MAAM;AAAA,EACjD,QAAQ;AAAA,EAAC;AACX;AAEO,SAAS,aAAa;AAC3B,QAAM,EAAE,KAAK,IAAI,QAAQ;AACzB,QAAM,EAAE,WAAW,IAAI,cAAc;AACrC,QAAM,EAAE,MAAM,iBAAiB,IAAI,sBAAsB;AACzD,QAAM,eAAe,OAAY,IAAI;AAErC,QAAM,mBAAmB,uBAAuB;AAChD,QAAM,eAAe,kBAAkB,OAAO,CAAC,KAAK;AACpD,QAAM,OAAO,YAAY,OAAO;AAEhC,YAAU,MAAM;AACd,QAAI,CAAC,QAAS,CAAC,oBAAoB,CAAC,KAAO;AAE3C,QAAI,mBAAwB;AAE5B,QAAI;AACF,sBAAgB;AAEhB,UAAI,SAAS,eAAe,cAAc,SAAS,eAAe,eAAe;AAC/E,wBAAgB;AAAA,MAClB,OAAO;AACL,iBAAS,iBAAiB,oBAAoB,eAAe;AAAA,MAC/D;AAEA,YAAM,WAAgC;AAAA,QACpC,IAAI,OAAO,KAAK,MAAM,EAAE;AAAA,MAC1B;AACA,UAAI,KAAK,MAAO,UAAS,QAAQ,KAAK;AACtC,UAAI,KAAK,QAAQ,KAAK,WAAW;AAC/B,iBAAS,OAAO,GAAG,KAAK,QAAQ,EAAE,IAAI,KAAK,aAAa,EAAE,GAAG,KAAK;AAAA,MACpE;AACA,eAAS,aAAa,OAClB,EAAE,SAAS,KAAK,IAChB,EAAE,SAAS,eAAe,KAAK,WAAW,EAAE,KAAK,KAAK,WAAW,IAAI,MAAM,cAAc,aAAa,GAAG;AAE7G,YAAM,SAA8B,EAAE,KAAK,WAAW,MAAM,SAAS;AACrE,UAAI,CAAC,MAAM;AACT,eAAO,UAAU;AACjB,eAAO,UAAU;AAAA,MACnB;AAEA,YAAM,MAAM;AACZ,yBAAmB,IAAI,MAAM,aAAa,MAAM;AAChD,UAAI,MAAM,YAAY,QAAQ;AAE9B,uBAAiB,KAAK,CAAC,WAAgB;AACrC,qBAAa,UAAU;AACvB,QAAC,OAAe,mBAAmB;AAAA,MACrC,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACnB,QAAQ;AAAA,IAAC;AAET,WAAO,MAAM;AACX,UAAI;AAEF,0BAAkB,QAAQ;AAC1B,qBAAa,UAAU;AACvB,QAAC,OAAe,mBAAmB;AACnC,iBAAS,oBAAoB,oBAAoB,eAAe;AAAA,MAClE,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF,GAAG,CAAC,MAAM,kBAAkB,MAAM,cAAc,SAAS,CAAC;AAE1D,SAAO;AACT;","names":[]}
|
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { IconHelp, IconBulb } from "@tabler/icons-react";
|
|
3
|
+
import { IconHelp, IconBulb, IconStar } from "@tabler/icons-react";
|
|
4
4
|
import { useIsDefaultWhitelabel, useWhitelabel } from "../../../providers/whitelabel.provider";
|
|
5
|
+
function openFrillWidget() {
|
|
6
|
+
const container = window.__frillContainer;
|
|
7
|
+
container?.open?.();
|
|
8
|
+
}
|
|
5
9
|
function BottomLinks() {
|
|
6
10
|
const { whitelabel } = useWhitelabel();
|
|
7
11
|
const isMainWhitelabel = useIsDefaultWhitelabel();
|
|
8
12
|
const helpUrl = whitelabel?.url_help || "https://ajuda.greatsoftwares.com.br/pt-br/";
|
|
9
13
|
const links = [
|
|
14
|
+
...isMainWhitelabel ? [
|
|
15
|
+
{
|
|
16
|
+
label: "Novidades",
|
|
17
|
+
icon: IconStar,
|
|
18
|
+
className: "novidades",
|
|
19
|
+
onClick: openFrillWidget
|
|
20
|
+
}
|
|
21
|
+
] : [],
|
|
10
22
|
{
|
|
11
23
|
label: "Central de ajuda",
|
|
12
24
|
icon: IconHelp,
|
|
@@ -20,20 +32,35 @@ function BottomLinks() {
|
|
|
20
32
|
}
|
|
21
33
|
] : []
|
|
22
34
|
];
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
const baseClassName = "rounded-md flex items-center gap-2 p-3 cursor-pointer transition-colors no-underline bg-white hover:bg-gray-100 active:bg-gray-50";
|
|
36
|
+
return /* @__PURE__ */ jsx("div", { className: "flex flex-col", children: links.map(
|
|
37
|
+
(link) => link.href ? /* @__PURE__ */ jsxs(
|
|
38
|
+
"a",
|
|
39
|
+
{
|
|
40
|
+
href: link.href,
|
|
41
|
+
target: "_blank",
|
|
42
|
+
rel: "noopener noreferrer",
|
|
43
|
+
className: `${baseClassName}${link.className ? ` ${link.className}` : ""}`,
|
|
44
|
+
children: [
|
|
45
|
+
/* @__PURE__ */ jsx(link.icon, { size: 20, className: "text-gray-400" }),
|
|
46
|
+
/* @__PURE__ */ jsx("span", { className: "paragraph-small-medium text-gray-500", children: link.label })
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
link.label
|
|
50
|
+
) : /* @__PURE__ */ jsxs(
|
|
51
|
+
"button",
|
|
52
|
+
{
|
|
53
|
+
type: "button",
|
|
54
|
+
onClick: link.onClick,
|
|
55
|
+
className: `${baseClassName} text-left${link.className ? ` ${link.className}` : ""}`,
|
|
56
|
+
children: [
|
|
57
|
+
/* @__PURE__ */ jsx(link.icon, { size: 20, className: "text-gray-400" }),
|
|
58
|
+
/* @__PURE__ */ jsx("span", { className: "paragraph-small-medium text-gray-500", children: link.label })
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
link.label
|
|
62
|
+
)
|
|
63
|
+
) });
|
|
37
64
|
}
|
|
38
65
|
export {
|
|
39
66
|
BottomLinks
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/navigation/subcomponents/BottomLinks.tsx"],"sourcesContent":["'use client';\n\nimport { IconHelp, IconBulb } from '@tabler/icons-react';\nimport { useIsDefaultWhitelabel, useWhitelabel } from '../../../providers/whitelabel.provider';\n\nexport function BottomLinks() {\n const { whitelabel } = useWhitelabel();\n const isMainWhitelabel = useIsDefaultWhitelabel();\n\n const helpUrl = whitelabel?.url_help || 'https://ajuda.greatsoftwares.com.br/pt-br/';\n\n const links = [\n {\n label: 'Central de ajuda',\n icon: IconHelp,\n href: helpUrl,\n },\n ...(isMainWhitelabel\n ? [\n {\n label: 'Enviar sugestões',\n icon: IconBulb,\n href: 'https://ideias.greatpages.com.br/b/y0geg1ve/feature-ideas',\n },\n ]\n : []),\n ];\n\n return (\n <div className=\"flex flex-col\">\n {links.map((link)
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/navigation/subcomponents/BottomLinks.tsx"],"sourcesContent":["'use client';\n\nimport { IconHelp, IconBulb, IconStar, type TablerIcon } from '@tabler/icons-react';\nimport { useIsDefaultWhitelabel, useWhitelabel } from '../../../providers/whitelabel.provider';\n\ninterface BottomLink {\n label: string;\n icon: TablerIcon;\n href?: string;\n className?: string;\n onClick?: () => void;\n}\n\nfunction openFrillWidget() {\n const container = (window as unknown as { __frillContainer?: { open?: () => void } }).__frillContainer;\n container?.open?.();\n}\n\nexport function BottomLinks() {\n const { whitelabel } = useWhitelabel();\n const isMainWhitelabel = useIsDefaultWhitelabel();\n\n const helpUrl = whitelabel?.url_help || 'https://ajuda.greatsoftwares.com.br/pt-br/';\n\n const links: BottomLink[] = [\n ...(isMainWhitelabel\n ? [\n {\n label: 'Novidades',\n icon: IconStar,\n className: 'novidades',\n onClick: openFrillWidget,\n },\n ]\n : []),\n {\n label: 'Central de ajuda',\n icon: IconHelp,\n href: helpUrl,\n },\n ...(isMainWhitelabel\n ? [\n {\n label: 'Enviar sugestões',\n icon: IconBulb,\n href: 'https://ideias.greatpages.com.br/b/y0geg1ve/feature-ideas',\n },\n ]\n : []),\n ];\n\n const baseClassName =\n 'rounded-md flex items-center gap-2 p-3 cursor-pointer transition-colors no-underline bg-white hover:bg-gray-100 active:bg-gray-50';\n\n return (\n <div className=\"flex flex-col\">\n {links.map((link) =>\n link.href ? (\n <a\n key={link.label}\n href={link.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`${baseClassName}${link.className ? ` ${link.className}` : ''}`}\n >\n <link.icon size={20} className=\"text-gray-400\" />\n <span className=\"paragraph-small-medium text-gray-500\">{link.label}</span>\n </a>\n ) : (\n <button\n key={link.label}\n type=\"button\"\n onClick={link.onClick}\n className={`${baseClassName} text-left${link.className ? ` ${link.className}` : ''}`}\n >\n <link.icon size={20} className=\"text-gray-400\" />\n <span className=\"paragraph-small-medium text-gray-500\">{link.label}</span>\n </button>\n )\n )}\n </div>\n );\n}\n"],"mappings":";AA0DU,SAOE,KAPF;AAxDV,SAAS,UAAU,UAAU,gBAAiC;AAC9D,SAAS,wBAAwB,qBAAqB;AAUtD,SAAS,kBAAkB;AACzB,QAAM,YAAa,OAAmE;AACtF,aAAW,OAAO;AACpB;AAEO,SAAS,cAAc;AAC5B,QAAM,EAAE,WAAW,IAAI,cAAc;AACrC,QAAM,mBAAmB,uBAAuB;AAEhD,QAAM,UAAU,YAAY,YAAY;AAExC,QAAM,QAAsB;AAAA,IAC1B,GAAI,mBACA;AAAA,MACE;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS;AAAA,MACX;AAAA,IACF,IACA,CAAC;AAAA,IACL;AAAA,MACE,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,GAAI,mBACA;AAAA,MACE;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF,IACA,CAAC;AAAA,EACP;AAEA,QAAM,gBACJ;AAEF,SACE,oBAAC,SAAI,WAAU,iBACZ,gBAAM;AAAA,IAAI,CAAC,SACV,KAAK,OACH;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM,KAAK;AAAA,QACX,QAAO;AAAA,QACP,KAAI;AAAA,QACJ,WAAW,GAAG,aAAa,GAAG,KAAK,YAAY,IAAI,KAAK,SAAS,KAAK,EAAE;AAAA,QAExE;AAAA,8BAAC,KAAK,MAAL,EAAU,MAAM,IAAI,WAAU,iBAAgB;AAAA,UAC/C,oBAAC,UAAK,WAAU,wCAAwC,eAAK,OAAM;AAAA;AAAA;AAAA,MAP9D,KAAK;AAAA,IAQZ,IAEA;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,SAAS,KAAK;AAAA,QACd,WAAW,GAAG,aAAa,aAAa,KAAK,YAAY,IAAI,KAAK,SAAS,KAAK,EAAE;AAAA,QAElF;AAAA,8BAAC,KAAK,MAAL,EAAU,MAAM,IAAI,WAAU,iBAAgB;AAAA,UAC/C,oBAAC,UAAK,WAAU,wCAAwC,eAAK,OAAM;AAAA;AAAA;AAAA,MAN9D,KAAK;AAAA,IAOZ;AAAA,EAEJ,GACF;AAEJ;","names":[]}
|
|
@@ -15,12 +15,12 @@ const ChargeSchema = z.object({
|
|
|
15
15
|
title: z.string().nullable().optional(),
|
|
16
16
|
id_subscription: z.union([z.number(), z.string()]).nullable().optional(),
|
|
17
17
|
id_account: z.coerce.number(),
|
|
18
|
-
status: z.number().nullable().optional().
|
|
18
|
+
status: z.coerce.number().nullable().optional().transform((val) => val ?? 0),
|
|
19
19
|
description: z.string().nullable().optional(),
|
|
20
20
|
date_due: z.coerce.date().nullable().optional(),
|
|
21
21
|
date_payment: z.coerce.date().nullable().optional(),
|
|
22
22
|
payment_method: z.number().nullable().optional(),
|
|
23
|
-
value: z.number().nullable().optional().
|
|
23
|
+
value: z.coerce.number().nullable().optional().transform((val) => val ?? 0),
|
|
24
24
|
type: z.number().nullable().optional(),
|
|
25
25
|
periodicity: z.number().nullable().optional(),
|
|
26
26
|
id_gateway: z.number().nullable().optional(),
|
|
@@ -31,11 +31,11 @@ const ChargeSchema = z.object({
|
|
|
31
31
|
invoice_url: z.string().nullable().optional(),
|
|
32
32
|
invoice_pdf: z.string().nullable().optional(),
|
|
33
33
|
date_created: z.coerce.date().nullable().optional(),
|
|
34
|
-
deleted: z.number().transform((val) => val === 1)
|
|
34
|
+
deleted: z.coerce.number().nullable().optional().transform((val) => val === 1),
|
|
35
35
|
datetime_alt: z.coerce.date().nullable().optional(),
|
|
36
36
|
datetime_del: z.coerce.date().nullable().optional(),
|
|
37
37
|
datetime_add: z.coerce.date().nullable().optional(),
|
|
38
|
-
line_descriptions: z.array(z.string()).nullable().optional().
|
|
38
|
+
line_descriptions: z.array(z.string()).nullable().optional().transform((val) => val ?? []),
|
|
39
39
|
payment_details: PaymentDetailsSchema
|
|
40
40
|
});
|
|
41
41
|
const FindChargesParamsSchema = z.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/charges/types/charge.type.ts"],"sourcesContent":["import { PaginationParamsSchema, SearchParamsSchema, SortParamsSchema } from '../../../infra/api/types';\nimport z from 'zod';\n\nconst BoletoPaymentDetailsSchema = z.object({\n type: z.literal('boleto'),\n barcode: z.string().nullable().optional(),\n expiration_date: z.number().nullable().optional(),\n hosted_voucher_url: z.string().nullable().optional(),\n pdf: z.string().nullable().optional(),\n});\n\nconst PaymentDetailsSchema = z.union([BoletoPaymentDetailsSchema, z.record(z.string(), z.unknown())]).nullable().optional();\n\nexport const ChargeSchema = z.object({\n id: z.coerce.number(),\n id_wl: z.number(),\n id_product: z.number().nullable().optional(),\n title: z.string().nullable().optional(),\n id_subscription: z.union([z.number(), z.string()]).nullable().optional(),\n id_account: z.coerce.number(),\n status: z.number().nullable().optional().
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/charges/types/charge.type.ts"],"sourcesContent":["import { PaginationParamsSchema, SearchParamsSchema, SortParamsSchema } from '../../../infra/api/types';\nimport z from 'zod';\n\nconst BoletoPaymentDetailsSchema = z.object({\n type: z.literal('boleto'),\n barcode: z.string().nullable().optional(),\n expiration_date: z.number().nullable().optional(),\n hosted_voucher_url: z.string().nullable().optional(),\n pdf: z.string().nullable().optional(),\n});\n\nconst PaymentDetailsSchema = z.union([BoletoPaymentDetailsSchema, z.record(z.string(), z.unknown())]).nullable().optional();\n\nexport const ChargeSchema = z.object({\n id: z.coerce.number(),\n id_wl: z.number(),\n id_product: z.number().nullable().optional(),\n title: z.string().nullable().optional(),\n id_subscription: z.union([z.number(), z.string()]).nullable().optional(),\n id_account: z.coerce.number(),\n status: z.coerce.number().nullable().optional().transform((val) => val ?? 0),\n description: z.string().nullable().optional(),\n date_due: z.coerce.date().nullable().optional(),\n date_payment: z.coerce.date().nullable().optional(),\n payment_method: z.number().nullable().optional(),\n value: z.coerce.number().nullable().optional().transform((val) => val ?? 0),\n type: z.number().nullable().optional(),\n periodicity: z.number().nullable().optional(),\n id_gateway: z.number().nullable().optional(),\n gateway_invoice: z.string().nullable().optional(),\n gateway_billet: z.string().nullable().optional(),\n invoice_id: z.string().nullable().optional(),\n invoice_service: z.string().nullable().optional(),\n invoice_url: z.string().nullable().optional(),\n invoice_pdf: z.string().nullable().optional(),\n date_created: z.coerce.date().nullable().optional(),\n deleted: z.coerce.number().nullable().optional().transform((val) => val === 1),\n datetime_alt: z.coerce.date().nullable().optional(),\n datetime_del: z.coerce.date().nullable().optional(),\n datetime_add: z.coerce.date().nullable().optional(),\n line_descriptions: z.array(z.string()).nullable().optional().transform((val) => val ?? []),\n payment_details: PaymentDetailsSchema,\n});\n\nexport type Charge = z.infer<typeof ChargeSchema>;\n\nexport const FindChargesParamsSchema = z\n .object({\n date_start: z.date(),\n date_end: z.date(),\n date_payment_start: z.date(),\n date_payment_end: z.date(),\n status: z.array(z.number()).optional(),\n })\n .extend(PaginationParamsSchema.shape)\n .extend(SortParamsSchema.shape)\n .extend(SearchParamsSchema.shape);\n\nexport const PayChargeInputSchema = z.object({\n chargeId: z.union([z.number(), z.string()]),\n paymentMethod: z.number(),\n paymentMethodId: z.string().optional(),\n});\n\nexport type PayChargeInput = z.infer<typeof PayChargeInputSchema>;\n\nexport type FindChargesParams = z.infer<typeof FindChargesParamsSchema>;\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -113,6 +113,7 @@ export function FrillEmbed() {
|
|
|
113
113
|
|
|
114
114
|
containerPromise.then((widget: any) => {
|
|
115
115
|
containerRef.current = widget;
|
|
116
|
+
(window as any).__frillContainer = widget;
|
|
116
117
|
}).catch(() => {});
|
|
117
118
|
} catch {}
|
|
118
119
|
|
|
@@ -121,6 +122,7 @@ export function FrillEmbed() {
|
|
|
121
122
|
// Destroy via promise — handles both pending and resolved containers
|
|
122
123
|
containerPromise?.destroy();
|
|
123
124
|
containerRef.current = null;
|
|
125
|
+
(window as any).__frillContainer = null;
|
|
124
126
|
document.removeEventListener('DOMContentLoaded', loadFrillScript);
|
|
125
127
|
} catch {}
|
|
126
128
|
};
|
|
@@ -1,15 +1,38 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { IconHelp, IconBulb } from '@tabler/icons-react';
|
|
3
|
+
import { IconHelp, IconBulb, IconStar, type TablerIcon } from '@tabler/icons-react';
|
|
4
4
|
import { useIsDefaultWhitelabel, useWhitelabel } from '../../../providers/whitelabel.provider';
|
|
5
5
|
|
|
6
|
+
interface BottomLink {
|
|
7
|
+
label: string;
|
|
8
|
+
icon: TablerIcon;
|
|
9
|
+
href?: string;
|
|
10
|
+
className?: string;
|
|
11
|
+
onClick?: () => void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function openFrillWidget() {
|
|
15
|
+
const container = (window as unknown as { __frillContainer?: { open?: () => void } }).__frillContainer;
|
|
16
|
+
container?.open?.();
|
|
17
|
+
}
|
|
18
|
+
|
|
6
19
|
export function BottomLinks() {
|
|
7
20
|
const { whitelabel } = useWhitelabel();
|
|
8
21
|
const isMainWhitelabel = useIsDefaultWhitelabel();
|
|
9
22
|
|
|
10
23
|
const helpUrl = whitelabel?.url_help || 'https://ajuda.greatsoftwares.com.br/pt-br/';
|
|
11
24
|
|
|
12
|
-
const links = [
|
|
25
|
+
const links: BottomLink[] = [
|
|
26
|
+
...(isMainWhitelabel
|
|
27
|
+
? [
|
|
28
|
+
{
|
|
29
|
+
label: 'Novidades',
|
|
30
|
+
icon: IconStar,
|
|
31
|
+
className: 'novidades',
|
|
32
|
+
onClick: openFrillWidget,
|
|
33
|
+
},
|
|
34
|
+
]
|
|
35
|
+
: []),
|
|
13
36
|
{
|
|
14
37
|
label: 'Central de ajuda',
|
|
15
38
|
icon: IconHelp,
|
|
@@ -26,22 +49,35 @@ export function BottomLinks() {
|
|
|
26
49
|
: []),
|
|
27
50
|
];
|
|
28
51
|
|
|
52
|
+
const baseClassName =
|
|
53
|
+
'rounded-md flex items-center gap-2 p-3 cursor-pointer transition-colors no-underline bg-white hover:bg-gray-100 active:bg-gray-50';
|
|
54
|
+
|
|
29
55
|
return (
|
|
30
56
|
<div className="flex flex-col">
|
|
31
|
-
{links.map((link) =>
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
{link.label}
|
|
42
|
-
</
|
|
43
|
-
|
|
44
|
-
|
|
57
|
+
{links.map((link) =>
|
|
58
|
+
link.href ? (
|
|
59
|
+
<a
|
|
60
|
+
key={link.label}
|
|
61
|
+
href={link.href}
|
|
62
|
+
target="_blank"
|
|
63
|
+
rel="noopener noreferrer"
|
|
64
|
+
className={`${baseClassName}${link.className ? ` ${link.className}` : ''}`}
|
|
65
|
+
>
|
|
66
|
+
<link.icon size={20} className="text-gray-400" />
|
|
67
|
+
<span className="paragraph-small-medium text-gray-500">{link.label}</span>
|
|
68
|
+
</a>
|
|
69
|
+
) : (
|
|
70
|
+
<button
|
|
71
|
+
key={link.label}
|
|
72
|
+
type="button"
|
|
73
|
+
onClick={link.onClick}
|
|
74
|
+
className={`${baseClassName} text-left${link.className ? ` ${link.className}` : ''}`}
|
|
75
|
+
>
|
|
76
|
+
<link.icon size={20} className="text-gray-400" />
|
|
77
|
+
<span className="paragraph-small-medium text-gray-500">{link.label}</span>
|
|
78
|
+
</button>
|
|
79
|
+
)
|
|
80
|
+
)}
|
|
45
81
|
</div>
|
|
46
82
|
);
|
|
47
83
|
}
|
|
@@ -18,12 +18,12 @@ export const ChargeSchema = z.object({
|
|
|
18
18
|
title: z.string().nullable().optional(),
|
|
19
19
|
id_subscription: z.union([z.number(), z.string()]).nullable().optional(),
|
|
20
20
|
id_account: z.coerce.number(),
|
|
21
|
-
status: z.number().nullable().optional().
|
|
21
|
+
status: z.coerce.number().nullable().optional().transform((val) => val ?? 0),
|
|
22
22
|
description: z.string().nullable().optional(),
|
|
23
23
|
date_due: z.coerce.date().nullable().optional(),
|
|
24
24
|
date_payment: z.coerce.date().nullable().optional(),
|
|
25
25
|
payment_method: z.number().nullable().optional(),
|
|
26
|
-
value: z.number().nullable().optional().
|
|
26
|
+
value: z.coerce.number().nullable().optional().transform((val) => val ?? 0),
|
|
27
27
|
type: z.number().nullable().optional(),
|
|
28
28
|
periodicity: z.number().nullable().optional(),
|
|
29
29
|
id_gateway: z.number().nullable().optional(),
|
|
@@ -34,11 +34,11 @@ export const ChargeSchema = z.object({
|
|
|
34
34
|
invoice_url: z.string().nullable().optional(),
|
|
35
35
|
invoice_pdf: z.string().nullable().optional(),
|
|
36
36
|
date_created: z.coerce.date().nullable().optional(),
|
|
37
|
-
deleted: z.number().transform((val) => val === 1)
|
|
37
|
+
deleted: z.coerce.number().nullable().optional().transform((val) => val === 1),
|
|
38
38
|
datetime_alt: z.coerce.date().nullable().optional(),
|
|
39
39
|
datetime_del: z.coerce.date().nullable().optional(),
|
|
40
40
|
datetime_add: z.coerce.date().nullable().optional(),
|
|
41
|
-
line_descriptions: z.array(z.string()).nullable().optional().
|
|
41
|
+
line_descriptions: z.array(z.string()).nullable().optional().transform((val) => val ?? []),
|
|
42
42
|
payment_details: PaymentDetailsSchema,
|
|
43
43
|
});
|
|
44
44
|
|