@greatapps/common 1.1.699 → 1.1.701

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.
@@ -0,0 +1,166 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { toast } from "sonner";
4
+ import {
5
+ IconCheck,
6
+ IconCopy,
7
+ IconInfoCircle,
8
+ IconStar,
9
+ IconTicket,
10
+ IconX
11
+ } from "@tabler/icons-react";
12
+ import { Dialog, DialogClose, DialogContent, DialogTitle } from "../ui/overlay/Dialog";
13
+ import { Toast } from "../ui/feedback/Toast";
14
+ import { Button } from "../ui/buttons/Button";
15
+ import useCopyToClipboard from "../../hooks/copy-to-clipboard.hook";
16
+ import { useModalManager } from "../../store/useModalManager";
17
+ import { useWhitelabelUrls } from "../../providers/whitelabel.provider";
18
+ import { cn } from "../../infra/utils/clsx";
19
+ const COPY = {
20
+ title: "Rumo ao Hexa!",
21
+ subtitlePrefix: "Ofertas exclusivas at\xE9 ",
22
+ subtitleDate: "24/06",
23
+ mostChosen: "Mais escolhido",
24
+ couponLabel: "Cupom",
25
+ choosePlan: "Escolher plano",
26
+ couponCopied: "Cupom copiado!",
27
+ close: "Fechar",
28
+ footerPrefix: "V\xE1lido para a ",
29
+ footerBold: "primeira contrata\xE7\xE3o",
30
+ footerSuffix: " dos planos Essencial, Neg\xF3cio ou Ag\xEAncia"
31
+ };
32
+ const COMBOS = [
33
+ {
34
+ coupon: "MENSAL10",
35
+ name: "Combo convoca\xE7\xE3o",
36
+ highlighted: false,
37
+ features: ["10% OFF no plano mensal", "Webinars exclusivos"]
38
+ },
39
+ {
40
+ coupon: "SEMESTRAL10",
41
+ name: "Combo Hexa",
42
+ highlighted: true,
43
+ features: ["10% OFF no plano semestral", "3 templates exclusivos", "Webinars exclusivos"]
44
+ },
45
+ {
46
+ coupon: "ANUAL10",
47
+ name: "Combo escala\xE7\xE3o",
48
+ highlighted: false,
49
+ features: ["10% OFF no plano anual", "3 templates exclusivos"]
50
+ }
51
+ ];
52
+ const GRADIENT = "linear-gradient(180deg, #08c44f 0%, #7bd237 46.6%, #ffe31b 100%)";
53
+ function HexaPromoModal() {
54
+ const { activeModal, closeModal } = useModalManager();
55
+ const { accountsUrl } = useWhitelabelUrls();
56
+ const isOpen = activeModal === "hexaPromoModal";
57
+ const goToPlans = (coupon) => {
58
+ closeModal();
59
+ const url = `${accountsUrl}/subscriptions?tab=plans&coupon=${encodeURIComponent(coupon)}`;
60
+ window.location.assign(url);
61
+ };
62
+ return /* @__PURE__ */ jsx(Dialog, { open: isOpen, onOpenChange: () => closeModal(), children: /* @__PURE__ */ jsxs(
63
+ DialogContent,
64
+ {
65
+ showCloseButton: false,
66
+ onOpenAutoFocus: (e) => e.preventDefault(),
67
+ className: "border-0 bg-transparent p-0 shadow-none w-[calc(100%-32px)] sm:max-w-[940px] md:w-[924px] lg:w-[924px] max-h-[calc(100dvh-32px)] overflow-y-auto",
68
+ children: [
69
+ /* @__PURE__ */ jsx(DialogTitle, { className: "sr-only", children: COPY.title }),
70
+ /* @__PURE__ */ jsx("div", { className: "rounded-[12px] p-1", style: { background: GRADIENT }, children: /* @__PURE__ */ jsxs("div", { className: "relative overflow-hidden rounded-[10px] bg-white p-8 shadow-[0px_2px_10px_0px_rgba(26,26,26,0.05)]", children: [
71
+ /* @__PURE__ */ jsx(
72
+ "img",
73
+ {
74
+ src: "/promo/hexa-confetti.png",
75
+ alt: "",
76
+ "aria-hidden": true,
77
+ className: "pointer-events-none absolute -top-10 right-0 w-[280px] -rotate-16 select-none"
78
+ }
79
+ ),
80
+ /* @__PURE__ */ jsxs(DialogClose, { className: "absolute right-3 top-3 z-10 flex size-8 items-center justify-center rounded-lg p-2 text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-zinc-950 focus:outline-none", children: [
81
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: COPY.close }),
82
+ /* @__PURE__ */ jsx(IconX, { className: "size-[18px]" })
83
+ ] }),
84
+ /* @__PURE__ */ jsxs("div", { className: "relative z-[1] flex w-fit items-center gap-[9px] rounded-lg bg-zinc-100 px-[9px] py-2", children: [
85
+ /* @__PURE__ */ jsx("img", { src: "/promo/hexa-logo.svg", alt: "", "aria-hidden": true, className: "size-6 select-none" }),
86
+ /* @__PURE__ */ jsx("img", { src: "/promo/hexa-flag.png", alt: "", "aria-hidden": true, className: "size-6 rounded select-none" })
87
+ ] }),
88
+ /* @__PURE__ */ jsxs("div", { className: "relative z-[1] mt-4 flex flex-col gap-1", children: [
89
+ /* @__PURE__ */ jsx("h2", { className: "font-['Outfit'] text-[32px] font-semibold leading-8 text-zinc-950", children: COPY.title }),
90
+ /* @__PURE__ */ jsxs("p", { className: "paragraph-medium-medium text-zinc-950", children: [
91
+ COPY.subtitlePrefix,
92
+ /* @__PURE__ */ jsx("span", { className: "font-bold", children: COPY.subtitleDate })
93
+ ] })
94
+ ] }),
95
+ /* @__PURE__ */ jsx("div", { className: "relative z-[1] mt-10 flex flex-col items-stretch gap-3 md:flex-row", children: COMBOS.map((combo) => /* @__PURE__ */ jsx(ComboCard, { combo, onChoose: () => goToPlans(combo.coupon) }, combo.coupon)) }),
96
+ /* @__PURE__ */ jsxs("div", { className: "relative z-[1] mt-3 flex items-center justify-center gap-2.5 rounded-[10px] bg-zinc-100 p-3 text-center", children: [
97
+ /* @__PURE__ */ jsx(IconInfoCircle, { className: "size-4 shrink-0 text-zinc-950" }),
98
+ /* @__PURE__ */ jsxs("p", { className: "paragraph-small-medium text-zinc-950", children: [
99
+ COPY.footerPrefix,
100
+ /* @__PURE__ */ jsx("span", { className: "font-semibold", children: COPY.footerBold }),
101
+ COPY.footerSuffix
102
+ ] })
103
+ ] })
104
+ ] }) })
105
+ ]
106
+ }
107
+ ) });
108
+ }
109
+ function ComboCard({ combo, onChoose }) {
110
+ const { isCopied, copy } = useCopyToClipboard({
111
+ onSuccess: () => {
112
+ toast.custom((t) => /* @__PURE__ */ jsx(Toast, { variant: "success", message: COPY.couponCopied, toastId: t }));
113
+ }
114
+ });
115
+ return /* @__PURE__ */ jsxs(
116
+ "div",
117
+ {
118
+ className: cn(
119
+ "relative flex flex-1 flex-col rounded-[10px] border bg-white pb-3 md:w-[276px]",
120
+ combo.highlighted ? "border-cyan-500" : "border-zinc-200"
121
+ ),
122
+ children: [
123
+ combo.highlighted && /* @__PURE__ */ jsxs("div", { className: "absolute left-1/2 top-0 z-[1] flex h-6 -translate-x-1/2 -translate-y-1/2 items-center justify-center gap-[5px] rounded-md border-4 border-white bg-cyan-100 px-2", children: [
124
+ /* @__PURE__ */ jsx(IconStar, { className: "size-3 text-cyan-600" }),
125
+ /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold whitespace-nowrap text-cyan-600", children: COPY.mostChosen }),
126
+ /* @__PURE__ */ jsx(IconStar, { className: "size-3 text-cyan-600" })
127
+ ] }),
128
+ /* @__PURE__ */ jsx("h3", { className: "border-b border-zinc-200 px-4 py-4 text-center font-['Outfit'] text-base font-semibold text-zinc-950", children: combo.name }),
129
+ /* @__PURE__ */ jsx("ul", { className: "flex flex-1 flex-col gap-5 px-5 pt-5", children: combo.features.map((feature) => /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-2.5", children: [
130
+ /* @__PURE__ */ jsx(IconCheck, { className: "size-5 shrink-0 text-cyan-500" }),
131
+ /* @__PURE__ */ jsx("span", { className: "paragraph-small-medium text-zinc-950", children: feature })
132
+ ] }, feature)) }),
133
+ /* @__PURE__ */ jsxs("div", { className: "mx-3 mt-5 flex items-center gap-3 rounded-lg bg-cyan-50 py-2 pl-3.5 pr-2.5", children: [
134
+ /* @__PURE__ */ jsx(IconTicket, { className: "size-5 shrink-0 text-cyan-600" }),
135
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
136
+ /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-medium text-zinc-400", children: COPY.couponLabel }),
137
+ /* @__PURE__ */ jsx("span", { className: "paragraph-small-semibold text-zinc-950", children: combo.coupon })
138
+ ] }),
139
+ /* @__PURE__ */ jsx(
140
+ "button",
141
+ {
142
+ type: "button",
143
+ "aria-label": COPY.couponLabel,
144
+ onClick: () => copy(combo.coupon),
145
+ className: "flex size-8 shrink-0 items-center justify-center rounded-md text-zinc-500 transition-colors hover:bg-cyan-100 hover:text-zinc-950",
146
+ children: isCopied ? /* @__PURE__ */ jsx(IconCheck, { className: "size-[18px]" }) : /* @__PURE__ */ jsx(IconCopy, { className: "size-[18px]" })
147
+ }
148
+ )
149
+ ] }),
150
+ /* @__PURE__ */ jsx("div", { className: "mx-3 mt-3", children: /* @__PURE__ */ jsx(
151
+ Button,
152
+ {
153
+ variant: combo.highlighted ? "default" : "secondary",
154
+ className: cn("h-11! w-full", combo.highlighted && "bg-cyan-500 text-white hover:bg-cyan-600"),
155
+ onClick: onChoose,
156
+ children: COPY.choosePlan
157
+ }
158
+ ) })
159
+ ]
160
+ }
161
+ );
162
+ }
163
+ export {
164
+ HexaPromoModal as default
165
+ };
166
+ //# sourceMappingURL=HexaPromoModal.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/modals/HexaPromoModal.tsx"],"sourcesContent":["'use client';\n\nimport { toast } from 'sonner';\nimport {\n IconCheck,\n IconCopy,\n IconInfoCircle,\n IconStar,\n IconTicket,\n IconX,\n} from '@tabler/icons-react';\nimport { Dialog, DialogClose, DialogContent, DialogTitle } from '../ui/overlay/Dialog';\nimport { Toast } from '../ui/feedback/Toast';\nimport { Button } from '../ui/buttons/Button';\nimport useCopyToClipboard from '../../hooks/copy-to-clipboard.hook';\nimport { useModalManager } from '../../store/useModalManager';\nimport { useWhitelabelUrls } from '../../providers/whitelabel.provider';\nimport { cn } from '../../infra/utils/clsx';\n\ninterface HexaCombo {\n coupon: string;\n name: string;\n features: string[];\n highlighted: boolean;\n}\n\n// Campanha \"Rumo ao Hexa\" — exclusiva da whitelabel 1 (público pt-br). O texto é fixo de\n// propósito: a modal precisa renderizar também no gapps, que não tem provider de next-intl.\nconst COPY = {\n title: 'Rumo ao Hexa!',\n subtitlePrefix: 'Ofertas exclusivas até ',\n subtitleDate: '24/06',\n mostChosen: 'Mais escolhido',\n couponLabel: 'Cupom',\n choosePlan: 'Escolher plano',\n couponCopied: 'Cupom copiado!',\n close: 'Fechar',\n footerPrefix: 'Válido para a ',\n footerBold: 'primeira contratação',\n footerSuffix: ' dos planos Essencial, Negócio ou Agência',\n};\n\nconst COMBOS: HexaCombo[] = [\n {\n coupon: 'MENSAL10',\n name: 'Combo convocação',\n highlighted: false,\n features: ['10% OFF no plano mensal', 'Webinars exclusivos'],\n },\n {\n coupon: 'SEMESTRAL10',\n name: 'Combo Hexa',\n highlighted: true,\n features: ['10% OFF no plano semestral', '3 templates exclusivos', 'Webinars exclusivos'],\n },\n {\n coupon: 'ANUAL10',\n name: 'Combo escalação',\n highlighted: false,\n features: ['10% OFF no plano anual', '3 templates exclusivos'],\n },\n];\n\n// Cores promocionais (verde/amarelo do Brasil) — específicas desta campanha, fora do design\n// system, por isso ficam hardcoded apenas aqui.\nconst GRADIENT = 'linear-gradient(180deg, #08c44f 0%, #7bd237 46.6%, #ffe31b 100%)';\n\nexport default function HexaPromoModal() {\n const { activeModal, closeModal } = useModalManager();\n const { accountsUrl } = useWhitelabelUrls();\n const isOpen = activeModal === 'hexaPromoModal';\n\n const goToPlans = (coupon: string) => {\n closeModal();\n const url = `${accountsUrl}/subscriptions?tab=plans&coupon=${encodeURIComponent(coupon)}`;\n window.location.assign(url);\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={() => closeModal()}>\n <DialogContent\n showCloseButton={false}\n onOpenAutoFocus={(e) => e.preventDefault()}\n className=\"border-0 bg-transparent p-0 shadow-none w-[calc(100%-32px)] sm:max-w-[940px] md:w-[924px] lg:w-[924px] max-h-[calc(100dvh-32px)] overflow-y-auto\"\n >\n <DialogTitle className=\"sr-only\">{COPY.title}</DialogTitle>\n\n <div className=\"rounded-[12px] p-1\" style={{ background: GRADIENT }}>\n <div className=\"relative overflow-hidden rounded-[10px] bg-white p-8 shadow-[0px_2px_10px_0px_rgba(26,26,26,0.05)]\">\n {/* Arte decorativa (festão/bandeira) no canto superior direito */}\n <img\n src=\"/promo/hexa-confetti.png\"\n alt=\"\"\n aria-hidden\n className=\"pointer-events-none absolute -top-10 right-0 w-[280px] -rotate-16 select-none\"\n />\n\n <DialogClose className=\"absolute right-3 top-3 z-10 flex size-8 items-center justify-center rounded-lg p-2 text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-zinc-950 focus:outline-none\">\n <span className=\"sr-only\">{COPY.close}</span>\n <IconX className=\"size-[18px]\" />\n </DialogClose>\n\n {/* Header: logo + bandeira */}\n <div className=\"relative z-[1] flex w-fit items-center gap-[9px] rounded-lg bg-zinc-100 px-[9px] py-2\">\n <img src=\"/promo/hexa-logo.svg\" alt=\"\" aria-hidden className=\"size-6 select-none\" />\n <img src=\"/promo/hexa-flag.png\" alt=\"\" aria-hidden className=\"size-6 rounded select-none\" />\n </div>\n\n {/* Título */}\n <div className=\"relative z-[1] mt-4 flex flex-col gap-1\">\n <h2 className=\"font-['Outfit'] text-[32px] font-semibold leading-8 text-zinc-950\">\n {COPY.title}\n </h2>\n <p className=\"paragraph-medium-medium text-zinc-950\">\n {COPY.subtitlePrefix}\n <span className=\"font-bold\">{COPY.subtitleDate}</span>\n </p>\n </div>\n\n {/* Cards */}\n <div className=\"relative z-[1] mt-10 flex flex-col items-stretch gap-3 md:flex-row\">\n {COMBOS.map((combo) => (\n <ComboCard key={combo.coupon} combo={combo} onChoose={() => goToPlans(combo.coupon)} />\n ))}\n </div>\n\n {/* Rodapé informativo */}\n <div className=\"relative z-[1] mt-3 flex items-center justify-center gap-2.5 rounded-[10px] bg-zinc-100 p-3 text-center\">\n <IconInfoCircle className=\"size-4 shrink-0 text-zinc-950\" />\n <p className=\"paragraph-small-medium text-zinc-950\">\n {COPY.footerPrefix}\n <span className=\"font-semibold\">{COPY.footerBold}</span>\n {COPY.footerSuffix}\n </p>\n </div>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\ninterface ComboCardProps {\n combo: HexaCombo;\n onChoose: () => void;\n}\n\nfunction ComboCard({ combo, onChoose }: ComboCardProps) {\n const { isCopied, copy } = useCopyToClipboard({\n onSuccess: () => {\n toast.custom((t) => <Toast variant=\"success\" message={COPY.couponCopied} toastId={t} />);\n },\n });\n\n return (\n <div\n className={cn(\n 'relative flex flex-1 flex-col rounded-[10px] border bg-white pb-3 md:w-[276px]',\n combo.highlighted ? 'border-cyan-500' : 'border-zinc-200',\n )}\n >\n {combo.highlighted && (\n <div className=\"absolute left-1/2 top-0 z-[1] flex h-6 -translate-x-1/2 -translate-y-1/2 items-center justify-center gap-[5px] rounded-md border-4 border-white bg-cyan-100 px-2\">\n <IconStar className=\"size-3 text-cyan-600\" />\n <span className=\"paragraph-xsmall-semibold whitespace-nowrap text-cyan-600\">\n {COPY.mostChosen}\n </span>\n <IconStar className=\"size-3 text-cyan-600\" />\n </div>\n )}\n\n <h3 className=\"border-b border-zinc-200 px-4 py-4 text-center font-['Outfit'] text-base font-semibold text-zinc-950\">\n {combo.name}\n </h3>\n\n <ul className=\"flex flex-1 flex-col gap-5 px-5 pt-5\">\n {combo.features.map((feature) => (\n <li key={feature} className=\"flex items-center gap-2.5\">\n <IconCheck className=\"size-5 shrink-0 text-cyan-500\" />\n <span className=\"paragraph-small-medium text-zinc-950\">{feature}</span>\n </li>\n ))}\n </ul>\n\n <div className=\"mx-3 mt-5 flex items-center gap-3 rounded-lg bg-cyan-50 py-2 pl-3.5 pr-2.5\">\n <IconTicket className=\"size-5 shrink-0 text-cyan-600\" />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"paragraph-xsmall-medium text-zinc-400\">{COPY.couponLabel}</span>\n <span className=\"paragraph-small-semibold text-zinc-950\">{combo.coupon}</span>\n </div>\n <button\n type=\"button\"\n aria-label={COPY.couponLabel}\n onClick={() => copy(combo.coupon)}\n className=\"flex size-8 shrink-0 items-center justify-center rounded-md text-zinc-500 transition-colors hover:bg-cyan-100 hover:text-zinc-950\"\n >\n {isCopied ? <IconCheck className=\"size-[18px]\" /> : <IconCopy className=\"size-[18px]\" />}\n </button>\n </div>\n\n <div className=\"mx-3 mt-3\">\n <Button\n variant={combo.highlighted ? 'default' : 'secondary'}\n className={cn('h-11! w-full', combo.highlighted && 'bg-cyan-500 text-white hover:bg-cyan-600')}\n onClick={onChoose}\n >\n {COPY.choosePlan}\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,54 @@
1
+ "use client";
2
+ import { useEffect, useRef } from "react";
3
+ import { useActiveSubscription } from "../../modules/subscriptions/hooks/find-active-subscription.hook";
4
+ import { useAuth } from "../../providers/auth.provider";
5
+ import { useWhitelabel } from "../../providers/whitelabel.provider";
6
+ import { useModalManager } from "../../store/useModalManager";
7
+ import {
8
+ getHexaPromoSeenDay,
9
+ getHexaPromoSince,
10
+ hexaPromoDayKey,
11
+ setHexaPromoSeenDay,
12
+ setHexaPromoSince
13
+ } from "../../utils/cookies/hexa-promo";
14
+ const ONLINE_DELAY_MS = 3 * 60 * 1e3;
15
+ const FORCE_OPEN_FOR_TEST = false;
16
+ function HexaPromoModalGate() {
17
+ const { isAuthenticated } = useAuth();
18
+ const { whitelabel } = useWhitelabel();
19
+ const { activeModal, openModal } = useModalManager();
20
+ const { data } = useActiveSubscription();
21
+ const subscription = data?.data?.[0] ?? null;
22
+ const eligible = isAuthenticated && whitelabel?.id === 1 && subscription?.type === "trial";
23
+ const forcedRef = useRef(false);
24
+ useEffect(() => {
25
+ if (typeof window === "undefined") return;
26
+ if (FORCE_OPEN_FOR_TEST) {
27
+ if (forcedRef.current || activeModal) return;
28
+ forcedRef.current = true;
29
+ openModal("hexaPromoModal");
30
+ return;
31
+ }
32
+ if (!eligible) return;
33
+ if (activeModal) return;
34
+ const todayKey = hexaPromoDayKey();
35
+ if (getHexaPromoSeenDay() === todayKey) return;
36
+ let since = getHexaPromoSince();
37
+ if (!since || since.day !== todayKey) {
38
+ since = { day: todayKey, ms: Date.now() };
39
+ setHexaPromoSince(since.day, since.ms);
40
+ }
41
+ const remaining = Math.max(0, since.ms + ONLINE_DELAY_MS - Date.now());
42
+ const timer = setTimeout(() => {
43
+ if (getHexaPromoSeenDay() === todayKey) return;
44
+ setHexaPromoSeenDay(todayKey);
45
+ openModal("hexaPromoModal");
46
+ }, remaining);
47
+ return () => clearTimeout(timer);
48
+ }, [eligible, activeModal, openModal]);
49
+ return null;
50
+ }
51
+ export {
52
+ HexaPromoModalGate as default
53
+ };
54
+ //# sourceMappingURL=HexaPromoModalGate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/modals/HexaPromoModalGate.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef } from 'react';\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\nimport { useAuth } from '../../providers/auth.provider';\nimport { useWhitelabel } from '../../providers/whitelabel.provider';\nimport { useModalManager } from '../../store/useModalManager';\nimport {\n getHexaPromoSeenDay,\n getHexaPromoSince,\n hexaPromoDayKey,\n setHexaPromoSeenDay,\n setHexaPromoSince,\n} from '../../utils/cookies/hexa-promo';\n\n/** Janela de tempo online antes de abrir a modal (3 minutos). */\nconst ONLINE_DELAY_MS = 3 * 60 * 1000;\n\n/**\n * TESTE: quando `true`, a modal abre imediatamente ao carregar o app, ignorando\n * trial / whitelabel / timer de 3 min / cookies. Manter `false` em produção.\n */\nconst FORCE_OPEN_FOR_TEST = false;\n\n/**\n * Dispara a modal \"Rumo ao Hexa\" quando um usuário em **trial** da **whitelabel 1** fica\n * 3 minutos online. A janela é cumulativa entre gapps e gpages (timestamp compartilhado em\n * cookie no domínio pai) e a modal abre **uma única vez** — reabrindo só no dia seguinte ou\n * após logout/login. Montar este componente uma vez no layout de cada app consumidor.\n */\nexport default function HexaPromoModalGate() {\n const { isAuthenticated } = useAuth();\n const { whitelabel } = useWhitelabel();\n const { activeModal, openModal } = useModalManager();\n const { data } = useActiveSubscription();\n\n const subscription = data?.data?.[0] ?? null;\n const eligible =\n isAuthenticated && whitelabel?.id === 1 && subscription?.type === 'trial';\n\n const forcedRef = useRef(false);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n // TESTE: abre uma vez ao carregar, sem nenhuma condição.\n if (FORCE_OPEN_FOR_TEST) {\n if (forcedRef.current || activeModal) return;\n forcedRef.current = true;\n openModal('hexaPromoModal');\n return;\n }\n\n if (!eligible) return;\n // Outra modal aberta: não empilha em cima. Reavalia quando ela fechar (dep `activeModal`).\n if (activeModal) return;\n\n const todayKey = hexaPromoDayKey();\n if (getHexaPromoSeenDay() === todayKey) return; // já exibida hoje/nesta sessão\n\n // Início da janela compartilhado entre os apps; reinicia a cada novo dia.\n let since = getHexaPromoSince();\n if (!since || since.day !== todayKey) {\n since = { day: todayKey, ms: Date.now() };\n setHexaPromoSince(since.day, since.ms);\n }\n\n const remaining = Math.max(0, since.ms + ONLINE_DELAY_MS - Date.now());\n const timer = setTimeout(() => {\n // Recheca o cookie no disparo: se o outro app já abriu, não reabre aqui.\n if (getHexaPromoSeenDay() === todayKey) return;\n setHexaPromoSeenDay(todayKey);\n openModal('hexaPromoModal');\n }, remaining);\n\n return () => clearTimeout(timer);\n }, [eligible, activeModal, openModal]);\n\n return null;\n}\n"],"mappings":";AAEA,SAAS,WAAW,cAAc;AAClC,SAAS,6BAA6B;AACtC,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,MAAM,kBAAkB,IAAI,KAAK;AAMjC,MAAM,sBAAsB;AAQb,SAAR,qBAAsC;AAC3C,QAAM,EAAE,gBAAgB,IAAI,QAAQ;AACpC,QAAM,EAAE,WAAW,IAAI,cAAc;AACrC,QAAM,EAAE,aAAa,UAAU,IAAI,gBAAgB;AACnD,QAAM,EAAE,KAAK,IAAI,sBAAsB;AAEvC,QAAM,eAAe,MAAM,OAAO,CAAC,KAAK;AACxC,QAAM,WACJ,mBAAmB,YAAY,OAAO,KAAK,cAAc,SAAS;AAEpE,QAAM,YAAY,OAAO,KAAK;AAE9B,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,YAAa;AAGnC,QAAI,qBAAqB;AACvB,UAAI,UAAU,WAAW,YAAa;AACtC,gBAAU,UAAU;AACpB,gBAAU,gBAAgB;AAC1B;AAAA,IACF;AAEA,QAAI,CAAC,SAAU;AAEf,QAAI,YAAa;AAEjB,UAAM,WAAW,gBAAgB;AACjC,QAAI,oBAAoB,MAAM,SAAU;AAGxC,QAAI,QAAQ,kBAAkB;AAC9B,QAAI,CAAC,SAAS,MAAM,QAAQ,UAAU;AACpC,cAAQ,EAAE,KAAK,UAAU,IAAI,KAAK,IAAI,EAAE;AACxC,wBAAkB,MAAM,KAAK,MAAM,EAAE;AAAA,IACvC;AAEA,UAAM,YAAY,KAAK,IAAI,GAAG,MAAM,KAAK,kBAAkB,KAAK,IAAI,CAAC;AACrE,UAAM,QAAQ,WAAW,MAAM;AAE7B,UAAI,oBAAoB,MAAM,SAAU;AACxC,0BAAoB,QAAQ;AAC5B,gBAAU,gBAAgB;AAAA,IAC5B,GAAG,SAAS;AAEZ,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,UAAU,aAAa,SAAS,CAAC;AAErC,SAAO;AACT;","names":[]}
package/dist/index.mjs CHANGED
@@ -132,10 +132,13 @@ import {
132
132
  import { useBuyCreditsModal } from "./store/useBuyCreditsModal";
133
133
  import { useCreditsDisabledModal } from "./store/useCreditsDisabledModal";
134
134
  import { usePaidPlanRequiredModal } from "./store/usePaidPlanRequiredModal";
135
+ import { useHexaPromoModal } from "./store/useHexaPromoModal";
135
136
  import { default as default2 } from "./components/modals/BuyCreditsModal";
136
137
  import { default as default3 } from "./components/modals/CreditsDisabledModal";
137
138
  import { default as default4 } from "./components/modals/PaidPlanRequiredModal";
138
- import { default as default5 } from "./components/modals/cards/AddCardModal";
139
+ import { default as default5 } from "./components/modals/HexaPromoModal";
140
+ import { default as default6 } from "./components/modals/HexaPromoModalGate";
141
+ import { default as default7 } from "./components/modals/cards/AddCardModal";
139
142
  import { DeleteCardModal } from "./components/modals/cards/DeleteCardModal";
140
143
  import { CannotDeleteCardModal } from "./components/modals/cards/CannotDeleteCardModal";
141
144
  import {
@@ -169,13 +172,13 @@ import { AppNavBar } from "./components/layouts/AppNavBar";
169
172
  import { AppMobileNavBar } from "./components/layouts/AppMobileNavBar";
170
173
  import { SideBarNavigation } from "./components/layouts/SideBarNavigation";
171
174
  import { MdSideBarNavigation } from "./components/layouts/MdSideBarNavigation";
172
- import { default as default6 } from "./components/widgets/notifications/NotificationCard";
175
+ import { default as default8 } from "./components/widgets/notifications/NotificationCard";
173
176
  import { NotificationsPopover } from "./components/layouts/NotificationsPopover";
174
177
  import { NotificationPageContent } from "./components/pages/notifications/Notifications";
175
178
  import { NotFoundPage } from "./components/pages/NotFoundPage";
176
179
  import { UsersSelectorPopover } from "./components/layouts/UsersSelectorPopover";
177
180
  import { ProfilePopover } from "./components/layouts/ProfilePopover";
178
- import { default as default7 } from "./components/layouts/WhitelabelCodes";
181
+ import { default as default9 } from "./components/layouts/WhitelabelCodes";
179
182
  import { NavBarItem } from "./components/layouts/NavBarItem";
180
183
  import { AppNavigation } from "./components/navigation/AppNavigation";
181
184
  import { CancelledSubscriptionBanner } from "./components/navigation/CancelledSubscriptionBanner";
@@ -189,10 +192,10 @@ import {
189
192
  useWlQueryKey,
190
193
  useWlId
191
194
  } from "./hooks/useAuthQueryKey";
192
- import { default as default8 } from "./hooks/copy-to-clipboard.hook";
195
+ import { default as default10 } from "./hooks/copy-to-clipboard.hook";
193
196
  import { Button, buttonVariants } from "./components/ui/buttons/Button";
194
197
  import { CopyButton } from "./components/ui/buttons/CopyButton";
195
- import { default as default9 } from "./components/ui/buttons/CancelButton";
198
+ import { default as default11 } from "./components/ui/buttons/CancelButton";
196
199
  import {
197
200
  Accordion,
198
201
  AccordionItem,
@@ -237,8 +240,8 @@ import {
237
240
  TabsContent
238
241
  } from "./components/ui/data-display/Tabs";
239
242
  import { UserAvatar } from "./components/ui/data-display/UserAvatar";
240
- import { default as default10 } from "./components/ui/feedback/CircularProgress";
241
- import { default as default11 } from "./components/ui/feedback/DefaultCircularProgress";
243
+ import { default as default12 } from "./components/ui/feedback/CircularProgress";
244
+ import { default as default13 } from "./components/ui/feedback/DefaultCircularProgress";
242
245
  import { Progress } from "./components/ui/feedback/Progress";
243
246
  import { LoadingOverlay } from "./components/ui/feedback/LoadingOverlay";
244
247
  import { useBrandLoadingIcon } from "./hooks/useBrandLoadingIcon";
@@ -332,9 +335,9 @@ import { useMdSidebarStore } from "./store/useMdSidebarStore";
332
335
  import { useDesktopSidebarStore } from "./store/useDesktopSidebarStore";
333
336
  import { useModalManager } from "./store/useModalManager";
334
337
  import { AccountSectionType } from "./enums/AccountSectionType";
335
- import { default as default12 } from "./hooks/usePasswordVisibility";
336
- import { default as default13 } from "./hooks/useCountdownTimer";
337
- import { default as default14 } from "./hooks/useIsMobile";
338
+ import { default as default14 } from "./hooks/usePasswordVisibility";
339
+ import { default as default15 } from "./hooks/useCountdownTimer";
340
+ import { default as default16 } from "./hooks/useIsMobile";
338
341
  import { useDebounce } from "./hooks/useDebounce";
339
342
  import { useDebouncedEffect } from "./hooks/useDebouncedEffect";
340
343
  import { useDebounceState } from "./hooks/useDebounceState";
@@ -362,8 +365,8 @@ import { copyToClipboard, readFromClipboard } from "./utils/browser/clipboard";
362
365
  import { FormField } from "./components/ui/form/FormField";
363
366
  import { SelectField } from "./components/ui/form/SelectField";
364
367
  import { ComboboxField } from "./components/ui/form/ComboboxField";
365
- import { default as default15 } from "./components/ui/form/PhoneInput";
366
- import { default as default16 } from "./components/ui/form/SwitchOptionFieldWithIcon";
368
+ import { default as default17 } from "./components/ui/form/PhoneInput";
369
+ import { default as default18 } from "./components/ui/form/SwitchOptionFieldWithIcon";
367
370
  import { TextAreaField } from "./components/ui/form/TextAreaField";
368
371
  import {
369
372
  useCurrentAccount,
@@ -380,13 +383,13 @@ import {
380
383
  } from "./modules/accounts/hooks/useAccountManagement";
381
384
  import { useViaCep } from "./modules/accounts/hooks/useViaCep";
382
385
  import { useAccountToken } from "./modules/accounts/hooks/use-account-token.hook";
383
- import { default as default17 } from "./components/account/AccountModals";
386
+ import { default as default19 } from "./components/account/AccountModals";
384
387
  import { useAccountModals } from "./store/useAccountModals";
385
388
  import { ModalManager } from "./components/modals/ModalManager";
386
389
  import { Modals } from "./components/modals/Modals";
387
- import { default as default18 } from "./components/account/TwoFactorAuthModal";
388
- import { default as default19 } from "./components/account/DisableTwoFactorAuthModal";
389
- import { default as default20 } from "./components/account/ConfirmGlobalPreferencesModal";
390
+ import { default as default20 } from "./components/account/TwoFactorAuthModal";
391
+ import { default as default21 } from "./components/account/DisableTwoFactorAuthModal";
392
+ import { default as default22 } from "./components/account/ConfirmGlobalPreferencesModal";
390
393
  import { MyProfileSection } from "./components/account/sections/MyProfileSection";
391
394
  import { PreferencesSection } from "./components/account/sections/PreferencesSection";
392
395
  import { SecuritySection } from "./components/account/sections/SecuritySection";
@@ -434,9 +437,9 @@ export {
434
437
  AccordionContent,
435
438
  AccordionItem,
436
439
  AccordionTrigger,
437
- default17 as AccountModals,
440
+ default19 as AccountModals,
438
441
  AccountSectionType,
439
- default5 as AddCardModal,
442
+ default7 as AddCardModal,
440
443
  AppMobileNavBar,
441
444
  AppNavBar,
442
445
  AppNavigation,
@@ -451,7 +454,7 @@ export {
451
454
  CURRENCY_OPTIONS,
452
455
  Calendar,
453
456
  CalendarDayButton,
454
- default9 as CancelButton,
457
+ default11 as CancelButton,
455
458
  CancelledSubscriptionBanner,
456
459
  CannotDeleteCardModal,
457
460
  Card,
@@ -469,7 +472,7 @@ export {
469
472
  ChangePhoneModal,
470
473
  ChargeSchema,
471
474
  Checkbox,
472
- default10 as CircularProgress,
475
+ default12 as CircularProgress,
473
476
  ClarityEmbed,
474
477
  ComboboxField,
475
478
  Command,
@@ -481,14 +484,14 @@ export {
481
484
  CommandList,
482
485
  CommandSeparator,
483
486
  CommandShortcut,
484
- default20 as ConfirmGlobalPreferencesModal,
487
+ default22 as ConfirmGlobalPreferencesModal,
485
488
  CopyButton,
486
489
  CreateCardRequestSchema,
487
490
  default3 as CreditsDisabledModal,
488
491
  CrispEmbed,
489
492
  DatePicker,
490
493
  DateRangePicker,
491
- default11 as DefaultCircularProgress,
494
+ default13 as DefaultCircularProgress,
492
495
  DeleteCardModal,
493
496
  Dialog,
494
497
  DialogClose,
@@ -500,13 +503,15 @@ export {
500
503
  DialogPortal,
501
504
  DialogTitle,
502
505
  DialogTrigger,
503
- default19 as DisableTwoFactorAuthModal,
506
+ default21 as DisableTwoFactorAuthModal,
504
507
  EmbedWidgets,
505
508
  FindCardsParamsSchema,
506
509
  FindChargesParamsSchema,
507
510
  FormField,
508
511
  FrillEmbed,
509
512
  GENDER_OPTIONS,
513
+ default5 as HexaPromoModal,
514
+ default6 as HexaPromoModalGate,
510
515
  INFINITE_PROJECTS_QUERY_KEY,
511
516
  ImageCropModal,
512
517
  ImageTooSmallModal,
@@ -539,7 +544,7 @@ export {
539
544
  NavBarItem,
540
545
  NavigationProvider,
541
546
  NotFoundPage,
542
- default6 as NotificationCard,
547
+ default8 as NotificationCard,
543
548
  NotificationPageContent,
544
549
  NotificationsPopover,
545
550
  OverdueInvoiceBanner,
@@ -558,7 +563,7 @@ export {
558
563
  PayChargeInputSchema,
559
564
  CardSchema as PaymentCardSchema,
560
565
  PaymentInfoCard,
561
- default15 as PhoneInput,
566
+ default17 as PhoneInput,
562
567
  PixPendingDataSchema,
563
568
  PlanItemSchema,
564
569
  PlanSchema,
@@ -606,7 +611,7 @@ export {
606
611
  SubscriptionPendingPixResponseSchema,
607
612
  SubscriptionSchema,
608
613
  Switch,
609
- default16 as SwitchOptionFieldWithIcon,
614
+ default18 as SwitchOptionFieldWithIcon,
610
615
  TIME_FORMAT_OPTIONS,
611
616
  Table,
612
617
  TableBody,
@@ -628,12 +633,12 @@ export {
628
633
  TooltipProvider,
629
634
  TooltipTrigger,
630
635
  TrialBanner,
631
- default18 as TwoFactorAuthModal,
636
+ default20 as TwoFactorAuthModal,
632
637
  USER_QUERY_KEY,
633
638
  UpcomingInvoiceBanner,
634
639
  UserAvatar,
635
640
  UsersSelectorPopover,
636
- default7 as WhitelabelCodes,
641
+ default9 as WhitelabelCodes,
637
642
  badgeVariants,
638
643
  base64ToFile,
639
644
  buildCardFormSchema,
@@ -704,9 +709,9 @@ export {
704
709
  useChargeAction,
705
710
  useChargeById,
706
711
  useCharges,
707
- default8 as useCopyToClipboard,
712
+ default10 as useCopyToClipboard,
708
713
  useCountPages,
709
- default13 as useCountdownTimer,
714
+ default15 as useCountdownTimer,
710
715
  useCreateCard,
711
716
  useCreateProject,
712
717
  useCreateSetupIntent,
@@ -724,11 +729,12 @@ export {
724
729
  useDesktopSidebarStore,
725
730
  useHandleDeleteCard,
726
731
  useHasPlanAddon,
732
+ useHexaPromoModal,
727
733
  useIaCredits,
728
734
  useImageUpload,
729
735
  useInfiniteProjects,
730
736
  useInvalidateUser,
731
- default14 as useIsMobile,
737
+ default16 as useIsMobile,
732
738
  useListAllAccountUsers,
733
739
  useListAvailableUsers,
734
740
  useListProjectUsers,
@@ -739,7 +745,7 @@ export {
739
745
  useNavigationFallback,
740
746
  usePaidPlanRequiredModal,
741
747
  useParams,
742
- default12 as usePasswordVisibility,
748
+ default14 as usePasswordVisibility,
743
749
  usePathname,
744
750
  usePlanById,
745
751
  usePlans,