mitre-actions-widget 0.1.8 → 2.1.0
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/README.md +5 -10
- package/dist/index.cjs +26 -222
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -3
- package/dist/index.d.ts +6 -3
- package/dist/index.js +24 -220
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -45,23 +45,20 @@ const products = JSON.parse(process.env.VITE_PRODUCT_ID!);
|
|
|
45
45
|
|
|
46
46
|
<MitreActionsWidget
|
|
47
47
|
products={products}
|
|
48
|
-
|
|
49
|
-
apiToken={process.env.VITE_REGISTER_LEADS_TOKEN!}
|
|
48
|
+
ambiente="prod"
|
|
50
49
|
/>
|
|
51
50
|
|
|
52
51
|
// Com cor personalizada
|
|
53
52
|
<MitreActionsWidget
|
|
54
53
|
products={products}
|
|
55
|
-
|
|
56
|
-
apiToken={process.env.VITE_REGISTER_LEADS_TOKEN!}
|
|
54
|
+
ambiente="prod"
|
|
57
55
|
backgroundColor="#FF5733"
|
|
58
56
|
/>
|
|
59
57
|
|
|
60
58
|
// Com customização do formulário e callback de sucesso (props opcionais)
|
|
61
59
|
<MitreActionsWidget
|
|
62
60
|
products={products}
|
|
63
|
-
|
|
64
|
-
apiToken={process.env.VITE_REGISTER_LEADS_TOKEN!}
|
|
61
|
+
ambiente="prod"
|
|
65
62
|
// formShowHeader={true}
|
|
66
63
|
// formTitle="Fale conosco"
|
|
67
64
|
// formSubtitle="Preencha o formulário abaixo"
|
|
@@ -127,8 +124,7 @@ Depois de instalar a biblioteca, você pode começar a usá-la diretamente no se
|
|
|
127
124
|
O `MitreActionsWidget` aceita as seguintes props:
|
|
128
125
|
|
|
129
126
|
- **`products`** (Product[]): Array de produtos do empreendimento.
|
|
130
|
-
- **`
|
|
131
|
-
- **`apiToken`** (string): Token de autenticação da API.
|
|
127
|
+
- **`ambiente`** (`"homol" | "prod"`, opcional): Define de qual config interno do `mitre-form-component` o widget lê `apiUrl`, `apiToken`, `whatsappPhone` e `chatUrl`. Padrão: `"homol"`.
|
|
132
128
|
- **`backgroundColor`** (string, opcional): Cor de fundo personalizada para o botão flutuante. Padrão: `#2DCE68` (verde).
|
|
133
129
|
- **`formShowHeader`** (boolean, opcional): Exibe ou oculta o cabeçalho do formulário.
|
|
134
130
|
- **`formTitle`** (string, opcional): Título exibido no cabeçalho do formulário.
|
|
@@ -160,8 +156,7 @@ const products = JSON.parse(process.env.NEXT_PUBLIC_PRODUCT_ID!);
|
|
|
160
156
|
<ErrorBoundary fallback={<div>Erro ao carregar o formulário</div>}>
|
|
161
157
|
<MitreActionsWidget
|
|
162
158
|
products={products}
|
|
163
|
-
|
|
164
|
-
apiToken={process.env.NEXT_PUBLIC_REGISTER_LEADS_TOKEN!}
|
|
159
|
+
ambiente="prod"
|
|
165
160
|
backgroundColor="#2DCE68" // Opcional: cor personalizada
|
|
166
161
|
// formShowHeader={true}
|
|
167
162
|
// formTitle="Fale conosco"
|
package/dist/index.cjs
CHANGED
|
@@ -35,7 +35,7 @@ __export(index_exports, {
|
|
|
35
35
|
module.exports = __toCommonJS(index_exports);
|
|
36
36
|
|
|
37
37
|
// src/components/MitreActionsWidget/index.tsx
|
|
38
|
-
var
|
|
38
|
+
var import_react4 = __toESM(require("react"), 1);
|
|
39
39
|
|
|
40
40
|
// src/components/styles/utils.ts
|
|
41
41
|
function flex(direction = "row", alignItems, justifyContent) {
|
|
@@ -184,7 +184,7 @@ var ensureMontserratFont = () => {
|
|
|
184
184
|
};
|
|
185
185
|
|
|
186
186
|
// src/components/Selector/index.tsx
|
|
187
|
-
var
|
|
187
|
+
var import_react3 = require("react");
|
|
188
188
|
|
|
189
189
|
// src/components/hooks/useClickOutside.ts
|
|
190
190
|
var import_react = require("react");
|
|
@@ -502,95 +502,6 @@ var Navbar = ({ setCurrentOpen, currentOpen }) => {
|
|
|
502
502
|
};
|
|
503
503
|
var Navbar_default = Navbar;
|
|
504
504
|
|
|
505
|
-
// src/components/TalkWithASeller/index.tsx
|
|
506
|
-
var import_react2 = require("react");
|
|
507
|
-
|
|
508
|
-
// src/components/utils/utm.ts
|
|
509
|
-
var UTM_STORAGE_KEY = "utm_meta";
|
|
510
|
-
var TTL_DAYS = 7;
|
|
511
|
-
var isBrowser = () => typeof window !== "undefined" && typeof document !== "undefined";
|
|
512
|
-
var daysToMs = (days) => days * 24 * 60 * 60 * 1e3;
|
|
513
|
-
function readStoredUtm(maxAgeDays = TTL_DAYS) {
|
|
514
|
-
if (!isBrowser()) return { data: null, isValid: false };
|
|
515
|
-
try {
|
|
516
|
-
const raw = window.localStorage.getItem(UTM_STORAGE_KEY);
|
|
517
|
-
if (!raw) return { data: null, isValid: false };
|
|
518
|
-
const parsed = JSON.parse(raw);
|
|
519
|
-
if (!parsed?.createdAt) return { data: null, isValid: false };
|
|
520
|
-
const age = Date.now() - new Date(parsed.createdAt).getTime();
|
|
521
|
-
const isValid = age <= daysToMs(maxAgeDays);
|
|
522
|
-
return { data: isValid ? parsed : null, isValid };
|
|
523
|
-
} catch {
|
|
524
|
-
return { data: null, isValid: false };
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
function saveUtm(data, now = /* @__PURE__ */ new Date()) {
|
|
528
|
-
if (!isBrowser()) return null;
|
|
529
|
-
const payload = {
|
|
530
|
-
utm_source: data.utm_source || "direto",
|
|
531
|
-
utm_campaign: data.utm_campaign,
|
|
532
|
-
utm_medium: data.utm_medium,
|
|
533
|
-
utm_term: data.utm_term,
|
|
534
|
-
createdAt: now.toISOString()
|
|
535
|
-
};
|
|
536
|
-
try {
|
|
537
|
-
window.localStorage.setItem(UTM_STORAGE_KEY, JSON.stringify(payload));
|
|
538
|
-
} catch {
|
|
539
|
-
}
|
|
540
|
-
return payload;
|
|
541
|
-
}
|
|
542
|
-
function parseUrlUtm(loc) {
|
|
543
|
-
if (!isBrowser()) return {};
|
|
544
|
-
const locationObj = loc || window.location;
|
|
545
|
-
const sp = new URL(locationObj.href).searchParams;
|
|
546
|
-
const utm_source = sp.get("utm_source") || void 0;
|
|
547
|
-
const utm_campaign = sp.get("utm_campaign") || void 0;
|
|
548
|
-
const utm_medium = sp.get("utm_medium") || void 0;
|
|
549
|
-
const utm_term = sp.get("utm_term") || void 0;
|
|
550
|
-
return { utm_source, utm_campaign, utm_medium, utm_term };
|
|
551
|
-
}
|
|
552
|
-
function inferSourceFromReferrer(ref) {
|
|
553
|
-
if (!isBrowser()) return void 0;
|
|
554
|
-
const href = (ref ?? document.referrer ?? "").toLowerCase();
|
|
555
|
-
if (!href) return "direto";
|
|
556
|
-
const hostMatch = href.match(/https?:\/\/([^/]+)/);
|
|
557
|
-
const host = hostMatch?.[1] ?? href;
|
|
558
|
-
if (/google\./.test(host) || /^g\.co$/.test(host) || /^goo\.gl$/.test(host)) return "google";
|
|
559
|
-
if (/(^|\.)facebook\.com$/.test(host) || /(^|\.)m\.facebook\.com$/.test(host) || /(^|\.)fb\.com$/.test(host) || /(^|\.)fb\.me$/.test(host) || /(^|\.)fb\.watch$/.test(host) || /(^|\.)m\.me$/.test(host)) return "facebook";
|
|
560
|
-
if (/(^|\.)instagram\.com$/.test(host) || /(^|\.)l\.instagram\.com$/.test(host) || /(^|\.)instagr\.am$/.test(host) || /^ig\.me$/.test(host)) return "instagram";
|
|
561
|
-
if (/(^|\.)linkedin\.com$/.test(host) || /^lnkd\.in$/.test(host)) return "linkedin";
|
|
562
|
-
if (/^t\.co$/.test(host) || /(^|\.)twitter\.com$/.test(host) || /(^|\.)x\.com$/.test(host)) return "twitter";
|
|
563
|
-
if (/(^|\.)youtube\.com$/.test(host) || /^youtu\.be$/.test(host)) return "youtube";
|
|
564
|
-
if (/(^|\.)mail\.google\.com$/.test(host)) return "email";
|
|
565
|
-
if (/(^|\.)outlook\.live\.com$/.test(host) || /(^|\.)outlook\.office\.com$/.test(host)) return "email";
|
|
566
|
-
if (/^(wa\.me)$/.test(host) || /(^|\.)api\.whatsapp\.com$/.test(host) || /(^|\.)web\.whatsapp\.com$/.test(host)) return "whatsapp";
|
|
567
|
-
if (/^t\.me$/.test(host)) return "telegram";
|
|
568
|
-
if (/(^|\.)tiktok\.com$/.test(host)) return "tiktok";
|
|
569
|
-
return "direto";
|
|
570
|
-
}
|
|
571
|
-
function resolveUtmWithPriority(now = /* @__PURE__ */ new Date(), propOverride) {
|
|
572
|
-
const stored = readStoredUtm();
|
|
573
|
-
if (stored.data) {
|
|
574
|
-
const merged = { ...stored.data, ...propOverride };
|
|
575
|
-
return { data: merged, source: "localStorage" };
|
|
576
|
-
}
|
|
577
|
-
const fromUrl = parseUrlUtm();
|
|
578
|
-
if (fromUrl.utm_source) {
|
|
579
|
-
const saved = saveUtm(fromUrl, now);
|
|
580
|
-
const merged = { ...saved, ...propOverride };
|
|
581
|
-
return { data: merged, source: "url" };
|
|
582
|
-
}
|
|
583
|
-
const utm_source = inferSourceFromReferrer();
|
|
584
|
-
const payload = {
|
|
585
|
-
utm_source: utm_source || "direto",
|
|
586
|
-
utm_campaign: propOverride?.utm_campaign,
|
|
587
|
-
utm_medium: propOverride?.utm_medium,
|
|
588
|
-
utm_term: propOverride?.utm_term,
|
|
589
|
-
createdAt: now.toISOString()
|
|
590
|
-
};
|
|
591
|
-
return { data: payload, source: "referrer" };
|
|
592
|
-
}
|
|
593
|
-
|
|
594
505
|
// src/components/styles.ts
|
|
595
506
|
var import_styled_components5 = __toESM(require("styled-components"), 1);
|
|
596
507
|
var Container2 = import_styled_components5.default.div`
|
|
@@ -673,113 +584,13 @@ var SelectorOption = import_styled_components5.default.div`
|
|
|
673
584
|
}
|
|
674
585
|
`;
|
|
675
586
|
|
|
676
|
-
// src/components/utils/windowPopup.ts
|
|
677
|
-
var openWindowPopup = (url) => {
|
|
678
|
-
const dualScreenLeft = window.screenLeft !== void 0 ? window.screenLeft : window.screenX;
|
|
679
|
-
const dualScreenTop = window.screenTop !== void 0 ? window.screenTop : window.screenY;
|
|
680
|
-
const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width;
|
|
681
|
-
const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height;
|
|
682
|
-
const systemZoom = width / window.screen.availWidth;
|
|
683
|
-
const w = 674;
|
|
684
|
-
const h = 540;
|
|
685
|
-
const left = (width - w) / 2 / systemZoom + dualScreenLeft;
|
|
686
|
-
const top = (height - h) / 2 / systemZoom + dualScreenTop;
|
|
687
|
-
window.open(
|
|
688
|
-
url,
|
|
689
|
-
`mitre-window`,
|
|
690
|
-
`width=${w / systemZoom},
|
|
691
|
-
height=${h / systemZoom},
|
|
692
|
-
top=${top},
|
|
693
|
-
left=${left},
|
|
694
|
-
status=no,
|
|
695
|
-
toolbar=no,
|
|
696
|
-
location=no,
|
|
697
|
-
menubar=no,
|
|
698
|
-
resizable=no,
|
|
699
|
-
fullscreen=no`
|
|
700
|
-
);
|
|
701
|
-
};
|
|
702
|
-
|
|
703
587
|
// src/components/TalkWithASeller/index.tsx
|
|
704
588
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
705
|
-
var TalkWithSeller = ({
|
|
706
|
-
products,
|
|
707
|
-
apiUrl,
|
|
708
|
-
setCurrentFormOpen
|
|
709
|
-
}) => {
|
|
710
|
-
const [utm, setUtm] = (0, import_react2.useState)({ utm_source: "direto", createdAt: (/* @__PURE__ */ new Date()).toISOString() });
|
|
711
|
-
(0, import_react2.useEffect)(() => {
|
|
712
|
-
if (!isBrowser()) return;
|
|
713
|
-
const { data } = resolveUtmWithPriority(/* @__PURE__ */ new Date());
|
|
714
|
-
setUtm(data);
|
|
715
|
-
}, []);
|
|
716
|
-
const validateProducts = () => {
|
|
717
|
-
if (!products) {
|
|
718
|
-
return "Lista de produtos n\xE3o foi fornecida";
|
|
719
|
-
}
|
|
720
|
-
if (!Array.isArray(products)) {
|
|
721
|
-
return "Lista de produtos deve ser um array";
|
|
722
|
-
}
|
|
723
|
-
if (products.length === 0) {
|
|
724
|
-
return "Lista de produtos n\xE3o pode estar vazia";
|
|
725
|
-
}
|
|
726
|
-
for (let i = 0; i < products.length; i++) {
|
|
727
|
-
const product = products[i];
|
|
728
|
-
if (!product) {
|
|
729
|
-
return `Produto na posi\xE7\xE3o ${i} \xE9 inv\xE1lido (nulo/undefined)`;
|
|
730
|
-
}
|
|
731
|
-
if (typeof product.id !== "number" || product.id <= 0) {
|
|
732
|
-
return `Produto na posi\xE7\xE3o ${i} possui ID inv\xE1lido (deve ser um n\xFAmero positivo)`;
|
|
733
|
-
}
|
|
734
|
-
if (typeof product.name !== "string" || product.name.trim().length === 0) {
|
|
735
|
-
return `Produto na posi\xE7\xE3o ${i} possui nome inv\xE1lido (deve ser uma string n\xE3o vazia)`;
|
|
736
|
-
}
|
|
737
|
-
}
|
|
738
|
-
return null;
|
|
739
|
-
};
|
|
740
|
-
const onWhatsClick = async () => {
|
|
741
|
-
try {
|
|
742
|
-
const validationError = validateProducts();
|
|
743
|
-
if (validationError) {
|
|
744
|
-
console.log(validationError);
|
|
745
|
-
throw new Error("Missing required parameters");
|
|
746
|
-
}
|
|
747
|
-
const params = new URLSearchParams();
|
|
748
|
-
params.append("id_produto", products[0].id.toString());
|
|
749
|
-
params.append("utm_source", utm.utm_source);
|
|
750
|
-
if (utm.utm_medium) params.append("utm_medium", utm.utm_medium);
|
|
751
|
-
if (utm.utm_campaign) params.append("utm_campaign", utm.utm_campaign);
|
|
752
|
-
if (utm.utm_term) params.append("utm_term", utm.utm_term);
|
|
753
|
-
params.append("canal", "whatsapp");
|
|
754
|
-
const url = `${apiUrl}/atendimento?${params.toString()}`;
|
|
755
|
-
openWindowPopup(url);
|
|
756
|
-
} catch (error) {
|
|
757
|
-
console.error("Error in onWhatsClick:", error);
|
|
758
|
-
}
|
|
759
|
-
};
|
|
760
|
-
const onChatClick = async () => {
|
|
761
|
-
try {
|
|
762
|
-
const validationError = validateProducts();
|
|
763
|
-
if (validationError) {
|
|
764
|
-
console.log(validationError);
|
|
765
|
-
throw new Error("Missing required parameters");
|
|
766
|
-
}
|
|
767
|
-
const params = new URLSearchParams();
|
|
768
|
-
params.append("id_produto", products[0].id.toString());
|
|
769
|
-
params.append("utm_source", utm.utm_source);
|
|
770
|
-
if (utm.utm_medium) params.append("utm_medium", utm.utm_medium);
|
|
771
|
-
if (utm.utm_campaign) params.append("utm_campaign", utm.utm_campaign);
|
|
772
|
-
if (utm.utm_term) params.append("utm_term", utm.utm_term);
|
|
773
|
-
const url = `${apiUrl}/atendimento?${params.toString()}`;
|
|
774
|
-
openWindowPopup(url);
|
|
775
|
-
} catch (error) {
|
|
776
|
-
console.error("Error in onChatClick:", error);
|
|
777
|
-
}
|
|
778
|
-
};
|
|
589
|
+
var TalkWithSeller = ({ openForm }) => {
|
|
779
590
|
const itens = [
|
|
780
|
-
{ title: "Atendimento por Whatsapp", text: "Canal exclusivo para vendas", onClick: () =>
|
|
781
|
-
{ title: "Atendimento por chat", text: "Canal exclusivo para vendas", onClick: () =>
|
|
782
|
-
{ title: "Atendimento por mensagem", text: "Canal exclusivo para vendas", onClick: () =>
|
|
591
|
+
{ title: "Atendimento por Whatsapp", text: "Canal exclusivo para vendas", onClick: () => openForm("whatsapp"), icon: "whatsapp" },
|
|
592
|
+
{ title: "Atendimento por chat", text: "Canal exclusivo para vendas", onClick: () => openForm("chat"), icon: "chat" },
|
|
593
|
+
{ title: "Atendimento por mensagem", text: "Canal exclusivo para vendas", onClick: () => openForm("form"), icon: "message" }
|
|
783
594
|
];
|
|
784
595
|
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
785
596
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Title, { children: "Converse com um corretor" }),
|
|
@@ -805,10 +616,10 @@ var TalkWithSeller = ({
|
|
|
805
616
|
var TalkWithASeller_default = TalkWithSeller;
|
|
806
617
|
|
|
807
618
|
// src/components/hooks/useDeviceType.ts
|
|
808
|
-
var
|
|
619
|
+
var import_react2 = require("react");
|
|
809
620
|
function useDeviceType() {
|
|
810
|
-
const [deviceType, setDeviceType] = (0,
|
|
811
|
-
(0,
|
|
621
|
+
const [deviceType, setDeviceType] = (0, import_react2.useState)("Unknown");
|
|
622
|
+
(0, import_react2.useEffect)(() => {
|
|
812
623
|
const userAgent = navigator.userAgent || navigator.vendor;
|
|
813
624
|
if (/android/i.test(userAgent)) {
|
|
814
625
|
setDeviceType("Android");
|
|
@@ -952,8 +763,7 @@ var import_react_error_boundary = require("react-error-boundary");
|
|
|
952
763
|
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
953
764
|
var Selector = ({
|
|
954
765
|
products,
|
|
955
|
-
|
|
956
|
-
apiToken,
|
|
766
|
+
ambiente,
|
|
957
767
|
close,
|
|
958
768
|
formShowHeader,
|
|
959
769
|
formTitle,
|
|
@@ -961,9 +771,11 @@ var Selector = ({
|
|
|
961
771
|
formShowPreferenciaContato,
|
|
962
772
|
onFormSuccess
|
|
963
773
|
}) => {
|
|
964
|
-
const ref = (0,
|
|
965
|
-
const [currentOpen, setCurrentOpen] = (0,
|
|
966
|
-
const [
|
|
774
|
+
const ref = (0, import_react3.useRef)(null);
|
|
775
|
+
const [currentOpen, setCurrentOpen] = (0, import_react3.useState)(0);
|
|
776
|
+
const [formCanal, setFormCanal] = (0, import_react3.useState)(null);
|
|
777
|
+
const openForm = (canal) => setFormCanal(canal);
|
|
778
|
+
const closeForm = () => setFormCanal(null);
|
|
967
779
|
useClickOutside_default(ref, close);
|
|
968
780
|
const tabs = [
|
|
969
781
|
TalkWithASeller_default,
|
|
@@ -978,9 +790,9 @@ var Selector = ({
|
|
|
978
790
|
import_hi.HiArrowNarrowLeft,
|
|
979
791
|
{
|
|
980
792
|
className: "back-icon",
|
|
981
|
-
onClick:
|
|
793
|
+
onClick: closeForm,
|
|
982
794
|
size: 28,
|
|
983
|
-
visibility:
|
|
795
|
+
visibility: formCanal !== null ? "visible" : "hidden",
|
|
984
796
|
color: colors.black
|
|
985
797
|
}
|
|
986
798
|
),
|
|
@@ -994,7 +806,7 @@ var Selector = ({
|
|
|
994
806
|
}
|
|
995
807
|
)
|
|
996
808
|
] }),
|
|
997
|
-
|
|
809
|
+
formCanal !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_jsx_runtime5.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(FormContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_error_boundary.ErrorBoundary, { fallback: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(FormErrorContainer, { children: [
|
|
998
810
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
999
811
|
import_hi.HiOutlineExclamation,
|
|
1000
812
|
{
|
|
@@ -1007,8 +819,8 @@ var Selector = ({
|
|
|
1007
819
|
import_mitre_form_component.MitreFormComponent,
|
|
1008
820
|
{
|
|
1009
821
|
products,
|
|
1010
|
-
|
|
1011
|
-
|
|
822
|
+
ambiente,
|
|
823
|
+
canal: formCanal,
|
|
1012
824
|
backgroundColor: "transparent",
|
|
1013
825
|
innerPadding: "0",
|
|
1014
826
|
showHeader: formShowHeader,
|
|
@@ -1018,14 +830,7 @@ var Selector = ({
|
|
|
1018
830
|
onSuccess: onFormSuccess
|
|
1019
831
|
}
|
|
1020
832
|
) }) }) }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
|
|
1021
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ContentContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1022
|
-
CurrentComponent,
|
|
1023
|
-
{
|
|
1024
|
-
setCurrentFormOpen,
|
|
1025
|
-
products,
|
|
1026
|
-
apiUrl
|
|
1027
|
-
}
|
|
1028
|
-
) }),
|
|
833
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ContentContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CurrentComponent, { openForm }) }),
|
|
1029
834
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(FooterContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1030
835
|
Navbar_default,
|
|
1031
836
|
{
|
|
@@ -1040,10 +845,9 @@ var Selector_default = Selector;
|
|
|
1040
845
|
|
|
1041
846
|
// src/components/MitreActionsWidget/index.tsx
|
|
1042
847
|
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
1043
|
-
var MitreActionsWidget =
|
|
848
|
+
var MitreActionsWidget = import_react4.default.forwardRef(({
|
|
1044
849
|
products,
|
|
1045
|
-
|
|
1046
|
-
apiToken,
|
|
850
|
+
ambiente,
|
|
1047
851
|
backgroundColor,
|
|
1048
852
|
formShowHeader,
|
|
1049
853
|
formTitle,
|
|
@@ -1051,8 +855,8 @@ var MitreActionsWidget = import_react5.default.forwardRef(({
|
|
|
1051
855
|
formShowPreferenciaContato,
|
|
1052
856
|
onFormSuccess
|
|
1053
857
|
}, ref) => {
|
|
1054
|
-
const [open, setOpen] = (0,
|
|
1055
|
-
(0,
|
|
858
|
+
const [open, setOpen] = (0, import_react4.useState)(false);
|
|
859
|
+
(0, import_react4.useEffect)(() => {
|
|
1056
860
|
ensureMontserratFont();
|
|
1057
861
|
}, []);
|
|
1058
862
|
function handleOpen() {
|
|
@@ -1062,7 +866,7 @@ var MitreActionsWidget = import_react5.default.forwardRef(({
|
|
|
1062
866
|
setOpen(false);
|
|
1063
867
|
}
|
|
1064
868
|
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ComponentWrapper, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(Container, { children: [
|
|
1065
|
-
open && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Selector_default, { products,
|
|
869
|
+
open && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Selector_default, { products, ambiente, close: () => close(), formShowHeader, formTitle, formSubtitle, formShowPreferenciaContato, onFormSuccess }),
|
|
1066
870
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ButtonContainer, { ref, open, $backgroundColor: backgroundColor, onClick: () => handleOpen(), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
1067
871
|
"img",
|
|
1068
872
|
{
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/MitreActionsWidget/index.tsx","../src/components/styles/utils.ts","../src/components/MitreActionsWidget/styles.ts","../src/theme/colors.ts","../src/components/ComponentWrapper/index.tsx","../src/utils/fontLoader.ts","../src/components/Selector/index.tsx","../src/components/hooks/useClickOutside.ts","../src/components/Selector/styles.ts","../src/components/Navbar/styles.ts","../src/assets/icons.ts","../src/components/Navbar/index.tsx","../src/components/TalkWithASeller/index.tsx","../src/components/utils/utm.ts","../src/components/styles.ts","../src/components/utils/windowPopup.ts","../src/components/hooks/useDeviceType.ts","../src/components/LeadSupport/index.tsx","../src/components/OtherTopics/index.tsx"],"sourcesContent":["export { default as MitreActionsWidget } from \"./components/MitreActionsWidget\";\nexport type { MitreActionsWidgetProps } from \"./components/MitreActionsWidget\";\n","import React, { useState, useEffect } from \"react\";\nimport { Container, ButtonContainer } from \"./styles\";\nimport { Product } from '../../domain/Product';\nimport { ComponentWrapper } from \"../ComponentWrapper\";\nimport { ensureMontserratFont } from \"../../utils/fontLoader\";\n\nimport Selector from \"../Selector\";\n\nimport { iconMap } from \"../../assets/icons\";\nimport { RequestBody } from \"mitre-form-component\";\n\nexport interface MitreActionsWidgetProps {\n products: Product[];\n apiUrl: string;\n apiToken: string;\n /**\n * Cor de fundo personalizada para o botão flutuante.\n * @default \"#2DCE68\" (verde padrão)\n * @example backgroundColor=\"#FF5733\"\n */\n backgroundColor?: string;\n /** Exibe ou oculta o cabeçalho do formulário. */\n formShowHeader?: boolean;\n /** Título exibido no cabeçalho do formulário. */\n formTitle?: string;\n /** Subtítulo exibido no cabeçalho do formulário. */\n formSubtitle?: string;\n /** Exibe ou oculta o campo de preferência de contato no formulário. */\n formShowPreferenciaContato?: boolean;\n /**\n * Callback chamado após o envio bem-sucedido do formulário de lead.\n * Recebe o corpo da requisição e o ID do lead criado.\n * @example onFormSuccess={(body, leadId) => console.log(leadId)}\n */\n onFormSuccess?: (requestBody: RequestBody, leadId: string) => void;\n}\n\nconst MitreActionsWidget = React.forwardRef<HTMLDivElement, MitreActionsWidgetProps>(({\n products,\n apiUrl,\n apiToken,\n backgroundColor,\n formShowHeader,\n formTitle,\n formSubtitle,\n formShowPreferenciaContato,\n onFormSuccess\n}, ref) => {\n const [open, setOpen] = useState(false);\n\n // Carrega a fonte Montserrat de forma condicional (sem afetar o projeto host)\n useEffect(() => {\n ensureMontserratFont();\n }, []);\n\n function handleOpen() {\n setOpen(true);\n }\n\n function close() {\n setOpen(false);\n }\n\n return (\n <ComponentWrapper>\n <Container>\n {open && <Selector products={products} apiUrl={apiUrl} apiToken={apiToken} close={() => close()} formShowHeader={formShowHeader} formTitle={formTitle} formSubtitle={formSubtitle} formShowPreferenciaContato={formShowPreferenciaContato} onFormSuccess={onFormSuccess} />}\n <ButtonContainer ref={ref} open={open} $backgroundColor={backgroundColor} onClick={() => handleOpen()}>\n <img\n src={iconMap[\"balloon\"]}\n height={32}\n width={32}\n alt=\"Balão com mais opções\"\n draggable={false}\n />\n </ButtonContainer>\n </Container>\n </ComponentWrapper>\n )\n});\n\nMitreActionsWidget.displayName = \"MitreActionsWidget\";\n\nexport default MitreActionsWidget;","type directionType = \"column\" | \"row\";\ntype alignItemsType = \"center\" | \"flex-start\";\n\ntype jutifyContentType = \"center\" | \"space-between\";\n\nexport function flex(\n direction: directionType = \"row\",\n alignItems?: alignItemsType,\n justifyContent?: jutifyContentType\n) {\n return `\n align-items:${alignItems || null};\n display:flex;\n flex-direction:${direction};\n justify-content:${justifyContent || null};\n `;\n}\n\nexport const alignX = `\n left:50%;\n transform:translateX(-50%);\n`;\n\nexport const alignXAndY = `\n left:50%;\n top:50%;\n transform:translate(-50%, -50%);\n`;\n\nexport const darkEffect = `\n &:hover {\n cursor:pointer;\n filter:brightness(98%);\n }\n\n &:active {\n filter:brightness(95%);\n }\n`;\n\nexport const opacityEffect = `\n &:hover {\n cursor:pointer;\n opacity:.9;\n }\n\n &:active {\n opacity:.7;\n }\n`;\n\nexport const modalZIndex = 9999;\n\nexport const breakpoints = {\n tablet: \"1024px\",\n};\n","import { flex, darkEffect, breakpoints } from \"../styles/utils\";\nimport styled from \"styled-components\";\nimport { colors } from \"../../theme\";\n\nexport const Container = styled.div`\n ${flex(\"column\")}\n bottom: 1.5rem;\n right: 3rem;\n position: fixed;\n width: 375px;\n z-index: 9999;\n\n @media (max-width: ${breakpoints.tablet}) {\n bottom: 1.5rem;\n right: 1.5rem;\n }\n`;\n\ntype Props = {\n open?: boolean;\n $backgroundColor?: string;\n};\n\nexport const ButtonContainer = styled.div<Props>`\n ${darkEffect}\n ${flex(\"row\", \"center\", \"center\")}\n align-self:end;\n background-color: ${(props) => (props.$backgroundColor?.trim() ? props.$backgroundColor : colors.green2)};\n border-radius: 100px;\n height: 56px;\n width: 56px;\n pointer-events: ${(props) => (props.open ? \"none\" : \"\")};\n`;\n","export const colors = {\n red: '#e52e4d',\n white: '#FFF',\n black: '#2F2F2F',\n black2: '#1E1E1E',\n black3: '#353535',\n alphaBlack: '#000000',\n \n yellow400: '#FFD789',\n yellow500: '#F6C76B',\n \n gray40: '#F0F0F0',\n gray45: '#767676',\n gray50: '#686A69',\n gray60: '#8F8F8F',\n gray100: '#B6B6B6',\n gray150: '#B9B9B9',\n gray200: '#D2D2D2',\n gray300: '#EBEBEB',\n gray400: '#ECECEC',\n gray500: '#F4F4F4',\n gray550: '#6F6F6F',\n gray600: '#686868',\n gray700: '#535353',\n gray800: '#9D9D9D',\n \n green: '#57C06E',\n green2: '#2DCE68',\n} as const;\n\nexport const shadows = {\n shadow500: '0px 4px 8px rgba(91, 91, 91, 0.2)',\n} as const;\n","import styled from \"styled-components\";\nimport { colors } from \"../../theme\";\n\nexport const ComponentWrapper = styled.div`\n /* Reset local apenas para elementos dentro do componente */\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n /* Font family aplicada apenas aos elementos do componente */\n font-family: \"Montserrat\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n -webkit-font-smoothing: antialiased;\n\n /* Aplicar font aos elementos filhos */\n input, textarea, select, button {\n font-family: \"Montserrat\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-weight: 400;\n }\n\n h1, h2, h3, h4, h5, h6, strong {\n font-weight: 700;\n }\n\n button {\n cursor: pointer;\n }\n\n [disabled] {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n /* Scrollbar customizada APENAS para elementos internos */\n ::-webkit-scrollbar {\n -webkit-appearance: none;\n background: ${colors.gray500};\n width: 6px;\n height: 10px;\n }\n\n ::-webkit-scrollbar-thumb {\n background-color: ${colors.gray50};\n }\n`;\n","/**\n * Carrega a fonte Montserrat de forma condicional.\n * Verifica se a fonte já está carregada no documento antes de adicionar,\n * evitando duplicação se o projeto host já tiver a fonte.\n */\nexport const ensureMontserratFont = (): void => {\n // Verifica se a fonte já está carregada\n if (document.querySelector('link[href*=\"Montserrat\"]')) {\n return;\n }\n\n const link = document.createElement(\"link\");\n link.href = \"https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swap\";\n link.rel = \"stylesheet\";\n document.head.appendChild(link);\n};\n","import { useRef, useState } from \"react\";\nimport { colors } from \"../../theme\";\n\nimport useClickOutside from \"../hooks/useClickOutside\";\n\nimport {\n HeaderContainer,\n ContentContainer,\n FormContainer,\n SelectorContainer,\n FooterContainer,\n FormErrorContainer,\n TextError\n} from \"./styles\";\n\nimport { HiX, HiArrowNarrowLeft, HiOutlineExclamation } from 'react-icons/hi';\n\nimport Navbar from \"../Navbar\";\n\nimport TalkWithSeller from \"../TalkWithASeller\";\nimport LeadSupport from \"../LeadSupport\";\nimport OtherTopics from \"../OtherTopics\";\n\nimport { MitreFormComponent, RequestBody } from 'mitre-form-component'\n\nimport { Product } from '../../domain/Product';\n\nimport { ErrorBoundary } from 'react-error-boundary';\n\ntype Props = {\n products: Product[];\n apiUrl: string,\n apiToken: string,\n close: () => void;\n formShowHeader?: boolean;\n formTitle?: string;\n formSubtitle?: string;\n formShowPreferenciaContato?: boolean;\n onFormSuccess?: (requestBody: RequestBody, leadId: string) => void;\n}\n\nconst Selector = ({\n products,\n apiUrl,\n apiToken,\n close,\n formShowHeader,\n formTitle,\n formSubtitle,\n formShowPreferenciaContato,\n onFormSuccess\n}: Props) => {\n const ref = useRef<HTMLDivElement | null>(null);\n const [currentOpen, setCurrentOpen] = useState(0);\n\n const [currentFormOpen, setCurrentFormOpen] = useState(-1);\n\n useClickOutside(ref, close);\n\n const tabs = [\n TalkWithSeller,\n LeadSupport,\n OtherTopics\n ];\n\n const DefaultComponent = () => <></>;\n\n const CurrentComponent = tabs[currentOpen] || DefaultComponent;\n\n return (\n <SelectorContainer ref={ref}>\n\n <HeaderContainer>\n <HiArrowNarrowLeft\n className=\"back-icon\"\n onClick={() => setCurrentFormOpen(-1)}\n size={28}\n visibility={currentFormOpen >= 0 ? \"visible\" : \"hidden\"}\n color={colors.black}\n />\n\n <HiX\n className=\"close-icon\"\n onClick={close}\n size={28}\n color={colors.black}\n />\n </HeaderContainer>\n\n {currentFormOpen >= 0 ?\n <>\n <FormContainer>\n <ErrorBoundary fallback={\n <FormErrorContainer>\n <HiOutlineExclamation\n size={28}\n color={colors.red}\n />\n <TextError>Ocorreu um erro ao carregar o formulário!</TextError>\n </FormErrorContainer>\n }>\n <MitreFormComponent\n products={products}\n apiUrl={apiUrl}\n apiToken={apiToken}\n backgroundColor=\"transparent\"\n innerPadding=\"0\"\n showHeader={formShowHeader}\n title={formTitle}\n subtitle={formSubtitle}\n showPreferenciaContato={formShowPreferenciaContato}\n onSuccess={onFormSuccess}\n />\n </ErrorBoundary>\n </FormContainer>\n </>\n :\n <>\n <ContentContainer>\n <CurrentComponent\n setCurrentFormOpen={setCurrentFormOpen}\n products={products}\n apiUrl={apiUrl}\n />\n </ContentContainer>\n\n <FooterContainer>\n <Navbar\n currentOpen={currentOpen}\n setCurrentOpen={setCurrentOpen}\n />\n </FooterContainer>\n </>\n }\n\n </SelectorContainer>\n );\n}\n\nexport default Selector;","import { useEffect } from \"react\";\n\nfunction useClickOutside(\n ref: React.RefObject<HTMLElement | null>,\n methodToRunWhenClickOutside: (e?: MouseEvent) => void,\n exemptedIds: string[] = []\n) {\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n // Explicit null check (TypeScript will now understand ref.current could be null)\n if (!ref.current) return;\n\n const isClickOutside = !ref.current.contains(event.target as Node);\n\n // Check if the clicked element or any of its ancestors have an exempted ID\n const isAnElementAllowedToClose = exemptedIds.some((id) => {\n let element = event.target as HTMLElement | null;\n while (element) {\n if (element.id === id) {\n return true;\n }\n element = element.parentElement;\n }\n return false;\n });\n\n // Only run the method if the click is outside and not exempted\n if (isClickOutside && !isAnElementAllowedToClose) {\n methodToRunWhenClickOutside(event);\n }\n }\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [ref, methodToRunWhenClickOutside, exemptedIds]);\n}\n\nexport default useClickOutside;\n","import { flex, opacityEffect, breakpoints } from \"../styles/utils\";\nimport styled from \"styled-components\";\nimport { colors } from \"../../theme\";\n\nexport const HeaderContainer = styled.div`\n position: relative;\n width: 100%;\n height: 52px;\n padding-top: 20px;\n padding-bottom: 8px;\n padding-left: 20px;\n padding-right: 20px;\n\n justify-content: space-between;\n align-items: center;\n display: flex;\n\n .close-icon {\n ${opacityEffect}\n color: ${colors.gray100};\n }\n\n .back-icon {\n ${opacityEffect}\n }\n`;\n\nexport const ContentContainer = styled.div`\n flex: 1;\n overflow-x: hidden;\n overflow-y: auto;\n\n /* Hide scrollbars for WebKit browsers */\n ::-webkit-scrollbar {\n display: none;\n }\n\n /* Hide scrollbars for Firefox */\n scrollbar-width: none;\n\n /* Padding para prevenir conteúdo encostado nas bordas */\n padding-left: 20px;\n padding-right: 20px;\n padding-bottom: 10px;\n padding-top: 10px;\n`;\n\nexport const FormContainer = styled.div`\n ${flex(\"column\")}\n overflow-x: hidden;\n overflow-y: auto;\n height: 100%;\n\n /* Padding do container do formulário (igual ao ContentContainer) */\n padding-left: 20px;\n padding-right: 20px;\n padding-bottom: 10px;\n padding-top: 10px;\n\n /* Restaurar espaçamentos dos elementos do formulário */\n & > * {\n margin-bottom: 16px;\n }\n\n & label {\n margin-bottom: 8px;\n display: block;\n }\n\n & input,\n & textarea,\n & select {\n padding: 12px;\n margin-bottom: 16px;\n }\n\n /* Restaurar padding para elementos do phone input que foram resetados */\n .react-international-phone-country-selector-button {\n padding: 0 0.5rem !important;\n }\n\n .react-international-phone-country-selector-button__button-content {\n padding: 0.25rem !important;\n }\n\n .react-international-phone-country-selector-button__flag-emoji {\n padding: 0 0.25rem !important;\n }\n\n /* Restaurar padding para os itens da lista de países no dropdown */\n .react-international-phone-country-selector-dropdown {\n padding: 0.25rem 0 !important;\n }\n\n .react-international-phone-country-selector-dropdown__list-item {\n padding: 0.25rem 1rem !important;\n }\n\n .react-international-phone-country-selector-dropdown__list-item-flag-emoji {\n padding: 0 0.5rem 0 0 !important;\n }\n\n .react-international-phone-country-selector-dropdown__list-item-country-name {\n padding: 0 0.5rem !important;\n }\n\n .react-international-phone-country-selector-dropdown__list-item-dial-code {\n padding: 0 0 0 0.5rem !important;\n }\n\n /* Hide scrollbars for WebKit browsers */\n ::-webkit-scrollbar {\n display: none;\n }\n\n /* Hide scrollbars for Firefox */\n scrollbar-width: none;\n`;\n\nexport const SelectorContainer = styled.div`\n display: flex;\n flex-direction: column;\n height: 85vh;\n margin-bottom: 8px;\n max-height: 660px;\n position: relative;\n background: ${colors.gray300};\n border-radius: 8px;\n\n @media (max-width: ${breakpoints.tablet}) {\n height: 100%;\n width: 100%;\n max-height: 100%;\n border-radius: 0px;\n position: fixed;\n bottom: 0;\n right: 0;\n top: 0;\n left: 0;\n margin: 0;\n z-index: 50;\n padding-bottom: env(safe-area-inset-bottom);\n }\n`;\n\nexport const FooterContainer = styled.div`\n height: 90px;\n width: 100%;\n`;\n\nexport const FormErrorContainer = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100%;\n\n background: ${colors.white};\n border-radius: 8px;\n border: none;\n`;\n\nexport const TextError = styled.h3`\n color: ${colors.red};\n text-align: center;\n padding-top: 10px;\n`;\n","import { flex, opacityEffect } from \"../styles/utils\";\nimport styled from \"styled-components\";\nimport { colors } from \"../../theme\";\n\nexport const NavContainer = styled.nav`\n ${flex(\"row\")}\n gap:10px;\n position: absolute;\n left: 15px;\n right: 15px;\n bottom: 10px;\n\n button {\n ${flex(\"column\", \"center\")}\n ${opacityEffect}\n background: black;\n border-radius: 10px;\n border: none;\n color: white;\n font-size: 11px;\n gap: 5px;\n padding: 10px 5px;\n width: 33%;\n\n &.active {\n background: ${colors.yellow500};\n color: black;\n font-weight: 700;\n\n img,\n svg {\n filter: initial;\n }\n }\n\n img,\n svg {\n filter: invert(100%);\n }\n }\n`;\n","import apple_mac from \"./images/apple-mac.svg\";\nimport balloon from \"./images/balloon.svg\";\nimport chat from \"./images/chat.svg\";\nimport google_play_store from \"./images/google-play-store.svg\";\nimport house_with_hand from \"./images/house-with-hand.svg\";\nimport mala from \"./images/mala.svg\";\nimport message from \"./images/message.svg\";\nimport person from \"./images/person.svg\";\nimport question_mark_circle from \"./images/question-mark-circle.svg\";\nimport shake_hands from \"./images/shake-hands.svg\";\nimport star from \"./images/star.svg\";\nimport whatsapp from \"./images/whatsapp.svg\";\n\nexport const iconMap: Record<string, string> = {\n apple_mac,\n balloon,\n chat,\n google_play_store,\n house_with_hand,\n mala,\n message,\n person,\n question_mark_circle,\n shake_hands,\n star,\n whatsapp,\n};\n","import { NavContainer } from \"./styles\";\n\nimport { Dispatch } from \"react\";\n\nimport { iconMap } from \"../../assets/icons\";\n\ntype Props = {\n currentOpen:number;\n setCurrentOpen:Dispatch<number>;\n}\n\nconst Navbar = ({ setCurrentOpen, currentOpen }:Props) => {\n\n const itens = [\n { name:\"Converse com um corretor\", icon:\"house_with_hand\" },\n { name:\"Atendimento ao cliente\", icon:\"person\" },\n { name:\"Outros assuntos\", icon:\"question_mark_circle\" }\n ]\n\n return (\n <NavContainer>\n \n { itens.map((tab, index) => (\n <button \n className={index === currentOpen ? \"active\" : \"\" } \n key={ tab.name } \n onClick={ () => setCurrentOpen(index) }\n >\n <img\n alt={ tab.name }\n height={ 20 }\n src={iconMap[tab.icon!]}\n width={ 20 }\n />\n { tab.name }\n </button>\n ))}\n\n </NavContainer>\n )\n}\n\nexport default Navbar","import { Dispatch, useEffect, useState } from \"react\";\nimport { UTM, isBrowser, resolveUtmWithPriority } from \"../utils/utm\";\nimport { Title, Text, SelectorOptionsContainer, SelectorOption } from \"../styles\";\nimport { openWindowPopup } from \"../utils/windowPopup\";\nimport { Product } from '../../domain/Product';\n\nimport { iconMap } from \"../../assets/icons\";\n\ntype Props = {\n products: Product[];\n apiUrl: string,\n setCurrentFormOpen: Dispatch<number>;\n}\n\nconst TalkWithSeller = ({\n products,\n apiUrl,\n setCurrentFormOpen\n}: Props) => {\n const [utm, setUtm] = useState<UTM>({ utm_source: 'direto', createdAt: new Date().toISOString() });\n\n useEffect(() => {\n if (!isBrowser()) return;\n const { data } = resolveUtmWithPriority(new Date());\n setUtm(data);\n }, []);\n\n const validateProducts = (): string | null => {\n if (!products) {\n return \"Lista de produtos não foi fornecida\";\n }\n\n if (!Array.isArray(products)) {\n return \"Lista de produtos deve ser um array\";\n }\n\n if (products.length === 0) {\n return \"Lista de produtos não pode estar vazia\";\n }\n\n // Validar cada produto no array\n for (let i = 0; i < products.length; i++) {\n const product = products[i];\n\n if (!product) {\n return `Produto na posição ${i} é inválido (nulo/undefined)`;\n }\n\n if (typeof product.id !== 'number' || product.id <= 0) {\n return `Produto na posição ${i} possui ID inválido (deve ser um número positivo)`;\n }\n\n if (typeof product.name !== 'string' || product.name.trim().length === 0) {\n return `Produto na posição ${i} possui nome inválido (deve ser uma string não vazia)`;\n }\n }\n\n return null;\n };\n\n const onWhatsClick = async () => {\n try {\n const validationError = validateProducts();\n if (validationError) {\n console.log(validationError);\n throw new Error(\"Missing required parameters\");\n }\n\n const params = new URLSearchParams();\n params.append('id_produto', products[0].id.toString());\n params.append('utm_source', utm.utm_source);\n if (utm.utm_medium) params.append('utm_medium', utm.utm_medium);\n if (utm.utm_campaign) params.append('utm_campaign', utm.utm_campaign);\n if (utm.utm_term) params.append('utm_term', utm.utm_term);\n params.append('canal', 'whatsapp');\n\n const url = `${apiUrl}/atendimento?${params.toString()}`;\n openWindowPopup(url);\n } catch (error) {\n console.error(\"Error in onWhatsClick:\", error);\n }\n };\n\n const onChatClick = async () => {\n try {\n const validationError = validateProducts();\n if (validationError) {\n console.log(validationError);\n throw new Error(\"Missing required parameters\");\n }\n\n const params = new URLSearchParams();\n params.append('id_produto', products[0].id.toString());\n params.append('utm_source', utm.utm_source);\n if (utm.utm_medium) params.append('utm_medium', utm.utm_medium);\n if (utm.utm_campaign) params.append('utm_campaign', utm.utm_campaign);\n if (utm.utm_term) params.append('utm_term', utm.utm_term);\n\n const url = `${apiUrl}/atendimento?${params.toString()}`;\n openWindowPopup(url);\n } catch (error) {\n console.error(\"Error in onChatClick:\", error);\n }\n };\n\n const itens = [\n { title: \"Atendimento por Whatsapp\", text: \"Canal exclusivo para vendas\", onClick: () => onWhatsClick(), icon: \"whatsapp\" },\n { title: \"Atendimento por chat\", text: \"Canal exclusivo para vendas\", onClick: () => onChatClick(), icon: \"chat\" },\n { title: \"Atendimento por mensagem\", text: \"Canal exclusivo para vendas\", onClick: () => setCurrentFormOpen(0), icon: \"message\" },\n ];\n\n return (\n <div>\n\n <Title>\n Converse com um corretor\n </Title>\n\n <Text>\n Selecione uma opção de contato a seguir:\n </Text>\n\n <SelectorOptionsContainer>\n {itens.map((value) => (\n <button key={value.title} onClick={value.onClick}>\n <SelectorOption >\n <div>\n <h3>{value.title}</h3>\n <p>{value.text}</p>\n </div>\n\n <img\n alt=\"\"\n aria-hidden=\"true\"\n height={26}\n src={iconMap[value.icon]}\n width={26}\n />\n </SelectorOption>\n </button>\n ))}\n </SelectorOptionsContainer>\n\n </div>\n )\n}\n\nexport default TalkWithSeller\n","export type UTM = {\n utm_source: string; // default 'direto'\n utm_campaign?: string;\n utm_medium?: string;\n utm_term?: string;\n createdAt: string; // ISO 8601\n };\n \n const UTM_STORAGE_KEY = 'utm_meta';\n const TTL_DAYS = 7;\n \n export const isBrowser = () =>\n typeof window !== 'undefined' && typeof document !== 'undefined';\n \n const daysToMs = (days: number) => days * 24 * 60 * 60 * 1000;\n \n export function readStoredUtm(maxAgeDays = TTL_DAYS): { data: UTM | null; isValid: boolean } {\n if (!isBrowser()) return { data: null, isValid: false };\n try {\n const raw = window.localStorage.getItem(UTM_STORAGE_KEY);\n if (!raw) return { data: null, isValid: false };\n const parsed = JSON.parse(raw) as UTM;\n if (!parsed?.createdAt) return { data: null, isValid: false };\n const age = Date.now() - new Date(parsed.createdAt).getTime();\n const isValid = age <= daysToMs(maxAgeDays);\n return { data: isValid ? parsed : null, isValid };\n } catch {\n return { data: null, isValid: false };\n }\n }\n \n export function saveUtm(data: Partial<UTM>, now = new Date()): UTM | null {\n if (!isBrowser()) return null;\n const payload: UTM = {\n utm_source: data.utm_source || 'direto',\n utm_campaign: data.utm_campaign,\n utm_medium: data.utm_medium,\n utm_term: data.utm_term,\n createdAt: now.toISOString(),\n };\n try {\n window.localStorage.setItem(UTM_STORAGE_KEY, JSON.stringify(payload));\n } catch { /* ignore quota errors */ }\n return payload;\n }\n \n export function parseUrlUtm(loc?: Location): Partial<UTM> {\n if (!isBrowser()) return {};\n const locationObj = loc || window.location;\n const sp = new URL(locationObj.href).searchParams;\n const utm_source = sp.get('utm_source') || undefined;\n const utm_campaign = sp.get('utm_campaign') || undefined;\n const utm_medium = sp.get('utm_medium') || undefined;\n const utm_term = sp.get('utm_term') || undefined;\n return { utm_source, utm_campaign, utm_medium, utm_term };\n }\n \n export function inferSourceFromReferrer(ref?: string): string | undefined {\n if (!isBrowser()) return undefined;\n const href = (ref ?? document.referrer ?? '').toLowerCase();\n if (!href) return 'direto';\n const hostMatch = href.match(/https?:\\/\\/([^/]+)/);\n const host = hostMatch?.[1] ?? href;\n if (/google\\./.test(host) || /^g\\.co$/.test(host) || /^goo\\.gl$/.test(host)) return 'google';\n\n if (\n /(^|\\.)facebook\\.com$/.test(host) ||\n /(^|\\.)m\\.facebook\\.com$/.test(host) ||\n /(^|\\.)fb\\.com$/.test(host) ||\n /(^|\\.)fb\\.me$/.test(host) ||\n /(^|\\.)fb\\.watch$/.test(host) ||\n /(^|\\.)m\\.me$/.test(host)\n ) return 'facebook';\n\n if (\n /(^|\\.)instagram\\.com$/.test(host) ||\n /(^|\\.)l\\.instagram\\.com$/.test(host) ||\n /(^|\\.)instagr\\.am$/.test(host) ||\n /^ig\\.me$/.test(host)\n ) return 'instagram';\n\n if (/(^|\\.)linkedin\\.com$/.test(host) || /^lnkd\\.in$/.test(host)) return 'linkedin';\n\n if (/^t\\.co$/.test(host) || /(^|\\.)twitter\\.com$/.test(host) || /(^|\\.)x\\.com$/.test(host)) return 'twitter';\n\n if (/(^|\\.)youtube\\.com$/.test(host) || /^youtu\\.be$/.test(host)) return 'youtube';\n\n if (/(^|\\.)mail\\.google\\.com$/.test(host)) return 'email';\n\n if (/(^|\\.)outlook\\.live\\.com$/.test(host) || /(^|\\.)outlook\\.office\\.com$/.test(host)) return 'email';\n\n if (/^(wa\\.me)$/.test(host) || /(^|\\.)api\\.whatsapp\\.com$/.test(host) || /(^|\\.)web\\.whatsapp\\.com$/.test(host)) return 'whatsapp';\n\n if (/^t\\.me$/.test(host)) return 'telegram';\n\n if (/(^|\\.)tiktok\\.com$/.test(host)) return 'tiktok';\n return 'direto';\n }\n \n /** Resolve UTM e persiste quando necessário. Prioridade: localStorage (válido) > URL > referrer */\n export function resolveUtmWithPriority(\n now = new Date(),\n propOverride?: Partial<UTM>\n ): { data: UTM; source: 'localStorage' | 'url' | 'referrer' } {\n // 1) Se houver UTM válido no localStorage (<= 7 dias), usar SEM sobrescrever\n const stored = readStoredUtm();\n if (stored.data) {\n const merged = { ...stored.data, ...propOverride } as UTM;\n return { data: merged, source: 'localStorage' };\n }\n \n // 2) Se NÃO houver válido no localStorage, tentar URL. Se houver, salvar e usar\n const fromUrl = parseUrlUtm();\n if (fromUrl.utm_source) {\n const saved = saveUtm(fromUrl, now)!;\n const merged = { ...saved, ...propOverride } as UTM;\n return { data: merged, source: 'url' };\n }\n \n // 3) Fallback: inferir do referrer, apenas ler (não salvar no localStorage)\n const utm_source = inferSourceFromReferrer();\n const payload: UTM = {\n utm_source: utm_source || 'direto',\n utm_campaign: propOverride?.utm_campaign,\n utm_medium: propOverride?.utm_medium,\n utm_term: propOverride?.utm_term,\n createdAt: now.toISOString(),\n };\n return { data: payload, source: 'referrer' };\n }","import { darkEffect, flex, breakpoints } from \"./styles/utils\";\nimport styled from \"styled-components\";\nimport { colors } from \"../theme\";\n\nexport const Container = styled.div`\n ${flex(\"column\")}\n bottom: 1.5rem;\n right: 3rem;\n position: fixed;\n width: 375px;\n\n @media (max-width: ${breakpoints.tablet}) {\n bottom: 1.5rem;\n right: 1.5rem;\n }\n`;\n\ntype Props = {\n open?: boolean;\n};\n\nexport const ButtonContainer = styled.div<Props>`\n ${darkEffect}\n ${flex(\"row\", \"center\", \"center\")}\n align-self:end;\n border-radius: 100px;\n height: 56px;\n width: 56px;\n pointer-events: ${(props) => (props.open ? \"none\" : \"\")};\n`;\n\nexport const Title = styled.h2<{ $textColor?: string }>`\n font-size: 1.25rem;\n font-weight: 700;\n line-height: 24px;\n letter-spacing: 0em;\n color: ${(props) => props.$textColor || colors.black};\n`;\n\nexport const Text = styled.p<{ $textColor?: string }>`\n font-size: 1rem;\n font-weight: 400;\n line-height: 23px;\n letter-spacing: 0em;\n margin-top: 10px;\n color: ${(props) => props.$textColor || colors.black};\n`;\n\nexport const SelectorOptionsContainer = styled.div`\n ${flex(\"column\")}\n gap: 10px;\n padding: 20px 0;\n\n a {\n text-decoration: none;\n }\n\n button {\n border: none;\n border-radius: 8px;\n background: transparent;\n }\n`;\n\nexport const SelectorOption = styled.div`\n ${flex(\"row\", \"center\", \"space-between\")}\n ${darkEffect}\n background: ${colors.white};\n color: black;\n border-radius: 8px;\n padding: 12px;\n width: 100%;\n\n h3 {\n font-size: 0.81rem;\n font-weight: 700;\n letter-spacing: 0em;\n text-align: left;\n line-height: 1.4;\n margin-bottom: 10px;\n margin-right: 10px;\n }\n\n p {\n font-size: 0.75rem;\n font-weight: 300;\n letter-spacing: 0em;\n text-align: left;\n line-height: 1.4;\n margin-right: 10px;\n }\n`;\n","export const openWindowPopup = (url: string) => {\n // Fixes dual-screen position Most browsers Firefox\n const dualScreenLeft =\n window.screenLeft !== undefined ? window.screenLeft : window.screenX;\n const dualScreenTop =\n window.screenTop !== undefined ? window.screenTop : window.screenY;\n\n const width = window.innerWidth\n ? window.innerWidth\n : document.documentElement.clientWidth\n ? document.documentElement.clientWidth\n : screen.width;\n const height = window.innerHeight\n ? window.innerHeight\n : document.documentElement.clientHeight\n ? document.documentElement.clientHeight\n : screen.height;\n\n const systemZoom = width / window.screen.availWidth;\n const w = 674;\n const h = 540;\n const left = (width - w) / 2 / systemZoom + dualScreenLeft;\n const top = (height - h) / 2 / systemZoom + dualScreenTop;\n\n window.open(\n url,\n `mitre-window`,\n `width=${w / systemZoom}, \n height=${h / systemZoom}, \n top=${top}, \n left=${left}, \n status=no, \n toolbar=no, \n location=no, \n menubar=no, \n resizable=no, \n fullscreen=no`\n );\n};\n","import { useEffect, useState } from \"react\";\n\ntype DeviceType = \"Android\" | \"iPhone\" | \"Unknown\";\n\nexport function useDeviceType(): DeviceType {\n const [deviceType, setDeviceType] = useState<DeviceType>(\"Unknown\");\n\n useEffect(() => {\n const userAgent = navigator.userAgent || navigator.vendor;\n\n if (/android/i.test(userAgent)) {\n setDeviceType(\"Android\");\n } else if (/iPad|iPhone|iPod/.test(userAgent)) {\n setDeviceType(\"iPhone\");\n } else {\n setDeviceType(\"Unknown\");\n }\n }, []);\n\n return deviceType;\n}\n","import { Title, Text, SelectorOptionsContainer, SelectorOption } from \"../styles\";\nimport { useDeviceType } from \"../hooks/useDeviceType\";\n\nimport { iconMap } from \"../../assets/icons\";\n\nconst Client = () => {\n const device = useDeviceType()\n const mobileLink = device === \"Android\" ? \"https://play.google.com/store/apps/details?id=com.mitre.experience&pli=1\" : \"https://apps.apple.com/br/app/mitre-experience/id1543244752\";\n const mobileIcon = device === \"Android\" ? \"google-play-store\" : \"apple-mac\";\n const mobileMessage = device === \"Android\" ? \"Encontre nosso app na Google Play Store\" : \"Encontre nosso app na App Store\";\n\n const items = [\n { title:\"Atendimento ao Cliente Mitre\", text:\"Acesso ao portal do cliente\", icon:\"person\", link:\"https://portal.mitrerealty.com.br/Clientes/\", },\n { title:\"Baixe o Aplicativo Mitre Experience\", text:mobileMessage, icon:mobileIcon, link:mobileLink },\n ];\n\n const mobileItems = [\n { title:\"Baixe o Aplicativo Mitre Experience no Android\", text:\"Encontre nosso app na Google Play Store\", icon:\"google_play_store\", link:\"https://play.google.com/store/apps/details?id=com.mitre.experience&pli=1\" },\n { title:\"Baixe o Aplicativo Mitre Experience no IOS\", text:\"Encontre nosso app na App Store\", icon:\"apple_mac\", link:\"https://apps.apple.com/br/app/mitre-experience/id1543244752\" }\n ];\n\n function isInMobileItemButInDesktop(index:number) {\n const itemIndex = 1;\n return index === itemIndex && device === \"Unknown\";\n }\n\n return (\n <div>\n\n <Title>\n Central de Relacionamento\n </Title>\n\n <Text>\n <>\n Já é cliente Mitre Reality? Precisa falar conosco?\n <br/><br/>\n Acesse o Portal do Cliente para enviar sua solicitação à nossa Central de Relacionamento: \n </>\n </Text>\n\n <SelectorOptionsContainer>\n <>\n { items.map((item, index) => (\n <a \n key={ item.title } \n href={ item.link }\n target=\"_blank\" rel=\"noreferrer\"\n style={isInMobileItemButInDesktop(index) ? { display:\"none\" } : {}}\n >\n <SelectorOption>\n <div>\n <h3>{ item.title }</h3>\n <p>{item.text}</p>\n </div>\n <img\n alt=\"\"\n aria-hidden=\"true\"\n height={ 26 }\n src={iconMap[item.icon]}\n width={ 26 }\n />\n </SelectorOption>\n </a>\n ))}\n\n { device === \"Unknown\" &&\n mobileItems.map((item) => (\n <a \n key={ item.title } \n href={ item.link }\n target=\"_blank\" rel=\"noreferrer\"\n >\n <SelectorOption>\n <div>\n <h3>{ item.title }</h3>\n <p>{item.text}</p>\n </div>\n <img\n alt=\"\"\n aria-hidden=\"true\"\n height={ 26 }\n src={iconMap[item.icon]}\n width={ 26 }\n />\n </SelectorOption>\n </a>\n ))\n }\n\n </>\n </SelectorOptionsContainer>\n\n </div>\n )\n}\n\nexport default Client;\n","import { Title, Text, SelectorOptionsContainer, SelectorOption } from \"../styles\";\n\nimport { iconMap } from \"../../assets/icons\";\n\nconst Other = () => {\n const itens = [\n { title:\"Trabalhe conosco\", text:\"Canal exclusivo para vagas\", icon:\"mala\", link:`https://mitrerealty.gupy.io/` },\n { title:\"Fornecedores\", text:\"Seja um fornecedor da Mitre\", icon:\"shake_hands\", link:`https://www.mitrerealty.com.br/fornecedores` },\n { title:\"Seja um Parceiro Mitre\", text:\"Seja um corretor ou imobiliária parceira da Mitre.\", icon:\"star\", link:`https://www.mitrerealty.com.br/seja-parceiro-mitre` },\n { title:\"Outros assuntos\", text:\"Entre em contato com a Mitre\", icon:\"question_mark_circle\", link:`https://www.mitrerealty.com.br/contato` }\n ];\n\n return (\n <div>\n\n <Title>\n Outros assuntos\n </Title>\n\n <Text>\n Selecione uma das opções a seguir:\n </Text>\n\n <SelectorOptionsContainer>\n { itens.map((item) => (\n <a \n key={ item.title } \n href={ item.link }\n target=\"_blank\" rel=\"noreferrer\"\n >\n <SelectorOption >\n <div>\n <h3>{ item.title }</h3>\n <p>{item.text}</p>\n </div>\n\n <img\n alt=\"\"\n aria-hidden=\"true\"\n height={ 26 }\n src={ iconMap[item.icon] }\n width={ 26 }\n />\n </SelectorOption>\n </a>\n ))}\n </SelectorOptionsContainer>\n\n </div>\n )\n}\n\nexport default Other; "],"mappings":"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","names":["import_react","styled","import_styled_components","styled","import_react","import_styled_components","styled","import_styled_components","styled","import_react","import_styled_components","Container","styled","ButtonContainer","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/MitreActionsWidget/index.tsx","../src/components/styles/utils.ts","../src/components/MitreActionsWidget/styles.ts","../src/theme/colors.ts","../src/components/ComponentWrapper/index.tsx","../src/utils/fontLoader.ts","../src/components/Selector/index.tsx","../src/components/hooks/useClickOutside.ts","../src/components/Selector/styles.ts","../src/components/Navbar/styles.ts","../src/assets/icons.ts","../src/components/Navbar/index.tsx","../src/components/styles.ts","../src/components/TalkWithASeller/index.tsx","../src/components/hooks/useDeviceType.ts","../src/components/LeadSupport/index.tsx","../src/components/OtherTopics/index.tsx"],"sourcesContent":["export { default as MitreActionsWidget } from \"./components/MitreActionsWidget\";\nexport type { MitreActionsWidgetProps } from \"./components/MitreActionsWidget\";\n","import React, { useState, useEffect } from \"react\";\nimport { Container, ButtonContainer } from \"./styles\";\nimport { Product } from '../../domain/Product';\nimport { ComponentWrapper } from \"../ComponentWrapper\";\nimport { ensureMontserratFont } from \"../../utils/fontLoader\";\n\nimport Selector from \"../Selector\";\n\nimport { iconMap } from \"../../assets/icons\";\nimport { RequestBody, type Ambiente } from \"mitre-form-component\";\n\nexport interface MitreActionsWidgetProps {\n products: Product[];\n /**\n * Define de qual config interno o `MitreFormComponent` lê `apiUrl`/`apiToken`/`whatsappPhone`/`chatUrl`.\n * Default `\"homol\"`.\n */\n ambiente?: Ambiente;\n /**\n * Cor de fundo personalizada para o botão flutuante.\n * @default \"#2DCE68\" (verde padrão)\n * @example backgroundColor=\"#FF5733\"\n */\n backgroundColor?: string;\n /** Exibe ou oculta o cabeçalho do formulário. */\n formShowHeader?: boolean;\n /** Título exibido no cabeçalho do formulário. */\n formTitle?: string;\n /** Subtítulo exibido no cabeçalho do formulário. */\n formSubtitle?: string;\n /** Exibe ou oculta o campo de preferência de contato no formulário. */\n formShowPreferenciaContato?: boolean;\n /**\n * Callback chamado após o envio bem-sucedido do formulário de lead.\n * Recebe o corpo da requisição e o ID do lead criado.\n * @example onFormSuccess={(body, leadId) => console.log(leadId)}\n */\n onFormSuccess?: (requestBody: RequestBody, leadId: string) => void;\n}\n\nconst MitreActionsWidget = React.forwardRef<HTMLDivElement, MitreActionsWidgetProps>(({\n products,\n ambiente,\n backgroundColor,\n formShowHeader,\n formTitle,\n formSubtitle,\n formShowPreferenciaContato,\n onFormSuccess\n}, ref) => {\n const [open, setOpen] = useState(false);\n\n // Carrega a fonte Montserrat de forma condicional (sem afetar o projeto host)\n useEffect(() => {\n ensureMontserratFont();\n }, []);\n\n function handleOpen() {\n setOpen(true);\n }\n\n function close() {\n setOpen(false);\n }\n\n return (\n <ComponentWrapper>\n <Container>\n {open && <Selector products={products} ambiente={ambiente} close={() => close()} formShowHeader={formShowHeader} formTitle={formTitle} formSubtitle={formSubtitle} formShowPreferenciaContato={formShowPreferenciaContato} onFormSuccess={onFormSuccess} />}\n <ButtonContainer ref={ref} open={open} $backgroundColor={backgroundColor} onClick={() => handleOpen()}>\n <img\n src={iconMap[\"balloon\"]}\n height={32}\n width={32}\n alt=\"Balão com mais opções\"\n draggable={false}\n />\n </ButtonContainer>\n </Container>\n </ComponentWrapper>\n )\n});\n\nMitreActionsWidget.displayName = \"MitreActionsWidget\";\n\nexport default MitreActionsWidget;","type directionType = \"column\" | \"row\";\ntype alignItemsType = \"center\" | \"flex-start\";\n\ntype jutifyContentType = \"center\" | \"space-between\";\n\nexport function flex(\n direction: directionType = \"row\",\n alignItems?: alignItemsType,\n justifyContent?: jutifyContentType\n) {\n return `\n align-items:${alignItems || null};\n display:flex;\n flex-direction:${direction};\n justify-content:${justifyContent || null};\n `;\n}\n\nexport const alignX = `\n left:50%;\n transform:translateX(-50%);\n`;\n\nexport const alignXAndY = `\n left:50%;\n top:50%;\n transform:translate(-50%, -50%);\n`;\n\nexport const darkEffect = `\n &:hover {\n cursor:pointer;\n filter:brightness(98%);\n }\n\n &:active {\n filter:brightness(95%);\n }\n`;\n\nexport const opacityEffect = `\n &:hover {\n cursor:pointer;\n opacity:.9;\n }\n\n &:active {\n opacity:.7;\n }\n`;\n\nexport const modalZIndex = 9999;\n\nexport const breakpoints = {\n tablet: \"1024px\",\n};\n","import { flex, darkEffect, breakpoints } from \"../styles/utils\";\nimport styled from \"styled-components\";\nimport { colors } from \"../../theme\";\n\nexport const Container = styled.div`\n ${flex(\"column\")}\n bottom: 1.5rem;\n right: 3rem;\n position: fixed;\n width: 375px;\n z-index: 9999;\n\n @media (max-width: ${breakpoints.tablet}) {\n bottom: 1.5rem;\n right: 1.5rem;\n }\n`;\n\ntype Props = {\n open?: boolean;\n $backgroundColor?: string;\n};\n\nexport const ButtonContainer = styled.div<Props>`\n ${darkEffect}\n ${flex(\"row\", \"center\", \"center\")}\n align-self:end;\n background-color: ${(props) => (props.$backgroundColor?.trim() ? props.$backgroundColor : colors.green2)};\n border-radius: 100px;\n height: 56px;\n width: 56px;\n pointer-events: ${(props) => (props.open ? \"none\" : \"\")};\n`;\n","export const colors = {\n red: '#e52e4d',\n white: '#FFF',\n black: '#2F2F2F',\n black2: '#1E1E1E',\n black3: '#353535',\n alphaBlack: '#000000',\n \n yellow400: '#FFD789',\n yellow500: '#F6C76B',\n \n gray40: '#F0F0F0',\n gray45: '#767676',\n gray50: '#686A69',\n gray60: '#8F8F8F',\n gray100: '#B6B6B6',\n gray150: '#B9B9B9',\n gray200: '#D2D2D2',\n gray300: '#EBEBEB',\n gray400: '#ECECEC',\n gray500: '#F4F4F4',\n gray550: '#6F6F6F',\n gray600: '#686868',\n gray700: '#535353',\n gray800: '#9D9D9D',\n \n green: '#57C06E',\n green2: '#2DCE68',\n} as const;\n\nexport const shadows = {\n shadow500: '0px 4px 8px rgba(91, 91, 91, 0.2)',\n} as const;\n","import styled from \"styled-components\";\nimport { colors } from \"../../theme\";\n\nexport const ComponentWrapper = styled.div`\n /* Reset local apenas para elementos dentro do componente */\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n /* Font family aplicada apenas aos elementos do componente */\n font-family: \"Montserrat\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n -webkit-font-smoothing: antialiased;\n\n /* Aplicar font aos elementos filhos */\n input, textarea, select, button {\n font-family: \"Montserrat\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-weight: 400;\n }\n\n h1, h2, h3, h4, h5, h6, strong {\n font-weight: 700;\n }\n\n button {\n cursor: pointer;\n }\n\n [disabled] {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n /* Scrollbar customizada APENAS para elementos internos */\n ::-webkit-scrollbar {\n -webkit-appearance: none;\n background: ${colors.gray500};\n width: 6px;\n height: 10px;\n }\n\n ::-webkit-scrollbar-thumb {\n background-color: ${colors.gray50};\n }\n`;\n","/**\n * Carrega a fonte Montserrat de forma condicional.\n * Verifica se a fonte já está carregada no documento antes de adicionar,\n * evitando duplicação se o projeto host já tiver a fonte.\n */\nexport const ensureMontserratFont = (): void => {\n // Verifica se a fonte já está carregada\n if (document.querySelector('link[href*=\"Montserrat\"]')) {\n return;\n }\n\n const link = document.createElement(\"link\");\n link.href = \"https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swap\";\n link.rel = \"stylesheet\";\n document.head.appendChild(link);\n};\n","import { useRef, useState } from \"react\";\nimport { colors } from \"../../theme\";\n\nimport useClickOutside from \"../hooks/useClickOutside\";\n\nimport {\n HeaderContainer,\n ContentContainer,\n FormContainer,\n SelectorContainer,\n FooterContainer,\n FormErrorContainer,\n TextError\n} from \"./styles\";\n\nimport { HiX, HiArrowNarrowLeft, HiOutlineExclamation } from 'react-icons/hi';\n\nimport Navbar from \"../Navbar\";\n\nimport TalkWithSeller from \"../TalkWithASeller\";\nimport LeadSupport from \"../LeadSupport\";\nimport OtherTopics from \"../OtherTopics\";\n\nimport { MitreFormComponent, RequestBody, type Ambiente, type Canal } from 'mitre-form-component'\n\nimport { Product } from '../../domain/Product';\n\nimport { ErrorBoundary } from 'react-error-boundary';\n\ntype Props = {\n products: Product[];\n ambiente?: Ambiente;\n close: () => void;\n formShowHeader?: boolean;\n formTitle?: string;\n formSubtitle?: string;\n formShowPreferenciaContato?: boolean;\n onFormSuccess?: (requestBody: RequestBody, leadId: string) => void;\n}\n\nconst Selector = ({\n products,\n ambiente,\n close,\n formShowHeader,\n formTitle,\n formSubtitle,\n formShowPreferenciaContato,\n onFormSuccess\n}: Props) => {\n const ref = useRef<HTMLDivElement | null>(null);\n const [currentOpen, setCurrentOpen] = useState(0);\n\n const [formCanal, setFormCanal] = useState<Canal | null>(null);\n const openForm = (canal: Canal) => setFormCanal(canal);\n const closeForm = () => setFormCanal(null);\n\n useClickOutside(ref, close);\n\n const tabs = [\n TalkWithSeller,\n LeadSupport,\n OtherTopics\n ];\n\n const DefaultComponent = () => <></>;\n\n const CurrentComponent = tabs[currentOpen] || DefaultComponent;\n\n return (\n <SelectorContainer ref={ref}>\n\n <HeaderContainer>\n <HiArrowNarrowLeft\n className=\"back-icon\"\n onClick={closeForm}\n size={28}\n visibility={formCanal !== null ? \"visible\" : \"hidden\"}\n color={colors.black}\n />\n\n <HiX\n className=\"close-icon\"\n onClick={close}\n size={28}\n color={colors.black}\n />\n </HeaderContainer>\n\n {formCanal !== null ?\n <>\n <FormContainer>\n <ErrorBoundary fallback={\n <FormErrorContainer>\n <HiOutlineExclamation\n size={28}\n color={colors.red}\n />\n <TextError>Ocorreu um erro ao carregar o formulário!</TextError>\n </FormErrorContainer>\n }>\n <MitreFormComponent\n products={products}\n ambiente={ambiente}\n canal={formCanal}\n backgroundColor=\"transparent\"\n innerPadding=\"0\"\n showHeader={formShowHeader}\n title={formTitle}\n subtitle={formSubtitle}\n showPreferenciaContato={formShowPreferenciaContato}\n onSuccess={onFormSuccess}\n />\n </ErrorBoundary>\n </FormContainer>\n </>\n :\n <>\n <ContentContainer>\n <CurrentComponent openForm={openForm} />\n </ContentContainer>\n\n <FooterContainer>\n <Navbar\n currentOpen={currentOpen}\n setCurrentOpen={setCurrentOpen}\n />\n </FooterContainer>\n </>\n }\n\n </SelectorContainer>\n );\n}\n\nexport default Selector;","import { useEffect } from \"react\";\n\nfunction useClickOutside(\n ref: React.RefObject<HTMLElement | null>,\n methodToRunWhenClickOutside: (e?: MouseEvent) => void,\n exemptedIds: string[] = []\n) {\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n // Explicit null check (TypeScript will now understand ref.current could be null)\n if (!ref.current) return;\n\n const isClickOutside = !ref.current.contains(event.target as Node);\n\n // Check if the clicked element or any of its ancestors have an exempted ID\n const isAnElementAllowedToClose = exemptedIds.some((id) => {\n let element = event.target as HTMLElement | null;\n while (element) {\n if (element.id === id) {\n return true;\n }\n element = element.parentElement;\n }\n return false;\n });\n\n // Only run the method if the click is outside and not exempted\n if (isClickOutside && !isAnElementAllowedToClose) {\n methodToRunWhenClickOutside(event);\n }\n }\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [ref, methodToRunWhenClickOutside, exemptedIds]);\n}\n\nexport default useClickOutside;\n","import { flex, opacityEffect, breakpoints } from \"../styles/utils\";\nimport styled from \"styled-components\";\nimport { colors } from \"../../theme\";\n\nexport const HeaderContainer = styled.div`\n position: relative;\n width: 100%;\n height: 52px;\n padding-top: 20px;\n padding-bottom: 8px;\n padding-left: 20px;\n padding-right: 20px;\n\n justify-content: space-between;\n align-items: center;\n display: flex;\n\n .close-icon {\n ${opacityEffect}\n color: ${colors.gray100};\n }\n\n .back-icon {\n ${opacityEffect}\n }\n`;\n\nexport const ContentContainer = styled.div`\n flex: 1;\n overflow-x: hidden;\n overflow-y: auto;\n\n /* Hide scrollbars for WebKit browsers */\n ::-webkit-scrollbar {\n display: none;\n }\n\n /* Hide scrollbars for Firefox */\n scrollbar-width: none;\n\n /* Padding para prevenir conteúdo encostado nas bordas */\n padding-left: 20px;\n padding-right: 20px;\n padding-bottom: 10px;\n padding-top: 10px;\n`;\n\nexport const FormContainer = styled.div`\n ${flex(\"column\")}\n overflow-x: hidden;\n overflow-y: auto;\n height: 100%;\n\n /* Padding do container do formulário (igual ao ContentContainer) */\n padding-left: 20px;\n padding-right: 20px;\n padding-bottom: 10px;\n padding-top: 10px;\n\n /* Restaurar espaçamentos dos elementos do formulário */\n & > * {\n margin-bottom: 16px;\n }\n\n & label {\n margin-bottom: 8px;\n display: block;\n }\n\n & input,\n & textarea,\n & select {\n padding: 12px;\n margin-bottom: 16px;\n }\n\n /* Restaurar padding para elementos do phone input que foram resetados */\n .react-international-phone-country-selector-button {\n padding: 0 0.5rem !important;\n }\n\n .react-international-phone-country-selector-button__button-content {\n padding: 0.25rem !important;\n }\n\n .react-international-phone-country-selector-button__flag-emoji {\n padding: 0 0.25rem !important;\n }\n\n /* Restaurar padding para os itens da lista de países no dropdown */\n .react-international-phone-country-selector-dropdown {\n padding: 0.25rem 0 !important;\n }\n\n .react-international-phone-country-selector-dropdown__list-item {\n padding: 0.25rem 1rem !important;\n }\n\n .react-international-phone-country-selector-dropdown__list-item-flag-emoji {\n padding: 0 0.5rem 0 0 !important;\n }\n\n .react-international-phone-country-selector-dropdown__list-item-country-name {\n padding: 0 0.5rem !important;\n }\n\n .react-international-phone-country-selector-dropdown__list-item-dial-code {\n padding: 0 0 0 0.5rem !important;\n }\n\n /* Hide scrollbars for WebKit browsers */\n ::-webkit-scrollbar {\n display: none;\n }\n\n /* Hide scrollbars for Firefox */\n scrollbar-width: none;\n`;\n\nexport const SelectorContainer = styled.div`\n display: flex;\n flex-direction: column;\n height: 85vh;\n margin-bottom: 8px;\n max-height: 660px;\n position: relative;\n background: ${colors.gray300};\n border-radius: 8px;\n\n @media (max-width: ${breakpoints.tablet}) {\n height: 100%;\n width: 100%;\n max-height: 100%;\n border-radius: 0px;\n position: fixed;\n bottom: 0;\n right: 0;\n top: 0;\n left: 0;\n margin: 0;\n z-index: 50;\n padding-bottom: env(safe-area-inset-bottom);\n }\n`;\n\nexport const FooterContainer = styled.div`\n height: 90px;\n width: 100%;\n`;\n\nexport const FormErrorContainer = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100%;\n\n background: ${colors.white};\n border-radius: 8px;\n border: none;\n`;\n\nexport const TextError = styled.h3`\n color: ${colors.red};\n text-align: center;\n padding-top: 10px;\n`;\n","import { flex, opacityEffect } from \"../styles/utils\";\nimport styled from \"styled-components\";\nimport { colors } from \"../../theme\";\n\nexport const NavContainer = styled.nav`\n ${flex(\"row\")}\n gap:10px;\n position: absolute;\n left: 15px;\n right: 15px;\n bottom: 10px;\n\n button {\n ${flex(\"column\", \"center\")}\n ${opacityEffect}\n background: black;\n border-radius: 10px;\n border: none;\n color: white;\n font-size: 11px;\n gap: 5px;\n padding: 10px 5px;\n width: 33%;\n\n &.active {\n background: ${colors.yellow500};\n color: black;\n font-weight: 700;\n\n img,\n svg {\n filter: initial;\n }\n }\n\n img,\n svg {\n filter: invert(100%);\n }\n }\n`;\n","import apple_mac from \"./images/apple-mac.svg\";\nimport balloon from \"./images/balloon.svg\";\nimport chat from \"./images/chat.svg\";\nimport google_play_store from \"./images/google-play-store.svg\";\nimport house_with_hand from \"./images/house-with-hand.svg\";\nimport mala from \"./images/mala.svg\";\nimport message from \"./images/message.svg\";\nimport person from \"./images/person.svg\";\nimport question_mark_circle from \"./images/question-mark-circle.svg\";\nimport shake_hands from \"./images/shake-hands.svg\";\nimport star from \"./images/star.svg\";\nimport whatsapp from \"./images/whatsapp.svg\";\n\nexport const iconMap: Record<string, string> = {\n apple_mac,\n balloon,\n chat,\n google_play_store,\n house_with_hand,\n mala,\n message,\n person,\n question_mark_circle,\n shake_hands,\n star,\n whatsapp,\n};\n","import { NavContainer } from \"./styles\";\n\nimport { Dispatch } from \"react\";\n\nimport { iconMap } from \"../../assets/icons\";\n\ntype Props = {\n currentOpen:number;\n setCurrentOpen:Dispatch<number>;\n}\n\nconst Navbar = ({ setCurrentOpen, currentOpen }:Props) => {\n\n const itens = [\n { name:\"Converse com um corretor\", icon:\"house_with_hand\" },\n { name:\"Atendimento ao cliente\", icon:\"person\" },\n { name:\"Outros assuntos\", icon:\"question_mark_circle\" }\n ]\n\n return (\n <NavContainer>\n \n { itens.map((tab, index) => (\n <button \n className={index === currentOpen ? \"active\" : \"\" } \n key={ tab.name } \n onClick={ () => setCurrentOpen(index) }\n >\n <img\n alt={ tab.name }\n height={ 20 }\n src={iconMap[tab.icon!]}\n width={ 20 }\n />\n { tab.name }\n </button>\n ))}\n\n </NavContainer>\n )\n}\n\nexport default Navbar","import { darkEffect, flex, breakpoints } from \"./styles/utils\";\nimport styled from \"styled-components\";\nimport { colors } from \"../theme\";\n\nexport const Container = styled.div`\n ${flex(\"column\")}\n bottom: 1.5rem;\n right: 3rem;\n position: fixed;\n width: 375px;\n\n @media (max-width: ${breakpoints.tablet}) {\n bottom: 1.5rem;\n right: 1.5rem;\n }\n`;\n\ntype Props = {\n open?: boolean;\n};\n\nexport const ButtonContainer = styled.div<Props>`\n ${darkEffect}\n ${flex(\"row\", \"center\", \"center\")}\n align-self:end;\n border-radius: 100px;\n height: 56px;\n width: 56px;\n pointer-events: ${(props) => (props.open ? \"none\" : \"\")};\n`;\n\nexport const Title = styled.h2<{ $textColor?: string }>`\n font-size: 1.25rem;\n font-weight: 700;\n line-height: 24px;\n letter-spacing: 0em;\n color: ${(props) => props.$textColor || colors.black};\n`;\n\nexport const Text = styled.p<{ $textColor?: string }>`\n font-size: 1rem;\n font-weight: 400;\n line-height: 23px;\n letter-spacing: 0em;\n margin-top: 10px;\n color: ${(props) => props.$textColor || colors.black};\n`;\n\nexport const SelectorOptionsContainer = styled.div`\n ${flex(\"column\")}\n gap: 10px;\n padding: 20px 0;\n\n a {\n text-decoration: none;\n }\n\n button {\n border: none;\n border-radius: 8px;\n background: transparent;\n }\n`;\n\nexport const SelectorOption = styled.div`\n ${flex(\"row\", \"center\", \"space-between\")}\n ${darkEffect}\n background: ${colors.white};\n color: black;\n border-radius: 8px;\n padding: 12px;\n width: 100%;\n\n h3 {\n font-size: 0.81rem;\n font-weight: 700;\n letter-spacing: 0em;\n text-align: left;\n line-height: 1.4;\n margin-bottom: 10px;\n margin-right: 10px;\n }\n\n p {\n font-size: 0.75rem;\n font-weight: 300;\n letter-spacing: 0em;\n text-align: left;\n line-height: 1.4;\n margin-right: 10px;\n }\n`;\n","import { Title, Text, SelectorOptionsContainer, SelectorOption } from \"../styles\";\nimport { type Canal } from \"mitre-form-component\";\n\nimport { iconMap } from \"../../assets/icons\";\n\ntype Props = {\n openForm: (canal: Canal) => void;\n}\n\nconst TalkWithSeller = ({ openForm }: Props) => {\n const itens = [\n { title: \"Atendimento por Whatsapp\", text: \"Canal exclusivo para vendas\", onClick: () => openForm(\"whatsapp\"), icon: \"whatsapp\" },\n { title: \"Atendimento por chat\", text: \"Canal exclusivo para vendas\", onClick: () => openForm(\"chat\"), icon: \"chat\" },\n { title: \"Atendimento por mensagem\", text: \"Canal exclusivo para vendas\", onClick: () => openForm(\"form\"), icon: \"message\" },\n ];\n\n return (\n <div>\n\n <Title>\n Converse com um corretor\n </Title>\n\n <Text>\n Selecione uma opção de contato a seguir:\n </Text>\n\n <SelectorOptionsContainer>\n {itens.map((value) => (\n <button key={value.title} onClick={value.onClick}>\n <SelectorOption >\n <div>\n <h3>{value.title}</h3>\n <p>{value.text}</p>\n </div>\n\n <img\n alt=\"\"\n aria-hidden=\"true\"\n height={26}\n src={iconMap[value.icon]}\n width={26}\n />\n </SelectorOption>\n </button>\n ))}\n\n </SelectorOptionsContainer>\n\n </div>\n )\n}\n\nexport default TalkWithSeller\n","import { useEffect, useState } from \"react\";\n\ntype DeviceType = \"Android\" | \"iPhone\" | \"Unknown\";\n\nexport function useDeviceType(): DeviceType {\n const [deviceType, setDeviceType] = useState<DeviceType>(\"Unknown\");\n\n useEffect(() => {\n const userAgent = navigator.userAgent || navigator.vendor;\n\n if (/android/i.test(userAgent)) {\n setDeviceType(\"Android\");\n } else if (/iPad|iPhone|iPod/.test(userAgent)) {\n setDeviceType(\"iPhone\");\n } else {\n setDeviceType(\"Unknown\");\n }\n }, []);\n\n return deviceType;\n}\n","import { Title, Text, SelectorOptionsContainer, SelectorOption } from \"../styles\";\nimport { useDeviceType } from \"../hooks/useDeviceType\";\n\nimport { iconMap } from \"../../assets/icons\";\n\nconst Client = () => {\n const device = useDeviceType()\n const mobileLink = device === \"Android\" ? \"https://play.google.com/store/apps/details?id=com.mitre.experience&pli=1\" : \"https://apps.apple.com/br/app/mitre-experience/id1543244752\";\n const mobileIcon = device === \"Android\" ? \"google-play-store\" : \"apple-mac\";\n const mobileMessage = device === \"Android\" ? \"Encontre nosso app na Google Play Store\" : \"Encontre nosso app na App Store\";\n\n const items = [\n { title:\"Atendimento ao Cliente Mitre\", text:\"Acesso ao portal do cliente\", icon:\"person\", link:\"https://portal.mitrerealty.com.br/Clientes/\", },\n { title:\"Baixe o Aplicativo Mitre Experience\", text:mobileMessage, icon:mobileIcon, link:mobileLink },\n ];\n\n const mobileItems = [\n { title:\"Baixe o Aplicativo Mitre Experience no Android\", text:\"Encontre nosso app na Google Play Store\", icon:\"google_play_store\", link:\"https://play.google.com/store/apps/details?id=com.mitre.experience&pli=1\" },\n { title:\"Baixe o Aplicativo Mitre Experience no IOS\", text:\"Encontre nosso app na App Store\", icon:\"apple_mac\", link:\"https://apps.apple.com/br/app/mitre-experience/id1543244752\" }\n ];\n\n function isInMobileItemButInDesktop(index:number) {\n const itemIndex = 1;\n return index === itemIndex && device === \"Unknown\";\n }\n\n return (\n <div>\n\n <Title>\n Central de Relacionamento\n </Title>\n\n <Text>\n <>\n Já é cliente Mitre Reality? Precisa falar conosco?\n <br/><br/>\n Acesse o Portal do Cliente para enviar sua solicitação à nossa Central de Relacionamento: \n </>\n </Text>\n\n <SelectorOptionsContainer>\n <>\n { items.map((item, index) => (\n <a \n key={ item.title } \n href={ item.link }\n target=\"_blank\" rel=\"noreferrer\"\n style={isInMobileItemButInDesktop(index) ? { display:\"none\" } : {}}\n >\n <SelectorOption>\n <div>\n <h3>{ item.title }</h3>\n <p>{item.text}</p>\n </div>\n <img\n alt=\"\"\n aria-hidden=\"true\"\n height={ 26 }\n src={iconMap[item.icon]}\n width={ 26 }\n />\n </SelectorOption>\n </a>\n ))}\n\n { device === \"Unknown\" &&\n mobileItems.map((item) => (\n <a \n key={ item.title } \n href={ item.link }\n target=\"_blank\" rel=\"noreferrer\"\n >\n <SelectorOption>\n <div>\n <h3>{ item.title }</h3>\n <p>{item.text}</p>\n </div>\n <img\n alt=\"\"\n aria-hidden=\"true\"\n height={ 26 }\n src={iconMap[item.icon]}\n width={ 26 }\n />\n </SelectorOption>\n </a>\n ))\n }\n\n </>\n </SelectorOptionsContainer>\n\n </div>\n )\n}\n\nexport default Client;\n","import { Title, Text, SelectorOptionsContainer, SelectorOption } from \"../styles\";\n\nimport { iconMap } from \"../../assets/icons\";\n\nconst Other = () => {\n const itens = [\n { title:\"Trabalhe conosco\", text:\"Canal exclusivo para vagas\", icon:\"mala\", link:`https://mitrerealty.gupy.io/` },\n { title:\"Fornecedores\", text:\"Seja um fornecedor da Mitre\", icon:\"shake_hands\", link:`https://www.mitrerealty.com.br/fornecedores` },\n { title:\"Seja um Parceiro Mitre\", text:\"Seja um corretor ou imobiliária parceira da Mitre.\", icon:\"star\", link:`https://www.mitrerealty.com.br/seja-parceiro-mitre` },\n { title:\"Outros assuntos\", text:\"Entre em contato com a Mitre\", icon:\"question_mark_circle\", link:`https://www.mitrerealty.com.br/contato` }\n ];\n\n return (\n <div>\n\n <Title>\n Outros assuntos\n </Title>\n\n <Text>\n Selecione uma das opções a seguir:\n </Text>\n\n <SelectorOptionsContainer>\n { itens.map((item) => (\n <a \n key={ item.title } \n href={ item.link }\n target=\"_blank\" rel=\"noreferrer\"\n >\n <SelectorOption >\n <div>\n <h3>{ item.title }</h3>\n <p>{item.text}</p>\n </div>\n\n <img\n alt=\"\"\n aria-hidden=\"true\"\n height={ 26 }\n src={ iconMap[item.icon] }\n width={ 26 }\n />\n </SelectorOption>\n </a>\n ))}\n </SelectorOptionsContainer>\n\n </div>\n )\n}\n\nexport default Other; "],"mappings":"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","names":["import_react","styled","import_styled_components","styled","import_react","import_styled_components","styled","import_styled_components","styled","import_styled_components","Container","styled","ButtonContainer","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React"]}
|