mitre-form-component 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -909,112 +909,185 @@ var slideIn = keyframes2`
909
909
  to { opacity: 1; transform: translateY(0) scale(1); }
910
910
  `;
911
911
  var Overlay = styled6.div`
912
- position: fixed;
913
- inset: 0;
914
- background: rgba(0, 0, 0, 0.55);
915
- display: flex;
916
- align-items: center;
917
- justify-content: center;
918
- z-index: 9999;
919
- padding: 1rem;
920
- animation: ${fadeIn2} 0.18s ease-out;
912
+ && {
913
+ position: fixed !important;
914
+ inset: 0 !important;
915
+ top: 0 !important;
916
+ right: 0 !important;
917
+ bottom: 0 !important;
918
+ left: 0 !important;
919
+ background: rgba(0, 0, 0, 0.55) !important;
920
+ display: flex !important;
921
+ align-items: center !important;
922
+ justify-content: center !important;
923
+ z-index: 9999 !important;
924
+ padding: 1rem !important;
925
+ margin: 0 !important;
926
+ box-sizing: border-box !important;
927
+ animation: ${fadeIn2} 0.18s ease-out;
928
+ }
921
929
  `;
922
930
  var accentStyles = {
923
931
  success: css5`
924
- color: ${theme.colors.green2};
932
+ color: ${theme.colors.green2} !important;
925
933
  `,
926
934
  error: css5`
927
- color: ${theme.colors.red};
935
+ color: ${theme.colors.red} !important;
928
936
  `
929
937
  };
930
938
  var Container = styled6.div`
931
- position: relative;
932
- background: ${theme.colors.white};
933
- border-radius: 0.75rem;
934
- box-shadow: ${theme.shadows.shadow500};
935
- max-width: 420px;
936
- width: 100%;
937
- padding: 1.75rem 1.5rem 1.25rem;
938
- font-family: ${theme.fonts.primary};
939
- animation: ${slideIn} 0.22s ease-out;
939
+ && {
940
+ position: relative !important;
941
+ background: ${theme.colors.white} !important;
942
+ border: none !important;
943
+ border-radius: 0.75rem !important;
944
+ box-shadow: ${theme.shadows.shadow500} !important;
945
+ max-width: 420px !important;
946
+ width: 100% !important;
947
+ padding: 1.75rem 1.5rem 1.25rem !important;
948
+ margin: 0 !important;
949
+ box-sizing: border-box !important;
950
+ font-family: ${theme.fonts.primary} !important;
951
+ animation: ${slideIn} 0.22s ease-out;
952
+ }
940
953
 
941
- &::before {
942
- content: "";
943
- display: block;
944
- width: 56px;
945
- height: 4px;
946
- border-radius: 999px;
947
- margin: 0 auto 1rem;
948
- background: ${({ $type }) => $type === "success" ? theme.colors.green2 : theme.colors.red};
954
+ &&::before {
955
+ content: "" !important;
956
+ display: block !important;
957
+ width: 56px !important;
958
+ height: 4px !important;
959
+ border-radius: 999px !important;
960
+ margin: 0 auto 1rem !important;
961
+ padding: 0 !important;
962
+ background: ${({ $type }) => $type === "success" ? theme.colors.green2 : theme.colors.red} !important;
949
963
  }
950
964
 
951
- h2 {
952
- margin: 0 0 0.5rem;
953
- font-size: 1.25rem;
954
- font-weight: 700;
955
- text-align: center;
965
+ && h2 {
966
+ margin: 0 0 0.5rem !important;
967
+ padding: 0 !important;
968
+ font-family: ${theme.fonts.primary} !important;
969
+ font-size: 1.25rem !important;
970
+ font-weight: 700 !important;
971
+ line-height: 1.3 !important;
972
+ text-align: center !important;
956
973
  ${({ $type }) => accentStyles[$type]}
957
974
  }
958
975
 
959
- p {
960
- margin: 0 0 1.5rem;
961
- font-size: 0.95rem;
962
- line-height: 1.45;
963
- text-align: center;
964
- color: ${theme.colors.black};
976
+ && p {
977
+ margin: 0 0 1.5rem !important;
978
+ padding: 0 !important;
979
+ font-family: ${theme.fonts.primary} !important;
980
+ font-size: 0.95rem !important;
981
+ font-weight: 400 !important;
982
+ line-height: 1.45 !important;
983
+ text-align: center !important;
984
+ color: ${theme.colors.black} !important;
965
985
  }
966
986
  `;
967
987
  var CloseButton = styled6.button`
968
- position: absolute;
969
- top: 0.5rem;
970
- right: 0.5rem;
971
- background: transparent;
972
- border: none;
973
- cursor: pointer;
974
- color: ${theme.colors.gray550};
975
- padding: 0.25rem;
976
- display: inline-flex;
977
- align-items: center;
978
- justify-content: center;
979
- border-radius: 999px;
980
- transition: background 0.15s, color 0.15s;
988
+ && {
989
+ position: absolute !important;
990
+ top: 0.5rem !important;
991
+ right: 0.5rem !important;
992
+ background: transparent !important;
993
+ border: none !important;
994
+ cursor: pointer !important;
995
+ color: ${theme.colors.gray550} !important;
996
+ padding: 0.25rem !important;
997
+ margin: 0 !important;
998
+ display: inline-flex !important;
999
+ align-items: center !important;
1000
+ justify-content: center !important;
1001
+ border-radius: 999px !important;
1002
+ box-sizing: border-box !important;
1003
+ transition: background 0.15s, color 0.15s;
1004
+ }
981
1005
 
982
- &:hover {
983
- background: ${theme.colors.gray300};
984
- color: ${theme.colors.black};
1006
+ &&:hover {
1007
+ background: ${theme.colors.gray300} !important;
1008
+ color: ${theme.colors.black} !important;
985
1009
  }
986
1010
 
987
- svg {
988
- width: 1.1rem;
989
- height: 1.1rem;
1011
+ && svg {
1012
+ width: 1.1rem !important;
1013
+ height: 1.1rem !important;
990
1014
  }
991
1015
  `;
992
1016
  var PrimaryButton = styled6.button`
993
- display: block;
994
- width: 100%;
995
- padding: 0.75rem 1rem;
996
- border: none;
997
- border-radius: 0.5rem;
998
- background: ${({ $bgColor }) => $bgColor || theme.colors.yellow500};
999
- color: ${({ $textColor }) => $textColor || theme.colors.black};
1000
- font-family: ${theme.fonts.primary};
1001
- font-size: 1rem;
1002
- font-weight: 700;
1003
- cursor: pointer;
1004
- transition: filter 0.15s;
1017
+ && {
1018
+ display: block !important;
1019
+ width: 100% !important;
1020
+ padding: 0.75rem 1rem !important;
1021
+ margin: 0 !important;
1022
+ border: none !important;
1023
+ border-radius: 0.5rem !important;
1024
+ background: ${({ $bgColor }) => $bgColor || theme.colors.yellow500} !important;
1025
+ color: ${({ $textColor }) => $textColor || theme.colors.black} !important;
1026
+ font-family: ${theme.fonts.primary} !important;
1027
+ font-size: 1rem !important;
1028
+ font-weight: 700 !important;
1029
+ line-height: 1.2 !important;
1030
+ text-align: center !important;
1031
+ cursor: pointer !important;
1032
+ box-sizing: border-box !important;
1033
+ transition: filter 0.15s;
1034
+ }
1005
1035
 
1006
- &:hover {
1007
- filter: brightness(0.95);
1036
+ &&:hover {
1037
+ filter: brightness(0.95) !important;
1038
+ }
1039
+
1040
+ &&:focus-visible {
1041
+ outline: 2px solid ${theme.colors.yellow400} !important;
1042
+ outline-offset: 2px !important;
1043
+ }
1044
+ `;
1045
+ var SecondaryText = styled6.p`
1046
+ && {
1047
+ margin: 2.25rem 0 0.75rem !important;
1048
+ padding: 0 !important;
1049
+ font-family: ${theme.fonts.primary} !important;
1050
+ font-size: 0.85rem !important;
1051
+ font-weight: 400 !important;
1052
+ font-style: italic !important;
1053
+ line-height: 1.4 !important;
1054
+ text-align: center !important;
1055
+ color: ${theme.colors.gray550} !important;
1056
+ }
1057
+ `;
1058
+ var SecondaryButton = styled6.button`
1059
+ && {
1060
+ display: block !important;
1061
+ width: 100% !important;
1062
+ padding: 0.65rem 1rem !important;
1063
+ margin: 0 !important;
1064
+ border: 1px solid ${({ $bgColor }) => $bgColor || theme.colors.yellow500} !important;
1065
+ border-radius: 0.5rem !important;
1066
+ background: transparent !important;
1067
+ color: ${({ $bgColor }) => $bgColor || theme.colors.black} !important;
1068
+ font-family: ${theme.fonts.primary} !important;
1069
+ font-size: 0.95rem !important;
1070
+ font-weight: 600 !important;
1071
+ line-height: 1.2 !important;
1072
+ text-align: center !important;
1073
+ cursor: pointer !important;
1074
+ box-sizing: border-box !important;
1075
+ transition: background 0.15s, color 0.15s;
1076
+ }
1077
+
1078
+ &&:hover {
1079
+ background: ${({ $bgColor }) => $bgColor || theme.colors.yellow500} !important;
1080
+ color: ${({ $textColor }) => $textColor || theme.colors.black} !important;
1008
1081
  }
1009
1082
 
1010
- &:focus-visible {
1011
- outline: 2px solid ${theme.colors.yellow400};
1012
- outline-offset: 2px;
1083
+ &&:focus-visible {
1084
+ outline: 2px solid ${theme.colors.yellow400} !important;
1085
+ outline-offset: 2px !important;
1013
1086
  }
1014
1087
  `;
1015
1088
 
1016
1089
  // src/components/Modal/index.tsx
1017
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
1090
+ import { Fragment, jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
1018
1091
  var Modal = ({
1019
1092
  type,
1020
1093
  title,
@@ -1023,7 +1096,10 @@ var Modal = ({
1023
1096
  onPrimaryAction,
1024
1097
  onClose,
1025
1098
  primaryButtonBgColor,
1026
- primaryButtonTextColor
1099
+ primaryButtonTextColor,
1100
+ secondaryText,
1101
+ secondaryButtonText,
1102
+ onSecondaryAction
1027
1103
  }) => {
1028
1104
  const primaryButtonRef = useRef(null);
1029
1105
  useEffect3(() => {
@@ -1043,6 +1119,7 @@ var Modal = ({
1043
1119
  onClose();
1044
1120
  }
1045
1121
  };
1122
+ const hasSecondaryAction = secondaryButtonText !== void 0 && onSecondaryAction !== void 0;
1046
1123
  return /* @__PURE__ */ jsx4(Overlay, { onClick: handleOverlayClick, role: "dialog", "aria-modal": "true", "aria-label": title, children: /* @__PURE__ */ jsxs4(Container, { $type: type, children: [
1047
1124
  /* @__PURE__ */ jsx4(CloseButton, { onClick: onClose, "aria-label": "Fechar", children: /* @__PURE__ */ jsx4(HiX2, {}) }),
1048
1125
  /* @__PURE__ */ jsx4("h2", { children: title }),
@@ -1057,7 +1134,20 @@ var Modal = ({
1057
1134
  type: "button",
1058
1135
  children: primaryButtonText
1059
1136
  }
1060
- )
1137
+ ),
1138
+ hasSecondaryAction && /* @__PURE__ */ jsxs4(Fragment, { children: [
1139
+ secondaryText && /* @__PURE__ */ jsx4(SecondaryText, { children: secondaryText }),
1140
+ /* @__PURE__ */ jsx4(
1141
+ SecondaryButton,
1142
+ {
1143
+ onClick: onSecondaryAction,
1144
+ $bgColor: primaryButtonBgColor,
1145
+ $textColor: primaryButtonTextColor,
1146
+ type: "button",
1147
+ children: secondaryButtonText
1148
+ }
1149
+ )
1150
+ ] })
1061
1151
  ] }) });
1062
1152
  };
1063
1153
 
@@ -1354,19 +1444,19 @@ var ENVIRONMENTS = {
1354
1444
  chatUrl: "https://crm.mitrerealty.com.br/wcc/UserLoginSubmit.do"
1355
1445
  }
1356
1446
  };
1357
- var resolveEnvironment = (ambiente = "homol") => {
1358
- return ENVIRONMENTS[ambiente] ?? null;
1447
+ var resolveEnvironment = (environment = "homol") => {
1448
+ return ENVIRONMENTS[environment] ?? null;
1359
1449
  };
1360
1450
 
1361
1451
  // src/components/Form/index.tsx
1362
- import { Fragment, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
1452
+ import { Fragment as Fragment2, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
1363
1453
  var phoneUtil = PhoneNumberUtil.getInstance();
1364
- var PreferenciaContato = /* @__PURE__ */ ((PreferenciaContato2) => {
1365
- PreferenciaContato2["Whatsapp"] = "Whatsapp";
1366
- PreferenciaContato2["Email"] = "Email";
1367
- PreferenciaContato2["Ligacao"] = "Liga\xE7\xE3o";
1368
- return PreferenciaContato2;
1369
- })(PreferenciaContato || {});
1454
+ var ContactPreference = /* @__PURE__ */ ((ContactPreference2) => {
1455
+ ContactPreference2["Whatsapp"] = "Whatsapp";
1456
+ ContactPreference2["Email"] = "Email";
1457
+ ContactPreference2["Ligacao"] = "Liga\xE7\xE3o";
1458
+ return ContactPreference2;
1459
+ })(ContactPreference || {});
1370
1460
  var WHATSAPP_MESSAGE = "Ol\xE1! Tenho interesse e gostaria de mais informa\xE7\xF5es.";
1371
1461
  var WHATSAPP_TITLE = "Fale com um corretor por WhatsApp";
1372
1462
  var WHATSAPP_SUBTITLE = "Informe seus dados para contato.";
@@ -1378,10 +1468,13 @@ var MODAL_ERROR_TITLE = "N\xE3o foi poss\xEDvel completar seu contato";
1378
1468
  var MODAL_ERROR_MESSAGE = "Por favor, tente novamente em alguns instantes.";
1379
1469
  var MODAL_ERROR_BUTTON_TEXT = "OK";
1380
1470
  var MODAL_SUCCESS_TITLE = "Cadastro realizado!";
1381
- var MODAL_SUCCESS_MESSAGE_WHATSAPP = "Clique abaixo para continuar pelo WhatsApp.";
1471
+ var MODAL_SUCCESS_AUTO_REDIRECT_WHATSAPP = "Voc\xEA est\xE1 sendo redirecionado automaticamente para o WhatsApp.";
1472
+ var MODAL_SUCCESS_AUTO_REDIRECT_CHAT = "Voc\xEA est\xE1 sendo redirecionado automaticamente para iniciar o atendimento via chat.";
1473
+ var MODAL_SUCCESS_OK_BUTTON_TEXT = "OK";
1474
+ var MODAL_SUCCESS_FALLBACK_INSTRUCTION = "Caso n\xE3o tenha sido direcionado automaticamente, clique no bot\xE3o abaixo para abrir a aplica\xE7\xE3o:";
1382
1475
  var MODAL_SUCCESS_BUTTON_WHATSAPP = "Abrir WhatsApp";
1383
- var MODAL_SUCCESS_MESSAGE_CHAT = "Clique abaixo para iniciar o atendimento.";
1384
1476
  var MODAL_SUCCESS_BUTTON_CHAT = "Iniciar atendimento";
1477
+ var REDIRECT_DELAY_MS = 0;
1385
1478
  function buildWhatsappUrl(phone) {
1386
1479
  const digits = phone.replace(/\D/g, "");
1387
1480
  const text = encodeURIComponent(WHATSAPP_MESSAGE);
@@ -1401,6 +1494,46 @@ function submitChatInNewTab(chatUrl, virtualObj) {
1401
1494
  form.submit();
1402
1495
  document.body.removeChild(form);
1403
1496
  }
1497
+ function isTabAlive(tab) {
1498
+ return tab !== null && !tab.closed;
1499
+ }
1500
+ function writeStatusHtmlToTab(tab, phase, channel) {
1501
+ try {
1502
+ const destinationLabel = channel === "whatsapp" ? "WhatsApp" : "atendimento";
1503
+ const isSuccess = phase === "success";
1504
+ const headline = isSuccess ? "Cadastro realizado!" : "Aguarde...";
1505
+ const message = isSuccess ? `Abrindo o ${destinationLabel} em instantes...` : "Estamos registrando seu cadastro...";
1506
+ const headlineColor = isSuccess ? "#2DCE68" : "#535353";
1507
+ const indicator = isSuccess ? '<div class="check" aria-hidden="true"></div>' : '<div class="spinner" aria-hidden="true"></div>';
1508
+ tab.document.open();
1509
+ tab.document.write(
1510
+ `<!DOCTYPE html><html lang="pt-br"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>${headline}</title><style>html,body{margin:0;padding:0;height:100%;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;background:#FFF;color:#2F2F2F;}body{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:1rem;}.box{text-align:center;max-width:360px;}.logo{width:140px;max-width:60%;height:auto;margin:0 auto 1.5rem;display:block;}.spinner{width:40px;height:40px;margin:0 auto 1.25rem;border:4px solid #EBEBEB;border-top-color:#2DCE68;border-radius:50%;animation:spin .9s linear infinite;}.check{width:52px;height:52px;margin:0 auto 1.25rem;border-radius:50%;background:#2DCE68;position:relative;animation:pop .25s ease-out;}.check::after{content:"";position:absolute;top:14px;left:19px;width:10px;height:20px;border:solid #FFF;border-width:0 4px 4px 0;transform:rotate(45deg);}.headline{font-size:1.35rem;font-weight:700;color:${headlineColor};margin:0 0 0.5rem;}.msg{font-size:.95rem;line-height:1.4;color:#535353;margin:0;}@keyframes spin{to{transform:rotate(360deg);}}@keyframes pop{from{transform:scale(0.6);opacity:0;}to{transform:scale(1);opacity:1;}}</style></head><body><div class="box"><img class="logo" src="https://portal.mitrerealty.com.br/Clientes/assets/images/mitre.svg" alt="Mitre Realty" onerror="this.style.display='none'"/>` + indicator + `<div class="headline">${headline}</div><div class="msg">${message}</div></div></body></html>`
1511
+ );
1512
+ tab.document.close();
1513
+ } catch {
1514
+ }
1515
+ }
1516
+ function escapeHtmlAttr(value) {
1517
+ return value.replace(/&/g, "&amp;").replace(/'/g, "&#39;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
1518
+ }
1519
+ function navigateTabToWhatsapp(tab, targetUrl) {
1520
+ try {
1521
+ tab.location.href = targetUrl;
1522
+ } catch {
1523
+ }
1524
+ }
1525
+ function submitChatInPreOpenedTab(tab, chatUrl, virtualObj) {
1526
+ try {
1527
+ const escapedJson = escapeHtmlAttr(JSON.stringify(virtualObj));
1528
+ const escapedUrl = escapeHtmlAttr(chatUrl);
1529
+ tab.document.open();
1530
+ tab.document.write(
1531
+ `<!DOCTYPE html><html><head><meta charset="utf-8"/><title>Abrindo atendimento...</title></head><body><form id="f" method="POST" action="${escapedUrl}"><input type="hidden" name="virtual_obj" value="${escapedJson}"/></form><script>document.getElementById('f').submit();</script></body></html>`
1532
+ );
1533
+ tab.document.close();
1534
+ } catch {
1535
+ }
1536
+ }
1404
1537
  var isPhoneValid = (phone) => {
1405
1538
  try {
1406
1539
  return phoneUtil.isValidNumber(phoneUtil.parseAndKeepRawInput(phone));
@@ -1432,8 +1565,8 @@ var schemaWithProduct = yup.object().shape({
1432
1565
  var schema = yup.object().shape(baseSchema);
1433
1566
  var MitreFormComponent = React2.forwardRef(({
1434
1567
  products,
1435
- ambiente = "homol",
1436
- canal = "form",
1568
+ environment = "homol",
1569
+ channel = "form",
1437
1570
  showHeader = true,
1438
1571
  title = "Atendimento por mensagem",
1439
1572
  subtitle = "Informe seus dados e retornaremos a mensagem.",
@@ -1447,7 +1580,7 @@ var MitreFormComponent = React2.forwardRef(({
1447
1580
  inputFocusBorderColor = theme.colors.yellow500,
1448
1581
  inputPlaceholderColor = theme.colors.gray100,
1449
1582
  inputTextColor = theme.colors.black,
1450
- showPreferenciaContato = false,
1583
+ showContactPreference = false,
1451
1584
  idProdutoTerceiro,
1452
1585
  idEmpreendimento,
1453
1586
  naoCriarEvento,
@@ -1485,53 +1618,53 @@ var MitreFormComponent = React2.forwardRef(({
1485
1618
  }
1486
1619
  return null;
1487
1620
  };
1488
- const env = resolveEnvironment(ambiente);
1489
- const validateAmbienteConfig = () => {
1621
+ const env = resolveEnvironment(environment);
1622
+ const validateEnvironmentConfig = () => {
1490
1623
  if (!env) {
1491
- return `ambiente='${ambiente}' n\xE3o \xE9 reconhecido. Use 'homol' ou 'prod'.`;
1624
+ return `environment='${environment}' n\xE3o \xE9 reconhecido. Use 'homol' ou 'prod'.`;
1492
1625
  }
1493
1626
  if (!env.apiUrl || !env.apiToken) {
1494
- return `Configura\xE7\xE3o interna do ambiente '${ambiente}' est\xE1 incompleta (apiUrl/apiToken).`;
1627
+ return `Configura\xE7\xE3o interna do environment '${environment}' est\xE1 incompleta (apiUrl/apiToken).`;
1495
1628
  }
1496
1629
  return null;
1497
1630
  };
1498
1631
  const validateWhatsappConfig = () => {
1499
- if (canal !== "whatsapp") return null;
1632
+ if (channel !== "whatsapp") return null;
1500
1633
  if (!env) return null;
1501
1634
  const raw = env.whatsappPhone?.trim() ?? "";
1502
1635
  if (!raw) {
1503
- return `canal='whatsapp' exige whatsappPhone no ambiente '${ambiente}'.`;
1636
+ return `channel='whatsapp' exige whatsappPhone no environment '${environment}'.`;
1504
1637
  }
1505
1638
  const normalized = raw.startsWith("+") ? raw : `+${raw}`;
1506
1639
  if (!isPhoneValid(normalized)) {
1507
- return `whatsappPhone do ambiente '${ambiente}' \xE9 inv\xE1lido (${JSON.stringify(env.whatsappPhone)}).`;
1640
+ return `whatsappPhone do environment '${environment}' \xE9 inv\xE1lido (${JSON.stringify(env.whatsappPhone)}).`;
1508
1641
  }
1509
1642
  return null;
1510
1643
  };
1511
1644
  const validateChatConfig = () => {
1512
- if (canal !== "chat") return null;
1645
+ if (channel !== "chat") return null;
1513
1646
  if (!env) return null;
1514
1647
  const raw = env.chatUrl?.trim() ?? "";
1515
1648
  if (!raw) {
1516
- return `canal='chat' exige chatUrl no ambiente '${ambiente}'.`;
1649
+ return `channel='chat' exige chatUrl no environment '${environment}'.`;
1517
1650
  }
1518
1651
  try {
1519
1652
  const parsed = new URL(raw);
1520
1653
  if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
1521
- return `chatUrl do ambiente '${ambiente}' precisa ter protocolo http(s) (recebido: ${JSON.stringify(env.chatUrl)}).`;
1654
+ return `chatUrl do environment '${environment}' precisa ter protocolo http(s) (recebido: ${JSON.stringify(env.chatUrl)}).`;
1522
1655
  }
1523
1656
  } catch {
1524
- return `chatUrl do ambiente '${ambiente}' n\xE3o \xE9 URL absoluta v\xE1lida (recebido: ${JSON.stringify(env.chatUrl)}).`;
1657
+ return `chatUrl do environment '${environment}' n\xE3o \xE9 URL absoluta v\xE1lida (recebido: ${JSON.stringify(env.chatUrl)}).`;
1525
1658
  }
1526
1659
  return null;
1527
1660
  };
1528
1661
  const productsValidationError = validateProducts();
1529
- const ambienteConfigError = validateAmbienteConfig();
1662
+ const environmentConfigError = validateEnvironmentConfig();
1530
1663
  const whatsappConfigError = validateWhatsappConfig();
1531
1664
  const chatConfigError = validateChatConfig();
1532
- const effectiveShowPreferenciaContato = canal === "whatsapp" || canal === "chat" ? false : showPreferenciaContato;
1533
- const effectiveTitle = canal === "whatsapp" ? WHATSAPP_TITLE : canal === "chat" ? CHAT_TITLE : title;
1534
- const effectiveSubtitle = canal === "whatsapp" ? WHATSAPP_SUBTITLE : canal === "chat" ? CHAT_SUBTITLE : subtitle;
1665
+ const effectiveShowContactPreference = channel === "whatsapp" || channel === "chat" ? false : showContactPreference;
1666
+ const effectiveTitle = channel === "whatsapp" ? WHATSAPP_TITLE : channel === "chat" ? CHAT_TITLE : title;
1667
+ const effectiveSubtitle = channel === "whatsapp" ? WHATSAPP_SUBTITLE : channel === "chat" ? CHAT_SUBTITLE : subtitle;
1535
1668
  const [utm, setUtm] = useState3({ utm_source: "direto", createdAt: (/* @__PURE__ */ new Date()).toISOString() });
1536
1669
  const formSchema = products && products.length > 1 ? schemaWithProduct : schema;
1537
1670
  const { control, register, handleSubmit, formState: { errors }, reset, clearErrors } = useForm({
@@ -1571,10 +1704,11 @@ var MitreFormComponent = React2.forwardRef(({
1571
1704
  const phoneDigitsOnly = phoneValue?.replace(/\D/g, "") || "";
1572
1705
  const message = "Gostaria de mais informa\xE7\xF5es sobre o produto";
1573
1706
  setActionModal(null);
1707
+ let preOpenedTab = null;
1574
1708
  try {
1575
1709
  setIsLoading(true);
1576
1710
  if (!env) {
1577
- throw new Error("Ambiente n\xE3o resolvido");
1711
+ throw new Error("Environment n\xE3o resolvido");
1578
1712
  }
1579
1713
  if (!products || products.length === 0) {
1580
1714
  throw new Error("Par\xE2metros obrigat\xF3rios n\xE3o informados");
@@ -1593,7 +1727,7 @@ var MitreFormComponent = React2.forwardRef(({
1593
1727
  selectedProduct = foundProduct;
1594
1728
  }
1595
1729
  const paginaAtual = typeof window !== "undefined" ? window.location.href : void 0;
1596
- const naoCriarEventoEfetivo = canal !== "form" && (naoCriarEvento ?? true);
1730
+ const naoCriarEventoEfetivo = channel !== "form" && (naoCriarEvento ?? true);
1597
1731
  const requestBody = {
1598
1732
  name,
1599
1733
  email,
@@ -1604,9 +1738,9 @@ var MitreFormComponent = React2.forwardRef(({
1604
1738
  utm_campaign: utm.utm_campaign,
1605
1739
  utm_medium: utm.utm_medium,
1606
1740
  utm_term: utm.utm_term,
1607
- ...canal === "whatsapp" ? { preferencia_contato: "Whatsapp" /* Whatsapp */ } : effectiveShowPreferenciaContato && preferencia_contato ? { preferencia_contato } : {},
1608
- ...canal !== "form" ? {
1609
- canal,
1741
+ ...channel === "whatsapp" ? { preferencia_contato: "Whatsapp" /* Whatsapp */ } : effectiveShowContactPreference && preferencia_contato ? { preferencia_contato } : {},
1742
+ ...channel !== "form" ? {
1743
+ channel,
1610
1744
  ...paginaAtual ? { pagina: paginaAtual } : {},
1611
1745
  // Paridade com atendimento.html legado: o mesmo <form id="chat-form">
1612
1746
  // era usado para chat e whatsapp, portanto is_chat=true ia em ambos.
@@ -1616,6 +1750,12 @@ var MitreFormComponent = React2.forwardRef(({
1616
1750
  ...naoCriarEventoEfetivo ? { naoCriarEvento: true } : {}
1617
1751
  } : {}
1618
1752
  };
1753
+ if (channel !== "form" && typeof window !== "undefined") {
1754
+ preOpenedTab = window.open("about:blank", "_blank");
1755
+ if (isTabAlive(preOpenedTab)) {
1756
+ writeStatusHtmlToTab(preOpenedTab, "processing", channel);
1757
+ }
1758
+ }
1619
1759
  const response = await fetch(`${env.apiUrl}/leads`, {
1620
1760
  method: "POST",
1621
1761
  headers: {
@@ -1631,13 +1771,23 @@ var MitreFormComponent = React2.forwardRef(({
1631
1771
  const leadId = responseData.leadId || responseData.id || "";
1632
1772
  resetForm();
1633
1773
  onSuccess?.(requestBody, leadId);
1634
- if (canal === "whatsapp") {
1774
+ if (channel === "whatsapp") {
1775
+ const targetUrl = buildWhatsappUrl(env.whatsappPhone);
1635
1776
  setActionModal({
1636
1777
  kind: "success",
1637
- canal: "whatsapp",
1638
- targetUrl: buildWhatsappUrl(env.whatsappPhone)
1778
+ channel: "whatsapp",
1779
+ targetUrl
1639
1780
  });
1640
- } else if (canal === "chat") {
1781
+ if (isTabAlive(preOpenedTab)) {
1782
+ writeStatusHtmlToTab(preOpenedTab, "success", "whatsapp");
1783
+ const tabToNavigate = preOpenedTab;
1784
+ setTimeout(() => {
1785
+ if (isTabAlive(tabToNavigate)) {
1786
+ navigateTabToWhatsapp(tabToNavigate, targetUrl);
1787
+ }
1788
+ }, REDIRECT_DELAY_MS);
1789
+ }
1790
+ } else if (channel === "chat") {
1641
1791
  const virtualObj = {
1642
1792
  ...requestBody,
1643
1793
  externalOriginId: leadId,
@@ -1648,16 +1798,29 @@ var MitreFormComponent = React2.forwardRef(({
1648
1798
  };
1649
1799
  setActionModal({
1650
1800
  kind: "success",
1651
- canal: "chat",
1801
+ channel: "chat",
1652
1802
  chatUrl: env.chatUrl,
1653
1803
  virtualObj
1654
1804
  });
1805
+ if (isTabAlive(preOpenedTab)) {
1806
+ writeStatusHtmlToTab(preOpenedTab, "success", "chat");
1807
+ const tabToSubmit = preOpenedTab;
1808
+ const chatUrlSnapshot = env.chatUrl;
1809
+ setTimeout(() => {
1810
+ if (isTabAlive(tabToSubmit)) {
1811
+ submitChatInPreOpenedTab(tabToSubmit, chatUrlSnapshot, virtualObj);
1812
+ }
1813
+ }, REDIRECT_DELAY_MS);
1814
+ }
1655
1815
  } else {
1656
1816
  setSuccessMessage("Mensagem enviada com sucesso!");
1657
1817
  }
1658
1818
  } catch (err) {
1819
+ if (isTabAlive(preOpenedTab)) {
1820
+ preOpenedTab.close();
1821
+ }
1659
1822
  const error2 = err instanceof Error ? err : new Error("Erro desconhecido");
1660
- if (canal === "whatsapp" || canal === "chat") {
1823
+ if (channel === "whatsapp" || channel === "chat") {
1661
1824
  setActionModal({ kind: "error" });
1662
1825
  } else {
1663
1826
  handleError(err);
@@ -1667,25 +1830,25 @@ var MitreFormComponent = React2.forwardRef(({
1667
1830
  setIsLoading(false);
1668
1831
  }
1669
1832
  };
1670
- if (productsValidationError || ambienteConfigError || whatsappConfigError || chatConfigError) {
1833
+ if (productsValidationError || environmentConfigError || whatsappConfigError || chatConfigError) {
1671
1834
  if (productsValidationError) {
1672
1835
  console.error("Erro na valida\xE7\xE3o dos produtos:", productsValidationError);
1673
1836
  }
1674
- if (ambienteConfigError) {
1675
- console.error("Erro na valida\xE7\xE3o do ambiente:", ambienteConfigError);
1837
+ if (environmentConfigError) {
1838
+ console.error("Erro na valida\xE7\xE3o do environment:", environmentConfigError);
1676
1839
  }
1677
1840
  if (whatsappConfigError) {
1678
- console.error("Erro na valida\xE7\xE3o do canal whatsapp:", whatsappConfigError);
1841
+ console.error("Erro na valida\xE7\xE3o do channel whatsapp:", whatsappConfigError);
1679
1842
  }
1680
1843
  if (chatConfigError) {
1681
- console.error("Erro na valida\xE7\xE3o do canal chat:", chatConfigError);
1844
+ console.error("Erro na valida\xE7\xE3o do channel chat:", chatConfigError);
1682
1845
  }
1683
1846
  return /* @__PURE__ */ jsx7(FormContainer, { $backgroundColor: backgroundColor, $innerPadding: innerPadding, ref, children: /* @__PURE__ */ jsxs7(HeaderContainer, { children: [
1684
1847
  /* @__PURE__ */ jsx7(Title, { $textColor: textColor, children: "Erro no carregamento do formul\xE1rio!" }),
1685
1848
  /* @__PURE__ */ jsx7(Subtitle, { $textColor: textColor, children: "N\xE3o foi poss\xEDvel carregar o formul\xE1rio. Tente novamente mais tarde." })
1686
1849
  ] }) });
1687
1850
  }
1688
- return /* @__PURE__ */ jsxs7(Fragment, { children: [
1851
+ return /* @__PURE__ */ jsxs7(Fragment2, { children: [
1689
1852
  error && /* @__PURE__ */ jsx7(
1690
1853
  Alert,
1691
1854
  {
@@ -1719,36 +1882,42 @@ var MitreFormComponent = React2.forwardRef(({
1719
1882
  primaryButtonTextColor: buttonTextColor
1720
1883
  }
1721
1884
  ),
1722
- actionModal?.kind === "success" && actionModal.canal === "whatsapp" && /* @__PURE__ */ jsx7(
1885
+ actionModal?.kind === "success" && actionModal.channel === "whatsapp" && /* @__PURE__ */ jsx7(
1723
1886
  Modal,
1724
1887
  {
1725
1888
  type: "success",
1726
1889
  title: MODAL_SUCCESS_TITLE,
1727
- message: MODAL_SUCCESS_MESSAGE_WHATSAPP,
1728
- primaryButtonText: MODAL_SUCCESS_BUTTON_WHATSAPP,
1729
- onPrimaryAction: () => {
1730
- window.open(actionModal.targetUrl, "_blank", "noopener,noreferrer");
1731
- setActionModal(null);
1732
- },
1890
+ message: MODAL_SUCCESS_AUTO_REDIRECT_WHATSAPP,
1891
+ primaryButtonText: MODAL_SUCCESS_OK_BUTTON_TEXT,
1892
+ onPrimaryAction: () => setActionModal(null),
1733
1893
  onClose: () => setActionModal(null),
1734
1894
  primaryButtonBgColor: buttonBackgroundColor,
1735
- primaryButtonTextColor: buttonTextColor
1895
+ primaryButtonTextColor: buttonTextColor,
1896
+ secondaryText: MODAL_SUCCESS_FALLBACK_INSTRUCTION,
1897
+ secondaryButtonText: MODAL_SUCCESS_BUTTON_WHATSAPP,
1898
+ onSecondaryAction: () => {
1899
+ window.open(actionModal.targetUrl, "_blank", "noopener,noreferrer");
1900
+ setActionModal(null);
1901
+ }
1736
1902
  }
1737
1903
  ),
1738
- actionModal?.kind === "success" && actionModal.canal === "chat" && /* @__PURE__ */ jsx7(
1904
+ actionModal?.kind === "success" && actionModal.channel === "chat" && /* @__PURE__ */ jsx7(
1739
1905
  Modal,
1740
1906
  {
1741
1907
  type: "success",
1742
1908
  title: MODAL_SUCCESS_TITLE,
1743
- message: MODAL_SUCCESS_MESSAGE_CHAT,
1744
- primaryButtonText: MODAL_SUCCESS_BUTTON_CHAT,
1745
- onPrimaryAction: () => {
1746
- submitChatInNewTab(actionModal.chatUrl, actionModal.virtualObj);
1747
- setActionModal(null);
1748
- },
1909
+ message: MODAL_SUCCESS_AUTO_REDIRECT_CHAT,
1910
+ primaryButtonText: MODAL_SUCCESS_OK_BUTTON_TEXT,
1911
+ onPrimaryAction: () => setActionModal(null),
1749
1912
  onClose: () => setActionModal(null),
1750
1913
  primaryButtonBgColor: buttonBackgroundColor,
1751
- primaryButtonTextColor: buttonTextColor
1914
+ primaryButtonTextColor: buttonTextColor,
1915
+ secondaryText: MODAL_SUCCESS_FALLBACK_INSTRUCTION,
1916
+ secondaryButtonText: MODAL_SUCCESS_BUTTON_CHAT,
1917
+ onSecondaryAction: () => {
1918
+ submitChatInNewTab(actionModal.chatUrl, actionModal.virtualObj);
1919
+ setActionModal(null);
1920
+ }
1752
1921
  }
1753
1922
  ),
1754
1923
  /* @__PURE__ */ jsxs7(FormContainer, { $backgroundColor: backgroundColor, $innerPadding: innerPadding, ref, children: [
@@ -1843,7 +2012,7 @@ var MitreFormComponent = React2.forwardRef(({
1843
2012
  },
1844
2013
  formKey
1845
2014
  ),
1846
- effectiveShowPreferenciaContato && /* @__PURE__ */ jsxs7(FormControl, { isInvalid: !!errors.preferencia_contato, children: [
2015
+ effectiveShowContactPreference && /* @__PURE__ */ jsxs7(FormControl, { isInvalid: !!errors.preferencia_contato, children: [
1847
2016
  /* @__PURE__ */ jsx7(FormLabel, { htmlFor: "preferencia_contato", $textColor: textColor, children: "Prefer\xEAncia de Contato" }),
1848
2017
  /* @__PURE__ */ jsxs7(
1849
2018
  Select,
@@ -1857,14 +2026,14 @@ var MitreFormComponent = React2.forwardRef(({
1857
2026
  $textColor: inputTextColor,
1858
2027
  children: [
1859
2028
  /* @__PURE__ */ jsx7("option", { value: "", disabled: true, children: "Selecione uma op\xE7\xE3o" }),
1860
- Object.values(PreferenciaContato).map((op) => /* @__PURE__ */ jsx7("option", { value: op, children: op }, op))
2029
+ Object.values(ContactPreference).map((op) => /* @__PURE__ */ jsx7("option", { value: op, children: op }, op))
1861
2030
  ]
1862
2031
  }
1863
2032
  ),
1864
2033
  errors.preferencia_contato && /* @__PURE__ */ jsx7(FormErrorMessage, { children: errors.preferencia_contato.message })
1865
2034
  ] }),
1866
2035
  /* @__PURE__ */ jsx7("h6", { children: "* Campos de preenchimento obrigat\xF3rio." }),
1867
- /* @__PURE__ */ jsx7(ButtonContainer, { children: /* @__PURE__ */ jsx7(Button2, { bgColor: buttonBackgroundColor, color: buttonTextColor, type: "submit", isSubmitting: loading, children: canal === "whatsapp" ? WHATSAPP_BUTTON_TEXT : canal === "chat" ? CHAT_BUTTON_TEXT : "Enviar mensagem" }) }),
2036
+ /* @__PURE__ */ jsx7(ButtonContainer, { children: /* @__PURE__ */ jsx7(Button2, { bgColor: buttonBackgroundColor, color: buttonTextColor, type: "submit", isSubmitting: loading, children: channel === "whatsapp" ? WHATSAPP_BUTTON_TEXT : channel === "chat" ? CHAT_BUTTON_TEXT : "Enviar mensagem" }) }),
1868
2037
  /* @__PURE__ */ jsxs7("p", { children: [
1869
2038
  "A Mitre Realty respeita a sua privacidade e utiliza os seus dados pessoais para contat\xE1-lo por e-mail ou telefone aqui registrados. Para saber mais, acesse a nossa",
1870
2039
  " ",
@@ -1890,7 +2059,7 @@ var MitreFormComponent = React2.forwardRef(({
1890
2059
  MitreFormComponent.displayName = "MitreFormComponent";
1891
2060
  var Form_default = MitreFormComponent;
1892
2061
  export {
1893
- Form_default as MitreFormComponent,
1894
- PreferenciaContato
2062
+ ContactPreference,
2063
+ Form_default as MitreFormComponent
1895
2064
  };
1896
2065
  //# sourceMappingURL=index.js.map