mitre-actions-widget 0.1.0 → 0.1.2
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.cjs +35 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +35 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -147,7 +147,7 @@ var ComponentWrapper = import_styled_components2.default.div`
|
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
h1, h2, h3, h4, h5, h6, strong {
|
|
150
|
-
font-weight:
|
|
150
|
+
font-weight: 700;
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
button {
|
|
@@ -264,6 +264,40 @@ var FormContainer = import_styled_components3.default.div`
|
|
|
264
264
|
overflow-y: auto;
|
|
265
265
|
height: 100%;
|
|
266
266
|
|
|
267
|
+
/* Restaurar padding para elementos do phone input que foram resetados */
|
|
268
|
+
.react-international-phone-country-selector-button {
|
|
269
|
+
padding: 0 0.5rem !important;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.react-international-phone-country-selector-button__button-content {
|
|
273
|
+
padding: 0.25rem !important;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.react-international-phone-country-selector-button__flag-emoji {
|
|
277
|
+
padding: 0 0.25rem !important;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/* Restaurar padding para os itens da lista de países no dropdown */
|
|
281
|
+
.react-international-phone-country-selector-dropdown {
|
|
282
|
+
padding: 0.25rem 0 !important;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.react-international-phone-country-selector-dropdown__list-item {
|
|
286
|
+
padding: 0.25rem 1rem !important;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.react-international-phone-country-selector-dropdown__list-item-flag-emoji {
|
|
290
|
+
padding: 0 0.5rem 0 0 !important;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
.react-international-phone-country-selector-dropdown__list-item-country-name {
|
|
294
|
+
padding: 0 0.5rem !important;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
.react-international-phone-country-selector-dropdown__list-item-dial-code {
|
|
298
|
+
padding: 0 0 0 0.5rem !important;
|
|
299
|
+
}
|
|
300
|
+
|
|
267
301
|
/* Hide scrollbars for WebKit browsers */
|
|
268
302
|
::-webkit-scrollbar {
|
|
269
303
|
display: none;
|
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\";\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}\n\nconst MitreActionsWidget = React.forwardRef<HTMLDivElement, MitreActionsWidgetProps>(({\n products,\n apiUrl,\n apiToken,\n backgroundColor\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()} />}\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: 600;\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 } 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}\n\nconst Selector = ({\n products,\n apiUrl,\n apiToken,\n close\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 />\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 /* Optional: Add padding to prevent content from touching edges */\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 /* 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/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\";\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}\n\nconst MitreActionsWidget = React.forwardRef<HTMLDivElement, MitreActionsWidgetProps>(({\n products,\n apiUrl,\n apiToken,\n backgroundColor\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()} />}\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 } 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}\n\nconst Selector = ({\n products,\n apiUrl,\n apiToken,\n close\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 />\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 /* Optional: Add padding to prevent content from touching edges */\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 /* 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,gBAA2C;;;ACKpC,SAAS,KACd,YAA2B,OAC3B,YACA,gBACA;AACA,SAAO;AAAA,kBACS,cAAc,IAAI;AAAA;AAAA,qBAEf,SAAS;AAAA,sBACR,kBAAkB,IAAI;AAAA;AAE5C;AAaO,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWnB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAatB,IAAM,cAAc;AAAA,EACzB,QAAQ;AACV;;;ACtDA,+BAAmB;;;ACDZ,IAAM,SAAS;AAAA,EACpB,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY;AAAA,EAEZ,WAAW;AAAA,EACX,WAAW;AAAA,EAEX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EAET,OAAO;AAAA,EACP,QAAQ;AACV;;;ADxBO,IAAM,YAAY,yBAAAC,QAAO;AAAA,IAC5B,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAOK,YAAY,MAAM;AAAA;AAAA;AAAA;AAAA;AAWlC,IAAM,kBAAkB,yBAAAA,QAAO;AAAA,IAClC,UAAU;AAAA,IACV,KAAK,OAAO,UAAU,QAAQ,CAAC;AAAA;AAAA,sBAEb,CAAC,UAAW,MAAM,kBAAkB,KAAK,IAAI,MAAM,mBAAmB,OAAO,MAAO;AAAA;AAAA;AAAA;AAAA,oBAItF,CAAC,UAAW,MAAM,OAAO,SAAS,EAAG;AAAA;;;AE/BzD,IAAAC,4BAAmB;AAGZ,IAAM,mBAAmB,0BAAAC,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAkCrB,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMR,OAAO,MAAM;AAAA;AAAA;;;ACtC9B,IAAM,uBAAuB,MAAY;AAE9C,MAAI,SAAS,cAAc,0BAA0B,GAAG;AACtD;AAAA,EACF;AAEA,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,OAAO;AACZ,OAAK,MAAM;AACX,WAAS,KAAK,YAAY,IAAI;AAChC;;;ACfA,IAAAC,gBAAiC;;;ACAjC,mBAA0B;AAE1B,SAAS,gBACP,KACA,6BACA,cAAwB,CAAC,GACzB;AACA,8BAAU,MAAM;AACd,aAAS,mBAAmB,OAAmB;AAE7C,UAAI,CAAC,IAAI,QAAS;AAElB,YAAM,iBAAiB,CAAC,IAAI,QAAQ,SAAS,MAAM,MAAc;AAGjE,YAAM,4BAA4B,YAAY,KAAK,CAAC,OAAO;AACzD,YAAI,UAAU,MAAM;AACpB,eAAO,SAAS;AACd,cAAI,QAAQ,OAAO,IAAI;AACrB,mBAAO;AAAA,UACT;AACA,oBAAU,QAAQ;AAAA,QACpB;AACA,eAAO;AAAA,MACT,CAAC;AAGD,UAAI,kBAAkB,CAAC,2BAA2B;AAChD,oCAA4B,KAAK;AAAA,MACnC;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,kBAAkB;AAAA,IAC9D;AAAA,EACF,GAAG,CAAC,KAAK,6BAA6B,WAAW,CAAC;AACpD;AAEA,IAAO,0BAAQ;;;ACtCf,IAAAC,4BAAmB;AAGZ,IAAM,kBAAkB,0BAAAC,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAchC,aAAa;AAAA,aACN,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA,MAIrB,aAAa;AAAA;AAAA;AAIZ,IAAM,mBAAmB,0BAAAA,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBhC,IAAM,gBAAgB,0BAAAA,QAAO;AAAA,IAChC,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgDX,IAAM,oBAAoB,0BAAAA,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAOxB,OAAO,OAAO;AAAA;AAAA;AAAA,uBAGP,YAAY,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBlC,IAAM,kBAAkB,0BAAAA,QAAO;AAAA;AAAA;AAAA;AAK/B,IAAM,qBAAqB,0BAAAA,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAQzB,OAAO,KAAK;AAAA;AAAA;AAAA;AAKrB,IAAM,YAAY,0BAAAA,QAAO;AAAA,WACrB,OAAO,GAAG;AAAA;AAAA;AAAA;;;AF9HrB,gBAA6D;;;AGd7D,IAAAC,4BAAmB;AAGZ,IAAM,eAAe,0BAAAC,QAAO;AAAA,IAC/B,KAAK,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQT,KAAK,UAAU,QAAQ,CAAC;AAAA,MACxB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAWC,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACZ7B,IAAM,UAAkC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACHQ;AAZR,IAAM,SAAS,CAAC,EAAE,gBAAgB,YAAY,MAAY;AAExD,QAAM,QAAQ;AAAA,IACZ,EAAE,MAAK,4BAA4B,MAAK,kBAAkB;AAAA,IAC1D,EAAE,MAAK,0BAA0B,MAAK,SAAS;AAAA,IAC/C,EAAE,MAAK,mBAAmB,MAAK,uBAAuB;AAAA,EACxD;AAEA,SACE,4CAAC,gBAEG,gBAAM,IAAI,CAAC,KAAK,UAChB;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,UAAU,cAAc,WAAW;AAAA,MAE9C,SAAU,MAAM,eAAe,KAAK;AAAA,MAEpC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAM,IAAI;AAAA,YACV,QAAS;AAAA,YACT,KAAK,QAAQ,IAAI,IAAK;AAAA,YACtB,OAAQ;AAAA;AAAA,QACV;AAAA,QACE,IAAI;AAAA;AAAA;AAAA,IATA,IAAI;AAAA,EAUZ,CACD,GAEH;AAEJ;AAEA,IAAO,iBAAQ;;;AC1Cf,IAAAC,gBAA8C;;;ACQ5C,IAAM,kBAAkB;AACxB,IAAM,WAAW;AAEV,IAAM,YAAY,MACvB,OAAO,WAAW,eAAe,OAAO,aAAa;AAEvD,IAAM,WAAW,CAAC,SAAiB,OAAO,KAAK,KAAK,KAAK;AAElD,SAAS,cAAc,aAAa,UAAkD;AAC3F,MAAI,CAAC,UAAU,EAAG,QAAO,EAAE,MAAM,MAAM,SAAS,MAAM;AACtD,MAAI;AACF,UAAM,MAAM,OAAO,aAAa,QAAQ,eAAe;AACvD,QAAI,CAAC,IAAK,QAAO,EAAE,MAAM,MAAM,SAAS,MAAM;AAC9C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,QAAQ,UAAW,QAAO,EAAE,MAAM,MAAM,SAAS,MAAM;AAC5D,UAAM,MAAM,KAAK,IAAI,IAAI,IAAI,KAAK,OAAO,SAAS,EAAE,QAAQ;AAC5D,UAAM,UAAU,OAAO,SAAS,UAAU;AAC1C,WAAO,EAAE,MAAM,UAAU,SAAS,MAAM,QAAQ;AAAA,EAClD,QAAQ;AACN,WAAO,EAAE,MAAM,MAAM,SAAS,MAAM;AAAA,EACtC;AACF;AAEO,SAAS,QAAQ,MAAoB,MAAM,oBAAI,KAAK,GAAe;AACxE,MAAI,CAAC,UAAU,EAAG,QAAO;AACzB,QAAM,UAAe;AAAA,IACnB,YAAY,KAAK,cAAc;AAAA,IAC/B,cAAc,KAAK;AAAA,IACnB,YAAY,KAAK;AAAA,IACjB,UAAU,KAAK;AAAA,IACf,WAAW,IAAI,YAAY;AAAA,EAC7B;AACA,MAAI;AACF,WAAO,aAAa,QAAQ,iBAAiB,KAAK,UAAU,OAAO,CAAC;AAAA,EACtE,QAAQ;AAAA,EAA4B;AACpC,SAAO;AACT;AAEO,SAAS,YAAY,KAA8B;AACxD,MAAI,CAAC,UAAU,EAAG,QAAO,CAAC;AAC1B,QAAM,cAAc,OAAO,OAAO;AAClC,QAAM,KAAK,IAAI,IAAI,YAAY,IAAI,EAAE;AACrC,QAAM,aAAa,GAAG,IAAI,YAAY,KAAK;AAC3C,QAAM,eAAe,GAAG,IAAI,cAAc,KAAK;AAC/C,QAAM,aAAa,GAAG,IAAI,YAAY,KAAK;AAC3C,QAAM,WAAW,GAAG,IAAI,UAAU,KAAK;AACvC,SAAO,EAAE,YAAY,cAAc,YAAY,SAAS;AAC1D;AAEO,SAAS,wBAAwB,KAAkC;AACxE,MAAI,CAAC,UAAU,EAAG,QAAO;AACzB,QAAM,QAAQ,OAAO,SAAS,YAAY,IAAI,YAAY;AAC1D,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,YAAY,KAAK,MAAM,oBAAoB;AACjD,QAAM,OAAO,YAAY,CAAC,KAAK;AAC/B,MAAI,WAAW,KAAK,IAAI,KAAK,UAAU,KAAK,IAAI,KAAK,YAAY,KAAK,IAAI,EAAG,QAAO;AAEpF,MACE,uBAAuB,KAAK,IAAI,KAChC,0BAA0B,KAAK,IAAI,KACnC,iBAAiB,KAAK,IAAI,KAC1B,gBAAgB,KAAK,IAAI,KACzB,mBAAmB,KAAK,IAAI,KAC5B,eAAe,KAAK,IAAI,EACxB,QAAO;AAET,MACE,wBAAwB,KAAK,IAAI,KACjC,2BAA2B,KAAK,IAAI,KACpC,qBAAqB,KAAK,IAAI,KAC9B,WAAW,KAAK,IAAI,EACpB,QAAO;AAET,MAAI,uBAAuB,KAAK,IAAI,KAAK,aAAa,KAAK,IAAI,EAAG,QAAO;AAEzE,MAAI,UAAU,KAAK,IAAI,KAAK,sBAAsB,KAAK,IAAI,KAAK,gBAAgB,KAAK,IAAI,EAAG,QAAO;AAEnG,MAAI,sBAAsB,KAAK,IAAI,KAAK,cAAc,KAAK,IAAI,EAAG,QAAO;AAEzE,MAAI,2BAA2B,KAAK,IAAI,EAAG,QAAO;AAElD,MAAI,4BAA4B,KAAK,IAAI,KAAK,8BAA8B,KAAK,IAAI,EAAG,QAAO;AAE/F,MAAI,aAAa,KAAK,IAAI,KAAK,4BAA4B,KAAK,IAAI,KAAK,4BAA4B,KAAK,IAAI,EAAG,QAAO;AAExH,MAAI,UAAU,KAAK,IAAI,EAAG,QAAO;AAEjC,MAAI,qBAAqB,KAAK,IAAI,EAAG,QAAO;AAC5C,SAAO;AACT;AAGO,SAAS,uBACd,MAAM,oBAAI,KAAK,GACf,cAC4D;AAE5D,QAAM,SAAS,cAAc;AAC7B,MAAI,OAAO,MAAM;AACf,UAAM,SAAS,EAAE,GAAG,OAAO,MAAM,GAAG,aAAa;AACjD,WAAO,EAAE,MAAM,QAAQ,QAAQ,eAAe;AAAA,EAChD;AAGA,QAAM,UAAU,YAAY;AAC5B,MAAI,QAAQ,YAAY;AACtB,UAAM,QAAQ,QAAQ,SAAS,GAAG;AAClC,UAAM,SAAS,EAAE,GAAG,OAAO,GAAG,aAAa;AAC3C,WAAO,EAAE,MAAM,QAAQ,QAAQ,MAAM;AAAA,EACvC;AAGA,QAAM,aAAa,wBAAwB;AAC3C,QAAM,UAAe;AAAA,IACnB,YAAY,cAAc;AAAA,IAC1B,cAAc,cAAc;AAAA,IAC5B,YAAY,cAAc;AAAA,IAC1B,UAAU,cAAc;AAAA,IACxB,WAAW,IAAI,YAAY;AAAA,EAC7B;AACA,SAAO,EAAE,MAAM,SAAS,QAAQ,WAAW;AAC7C;;;AChIF,IAAAC,4BAAmB;AAGZ,IAAMC,aAAY,0BAAAC,QAAO;AAAA,IAC5B,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAMK,YAAY,MAAM;AAAA;AAAA;AAAA;AAAA;AAUlC,IAAMC,mBAAkB,0BAAAD,QAAO;AAAA,IAClC,UAAU;AAAA,IACV,KAAK,OAAO,UAAU,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKf,CAAC,UAAW,MAAM,OAAO,SAAS,EAAG;AAAA;AAGlD,IAAM,QAAQ,0BAAAA,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA,WAKjB,CAAC,UAAU,MAAM,cAAc,OAAO,KAAK;AAAA;AAG/C,IAAM,OAAO,0BAAAA,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAMhB,CAAC,UAAU,MAAM,cAAc,OAAO,KAAK;AAAA;AAG/C,IAAM,2BAA2B,0BAAAA,QAAO;AAAA,IAC3C,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeX,IAAM,iBAAiB,0BAAAA,QAAO;AAAA,IACjC,KAAK,OAAO,UAAU,eAAe,CAAC;AAAA,IACtC,UAAU;AAAA,gBACE,OAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACnErB,IAAM,kBAAkB,CAAC,QAAgB;AAE9C,QAAM,iBACJ,OAAO,eAAe,SAAY,OAAO,aAAa,OAAO;AAC/D,QAAM,gBACJ,OAAO,cAAc,SAAY,OAAO,YAAY,OAAO;AAE7D,QAAM,QAAQ,OAAO,aACjB,OAAO,aACP,SAAS,gBAAgB,cACzB,SAAS,gBAAgB,cACzB,OAAO;AACX,QAAM,SAAS,OAAO,cAClB,OAAO,cACP,SAAS,gBAAgB,eACzB,SAAS,gBAAgB,eACzB,OAAO;AAEX,QAAM,aAAa,QAAQ,OAAO,OAAO;AACzC,QAAM,IAAI;AACV,QAAM,IAAI;AACV,QAAM,QAAQ,QAAQ,KAAK,IAAI,aAAa;AAC5C,QAAM,OAAO,SAAS,KAAK,IAAI,aAAa;AAE5C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,IAAI,UAAU;AAAA,eACZ,IAAI,UAAU;AAAA,YACjB,GAAG;AAAA,aACF,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf;AACF;;;AH4EM,IAAAE,sBAAA;AApGN,IAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF,MAAa;AACX,QAAM,CAAC,KAAK,MAAM,QAAI,wBAAc,EAAE,YAAY,UAAU,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAEjG,+BAAU,MAAM;AACd,QAAI,CAAC,UAAU,EAAG;AAClB,UAAM,EAAE,KAAK,IAAI,uBAAuB,oBAAI,KAAK,CAAC;AAClD,WAAO,IAAI;AAAA,EACb,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmB,MAAqB;AAC5C,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC5B,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO;AAAA,IACT;AAGA,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,UAAU,SAAS,CAAC;AAE1B,UAAI,CAAC,SAAS;AACZ,eAAO,4BAAsB,CAAC;AAAA,MAChC;AAEA,UAAI,OAAO,QAAQ,OAAO,YAAY,QAAQ,MAAM,GAAG;AACrD,eAAO,4BAAsB,CAAC;AAAA,MAChC;AAEA,UAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,KAAK,KAAK,EAAE,WAAW,GAAG;AACxE,eAAO,4BAAsB,CAAC;AAAA,MAChC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,YAAY;AAC/B,QAAI;AACF,YAAM,kBAAkB,iBAAiB;AACzC,UAAI,iBAAiB;AACnB,gBAAQ,IAAI,eAAe;AAC3B,cAAM,IAAI,MAAM,6BAA6B;AAAA,MAC/C;AAEA,YAAM,SAAS,IAAI,gBAAgB;AACnC,aAAO,OAAO,cAAc,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC;AACrD,aAAO,OAAO,cAAc,IAAI,UAAU;AAC1C,UAAI,IAAI,WAAY,QAAO,OAAO,cAAc,IAAI,UAAU;AAC9D,UAAI,IAAI,aAAc,QAAO,OAAO,gBAAgB,IAAI,YAAY;AACpE,UAAI,IAAI,SAAU,QAAO,OAAO,YAAY,IAAI,QAAQ;AACxD,aAAO,OAAO,SAAS,UAAU;AAEjC,YAAM,MAAM,GAAG,MAAM,gBAAgB,OAAO,SAAS,CAAC;AACtD,sBAAgB,GAAG;AAAA,IACrB,SAAS,OAAO;AACd,cAAQ,MAAM,0BAA0B,KAAK;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM,cAAc,YAAY;AAC9B,QAAI;AACF,YAAM,kBAAkB,iBAAiB;AACzC,UAAI,iBAAiB;AACnB,gBAAQ,IAAI,eAAe;AAC3B,cAAM,IAAI,MAAM,6BAA6B;AAAA,MAC/C;AAEA,YAAM,SAAS,IAAI,gBAAgB;AACnC,aAAO,OAAO,cAAc,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC;AACrD,aAAO,OAAO,cAAc,IAAI,UAAU;AAC1C,UAAI,IAAI,WAAY,QAAO,OAAO,cAAc,IAAI,UAAU;AAC9D,UAAI,IAAI,aAAc,QAAO,OAAO,gBAAgB,IAAI,YAAY;AACpE,UAAI,IAAI,SAAU,QAAO,OAAO,YAAY,IAAI,QAAQ;AAExD,YAAM,MAAM,GAAG,MAAM,gBAAgB,OAAO,SAAS,CAAC;AACtD,sBAAgB,GAAG;AAAA,IACrB,SAAS,OAAO;AACd,cAAQ,MAAM,yBAAyB,KAAK;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,QAAQ;AAAA,IACZ,EAAE,OAAO,4BAA4B,MAAM,+BAA+B,SAAS,MAAM,aAAa,GAAG,MAAM,WAAW;AAAA,IAC1H,EAAE,OAAO,wBAAwB,MAAM,+BAA+B,SAAS,MAAM,YAAY,GAAG,MAAM,OAAO;AAAA,IACjH,EAAE,OAAO,4BAA4B,MAAM,+BAA+B,SAAS,MAAM,mBAAmB,CAAC,GAAG,MAAM,UAAU;AAAA,EAClI;AAEA,SACE,8CAAC,SAEC;AAAA,iDAAC,SAAM,sCAEP;AAAA,IAEA,6CAAC,QAAK,4DAEN;AAAA,IAEA,6CAAC,4BACE,gBAAM,IAAI,CAAC,UACV,6CAAC,YAAyB,SAAS,MAAM,SACvC,wDAAC,kBACC;AAAA,oDAAC,SACC;AAAA,qDAAC,QAAI,gBAAM,OAAM;AAAA,QACjB,6CAAC,OAAG,gBAAM,MAAK;AAAA,SACjB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,KAAI;AAAA,UACJ,eAAY;AAAA,UACZ,QAAQ;AAAA,UACR,KAAK,QAAQ,MAAM,IAAI;AAAA,UACvB,OAAO;AAAA;AAAA,MACT;AAAA,OACF,KAdW,MAAM,KAenB,CACD,GACH;AAAA,KAEF;AAEJ;AAEA,IAAO,0BAAQ;;;AInJf,IAAAC,gBAAoC;AAI7B,SAAS,gBAA4B;AAC1C,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAqB,SAAS;AAElE,+BAAU,MAAM;AACd,UAAM,YAAY,UAAU,aAAa,UAAU;AAEnD,QAAI,WAAW,KAAK,SAAS,GAAG;AAC9B,oBAAc,SAAS;AAAA,IACzB,WAAW,mBAAmB,KAAK,SAAS,GAAG;AAC7C,oBAAc,QAAQ;AAAA,IACxB,OAAO;AACL,oBAAc,SAAS;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AACT;;;ACSM,IAAAC,sBAAA;AAxBN,IAAM,SAAS,MAAM;AACnB,QAAM,SAAS,cAAc;AAC7B,QAAM,aAAa,WAAW,YAAY,6EAA6E;AACvH,QAAM,aAAa,WAAW,YAAY,sBAAsB;AAChE,QAAM,gBAAgB,WAAW,YAAY,4CAA4C;AAEzF,QAAM,QAAQ;AAAA,IACZ,EAAE,OAAM,gCAAgC,MAAK,+BAA+B,MAAK,UAAU,MAAK,8CAA+C;AAAA,IAC/I,EAAE,OAAM,uCAAuC,MAAK,eAAe,MAAK,YAAY,MAAK,WAAW;AAAA,EACtG;AAEA,QAAM,cAAc;AAAA,IAClB,EAAE,OAAM,kDAAkD,MAAK,2CAA2C,MAAK,qBAAqB,MAAK,2EAA2E;AAAA,IACpN,EAAE,OAAM,8CAA8C,MAAK,mCAAmC,MAAK,aAAa,MAAK,8DAA8D;AAAA,EACrL;AAEA,WAAS,2BAA2B,OAAc;AAChD,UAAM,YAAY;AAClB,WAAO,UAAU,aAAa,WAAW;AAAA,EAC3C;AAEA,SACE,8CAAC,SAEC;AAAA,iDAAC,SAAM,uCAEP;AAAA,IAEA,6CAAC,QACC,wFAAE;AAAA;AAAA,MAEA,6CAAC,QAAE;AAAA,MAAE,6CAAC,QAAE;AAAA,MAAE;AAAA,OAEZ,GACF;AAAA,IAEA,6CAAC,4BACC,wFACI;AAAA,YAAM,IAAI,CAAC,MAAM,UACjB;AAAA,QAAC;AAAA;AAAA,UAEC,MAAO,KAAK;AAAA,UACZ,QAAO;AAAA,UAAS,KAAI;AAAA,UACpB,OAAO,2BAA2B,KAAK,IAAI,EAAE,SAAQ,OAAO,IAAI,CAAC;AAAA,UAEjE,wDAAC,kBACC;AAAA,0DAAC,SACC;AAAA,2DAAC,QAAK,eAAK,OAAO;AAAA,cAClB,6CAAC,OAAG,eAAK,MAAK;AAAA,eAChB;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAI;AAAA,gBACJ,eAAY;AAAA,gBACZ,QAAS;AAAA,gBACT,KAAK,QAAQ,KAAK,IAAI;AAAA,gBACtB,OAAQ;AAAA;AAAA,YACV;AAAA,aACF;AAAA;AAAA,QAjBM,KAAK;AAAA,MAkBb,CACD;AAAA,MAEC,WAAW,aACX,YAAY,IAAI,CAAC,SACf;AAAA,QAAC;AAAA;AAAA,UAEC,MAAO,KAAK;AAAA,UACZ,QAAO;AAAA,UAAS,KAAI;AAAA,UAEpB,wDAAC,kBACC;AAAA,0DAAC,SACC;AAAA,2DAAC,QAAK,eAAK,OAAO;AAAA,cAClB,6CAAC,OAAG,eAAK,MAAK;AAAA,eAChB;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAI;AAAA,gBACJ,eAAY;AAAA,gBACZ,QAAS;AAAA,gBACT,KAAK,QAAQ,KAAK,IAAI;AAAA,gBACtB,OAAQ;AAAA;AAAA,YACV;AAAA,aACF;AAAA;AAAA,QAhBM,KAAK;AAAA,MAiBb,CACD;AAAA,OAGL,GACF;AAAA,KAEF;AAEJ;AAEA,IAAO,sBAAQ;;;AClFT,IAAAC,sBAAA;AAXN,IAAM,QAAQ,MAAM;AAClB,QAAM,QAAQ;AAAA,IACZ,EAAE,OAAM,oBAAoB,MAAK,8BAA8B,MAAK,QAAQ,MAAK,+BAA+B;AAAA,IAChH,EAAE,OAAM,gBAAgB,MAAK,+BAA+B,MAAK,eAAe,MAAK,8CAA8C;AAAA,IACnI,EAAE,OAAM,gCAA2B,MAAK,+DAAuD,MAAK,QAAQ,MAAK,qDAAqD;AAAA,IACtK,EAAE,OAAM,mBAAmB,MAAK,gCAAgC,MAAK,wBAAwB,MAAK,yCAAyC;AAAA,EAC7I;AAEA,SACE,8CAAC,SAEC;AAAA,iDAAC,SAAM,6BAEP;AAAA,IAEA,6CAAC,QAAK,sDAEN;AAAA,IAEA,6CAAC,4BACG,gBAAM,IAAI,CAAC,SACT;AAAA,MAAC;AAAA;AAAA,QAEC,MAAO,KAAK;AAAA,QACZ,QAAO;AAAA,QAAS,KAAI;AAAA,QAEpB,wDAAC,kBACC;AAAA,wDAAC,SACC;AAAA,yDAAC,QAAK,eAAK,OAAO;AAAA,YAClB,6CAAC,OAAG,eAAK,MAAK;AAAA,aAChB;AAAA,UAEF;AAAA,YAAC;AAAA;AAAA,cACC,KAAI;AAAA,cACJ,eAAY;AAAA,cACZ,QAAS;AAAA,cACT,KAAM,QAAQ,KAAK,IAAI;AAAA,cACvB,OAAQ;AAAA;AAAA,UACV;AAAA,WACA;AAAA;AAAA,MAjBM,KAAK;AAAA,IAkBb,CACH,GACH;AAAA,KAEF;AAEJ;AAEA,IAAO,sBAAQ;;;AZ7Bf,kCAAmC;AAInC,kCAA8B;AA4BG,IAAAC,sBAAA;AAnBjC,IAAM,WAAW,CAAC;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAa;AACX,QAAM,UAAM,sBAA8B,IAAI;AAC9C,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,CAAC;AAEhD,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAAS,EAAE;AAEzD,0BAAgB,KAAK,KAAK;AAE1B,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM,6EAAE;AAEjC,QAAM,mBAAmB,KAAK,WAAW,KAAK;AAE9C,SACE,8CAAC,qBAAkB,KAEjB;AAAA,kDAAC,mBACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM,mBAAmB,EAAE;AAAA,UACpC,MAAM;AAAA,UACN,YAAY,mBAAmB,IAAI,YAAY;AAAA,UAC/C,OAAO,OAAO;AAAA;AAAA,MAChB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS;AAAA,UACT,MAAM;AAAA,UACN,OAAO,OAAO;AAAA;AAAA,MAChB;AAAA,OACF;AAAA,IAEC,mBAAmB,IAClB,6EACE,uDAAC,iBACC,uDAAC,6CAAc,UACb,8CAAC,sBACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,OAAO,OAAO;AAAA;AAAA,MAChB;AAAA,MACA,6CAAC,aAAU,0DAAyC;AAAA,OACtD,GAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,iBAAgB;AAAA;AAAA,IAClB,GACF,GACF,GACF,IAEA,8EACE;AAAA,mDAAC,oBACC;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF,GACF;AAAA,MAEA,6CAAC,mBACC;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA;AAAA,MACF,GACF;AAAA,OACF;AAAA,KAGJ;AAEJ;AAEA,IAAO,mBAAQ;;;AN9ET,IAAAC,sBAAA;AAvBN,IAAM,qBAAqB,cAAAC,QAAM,WAAoD,CAAC;AAAA,EACpF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAG,QAAQ;AACT,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AAGtC,+BAAU,MAAM;AACd,yBAAqB;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,WAAS,aAAa;AACpB,YAAQ,IAAI;AAAA,EACd;AAEA,WAAS,QAAQ;AACf,YAAQ,KAAK;AAAA,EACf;AAEA,SACE,6CAAC,oBACC,wDAAC,aACE;AAAA,YAAQ,6CAAC,oBAAS,UAAoB,QAAgB,UAAoB,OAAO,MAAM,MAAM,GAAG;AAAA,IACjG,6CAAC,mBAAgB,KAAU,MAAY,kBAAkB,iBAAiB,SAAS,MAAM,WAAW,GAClG;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,QAAQ,SAAS;AAAA,QACtB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,KAAI;AAAA,QACJ,WAAW;AAAA;AAAA,IACb,GACF;AAAA,KACF,GACF;AAEJ,CAAC;AAED,mBAAmB,cAAc;AAEjC,IAAO,6BAAQ;","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"]}
|
package/dist/index.js
CHANGED
|
@@ -111,7 +111,7 @@ var ComponentWrapper = styled2.div`
|
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
h1, h2, h3, h4, h5, h6, strong {
|
|
114
|
-
font-weight:
|
|
114
|
+
font-weight: 700;
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
button {
|
|
@@ -228,6 +228,40 @@ var FormContainer = styled3.div`
|
|
|
228
228
|
overflow-y: auto;
|
|
229
229
|
height: 100%;
|
|
230
230
|
|
|
231
|
+
/* Restaurar padding para elementos do phone input que foram resetados */
|
|
232
|
+
.react-international-phone-country-selector-button {
|
|
233
|
+
padding: 0 0.5rem !important;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.react-international-phone-country-selector-button__button-content {
|
|
237
|
+
padding: 0.25rem !important;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.react-international-phone-country-selector-button__flag-emoji {
|
|
241
|
+
padding: 0 0.25rem !important;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* Restaurar padding para os itens da lista de países no dropdown */
|
|
245
|
+
.react-international-phone-country-selector-dropdown {
|
|
246
|
+
padding: 0.25rem 0 !important;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.react-international-phone-country-selector-dropdown__list-item {
|
|
250
|
+
padding: 0.25rem 1rem !important;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.react-international-phone-country-selector-dropdown__list-item-flag-emoji {
|
|
254
|
+
padding: 0 0.5rem 0 0 !important;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.react-international-phone-country-selector-dropdown__list-item-country-name {
|
|
258
|
+
padding: 0 0.5rem !important;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.react-international-phone-country-selector-dropdown__list-item-dial-code {
|
|
262
|
+
padding: 0 0 0 0.5rem !important;
|
|
263
|
+
}
|
|
264
|
+
|
|
231
265
|
/* Hide scrollbars for WebKit browsers */
|
|
232
266
|
::-webkit-scrollbar {
|
|
233
267
|
display: none;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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":["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\";\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}\n\nconst MitreActionsWidget = React.forwardRef<HTMLDivElement, MitreActionsWidgetProps>(({\n products,\n apiUrl,\n apiToken,\n backgroundColor\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()} />}\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: 600;\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 } 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}\n\nconst Selector = ({\n products,\n apiUrl,\n apiToken,\n close\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 />\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 /* Optional: Add padding to prevent content from touching edges */\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 /* 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":["useState","useEffect","styled","styled","useState","styled","styled","styled","styled","useEffect","styled","Container","styled","ButtonContainer","jsx","jsxs","useEffect","useEffect","useState","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useState","jsx","jsxs","useState","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../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":["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\";\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}\n\nconst MitreActionsWidget = React.forwardRef<HTMLDivElement, MitreActionsWidgetProps>(({\n products,\n apiUrl,\n apiToken,\n backgroundColor\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()} />}\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 } 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}\n\nconst Selector = ({\n products,\n apiUrl,\n apiToken,\n close\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 />\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 /* Optional: Add padding to prevent content from touching edges */\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 /* 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":["useState","useEffect","styled","styled","useState","styled","styled","styled","styled","useEffect","styled","Container","styled","ButtonContainer","jsx","jsxs","useEffect","useEffect","useState","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useState","jsx","jsxs","useState","useEffect"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mitre-actions-widget",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.02",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Componente flutuante de botões com ações de contato para ser usado em projetos da Mitre Realty. Totalmente encapsulado sem conflitos de estilos.",
|
|
6
6
|
"type": "module",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"license": "MIT",
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"axios": "^1.8.4",
|
|
30
|
-
"mitre-form-component": "^0.1.
|
|
30
|
+
"mitre-form-component": "^0.1.1",
|
|
31
31
|
"react-error-boundary": "^5.0.0",
|
|
32
32
|
"react-icons": "^5.5.0"
|
|
33
33
|
},
|