{"version":3,"file":"static/js/default-index.tsx-270e7a47979d991cb8c3.js","mappings":"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","sources":["webpack://leadsbridge/./src/components/Basic/Button/index.tsx","webpack://leadsbridge/./src/components/Basic/ButtonNbe/index.tsx","webpack://leadsbridge/./src/components/Basic/Container/index.tsx","webpack://leadsbridge/./src/components/Basic/FakeInput/index.tsx","webpack://leadsbridge/./src/components/Basic/FiltersIcons/index.tsx","webpack://leadsbridge/./src/components/Basic/InputFeedback/index.tsx","webpack://leadsbridge/./src/components/Basic/Loader/index.tsx","webpack://leadsbridge/./src/components/Basic/Message/index.tsx","webpack://leadsbridge/./src/components/Basic/Modal/index.tsx","webpack://leadsbridge/./src/components/Basic/StateIcon/index.tsx","webpack://leadsbridge/./src/components/Basic/TinyTextualButton/index.tsx","webpack://leadsbridge/./src/components/ButtonProvider/index.tsx","webpack://leadsbridge/./src/components/ConnectedPopupWindow/index.tsx","webpack://leadsbridge/./src/components/Dropdown/index.tsx","webpack://leadsbridge/./src/components/Form/Checkbox/index.tsx","webpack://leadsbridge/./src/components/Form/InputDomain/index.tsx","webpack://leadsbridge/./src/components/Form/InputField/index.tsx","webpack://leadsbridge/./src/components/Form/InputSelect/index.tsx","webpack://leadsbridge/./src/components/Form/InputSmartSelect/index.tsx","webpack://leadsbridge/./src/components/Form/InputToggle/index.tsx","webpack://leadsbridge/./src/components/Form/Label/index.tsx","webpack://leadsbridge/./src/components/Form/LabelWithDocTooltip/index.tsx","webpack://leadsbridge/./src/components/Form/MultiCreatableCustom/index.tsx","webpack://leadsbridge/./src/components/Form/Textarea/index.tsx","webpack://leadsbridge/./src/components/Formik/FormikInputSmartSelect/index.tsx","webpack://leadsbridge/./src/components/InputAutoSelectCopy/index.tsx","webpack://leadsbridge/./src/components/PanelPopup/index.tsx","webpack://leadsbridge/./src/components/Panel/index.tsx","webpack://leadsbridge/./src/components/ReCaptcha/index.tsx","webpack://leadsbridge/./src/components/Translate/index.tsx","webpack://leadsbridge/./src/features/SignupSurvey/index.tsx","webpack://leadsbridge/./src/features/auth/SuperUserInfoBar/index.tsx","webpack://leadsbridge/./src/features/billing/BillingBox/BillingDetails/index.tsx","webpack://leadsbridge/./src/features/billing/BillingBox/index.tsx","webpack://leadsbridge/./src/features/billing/CreditCardBox/BoxWrapperWithSideImage/index.tsx","webpack://leadsbridge/./src/features/billing/CreditCardBox/index.tsx","webpack://leadsbridge/./src/features/checkout/CheckoutFooter/index.tsx","webpack://leadsbridge/./src/features/checkout/CheckoutTitle/index.tsx","webpack://leadsbridge/./src/features/googleAdsAccount/AccountActivate/index.tsx","webpack://leadsbridge/./src/features/googleAdsAccount/AccountConnect/index.tsx","webpack://leadsbridge/./src/features/googleAdsAccount/AccountCreationDone/index.tsx","webpack://leadsbridge/./src/features/googleAdsAccount/AccountCreationFormInner/index.tsx","webpack://leadsbridge/./src/features/googleAdsAccount/AccountCreationForm/index.tsx","webpack://leadsbridge/./src/features/googleAdsAccount/IntegrationPanel/index.tsx","webpack://leadsbridge/./src/features/nbee/BridgeChooserForm/index.tsx","webpack://leadsbridge/./src/features/nbee/BridgeChooserRedirector/index.tsx","webpack://leadsbridge/./src/features/nbee/EmailReceipt/index.tsx","webpack://leadsbridge/./src/features/nbee/FieldsMappingForm/FieldMappingEmptyState/index.tsx","webpack://leadsbridge/./src/features/nbee/FieldsMappingForm/FieldMappingRow/index.tsx","webpack://leadsbridge/./src/features/nbee/FieldsMappingForm/FormulaModal/index.tsx","webpack://leadsbridge/./src/features/nbee/FieldsMappingForm/HeaderSearch/index.tsx","webpack://leadsbridge/./src/features/nbee/AddFilterButton/AddFilterButtonModal/index.tsx","webpack://leadsbridge/./src/features/nbee/AddFilterButton/index.tsx","webpack://leadsbridge/./src/features/nbee/FieldsMappingForm/SendTestLeadFeedback/index.tsx","webpack://leadsbridge/./src/features/nbee/FieldsMappingForm/SendTestLeadSubForm/index.tsx","webpack://leadsbridge/./src/features/nbee/FieldsMappingForm/TestConnectionView/index.tsx","webpack://leadsbridge/./src/features/nbee/WelcomeMessageForm/index.tsx","webpack://leadsbridge/./src/features/nbee/FieldsMappingForm/index.tsx","webpack://leadsbridge/./src/features/nbee/IncomingDataContent/IncomingDataFinalStep/index.tsx","webpack://leadsbridge/./src/features/nbee/IncomingDataContent/IncomingDataInitialStep/index.tsx","webpack://leadsbridge/./src/components/IncomingDataTable/index.tsx","webpack://leadsbridge/./src/features/nbee/IncomingDataContent/LoadingStep/index.tsx","webpack://leadsbridge/./src/features/nbee/IncomingDataContent/IncomingDataTableStep/index.tsx","webpack://leadsbridge/./src/features/nbee/IntegrationCredentialsContent/AppAuthCredentialForm/index.tsx","webpack://leadsbridge/./src/features/nbee/IntegrationCredentialsContent/index.tsx","webpack://leadsbridge/./src/features/nbee/LoadingStep/index.tsx","webpack://leadsbridge/./src/features/nbee/ModalTrialInfo/index.tsx","webpack://leadsbridge/./src/features/nbee/NbeeError/index.tsx","webpack://leadsbridge/./src/components/Basic/Skeleton/index.tsx","webpack://leadsbridge/./src/features/nbee/SimpleBridgeBuilderForm/fields/IntegrationSelector/index.tsx","webpack://leadsbridge/./src/features/nbee/SimpleBridgeBuilderForm/fields/IntegrationSettings/index.tsx","webpack://leadsbridge/./src/features/nbee/SimpleBridgeBuilderForm/fields/AppConfigurator/index.tsx","webpack://leadsbridge/./src/features/nbee/SimpleBridgeBuilderForm/fields/AppSelector/index.tsx","webpack://leadsbridge/./src/features/nbee/SimpleBridgeBuilderForm/index.tsx","webpack://leadsbridge/./src/components/StatusBar/index.tsx","webpack://leadsbridge/./src/features/nbee/StatusBarBridge/index.tsx","webpack://leadsbridge/./src/features/nbee/StepCompleted/index.tsx","webpack://leadsbridge/./src/features/pricing/ModalChangePlan/index.tsx","webpack://leadsbridge/./src/features/pricing/ModalUpdatedPlan/index.tsx","webpack://leadsbridge/./src/features/pricing/PlanInfoBanner/index.tsx","webpack://leadsbridge/./src/features/pricing/PricingCard/index.tsx","webpack://leadsbridge/./src/features/signup/SignupForm/index.tsx","webpack://leadsbridge/./src/features/signup/SignupLayout/index.tsx","webpack://leadsbridge/./src/components/ToastComponent/index.tsx","webpack://leadsbridge/./src/index.tsx","webpack://leadsbridge/./src/utils/sentry/index.tsx","webpack://leadsbridge/./src/components/Alert/index.tsx","webpack://leadsbridge/./src/components/Basic/EditableText/index.tsx","webpack://leadsbridge/./src/components/Topbar/index.tsx","webpack://leadsbridge/./src/components/StepBar/index.tsx","webpack://leadsbridge/./src/layouts/PageEditor/index.tsx","webpack://leadsbridge/./src/layouts/SimplePage/index.tsx","webpack://leadsbridge/./src/pages/Admin/TestFacebookToken/index.tsx","webpack://leadsbridge/./src/pages/Admin/index.tsx","webpack://leadsbridge/./src/components/Basic/ProgressBar/index.tsx","webpack://leadsbridge/./src/components/FastAppSurvey/index.tsx","webpack://leadsbridge/./src/pages/BridgeByUrlCallback/index.tsx","webpack://leadsbridge/./src/pages/Checkout/index.tsx","webpack://leadsbridge/./src/pages/GoogleAdsAccount/index.tsx","webpack://leadsbridge/./src/pages/IncomingData/index.tsx","webpack://leadsbridge/./src/pages/Integration/index.tsx","webpack://leadsbridge/./src/pages/Logout/index.tsx","webpack://leadsbridge/./src/pages/Nbee/index.tsx","webpack://leadsbridge/./src/pages/Pricing/index.tsx","webpack://leadsbridge/./src/pages/Signup/index.tsx","webpack://leadsbridge/./src/pages/SignupAppSumo/index.tsx","webpack://leadsbridge/./src/features/signup/BbuContent/index.tsx","webpack://leadsbridge/./src/pages/SignupBbu/index.tsx","webpack://leadsbridge/./src/pages/SignupBbuFallbackSurvey/index.tsx","webpack://leadsbridge/./src/pages/ThankYouPage/index.tsx","webpack://leadsbridge/./src/store/index.tsx"],"sourcesContent":["import React, { ButtonHTMLAttributes } from 'react'\nimport { ButtonStyled } from './styled'\nimport { FaFacebook, FaTiktok } from 'react-icons/fa'\nimport { FcGoogle } from 'react-icons/fc'\n\ntype ButtonStyle =\n | 'facebook'\n | 'google'\n | 'tiktok'\n | 'primary'\n | 'secondary'\n | 'link'\n\nexport type ButtonSize = 'inline-small' | 'large'\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n $fluid?: boolean\n $loading?: boolean\n $variant?: ButtonStyle\n $size?: ButtonSize\n disabled?: boolean\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n $variant,\n children,\n ...props\n}) => {\n let icon\n switch ($variant) {\n case 'google':\n // we need to compensate some icon disaligment\n icon = <FcGoogle style={{ marginLeft: '-2px' }} />\n break\n case 'facebook':\n icon = <FaFacebook />\n break\n case 'tiktok':\n icon = <FaTiktok />\n break\n default:\n icon = null\n }\n\n return (\n <ButtonStyled $variant={$variant} {...props} disabled={props.disabled}>\n {icon}\n {children}\n </ButtonStyled>\n )\n}\n","import React, { ButtonHTMLAttributes } from 'react'\nimport {\n ButtonLoadingHiddenChildren,\n ButtonLoadingSpinner,\n ButtonLoadingWrapper,\n ButtonStyled,\n} from './styled'\n\ntype ButtonStyle =\n | 'primary'\n | 'action'\n | 'secondary'\n | 'blue'\n | 'outlined-primary'\n | 'outlined-secondary'\n | 'filter'\n | 'link-primary'\n | 'link-secondary'\ntype ButtonSize = 'small' | 'standard' | 'large'\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n $fluid?: boolean\n $loading?: boolean\n $loadingText?: string\n $variant?: ButtonStyle\n $size?: ButtonSize\n // when has an icon inside and needs to be aligned and separated a bit from text\n $hasIcon?: boolean\n disabled?: boolean\n $minWidth?: boolean\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n $variant,\n $size = 'standard',\n $hasIcon,\n $loading,\n $loadingText,\n $minWidth,\n children,\n ...props\n}) => {\n // when there's a loading text we force a min width\n const hasMinWidth = $minWidth || Boolean($loadingText)\n return (\n <ButtonStyled\n $variant={$variant}\n $size={$size}\n $hasIcon={$hasIcon}\n $minWidth={hasMinWidth}\n disabled={props.disabled}\n {...props}\n >\n {$loading ? (\n <>\n <ButtonLoadingWrapper>\n <ButtonLoadingSpinner /> {$loadingText}\n </ButtonLoadingWrapper>\n {/* this is only used to keep a fixed button width */}\n <ButtonLoadingHiddenChildren>{children}</ButtonLoadingHiddenChildren>\n </>\n ) : (\n children\n )}\n </ButtonStyled>\n )\n}\n","import styled, { css } from 'styled-components'\n\ninterface ContainerProps {\n $size?: 'md' | 'lg' | 'fluid'\n $marginY?: string\n}\n\nconst getContainerSize = ({ $size = 'md' }: ContainerProps) => {\n switch ($size) {\n case 'lg':\n return css`\n max-width: ${(props) => props.theme.container.large};\n `\n case 'md':\n return css`\n max-width: ${(props) => props.theme.container.medium};\n `\n }\n}\n\nexport const Container = styled.div<ContainerProps>`\n ${getContainerSize};\n\n margin: 0 auto;\n ${({ $marginY }) =>\n $marginY !== ''\n ? css`\n margin-top: ${$marginY};\n margin-bottom: ${$marginY};\n `\n : ''}\n`\n","import React from 'react'\nimport { FakeInputStyled } from './styled'\n\nexport interface FakeInputProps extends React.HTMLAttributes<HTMLDivElement> {\n required?: boolean\n text?: string\n}\n\nexport const FakeInput: React.FC<FakeInputProps> = ({\n required,\n text,\n ...props\n}) => {\n return (\n <FakeInputStyled required={required} {...props}>\n <p>{text}</p>\n </FakeInputStyled>\n )\n}\n","import React from 'react'\nimport { FaCopy, FaMinus, FaPlus } from 'react-icons/fa'\nimport ReactTooltip, { Place, Type, Effect } from 'react-tooltip'\nimport { useTranslation } from 'react-i18next'\nimport {\n IconButtonStyled,\n IconsWrapperStyled,\n} from '@components/Basic/FiltersIcons/styled'\n\ninterface Props {\n handleCopy: () => void\n handleAdd: () => void\n handleDelete: () => void\n isDeleteDisabled?: boolean\n isAddDisabled?: boolean\n isCopyDisabled?: boolean\n isBridgeDisabled?: boolean\n}\n\nconst tooltipProps = {\n place: 'top' as Place,\n type: 'light' as Type,\n effect: 'solid' as Effect,\n border: true,\n borderColor: '#f6f7f8',\n className: 'reactTooltipFilterIcons',\n}\n\nexport const FiltersIcons: React.FC<Props> = ({\n handleCopy,\n handleAdd,\n handleDelete,\n isDeleteDisabled = false,\n isAddDisabled = false,\n isCopyDisabled = false,\n isBridgeDisabled,\n}) => {\n const { t } = useTranslation()\n\n return (\n <div>\n <IconsWrapperStyled>\n <ReactTooltip id={'filter-copy'} {...tooltipProps}>\n {t('nbee.filters.tooltipIconCopy')}\n </ReactTooltip>\n <IconButtonStyled\n type={'button'}\n disabled={isCopyDisabled || isBridgeDisabled}\n onClick={handleCopy}\n data-tip\n data-for='filter-copy'\n >\n <FaCopy size={15} />\n </IconButtonStyled>\n <ReactTooltip id={'filter-delete'} {...tooltipProps}>\n {t('nbee.filters.tooltipIconDelete')}\n </ReactTooltip>\n <IconButtonStyled\n type={'button'}\n disabled={isDeleteDisabled || isBridgeDisabled}\n onClick={handleDelete}\n data-tip\n data-for='filter-delete'\n >\n <FaMinus size={15} />\n </IconButtonStyled>\n <ReactTooltip id={'filter-add'} {...tooltipProps}>\n {t('nbee.filters.tooltipIconAdd')}\n </ReactTooltip>\n <IconButtonStyled\n type={'button'}\n disabled={isAddDisabled || isBridgeDisabled}\n onClick={handleAdd}\n data-tip\n data-for='filter-add'\n >\n <FaPlus size={15} />\n </IconButtonStyled>\n </IconsWrapperStyled>\n </div>\n )\n}\n","import React, { ReactNode } from 'react'\nimport styled from 'styled-components'\n\nexport type InputFeedbackStatus = {\n error?: string | ReactNode\n success?: string\n}\n\nexport interface InputFeedbackProps {\n $status: InputFeedbackStatus\n}\n\nconst InputText = styled.p<{\n variant: 'success' | 'error'\n}>`\n font-size: 0.9rem;\n text-align: left;\n color: ${({ variant, theme }) => {\n switch (variant) {\n case 'success':\n return theme.input.success.borderColor\n case 'error':\n return theme.input.error.borderColor\n default:\n return theme.input.default.borderColor\n }\n }};\n`\n\nexport const InputFeedback: React.FC<InputFeedbackProps> = ({ $status }) => {\n return (\n <>\n {$status?.error && (\n <InputText data-testid={'input'} data-error='true' variant='error'>\n {$status?.error}\n </InputText>\n )}\n {$status?.success && (\n <InputText variant='success'>{$status?.success}</InputText>\n )}\n </>\n )\n}\n","import React from 'react'\nimport { LoaderStyled, LoaderDimmer } from './styled'\n\nexport interface LoaderProps {\n $active?: boolean\n $text?: string\n $size?: 'large' | 'small' | 'x-large'\n $inverted?: boolean\n $dimmer?: boolean\n}\n\nexport const Loader: React.FC<LoaderProps> = ({ $text, $dimmer, ...props }) => {\n return $dimmer ? (\n <LoaderDimmer>\n <LoaderStyled {...props}>{$text}</LoaderStyled>\n </LoaderDimmer>\n ) : (\n <LoaderStyled {...props}>{$text}</LoaderStyled>\n )\n}\n","import React from 'react'\nimport { MessageStyled } from './styled'\n\nexport interface MessageProps {\n $status?: 'success' | 'error'\n $header?: string\n}\n\nexport const Message: React.FC<MessageProps> = ({\n $header,\n children,\n ...props\n}) => {\n return (\n <MessageStyled $header={$header} {...props}>\n {$header && <div className={'message-title'}>{$header}</div>}\n <div className={'message-body'}>{children}</div>\n </MessageStyled>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport ReactModal, { Styles } from 'react-modal'\nimport styled, { css } from 'styled-components'\nimport { IoCloseOutline } from 'react-icons/io5'\nimport { defaultTheme } from '@app/styles/theme/default'\nimport { ReactComponent as MinimizeIcon } from '@assets/images/minimize.svg'\nimport { ReactComponent as CloseBlackIcon } from '@assets/images/close_black.svg'\nimport { ReactComponent as ExpandIcon } from '@assets/images/expand.svg'\n\ninterface ModalProps {\n isOpen: boolean\n onCloseModal: () => void\n hideCloseButton?: boolean\n isTransparent?: boolean\n isResizable?: boolean\n noPadding?: boolean\n modalTitle?: string\n isWide?: boolean\n}\n\nconst customStyles: Styles = {\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n margin: '0',\n width: '600px',\n borderRadius: '8px',\n boxShadow: '2px 2px 15px 0px rgba(31,31,31,0.28)',\n marginRight: '-50%',\n transform: 'translate(-50%, -50%)',\n backgroundColor: '#fff',\n },\n overlay: {\n zIndex: defaultTheme.zIndex.modal,\n },\n}\n\nconst noPaddingStyles: Styles = {\n content: {\n ...customStyles.content,\n borderRadius: '5px',\n boxShadow: undefined,\n minWidth: '570px',\n width: 'auto',\n height: '65vh',\n maxHeight: '75vh',\n maxWidth: '95vw',\n padding: 0,\n margin: 0,\n overflow: 'hidden',\n },\n overlay: {\n backgroundColor: 'rgba(94,94,94,0.6)',\n zIndex: defaultTheme.zIndex.modal,\n },\n}\n\nconst secondaryCustomStyles: Styles = {\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n margin: '0',\n width: '600px',\n border: 'none',\n backgroundColor: 'transparent',\n marginRight: '-50%',\n transform: 'translate(-50%, -50%)',\n },\n overlay: {\n zIndex: defaultTheme.zIndex.modal,\n },\n}\n\nconst minimizeCustomStyles: Styles = {\n content: {\n top: '60%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n margin: '0',\n width: '40%',\n padding: '0',\n borderRadius: '6px',\n boxShadow: '0 2px 6px 0 rgba(0, 0, 0, 0.4)',\n backgroundColor: '#fff',\n transform: 'translate(20%, -50%)',\n },\n overlay: {\n backgroundColor: 'rgba(0, 0, 0, 0)',\n },\n}\n\nconst expandCustomStyles: Styles = {\n content: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n padding: '0',\n borderRadius: '6px',\n boxShadow: '0 2px 6px 0 rgba(0, 0, 0, 0.4)',\n backgroundColor: '#fff',\n },\n overlay: {\n backgroundColor: 'rgba(0, 0, 0, 0)',\n },\n}\n\nconst ResizeWrapper = styled.div`\n background-color: #41a6dc;\n display: flex;\n align-items: center;\n padding: 0.5rem 1rem;\n\n p {\n margin: 0;\n flex: 1;\n font-weight: 600;\n color: #fff;\n }\n\n svg {\n cursor: pointer;\n }\n`\n\nconst IconsWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 3rem;\n`\n\nconst CloseIcon = styled.div<Pick<ModalProps, 'isTransparent' | 'noPadding'>>`\n text-align: right;\n cursor: pointer;\n ${({ isTransparent, noPadding }) =>\n isTransparent || noPadding\n ? css`\n font-size: 2rem;\n background-color: #f8f8f8;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 1rem;\n border-radius: 0 10%;\n `\n : null}\n ${({ noPadding }) =>\n noPadding &&\n css`\n margin: 0;\n `}\n`\n\n/*const ModalHeader = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding: 0;\n margin: 0;\n\n h3 {\n font-size: 1.35rem;\n padding-left: 1.5rem;\n padding-top: 1.5rem;\n }\n`*/\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n children,\n onCloseModal,\n hideCloseButton,\n isTransparent,\n isResizable,\n noPadding,\n // modalTitle,\n isWide,\n}) => {\n const [isExpand, setIsExpand] = useState(false)\n\n const [windowWidth, setWindowWidth] = useState(window.innerWidth)\n\n useEffect(() => {\n const handleResize = () => {\n setWindowWidth(window.innerWidth)\n }\n\n window.addEventListener('resize', handleResize)\n\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }, [])\n\n const wideCustomStyles: Styles = {\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n margin: '0',\n width: windowWidth <= 768 ? '80%' : '750px',\n padding: windowWidth <= 768 ? '0' : '1rem',\n borderRadius: '6px',\n boxShadow: '2px 2px 15px 0px rgba(31,31,31,0.28)',\n backgroundColor: '#fff',\n transform: 'translate(-50%, -50%)',\n },\n overlay: {\n backgroundColor: 'rgba(94,94,94,0.6)',\n zIndex: defaultTheme.zIndex.modal,\n },\n }\n\n return (\n <ReactModal\n isOpen={isOpen}\n onRequestClose={onCloseModal}\n style={\n isResizable && !isExpand\n ? minimizeCustomStyles\n : isResizable && isExpand\n ? expandCustomStyles\n : isTransparent\n ? secondaryCustomStyles\n : noPadding\n ? noPaddingStyles\n : isWide\n ? wideCustomStyles\n : customStyles\n }\n preventScroll={false}\n >\n {/* {noPadding && modalTitle ? (\n <ModalHeader>\n <h3>{modalTitle}</h3>\n <CloseIcon noPadding={noPadding} onClick={onCloseModal}>\n <IoCloseOutline />\n </CloseIcon>\n </ModalHeader>\n ) : null}*/}\n\n {!hideCloseButton && !noPadding ? (\n <CloseIcon isTransparent={isTransparent} onClick={onCloseModal}>\n <IoCloseOutline />\n </CloseIcon>\n ) : null}\n\n {isResizable ? (\n <>\n <ResizeWrapper>\n <p>Getting started video</p>\n <IconsWrapper>\n {isExpand ? (\n <MinimizeIcon onClick={() => setIsExpand(false)} />\n ) : (\n <ExpandIcon onClick={() => setIsExpand(true)} />\n )}\n <CloseBlackIcon onClick={onCloseModal} />\n </IconsWrapper>\n </ResizeWrapper>\n </>\n ) : null}\n {children}\n </ReactModal>\n )\n}\n\nReactModal.setAppElement('#root')\n","import React from 'react'\nimport { StateIconStyled } from '@components/Basic/StateIcon/styled'\nimport { IoIosCheckmarkCircleOutline } from 'react-icons/io'\nimport { IoAlertCircleOutline } from 'react-icons/io5'\nimport { AiOutlineMinusCircle } from 'react-icons/ai'\n\nexport type ValidationStates = 'empty' | 'default' | 'success' | 'error'\n\ninterface StateIconProps {\n state?: ValidationStates\n iconSize?: string\n}\n\nexport const StateIcon: React.FC<StateIconProps> = ({\n state = 'empty',\n iconSize = '24',\n}) => {\n // set of allowed icons\n const icons: Record<ValidationStates, JSX.Element> = {\n default: <AiOutlineMinusCircle color={'#ABB4BD'} size={iconSize} />,\n success: <IoIosCheckmarkCircleOutline color={'#2ECD72'} size={iconSize} />,\n error: <IoAlertCircleOutline color={'#EF4836'} size={iconSize} />,\n // return an empty svg to keep height consistent with other\n empty: <svg width={2} height={iconSize} />,\n }\n\n return (\n <StateIconStyled>\n <span />\n {icons[state]}\n <span />\n </StateIconStyled>\n )\n}\n","import React, { ButtonHTMLAttributes } from 'react'\nimport styled from 'styled-components'\n\nexport type Props = ButtonHTMLAttributes<HTMLButtonElement>\n\nconst RefreshButton = styled.button`\n cursor: pointer;\n font-size: 0.8rem;\n background: #fff;\n outline: none;\n border: 0;\n padding: 0;\n font-family: ${({ theme }) => theme.font.family};\n display: inline-flex;\n align-items: center;\n &:hover {\n color: ${({ theme }) => theme.color.link};\n }\n\n svg {\n margin-right: 0.3rem;\n }\n`\n\nexport const TinyTextualButton: React.FC<Props> = ({\n children,\n type = 'button',\n ...rest\n}) => {\n return (\n <RefreshButton type={type} {...rest}>\n {children}\n </RefreshButton>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { FacebookButtonCustom } from '@components/ButtonProvider/Facebook/FacebookButtonCustom'\nimport { FacebookButtonNative } from '@components/ButtonProvider/Facebook/FacebookButtonNative'\nimport { GoogleButtonNative } from '@components/ButtonProvider/Google/GoogleButtonNative'\nimport { GoogleButtonCustom } from '@components/ButtonProvider/Google/GoogleButtonCustom'\nimport { apiPublicClient } from '@app/services/apiPublicClient'\nimport { endpoints } from '@app/api/config'\nimport { parseApiError } from '@app/api/utils/error'\nimport AuthService from '@app/services/AuthService'\nimport { appRoutes, bridgeByUrlPartnersPaths } from '@app/routes'\nimport { deletePersistendSignupParms } from '@features/signup/SignupForm/useHideParamsFromString'\nimport { LocationDescriptor } from 'history'\nimport { matchPath } from 'react-router'\nimport { BbuRouteParams } from 'LeadsBridgeApp'\nimport { useLocation } from 'react-router-dom'\nimport { ApiErrorResponse, ApiUser, ApiUserResponse } from 'BackendApi'\nimport { identifyUserByUserData, trackEvent } from '@app/dataTracking'\nimport { ButtonErrorUi } from '@components/ButtonProvider/Facebook/ButtonErrorUi'\nimport { GetCaptchaToken } from '@components/ReCaptcha'\nimport { signInUserSessionCognito } from '@app/services/apiAuthClient/utils'\nimport { getAffiliateIdFromCookies } from '@app/utils/cookieUtils'\n\nexport type SignupProviderName = 'Facebook' | 'Google'\nexport type AuthScope = 'SignIn' | 'SignUp' | 'NoScope'\ntype SignUpParams = {\n trialDays: number\n cbPlan: string\n couponCode?: string\n}\n\nexport interface ButtonProviderProps {\n scope: AuthScope\n provider: SignupProviderName\n signupParams?: SignUpParams\n onBeforeAuth?: () => void\n onAuthError?: (errorMessage: string, errorCode?: string | number) => void\n onAuthSuccess?: (apiResponse: ApiUser) => void\n redirectPath?: LocationDescriptor<unknown>\n dataWidth?: number\n getCaptchaToken?: GetCaptchaToken\n}\n\nexport const ButtonProvider: React.FC<ButtonProviderProps> = ({\n provider,\n scope,\n onBeforeAuth,\n onAuthSuccess,\n onAuthError,\n dataWidth,\n signupParams,\n getCaptchaToken,\n}) => {\n const location = useLocation()\n\n const matchBBuPath = matchPath<BbuRouteParams>(location.pathname, {\n path: [appRoutes.signupBbu.path, ...bridgeByUrlPartnersPaths],\n exact: true,\n strict: false,\n })\n const bbuUri = matchBBuPath?.isExact\n ? `${window.location.origin}${location.pathname}`\n : undefined\n\n const [isGoogleButtonCustomLoaded, setIsGoogleButtonCustomLoaded] =\n useState<boolean>(false)\n const [googleButtonToUseForSignup, setGoogleButtonToUseForSignup] = useState<\n 'native' | 'custom'\n >('native')\n const [sdkFailedToLoad, setSdkFailedToLoad] = useState(false)\n\n const canUpdateState = useRef(true)\n useEffect(() => {\n canUpdateState.current = true\n return () => {\n if (canUpdateState) {\n canUpdateState.current = false\n }\n }\n })\n const handleSdkLoadError = () => {\n if (canUpdateState.current) {\n setSdkFailedToLoad(true)\n }\n }\n\n const handleExternalProviderAuth = async (oauthToken: string) => {\n if (onBeforeAuth) {\n onBeforeAuth()\n }\n\n let recaptchaToken: string | undefined\n if (getCaptchaToken) {\n recaptchaToken = await getCaptchaToken()\n }\n\n const tapExistingCookieData = getAffiliateIdFromCookies()\n\n console.log(\n 'calling authWithExternalProvider',\n 'tapVisitorId',\n tapExistingCookieData?.tapVisitorId,\n 'tapClickId',\n tapExistingCookieData?.tapClickId\n )\n\n const authResponse = await apiPublicClient\n .post<ApiUserResponse>(endpoints.authWithExternalProvider, {\n scope,\n bbuUri,\n referralUri: document.referrer || undefined,\n oauthToken: oauthToken,\n provider: provider,\n recaptchaToken: recaptchaToken || '',\n tapClickId: tapExistingCookieData?.tapClickId || undefined,\n tapVisitorId: tapExistingCookieData?.tapVisitorId || undefined,\n // signup params if any\n ...signupParams,\n })\n .catch((error: ApiErrorResponse) => {\n const parsedError = parseApiError(error)\n\n if (onAuthError) {\n onAuthError(parsedError.message, parsedError.code)\n }\n\n trackEvent({\n eventName: 'UnexpectedErrorThrown',\n feature: 'Authentication',\n // detecting scope, or not passing step when scope is 'NoScope' (eg. bbu)\n step:\n scope === 'SignIn'\n ? 'Signin'\n : scope === 'SignUp'\n ? 'Signup'\n : undefined,\n params: {\n custom: {\n errorCode: parsedError.code,\n errorDescription: parsedError.message,\n provider,\n scope,\n planId: signupParams?.cbPlan,\n },\n },\n sendEventToIntercom: true,\n })\n })\n\n if (!authResponse) {\n return\n }\n\n const userInfo = authResponse.data?.data\n const userCredentials = userInfo?.credentials\n\n if (\n !userCredentials ||\n !userCredentials.username ||\n !userCredentials.idToken ||\n !userCredentials.accessToken ||\n !userCredentials.refreshToken\n ) {\n if (onAuthError) {\n console.error('missing auth response', authResponse)\n }\n return\n }\n\n identifyUserByUserData(userInfo).then((r) =>\n console.log('App: Identify User: By UserData', r)\n )\n trackEvent({\n eventName: 'SignIn',\n feature: 'Authentication',\n step: 'Signin',\n })\n\n signInUserSessionCognito({\n username: userCredentials.username,\n idToken: userCredentials.idToken,\n accessToken: userCredentials.accessToken,\n refreshToken: userCredentials.refreshToken,\n })\n\n if (scope === 'SignUp') {\n // on signup we handle a redirect\n try {\n await AuthService.setSessionCookie()\n } catch (error) {\n console.error(error instanceof Error ? error.message : 'Unknown error')\n }\n } else {\n // on signin or no scope we also update the UI_AUTH_CHANNEL (Amplify Auth provider)\n await AuthService.onLoginAsync(false)\n }\n\n if (onAuthSuccess && userInfo) {\n onAuthSuccess(userInfo)\n }\n\n deletePersistendSignupParms()\n }\n\n const providerRender = () => {\n switch (provider) {\n case 'Facebook':\n // we don't show button fb is signup is sdk fails to load, in other pages (bbu) we show the ButtonErrorUi\n return sdkFailedToLoad ? (\n <ButtonErrorUi scope={scope} />\n ) : scope === 'SignUp' ? (\n <FacebookButtonCustom\n onTokenRetrived={handleExternalProviderAuth}\n scope={scope}\n onSdkLoadError={handleSdkLoadError}\n />\n ) : (\n <FacebookButtonNative\n onTokenRetrived={handleExternalProviderAuth}\n scope={scope}\n dataWidth={dataWidth}\n onSdkLoadError={handleSdkLoadError}\n />\n )\n case 'Google':\n if (scope === 'SignUp' && googleButtonToUseForSignup === 'custom') {\n return (\n <div style={{ opacity: isGoogleButtonCustomLoaded ? 1 : 0 }}>\n <GoogleButtonCustom\n onTokenRetrived={handleExternalProviderAuth}\n scope={scope}\n onGoogleLegacySdkInitSuccess={() => {\n // we know that legacy sdk has success:\n // If we have a success state, we can make the button visible otherwise, we make the native key load.\n // NB: The user will see the loading of a single button!\n setIsGoogleButtonCustomLoaded(true)\n }}\n onGoogleLegacySdkInitError={() => {\n // we know that legacy sdk has fail to laod\n setGoogleButtonToUseForSignup('native')\n }}\n />\n </div>\n )\n } else {\n return (\n <GoogleButtonNative\n onTokenRetrived={handleExternalProviderAuth}\n scope={scope}\n />\n )\n }\n }\n }\n\n return <>{providerRender()}</>\n}\n","import React, { useEffect, useRef } from 'react'\nimport {\n makePopupFeatures,\n postInitialDataToPopup,\n usePopupMessageReceiver,\n} from '@components/ConnectedPopupWindow/utils'\n\ninterface AuthorizationPopupProps {\n urlToOpen: string\n widthPx?: number\n heightPx?: number\n onPopupOpen: (popup: Window) => void\n onPopupClose: (newData?: unknown) => void\n popupName?: string\n initialData?: unknown\n}\n\nexport const ConnectedPopupWindow: React.FC<AuthorizationPopupProps> = ({\n urlToOpen,\n widthPx = 700,\n heightPx = 550,\n onPopupOpen,\n onPopupClose,\n initialData,\n popupName = 'authPopup',\n}) => {\n const popup = useRef<Window | null>(null)\n const isClosedRef = useRef<boolean>(false)\n const intervalId = useRef<NodeJS.Timer | null>()\n\n const { dataFromPopup } = usePopupMessageReceiver(popup)\n\n // Handle opening on new popup and posting of initialData\n useEffect(() => {\n // opening a new window as popup\n const features = makePopupFeatures(widthPx, heightPx)\n popup.current = window.open(urlToOpen, popupName, features)\n const currentPopup = popup.current\n\n if (!currentPopup) {\n onPopupClose()\n return\n }\n\n // we send the instance of the just opened popup as callback\n onPopupOpen(currentPopup)\n currentPopup.focus()\n\n // send initial data to popup\n postInitialDataToPopup({\n initialData,\n popup: currentPopup,\n })\n\n // cleanup functions\n return () => {\n // In case our component in un-mounted, we want to automatically close our popup\n if (popup.current) {\n popup.current.close()\n onPopupClose()\n }\n }\n }, [])\n\n // constantly check if popup is closed, to sync outer state\n useEffect(() => {\n const currentPopup = popup.current\n if (currentPopup) {\n intervalId.current = setInterval(() => {\n if (currentPopup.closed && !isClosedRef.current) {\n isClosedRef.current = true\n onPopupClose()\n }\n }, 500)\n }\n\n return () => {\n if (intervalId.current) {\n clearInterval(intervalId.current)\n }\n }\n }, [popup])\n\n // controlling the receival of data from popup\n useEffect(() => {\n if (dataFromPopup) {\n // console.log('received new data from popup: ', dataFromPopup)\n onPopupClose(dataFromPopup)\n popup.current!.close()\n }\n }, [dataFromPopup])\n\n return null\n}\n","import React, { useState } from 'react'\nimport {\n DropdownMenuDirection,\n DropdownMenuStyled,\n DropdownWrapper,\n} from './styled'\nimport { KebabButton } from '@components/Dropdown/KebabButton'\nimport { useClickAway } from '@components/Dropdown/useClickAway'\ntype DropdownLineSeparatorChild = 'last' | 'none'\n\ninterface DropdownProps {\n $direction?: DropdownMenuDirection\n dropdownButton?: React.ReactNode\n $lineSeparatorMenuItem?: DropdownLineSeparatorChild\n}\n\nexport const Dropdown: React.FC<DropdownProps> = ({\n $direction = 'left',\n children,\n dropdownButton,\n $lineSeparatorMenuItem,\n}) => {\n const [isOpen, setIsOpen] = useState(false)\n const closeDropdownHandler = () => setIsOpen(false)\n const clickAwayRef = useClickAway(closeDropdownHandler)\n\n return (\n <DropdownWrapper ref={isOpen ? clickAwayRef : undefined}>\n <span onClick={() => setIsOpen((p) => !p)}>\n {dropdownButton || <KebabButton />}\n </span>\n <DropdownMenuStyled\n $direction={$direction}\n $isOpen={isOpen}\n $lineSeparatorMenuItem={$lineSeparatorMenuItem}\n // close menu on item click (leveraging event-bubbling)\n onClick={closeDropdownHandler}\n >\n {children}\n </DropdownMenuStyled>\n </DropdownWrapper>\n )\n}\n","import React from 'react'\nimport { CheckboxStyled } from './styled'\nimport {\n InputFeedback,\n InputFeedbackStatus,\n} from '@components/Basic/InputFeedback'\n\nexport interface CheckboxProps {\n name: string\n value?: string\n checked?: boolean\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void\n disabled?: boolean\n $status?: InputFeedbackStatus\n}\nexport const Checkbox: React.FC<CheckboxProps> = ({\n value,\n checked,\n onChange,\n name,\n disabled,\n children,\n $status,\n ...inputProps\n}) => {\n return (\n <React.Fragment>\n <CheckboxStyled className={`${disabled ? 'disabled' : ''}`}>\n <label className='container'>\n {children}\n <input\n disabled={disabled}\n type='checkbox'\n name={name}\n id={name}\n value={value}\n checked={checked}\n onChange={onChange}\n {...inputProps}\n />\n <span className='checkmark' />\n </label>\n </CheckboxStyled>\n {$status && <InputFeedback $status={$status} />}\n </React.Fragment>\n )\n}\n","import React, { InputHTMLAttributes } from 'react'\nimport { InputDomainStyled } from '@components/Form/InputDomain/styled'\n\nexport interface InputDomainProps\n extends InputHTMLAttributes<HTMLInputElement> {\n $protocolLabel: string\n $domainLabel: string\n}\n\nexport const InputDomain: React.FC<InputDomainProps> = ({\n $protocolLabel,\n $domainLabel,\n ...props\n}) => {\n return (\n <InputDomainStyled>\n <label>{$protocolLabel}</label>\n <input {...props} type='text' />\n <label>{$domainLabel}</label>\n </InputDomainStyled>\n )\n}\n","import React, { InputHTMLAttributes, useEffect, useRef, useState } from 'react'\nimport {\n InputStyled,\n InputWrapperStyled,\n InputStyledProps,\n InputSlot,\n} from './styled'\nimport { Label } from '@components/Form/Label'\nimport {\n InputFeedbackStatus,\n InputFeedback,\n} from '@components/Basic/InputFeedback'\nimport { FloatingLabelStyled } from '@components/Form/InputSmartSelect/styled'\n\nexport interface InputFieldAttrProps\n extends InputHTMLAttributes<HTMLInputElement> {\n $status?: InputFeedbackStatus\n name: string\n type: 'text' | 'email' | 'number' | 'password' | 'tel' | 'url'\n $direction?: InputStyledProps['$direction']\n $fluid?: boolean\n slotLeft?: React.ReactNode\n slotRight?: React.ReactNode\n label?: string\n $hasMargin?: boolean\n defaultLabel?: string\n floatingLabel?: string\n fieldIsUnavailable?: boolean\n}\n\nexport const InputField: React.FC<\n InputFieldAttrProps & {\n inputRefCallback?: (input: HTMLInputElement | null) => void\n }\n> = ({\n label,\n slotLeft,\n slotRight,\n $status,\n $direction,\n $fluid,\n $hasMargin,\n defaultLabel,\n floatingLabel,\n fieldIsUnavailable,\n inputRefCallback,\n ...props\n}) => {\n const inputId = `${props.name}`\n const [isFocused, setIsFocused] = useState(false)\n const [hasValue, setHasValue] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (inputRefCallback && inputRef.current) {\n inputRefCallback(inputRef.current)\n }\n }, [inputRef.current, inputRefCallback])\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement, Element>) => {\n setIsFocused(true)\n if (props.onFocus) {\n props.onFocus(event)\n }\n }\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement, Element>) => {\n setIsFocused(false)\n if (props.onBlur) {\n props.onBlur(event)\n }\n }\n\n useEffect(() => {\n if (inputRef.current?.value) {\n setHasValue(true)\n } else {\n setHasValue(false)\n }\n }, [inputRef.current?.value])\n\n return (\n <InputStyled\n $direction={$direction || 'column'}\n $status={$status}\n type={props.type}\n name={props.name}\n id={inputId}\n $hasMargin={$hasMargin}\n className={props.className}\n >\n {label && (\n <Label $disabled={props.disabled} htmlFor={inputId} $label={label} />\n )}\n <InputWrapperStyled>\n {floatingLabel && (\n <FloatingLabelStyled\n htmlFor={inputId}\n isFloating={isFocused || hasValue}\n onClick={() => inputRef?.current?.focus()}\n >\n {isFocused || hasValue ? floatingLabel.toUpperCase() : defaultLabel}\n </FloatingLabelStyled>\n )}\n {slotLeft ? <InputSlot $slot={'left'}>{slotLeft}</InputSlot> : null}\n <input\n {...props}\n ref={inputRef}\n type={props.type}\n name={props.name}\n id={inputId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n style={\n defaultLabel && floatingLabel && (isFocused || hasValue)\n ? {\n paddingTop: '.6rem',\n paddingBottom: '.1rem',\n marginTop: '.6rem',\n height: '34px',\n color: (fieldIsUnavailable && 'red') || undefined,\n }\n : defaultLabel && floatingLabel && !isFocused && !hasValue\n ? {\n height: '43px',\n }\n : {}\n }\n />\n {slotRight ? <InputSlot $slot={'right'}>{slotRight}</InputSlot> : null}\n </InputWrapperStyled>\n\n {$status && <InputFeedback $status={$status} />}\n </InputStyled>\n )\n}\n","import React, { SelectHTMLAttributes } from 'react'\nimport { SelectStyled, SelectWrapper } from './styled'\nimport { Label } from '@components/Form/Label'\nimport {\n InputFeedback,\n InputFeedbackStatus,\n} from '@components/Basic/InputFeedback'\nimport { FiChevronDown } from 'react-icons/fi'\n\nexport type InputSelectOption = {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface SelectFieldProps\n extends SelectHTMLAttributes<HTMLSelectElement> {\n name: string\n disabled?: boolean\n $loading?: boolean\n $label?: string\n $direction?: 'column' | 'row'\n $options: InputSelectOption[]\n $optionsLabel?: string\n $status?: InputFeedbackStatus\n $hasMargin?: boolean\n}\n\nexport const InputSelect: React.FC<SelectFieldProps> = ({\n name,\n disabled,\n $loading,\n $direction,\n $label,\n $options,\n $optionsLabel,\n $status,\n $hasMargin,\n ...props\n}) => {\n const selectId = `${name}Select`\n return (\n <SelectStyled\n $options={$options}\n $direction={$direction || 'column'}\n name={name}\n $optionsLabel={$optionsLabel}\n $status={$status}\n $hasMargin={$hasMargin}\n >\n {$label && (\n <Label $disabled={disabled} htmlFor={selectId} $label={$label} />\n )}\n <SelectWrapper>\n <select\n name={name}\n id={selectId}\n {...props}\n disabled={disabled || $loading}\n >\n {$optionsLabel && (\n <option value=''>{$loading ? 'Loading...' : $optionsLabel}</option>\n )}\n {$options &&\n $options.map((option) => (\n <React.Fragment key={option.value}>\n <option value={option.value} disabled={option.disabled}>\n {option.label}\n </option>\n </React.Fragment>\n ))}\n </select>\n <div>\n <FiChevronDown />\n </div>\n </SelectWrapper>\n {$status && <InputFeedback $status={$status} />}\n </SelectStyled>\n )\n}\n","import React, { ClipboardEventHandler, FocusEventHandler } from 'react'\nimport Select from 'react-select'\nimport AsyncSelect from 'react-select/async'\nimport {\n CustomControl,\n CustomIndicatorsContainer,\n CustomMenu,\n CustomOption,\n CustomSingleValue,\n CustomValueContainer,\n MenuList,\n} from './ComponentOverrides'\nimport { customStyles, greyStyles, SmartSelectWrapper } from './styled'\nimport {\n InputFeedback,\n InputFeedbackStatus,\n} from '@components/Basic/InputFeedback'\nimport { useIsLabelTooLong } from '@components/Form/InputSmartSelect/Tooltip'\n\nexport type GroupedSelectValues = { label: string; options: SelectValue[] }[]\n\nexport type SelectValues = {\n sourceFields: SelectValue[]\n formula: SelectValue[]\n}\n\nexport type SelectValue = {\n value: string | number\n label: string\n logoUri?: string\n dropdownPrimaryLabel?: string\n secondaryLabel?: string\n icon?: 'new' | 'waiting'\n isVerified?: boolean\n type?: string\n index?: number\n [key: string]: any\n}\n\nexport interface SmartSelectProps {\n initialValues: GroupedSelectValues | SelectValue[]\n defaultValue?: SelectValue | SelectValue[]\n placeholder?: string\n isLoading?: boolean\n isClearable?: boolean\n isDisabled?: boolean\n secondaryStyles?: boolean\n isSearchable?: boolean\n isMulti?: boolean\n noOptionsMessageText?: string\n onSelect: (value: SelectValue | SelectValue[]) => void\n addNewOptionButton?: {\n label: string\n onClick: () => void\n }\n addActionClick?: {\n label: string\n onClick: () => void\n }\n onInputChange?: (value: string) => void\n hasCustomSearch?: boolean\n loadOptions?: (\n inputValue: string\n ) => Promise<GroupedSelectValues | SelectValue[]>\n $status?: InputFeedbackStatus\n onBlur?: FocusEventHandler<HTMLInputElement>\n name?: string\n menuIsOpen?: boolean\n noIcon?: boolean\n tooltipMessage?: string\n extraLabel?: boolean\n emailValidation?: boolean\n keyDown?: (e: any) => any\n isVerified?: boolean\n defaultLabel?: string\n floatingLabel?: string\n upDownIconsStyle?: boolean\n fieldIsUnavailable?: boolean\n largeUpDownIconsStyle?: boolean\n isFormulas?: boolean\n onPaste?: ClipboardEventHandler<HTMLInputElement>\n dataTestId?: string\n}\n\nexport const InputSmartSelect: React.FC<SmartSelectProps> = ({\n initialValues,\n isClearable = true,\n onSelect,\n placeholder,\n defaultValue,\n isSearchable = false,\n noOptionsMessageText,\n addNewOptionButton,\n onInputChange,\n hasCustomSearch,\n isLoading,\n loadOptions,\n isMulti,\n isDisabled,\n $status,\n onBlur,\n name,\n menuIsOpen,\n noIcon,\n tooltipMessage,\n addActionClick,\n extraLabel,\n secondaryStyles,\n emailValidation,\n keyDown,\n isVerified,\n isFormulas,\n defaultLabel,\n floatingLabel,\n upDownIconsStyle,\n fieldIsUnavailable,\n largeUpDownIconsStyle,\n onPaste,\n dataTestId,\n}) => {\n const { wrapperEl, selectedSingleValueEl, isLabelTooLong } =\n useIsLabelTooLong({\n defaultValue: defaultValue as SelectValue,\n })\n\n // use this object to pass extra props and read them inside custom components (overrides)\n const extraProps = {\n addNewOptionButton,\n addActionClick,\n extraLabel,\n noIcon,\n emailValidation,\n isVerified,\n defaultLabel,\n floatingLabel,\n upDownIconsStyle,\n largeUpDownIconsStyle,\n selectedSingleValueEl,\n isFormulas,\n // this is the selected value to be displayed when text is too long\n tooltipInternalLabel: isLabelTooLong\n ? (defaultValue as SelectValue).label\n : undefined,\n tooltipExternalMessage: tooltipMessage,\n fieldIsUnavailable,\n }\n\n const noDropdownIndicator =\n isSearchable || loadOptions\n ? { DropdownIndicator: () => null, IndicatorSeparator: () => null }\n : {}\n\n return (\n <SmartSelectWrapper\n ref={wrapperEl}\n isLoading={isLoading}\n datatest-id={dataTestId}\n >\n {loadOptions ? (\n <AsyncSelect\n components={{\n Option: CustomOption,\n SingleValue: CustomSingleValue,\n Control: CustomControl,\n Menu: CustomMenu,\n MenuList: MenuList,\n ValueContainer: CustomValueContainer,\n IndicatorsContainer: CustomIndicatorsContainer,\n ...noDropdownIndicator,\n }}\n styles={secondaryStyles ? greyStyles : customStyles}\n isClearable={isClearable}\n // always searchable when async\n isSearchable\n defaultOptions={initialValues}\n defaultValue={defaultValue}\n onChange={(selectedValue) => {\n onSelect(selectedValue as SelectValue)\n }}\n loadOptions={loadOptions}\n placeholder={isLoading ? 'Loading...' : placeholder}\n onBlur={onBlur}\n name={name}\n menuIsOpen={menuIsOpen}\n isDisabled={isLoading || isDisabled}\n {...extraProps}\n />\n ) : (\n <Select\n menuIsOpen={menuIsOpen}\n options={initialValues}\n defaultValue={defaultValue}\n components={{\n Option: CustomOption,\n SingleValue: CustomSingleValue,\n Control: CustomControl,\n Menu: CustomMenu,\n MenuList: MenuList,\n ValueContainer: CustomValueContainer,\n IndicatorsContainer: CustomIndicatorsContainer,\n ...noDropdownIndicator,\n }}\n styles={secondaryStyles ? greyStyles : customStyles}\n isClearable={isClearable}\n placeholder={isLoading ? 'Loading...' : placeholder}\n noOptionsMessage={\n noOptionsMessageText ? () => noOptionsMessageText : undefined\n }\n isDisabled={isLoading || isDisabled}\n isSearchable={isSearchable || hasCustomSearch}\n onChange={(selectedValue) => {\n onSelect(selectedValue as SelectValue)\n }}\n onInputChange={(newValue) => {\n if (onInputChange) {\n onInputChange(newValue)\n }\n }}\n filterOption={hasCustomSearch ? () => true : undefined}\n isMulti={isMulti}\n onBlur={onBlur}\n name={name}\n onKeyDown={keyDown}\n {...extraProps}\n />\n )}\n {$status && <InputFeedback $status={$status} />}\n </SmartSelectWrapper>\n )\n}\n","import React, { InputHTMLAttributes } from 'react'\nimport {\n LabelStyled,\n SpanStyled,\n WrapperStyled,\n} from '@components/Form/InputToggle/styled'\n\nexport type SpanStyle = 'primary' | 'dark'\n\nexport interface InputToggleProps\n extends InputHTMLAttributes<HTMLInputElement> {\n $labelRight?: string\n $labelLeft?: string\n $isChecked?: boolean\n $variant?: SpanStyle\n $size?: 'large' | 'small'\n $isDisabled?: boolean\n}\n\nexport const InputToggle: React.FC<InputToggleProps> = ({\n $isChecked,\n $variant,\n $labelLeft,\n $labelRight,\n $size,\n $isDisabled,\n ...props\n}) => {\n return (\n <WrapperStyled $size={$size} $variant={$variant} $isChecked={$isChecked}>\n {$labelLeft && (\n <label style={{ marginRight: '1rem' }}>{$labelLeft}</label>\n )}\n <LabelStyled $isDisabled={$isDisabled} $size={$size}>\n <input\n disabled={$isDisabled}\n checked={$isChecked}\n type='checkbox'\n {...props}\n />\n <SpanStyled $size={$size} $variant={$variant} $isChecked={$isChecked} />\n </LabelStyled>\n {$labelRight && (\n <label style={{ marginLeft: '1rem' }}>{$labelRight}</label>\n )}\n </WrapperStyled>\n )\n}\n","import React from 'react'\nimport { LabelStyled } from './styled'\n\nexport interface LabelProps {\n $disabled?: boolean\n $label?: string\n htmlFor?: string\n allowsHtml?: boolean\n}\n\nexport const Label: React.FC<LabelProps> = ({\n $disabled,\n htmlFor,\n $label,\n allowsHtml,\n}) => {\n const labelId = `${htmlFor}`\n return allowsHtml ? (\n <LabelStyled\n $disabled={$disabled}\n htmlFor={labelId}\n dangerouslySetInnerHTML={{\n __html: $label || '',\n }}\n />\n ) : (\n <LabelStyled $disabled={$disabled} htmlFor={labelId}>\n {$label}\n </LabelStyled>\n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport { Label } from '@components/Form/Label'\nimport ReactTooltip from 'react-tooltip'\nimport { IoIosHelpCircleOutline } from 'react-icons/io'\nimport { useTranslation } from 'react-i18next'\n\nconst LabelWrapper = styled.div`\n display: flex;\n align-items: center;\n svg {\n margin-left: 0.5rem;\n cursor: pointer;\n }\n`\n\nconst DocUrl = styled.div`\n margin-left: auto;\n font-size: 0.8rem; /* same as label */\n text-align: right;\n`\n\ninterface Props {\n label: string\n docUrl?: string\n isRequired?: boolean\n htmlFor?: string\n tooltip?: string\n}\n\nexport const LabelWithDocTooltip: React.FC<Props> = ({\n label,\n docUrl,\n isRequired,\n htmlFor,\n tooltip,\n}) => {\n const { t } = useTranslation()\n const labelWithRequired = isRequired ? `${label} <strong>(*)</strong>` : label\n\n return (\n <LabelWrapper>\n <div>\n <Label htmlFor={htmlFor} $label={labelWithRequired} allowsHtml />\n {tooltip ? (\n <>\n <IoIosHelpCircleOutline size={'0.9em'} data-tip={tooltip} />\n <ReactTooltip\n place={'bottom'}\n border\n backgroundColor={'rgba(0, 0, 0, 0.7)'}\n borderColor={'#f6f7f8'}\n className={'reactTooltipSmall'}\n />\n </>\n ) : null}\n </div>\n {docUrl ? (\n <DocUrl>\n <a href={docUrl} target={'_blank'} rel={'noopener noreferrer'}>\n {t('nbee.bridgeBuilder.settingDocUrlText')}\n </a>\n </DocUrl>\n ) : null}\n </LabelWrapper>\n )\n}\n","import React, { ReactElement, Ref, useEffect, useState } from 'react'\nimport CreatableSelect from 'react-select/creatable'\nimport {\n InputFeedback,\n InputFeedbackStatus,\n} from '@components/Basic/InputFeedback'\nimport {\n CustomMenuList,\n CustomMultiValue,\n CustomOption,\n} from '@components/Form/MultiCreatableCustom/ComponentOverrides'\nimport { ApiFormulasSchemaResponseData } from 'BackendApi'\nimport {\n customStyles,\n SourceIcon,\n} from '@components/Form/MultiCreatableCustom/styled'\nimport { MappedField, MappedFieldMapping, MappedFieldType } from 'Nbee'\nimport {\n createDefaultValues,\n createOptions,\n convertToMapping,\n} from '@components/Form/MultiCreatableCustom/utils'\nimport { useTranslation } from 'react-i18next'\nimport Select, { SelectInstance } from 'react-select'\n\nexport type SelectValueMulti = {\n label: string\n value: string\n lastValue?: string\n selectId?: string\n fieldType?: MappedFieldType\n formulaDescription?: string\n formulaCategory?: string\n isNewFormula?: boolean\n sourceLogoComponent?: ReactElement\n}\n\nexport type CustomCreatableAdditionalProps = {\n hasFormula?: boolean\n handleTabChange?: (tabName: TabType) => void\n activeTab?: TabType\n hasPicklist?: boolean\n sourceLogoComponent?: ReactElement\n userHasFormulaEnabled?: boolean\n onRedirectToPricing?: (redirect: boolean) => void\n}\n\nexport type TabType = 'fields' | 'formulas' | 'custom'\n\ninterface Props {\n mappedField?: MappedField\n fieldIndex?: number\n onMappingChange?: (mapping: MappedFieldMapping[]) => void\n onFormulaSelect?: (mappingItem: MappedFieldMapping) => void\n onRedirectToPricing?: (redirect: boolean) => void\n sourceOptions?: SelectValueMulti[]\n picklistOptions?: SelectValueMulti[]\n userHasFormulaEnabled?: boolean\n formulaSchema?: ApiFormulasSchemaResponseData[]\n sourceLogoUri?: string\n placeholder?: string\n isLoading?: boolean\n isDisabled?: boolean\n $status?: InputFeedbackStatus\n dataTestId?: string\n isCreatable?: boolean\n excludeSelected?: boolean\n}\n\nexport const MultiCreatableCustom: React.FC<Props> = ({\n mappedField,\n fieldIndex = 0, // default value must be 0\n onMappingChange,\n onFormulaSelect,\n onRedirectToPricing,\n sourceOptions,\n picklistOptions,\n userHasFormulaEnabled,\n formulaSchema,\n sourceLogoUri,\n placeholder,\n isLoading,\n isDisabled,\n $status,\n dataTestId,\n isCreatable = true,\n excludeSelected = false,\n}) => {\n const [selectedOptions, setSelectedOptions] = useState<SelectValueMulti[]>([])\n const [menuIsOpen, setMenuIsOpen] = useState(false)\n const { t } = useTranslation()\n\n const hasPicklist =\n picklistOptions &&\n mappedField?.picklist &&\n mappedField?.picklist?.length > 0\n const defaultActiveTab = hasPicklist ? 'custom' : 'fields'\n const hasFormula = formulaSchema && formulaSchema.length > 0\n const [activeTab, setActiveTab] = useState<TabType>(defaultActiveTab)\n\n // Filter options if excludeSelected is true\n const filteredSourceOptions = excludeSelected\n ? sourceOptions?.filter(\n (option) =>\n !selectedOptions.some((selected) => selected.value === option.value)\n )\n : sourceOptions\n\n const options = createOptions(\n filteredSourceOptions || [],\n picklistOptions || [],\n formulaSchema || [],\n activeTab\n )\n const defaultValues =\n createDefaultValues(mappedField?.mapping || [], sourceOptions || [], t) ||\n []\n\n const optionsDisabled = !userHasFormulaEnabled && activeTab === 'formulas'\n\n const sourceLogoComponent = (\n <SourceIcon src={sourceLogoUri} alt='Source logo' />\n )\n\n // Wrapper function to update both local (react-select) and parent (formik) state\n const handleMappingChange = (\n newOptions: SelectValueMulti[], // New selected options\n selectedOption?: SelectValueMulti // The option that was selected/deselected (if any)\n ) => {\n // console.log('handle mapping change is called', newOptions, selectedOption)\n // Convert the new selected options to an array of MappedFieldMapping objects for the Formik context\n if (!onMappingChange) return\n const newMapping = convertToMapping(\n newOptions,\n mappedField ?? { mappingType: 'manual', mapping: [] }\n )\n\n setSelectedOptions(newOptions) // Update local state with the new options\n onMappingChange(newMapping) // Notify parent component with new mapping array\n\n if (!onFormulaSelect) return\n // Check if the selected option is a formula and pass the mapping object to the parent component\n if (selectedOption?.fieldType === 'formula') {\n const newMappingWithFormula: MappedFieldMapping = {\n id: selectedOption.selectId,\n sourceFieldId: null,\n fieldType: 'formula',\n text: null,\n formula: {\n id: selectedOption.value,\n params:\n mappedField?.mapping.find((m) => m.id === selectedOption.selectId)\n ?.formula?.params || [],\n isNew: selectedOption.isNewFormula ?? true, // Set isNew to true if it's a new formula, otherwise false when editing an existing one\n },\n }\n onFormulaSelect(newMappingWithFormula)\n }\n }\n\n const handleTabChange = (tabName: TabType) => {\n setActiveTab(tabName)\n }\n\n const SelectComponent = isCreatable ? CreatableSelect : Select\n\n const selectRef: Ref<SelectInstance<any, any>> =\n React.useRef<SelectInstance | null>(null)\n const handleKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n // Dynamically determine the available tabs based on conditions\n const availableTabs: TabType[] = ['fields', 'formulas'] // Always available\n if (hasPicklist) availableTabs.unshift('custom') // Add 'custom' at the beginning if available\n\n const currentTabIndex = availableTabs.indexOf(activeTab)\n\n if (e.key === 'Tab') {\n e.preventDefault()\n // Move to the next tab (cyclically)\n const nextTabIndex = (currentTabIndex + 1) % availableTabs.length\n handleTabChange(availableTabs[nextTabIndex])\n }\n if (e.key === 'Backspace' && selectRef.current?.props.inputValue === '') {\n e.preventDefault()\n // console.log('selectValue', selectRef.current)\n handleMappingChange(selectedOptions.slice(0, -1))\n }\n if (e.key === ' ' && selectRef.current?.props.inputValue === '') {\n e.preventDefault()\n handleMappingChange([\n ...selectedOptions,\n {\n label: 'SPACE',\n value: ' ',\n fieldType: 'text',\n selectId: `${fieldIndex}-SPACE-${selectedOptions.length}`,\n },\n ])\n }\n }\n\n const extraProps: CustomCreatableAdditionalProps = {\n handleTabChange,\n activeTab,\n hasPicklist,\n sourceLogoComponent,\n hasFormula,\n userHasFormulaEnabled,\n onRedirectToPricing,\n }\n\n // Update selectedOptions when mappedField changes\n // This is necessary to keep the selected options in sync with the mappedField\n // (e.g. when the user adds a new formula, we want to display the label including the selected\n // field from the FormulaModal)\n useEffect(() => {\n const newOptions = createDefaultValues(\n mappedField?.mapping || [],\n sourceOptions || [],\n t\n )\n setSelectedOptions(newOptions as SelectValueMulti[])\n }, [mappedField?.mapping])\n\n return (\n <div data-testid={dataTestId}>\n <SelectComponent\n ref={selectRef}\n options={options}\n styles={customStyles}\n components={{\n MultiValue: CustomMultiValue,\n IndicatorsContainer: () => null, // disable indicators\n Option: CustomOption,\n MenuList: CustomMenuList,\n MultiValueRemove: () => null, // disable default MultiValueRemove component\n }}\n value={selectedOptions}\n defaultValue={defaultValues}\n placeholder={isLoading ? 'Loading...' : placeholder}\n onKeyDown={handleKeyDown}\n openMenuOnClick={true}\n menuIsOpen={menuIsOpen}\n onMenuOpen={() => setMenuIsOpen(true)}\n onMenuClose={() => setMenuIsOpen(false)}\n hideSelectedOptions={false}\n isDisabled={isLoading || isDisabled}\n isMulti\n isClearable={false}\n isOptionSelected={() => false}\n isOptionDisabled={() => optionsDisabled || false}\n isValidNewOption={(inputValue) => {\n // Necessary to allow adding value with the same text\n return inputValue.trim().length > 0\n }}\n onChange={(selectedValue, actionMeta) => {\n switch (actionMeta.action) {\n case 'select-option': {\n const selectedOption = actionMeta.option as SelectValueMulti\n // when selectedOption is an array, is because the editFormula button was clicked.\n // Otherwise, a new option has been added\n // console.log('selectedOption', selectedOption)\n if (selectedOption.value) {\n // If we're adding a new option, we want to generate a new selectId\n // to avoid conflicts with existing options,\n // and to update the local and parent states\n // console.log('selectedOption', selectedOption)\n const mappingIndex = selectedOptions.length\n const identifier = selectedOption.value\n // Generate unique identifier for the new option\n const selectId = `${fieldIndex}-${identifier}-${mappingIndex}`\n\n const updatedOption = {\n ...selectedOption,\n selectId,\n }\n\n // Update selectedOptions with the new or updated option\n handleMappingChange(\n [...selectedOptions, updatedOption],\n updatedOption\n )\n } else {\n // we are editing an existing formula, so we already have the selectId\n handleMappingChange(\n [...selectedOptions],\n selectedValue as unknown as SelectValueMulti\n )\n }\n break\n }\n\n case 'deselect-option': {\n // Filter out the deselected option using the selectId previously generated,\n // then update local and parent states\n handleMappingChange(\n selectedOptions.filter(\n (option) =>\n option.selectId !==\n (selectedValue as SelectValueMulti).selectId\n )\n )\n break\n }\n\n case 'create-option': {\n // Handle new 'text' options created by the user\n const newOption = {\n label: (actionMeta.option as SelectValueMulti).label,\n value: (actionMeta.option as SelectValueMulti).value,\n fieldType: 'text' as MappedFieldType, // Default to 'text' for new custom options\n isFormula: false,\n selectId: `${fieldIndex}-${\n (actionMeta.option as SelectValueMulti).value\n }-${selectedOptions.length}`, // Generate a new selectId for the custom option\n }\n // update local and parent states\n handleMappingChange([...selectedOptions, newOption])\n break\n }\n }\n }}\n {...extraProps}\n />\n {$status && <InputFeedback $status={$status} />}\n </div>\n )\n}\n","import React, { forwardRef, InputHTMLAttributes } from 'react'\nimport { TextareaWrapper, TextareaStyled } from './styled'\nimport { Label } from '@components/Form/Label'\nimport {\n InputFeedbackStatus,\n InputFeedback,\n} from '@components/Basic/InputFeedback'\n\nexport interface InputFieldAttrProps\n extends InputHTMLAttributes<HTMLTextAreaElement> {\n $status?: InputFeedbackStatus\n name: string\n label?: string\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, InputFieldAttrProps>(\n ({ label, $status, ...props }, ref) => {\n const inputId = `${props.name}`\n\n return (\n <TextareaWrapper>\n {label && (\n <Label $disabled={props.disabled} htmlFor={inputId} $label={label} />\n )}\n <TextareaStyled ref={ref} $status={$status} {...props} />\n {$status && <InputFeedback $status={$status} />}\n </TextareaWrapper>\n )\n }\n)\n\nTextarea.displayName = 'Textarea'\n","import React from 'react'\nimport {\n InputSmartSelect,\n SelectValue,\n} from '@components/Form/InputSmartSelect'\nimport { useField, useFormikContext } from 'formik'\nimport { Label } from '@components/Form/Label'\nimport { InputFeedback } from '@components/Basic/InputFeedback'\nimport { FormikInputSmartSelectStyled } from './styled'\n\nexport interface Props {\n initialValues: SelectValue[]\n name: string\n label?: string\n isLoading?: boolean\n secondaryStyles?: boolean\n noIcon?: boolean\n isClearable?: boolean\n}\nexport const FormikInputSmartSelect: React.FC<Props> = ({\n initialValues,\n name,\n label,\n isLoading,\n secondaryStyles,\n noIcon,\n isClearable,\n}) => {\n const [field, meta, helpers] = useField(name)\n const errorMessage = meta.touched && meta.error\n const defaultValue = initialValues.find((item) => item.value === field.value)\n\n return (\n <FormikInputSmartSelectStyled secondaryStyles={secondaryStyles}>\n <Label $label={label} />\n <InputSmartSelect\n onBlur={() => {\n helpers.setTouched(true)\n }}\n isLoading={isLoading}\n key={defaultValue?.value}\n defaultValue={defaultValue}\n initialValues={initialValues || []}\n onSelect={(selectedValue) => {\n const currentValue = selectedValue as SelectValue | null\n helpers.setValue(currentValue?.value || '')\n }}\n secondaryStyles={secondaryStyles}\n noIcon={noIcon}\n isClearable={isClearable}\n />\n {errorMessage ? (\n <InputFeedback $status={{ error: errorMessage }} />\n ) : null}\n </FormikInputSmartSelectStyled>\n )\n}\n","import React, { useRef, useState } from 'react'\nimport { BsQuestionCircle } from 'react-icons/bs'\nimport { ImCopy } from 'react-icons/im'\nimport ReactTooltip from 'react-tooltip'\nimport {\n InputWrapper,\n IconWrapper,\n InputField,\n CopyText,\n LabelWrapper,\n} from './styled'\n\ninterface Props {\n label?: string\n inputValue?: string\n tooltip?: string\n docUrl?: string\n linkKey?: string\n}\n\nexport const InputAutoSelectCopy: React.FC<Props> = ({\n label,\n inputValue,\n tooltip,\n docUrl,\n linkKey,\n ...props\n}) => {\n const inputRef = useRef<HTMLInputElement | null>(null)\n const [isCopied, setIsCopied] = useState(false)\n\n const handleCopyLink = () => {\n inputRef?.current?.select()\n document.execCommand('copy')\n setIsCopied(true)\n }\n\n return (\n <InputWrapper>\n <LabelWrapper>\n {label && <label>{label}</label>}\n {docUrl && (\n <a href={docUrl} target={'_blank'} rel={'noopener noreferrer'}>\n {linkKey}\n </a>\n )}\n </LabelWrapper>\n <InputField>\n <ReactTooltip\n id='url'\n place='top'\n type={'light'}\n effect='solid'\n className='customTooltipInput'\n >\n {inputValue}\n </ReactTooltip>\n <input\n data-tip\n data-for='url'\n ref={inputRef}\n type='text'\n value={inputValue}\n readOnly\n onClick={handleCopyLink}\n {...props}\n />\n <IconWrapper>\n {tooltip ? (\n <ReactTooltip\n id='url-info'\n place='bottom'\n type={'light'}\n effect='solid'\n className='customTooltipIcon'\n >\n {tooltip}\n </ReactTooltip>\n ) : null}\n <BsQuestionCircle size={20} data-tip data-for='url-info' />\n <ImCopy size={20} onClick={handleCopyLink} />\n </IconWrapper>\n </InputField>\n {isCopied && <CopyText>Copied</CopyText>}\n </InputWrapper>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\n\nimport {\n PanelPopupBody,\n PanelPopupButtonClose,\n PanelPopupContent,\n PanelPopupHeader,\n PanelPopupImageWrapper,\n PanelPopupStyled,\n PanelPopupWrapper,\n} from './styled'\nimport { useTranslation } from 'react-i18next'\nimport { IoCloseOutline } from 'react-icons/io5'\n\nexport interface PanelPopupProps {\n image?: string\n dismissable?: boolean\n onClose?: () => void\n content?: React.ReactNode\n position?: 'floating' | 'bottom'\n}\n\nexport const PanelPopup: React.VFC<PanelPopupProps> = ({\n image,\n content,\n onClose,\n dismissable,\n position,\n}) => {\n const { t } = useTranslation()\n const [isVisible, setIsVisible] = useState(false)\n const timeoutId = useRef<NodeJS.Timeout>()\n\n useEffect(() => {\n timeoutId.current = setTimeout(() => {\n setIsVisible(true)\n }, 1)\n\n return () => {\n if (timeoutId.current) {\n clearTimeout(timeoutId.current)\n }\n }\n }, [])\n\n return (\n <PanelPopupStyled\n position={position || 'floating'}\n className={isVisible ? 'visible' : ''}\n >\n <PanelPopupWrapper>\n <PanelPopupHeader>\n {dismissable ? (\n <PanelPopupButtonClose\n onClick={() => {\n if (onClose) {\n onClose()\n }\n }}\n >\n <IoCloseOutline /> {t('common.close')}\n </PanelPopupButtonClose>\n ) : null}\n </PanelPopupHeader>\n\n <PanelPopupBody>\n <PanelPopupContent>{content}</PanelPopupContent>\n {image ? (\n <PanelPopupImageWrapper>\n <img src={image} />\n </PanelPopupImageWrapper>\n ) : null}\n </PanelPopupBody>\n </PanelPopupWrapper>\n </PanelPopupStyled>\n )\n}\n","import React, { createContext, useEffect, useRef, useState } from 'react'\nimport {\n PanelBody,\n PanelBodyInner,\n PanelFooter,\n PanelFooterContainer,\n PanelFooterLeft,\n PanelFooterRight,\n PanelFooterWrapper,\n PanelHead,\n PanelStyled,\n PanelWrapper,\n} from './styled'\nimport { PanelPopup, PanelPopupProps } from '@components/PanelPopup'\nimport { ProgressBar } from '@components/Panel/ProgressBar'\n\ninterface PanelPopupContext {\n popup?: PanelPopupProps\n sendPopup?: (popup?: PanelPopupProps) => void\n}\n\nexport const PanelPopupContext = createContext<PanelPopupContext>({})\n\ninterface PanelProps {\n head?: React.ReactNode\n body?: React.ReactNode\n progressBarPercentage?: number\n footer?: {\n left?: React.ReactNode\n right?: React.ReactNode\n } | null\n}\n\nexport const Panel: React.FC<PanelProps> = ({\n head,\n body,\n footer,\n progressBarPercentage,\n}) => {\n const [popup, setPopup] = useState<PanelPopupProps | undefined>()\n const [bodyPaddingBottom, setBodyPaddingBottom] = useState<number>()\n\n const bodyOuterRef = useRef<HTMLDivElement | null>(null)\n const bodyInnerRef = useRef<HTMLDivElement | null>(null)\n const footerRef = useRef<HTMLDivElement | null>(null)\n\n // when bodyInner has scroll, we set a top seprator for footer\n const bodyOuterHeight = bodyOuterRef.current?.clientHeight\n const bodyInnerHeight = bodyInnerRef.current?.clientHeight\n const footerHasTopSeparator =\n bodyOuterHeight && bodyInnerHeight\n ? bodyInnerHeight > bodyOuterHeight\n : false\n\n // To avoid that footer will overlaps body content we set a padding bottom equal to footer height\n useEffect(() => {\n if (footerRef.current) {\n setBodyPaddingBottom(footerRef.current?.clientHeight)\n }\n }, [footerRef])\n\n return (\n <PanelPopupContext.Provider\n value={{\n popup,\n sendPopup: setPopup,\n }}\n >\n <PanelStyled extraPadding={Boolean(footer)}>\n <PanelWrapper>\n {progressBarPercentage ? (\n <ProgressBar percentage={progressBarPercentage} />\n ) : null}\n {head ? (\n <PanelHead>{head}</PanelHead>\n ) : (\n // in case of no head we keep some top space\n <div style={{ paddingTop: '0' }} />\n )}\n {body || footer ? (\n <PanelBody\n $hasExtraTopPadding={!head}\n ref={bodyOuterRef}\n $panelHasHead={!!head}\n >\n <PanelBodyInner\n ref={bodyInnerRef}\n paddingBottom={footer ? bodyPaddingBottom : 0}\n >\n {body}\n </PanelBodyInner>\n </PanelBody>\n ) : null}\n </PanelWrapper>\n </PanelStyled>\n {/* footer */}\n {footer ? (\n <PanelFooter ref={footerRef}>\n <PanelFooterContainer $showTopSeparator={footerHasTopSeparator}>\n {popup ? (\n <PanelPopup\n {...popup}\n onClose={() => {\n setPopup(undefined)\n if (popup.onClose) {\n popup.onClose()\n }\n }}\n />\n ) : null}\n\n <PanelFooterWrapper>\n <PanelFooterLeft>{footer.left}</PanelFooterLeft>\n <PanelFooterRight>{footer.right}</PanelFooterRight>\n </PanelFooterWrapper>\n </PanelFooterContainer>\n </PanelFooter>\n ) : null}\n </PanelPopupContext.Provider>\n )\n}\n","import React, { useEffect } from 'react'\n\ntype WindowWithGrecaptchh = Window &\n typeof globalThis & {\n grecaptcha: any\n }\n\nexport type GetCaptchaToken = () => Promise<string | undefined>\n\ninterface Props {\n children: (renderProps: {\n getCaptchaToken: GetCaptchaToken\n }) => React.ReactNode\n}\n\nconst googleReCaptchaKey = process.env.REACT_GOOGLE_RECAPTCHA_KEY || ''\n\nexport const ReCaptcha: React.VFC<Props> = ({ children }) => {\n // we generate the token everytime a child component calls this method\n const getCaptchaToken: GetCaptchaToken = async () => {\n if (!googleReCaptchaKey) {\n return 'recaptcha-not-enabled'\n }\n\n const w = window as WindowWithGrecaptchh\n if (!w.grecaptcha) {\n console.log('recaptcha lib not found')\n return\n }\n\n try {\n const token: string = await w.grecaptcha.execute(\n `${process.env.REACT_GOOGLE_RECAPTCHA_KEY}`,\n {\n action: 'submit',\n }\n )\n return token\n } catch (e: any) {\n console.log(e, e.message)\n return 'cannot-retrieve-recaptcha-token'\n }\n }\n\n useEffect(() => {\n if (!googleReCaptchaKey) {\n return\n }\n\n if (document.getElementById('google-recaptcha')) {\n console.log('Captcha script exists already')\n return\n }\n\n // Inject recaptcha script in DOM\n const script = document.createElement('script')\n script.src = `https://www.google.com/recaptcha/api.js?render=${googleReCaptchaKey}`\n script.id = 'google-recaptcha'\n document.body.appendChild(script)\n\n // cleanup function to remove script on component unmount\n return () => {\n const googleScript = document.getElementById('google-recaptcha')\n // remove element in DOM\n document.querySelector('.grecaptcha-badge')?.remove()\n if (googleScript) {\n googleScript.remove()\n }\n }\n }, [])\n\n return <>{children({ getCaptchaToken })}</>\n}\n","import React from 'react'\nimport { Trans } from 'react-i18next'\n\ninterface Props {\n i18nKey: string\n values?: Record<string, string | number>\n count?: number\n}\n\nexport const Translate: React.FC<Props> = ({ i18nKey, values, count }) => {\n return (\n <Trans\n i18nKey={i18nKey as never}\n components={{\n b: <strong />,\n strong: <strong />,\n a: <a />,\n br: <br />,\n }}\n values={values}\n count={count}\n />\n )\n}\n","import React, { Fragment } from 'react'\nimport { PageEditor } from '@app/layouts/PageEditor'\nimport { Formik, Form, FormikHelpers } from 'formik'\nimport { Panel } from '@components/Panel'\nimport { FormInner } from './FormInner'\nimport { SignupSurveyFormValues } from 'SignupSurvey'\nimport { initialValues, makeValidationSchema } from './formUtils'\nimport { useTranslation } from 'react-i18next'\nimport { AppLogos, BbuData } from '@features/SignupSurvey/AppLogos'\n\ninterface Props {\n bbuData?: BbuData\n onSubmit: (\n values: SignupSurveyFormValues,\n formikHelpers: FormikHelpers<SignupSurveyFormValues>\n ) => void\n}\n\nexport const SignupSurvey: React.VFC<Props> = ({ bbuData, onSubmit }) => {\n const { t } = useTranslation()\n const steps = [\n {\n title: t('auth.signupSurvey.stepName'),\n label: t('auth.signupSurvey.stepName'),\n },\n {},\n {},\n ]\n\n return (\n <Formik\n initialValues={initialValues}\n validationSchema={makeValidationSchema(t)}\n onSubmit={(values, formikHelpers) => {\n onSubmit(values, formikHelpers)\n }}\n >\n {() => {\n return (\n <Fragment>\n <PageEditor steps={steps} activeStep={0} hasTopBar>\n <Form>\n <Panel\n head={bbuData && <AppLogos bbuData={bbuData} />}\n body={<FormInner />}\n />\n </Form>\n </PageEditor>\n </Fragment>\n )\n }}\n </Formik>\n )\n}\n","import React, { lazy, Suspense } from 'react'\nimport { useGetUserInfo } from '@app/api/getUserInfo'\nimport { Route, Switch } from 'react-router-dom'\nimport { appRoutes } from '@app/routes'\n\nconst InfoBarComponentLazy = lazy(() => import('./InfoBarComponent'))\n\nconst SuperUserInfoBarWithQuery: React.VFC = () => {\n const { data: userData } = useGetUserInfo()\n\n if (userData?.user && userData?.superUser?.email) {\n return (\n <Suspense fallback={null}>\n <InfoBarComponentLazy\n fullName={`${userData.user.firstName} ${userData.user.lastName}`}\n email={userData.user.email || ''}\n />\n </Suspense>\n )\n }\n\n return null\n}\n\n// In case we are in logout path we can't load the SuperUserInfoBarWithQuery\n// because it will call `useGetUserInfo` (user/me) api that will generate an endless loop\n// `user/me` returns 401 -> redirect to logout -> calls user/me again -> 401 -> new redirection\nexport const SuperUserInfoBar: React.VFC = () => {\n return (\n <Switch>\n <Route path={appRoutes.logout.path}>\n <div />\n </Route>\n <Route path='/*' exact>\n <SuperUserInfoBarWithQuery />\n </Route>\n </Switch>\n )\n}\n","import React from 'react'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { useTranslation } from 'react-i18next'\nimport { MdMode } from 'react-icons/md'\nimport { ApiBillingInfo, ApiUserInfo } from 'BackendApi'\nimport { BillingDetailsStyled, ButtonWrapper } from './styled'\n\ninterface Props {\n billingInfo?: ApiBillingInfo | undefined\n onEditRequest: () => void\n userInfo: ApiUserInfo\n}\n\nexport const BillingDetails: React.FC<Props> = ({\n billingInfo,\n onEditRequest,\n userInfo,\n}) => {\n const { t } = useTranslation()\n\n const {\n companyName,\n country = '',\n state = '',\n zip = '',\n phone,\n } = billingInfo ?? {}\n\n const displayInfo = {\n name: companyName || `${userInfo.firstName} ${userInfo.lastName}`,\n address: [country, state, zip].filter(Boolean).join(', '),\n phone,\n }\n\n return (\n <>\n <BillingDetailsStyled>\n <div>\n <p>{displayInfo.name}</p>\n <p>{displayInfo.address.trim()}</p>\n <p>{displayInfo.phone}</p>\n </div>\n </BillingDetailsStyled>\n <ButtonWrapper>\n <MdMode size={24} color={'#41a6dc'} />\n <Button\n style={{ margin: '0', padding: '1rem 0.5rem' }}\n onClick={() => {\n onEditRequest()\n }}\n $variant={'link-primary'}\n $size={'large'}\n >\n {t('billing.payment.editBilling')}\n </Button>\n </ButtonWrapper>\n </>\n )\n}\n","import { Form, Formik } from 'formik'\nimport React, { useEffect, useState } from 'react'\nimport {\n BillingFormValues,\n statesValidationSchema,\n validationSchema,\n} from '@features/billing/BillingBox/formConfig'\nimport { FormikInputField } from '@components/Formik/FormikInputField'\nimport { FormikInputCheckbox } from '@components/Formik/FormikInputCheckbox'\nimport { FormikInputSelect } from '@components/Formik/FormikInputSelect'\nimport { SyncValuesWithParent } from '@features/billing/BillingBox/SyncValuesWithParent'\nimport { BillingDetails } from '@features/billing/BillingBox/BillingDetails'\n\nimport {\n CustomInputField,\n FormInputGroup,\n WrapperInputCheckbox,\n Wrapper,\n InputWrapper,\n} from './styled'\nimport { useGetCountries } from '@app/api/getCountries'\nimport { useGetStates } from '@app/api/getStates'\nimport { ApiUserInfo } from 'BackendApi'\nimport { FormikInputSmartSelect } from '@components/Formik/FormikInputSmartSelect'\n\ninterface Props {\n initialFormValues: BillingFormValues\n onValuesChange: (newValues: BillingFormValues, isValid: boolean) => void\n isDataEmpty: boolean\n userInfo: ApiUserInfo\n onStripeSubmit: boolean\n}\n\nexport const BillingBox: React.FC<Props> = ({\n initialFormValues,\n onValuesChange,\n isDataEmpty,\n userInfo,\n onStripeSubmit,\n}) => {\n const [isAddingNewInfo, setIsAddingNewInfo] = useState(false)\n const [countryCode, setCountryCode] = useState(initialFormValues.country)\n const [noCompany, setNoCompany] = useState(initialFormValues.noCompany)\n const [validation, setValidation] = useState(validationSchema)\n\n const handleValues = (newValues: BillingFormValues) => {\n setNoCompany(newValues.noCompany)\n setCountryCode(newValues.country)\n }\n\n const {\n data: countries,\n isLoading: isLoadingCountries,\n error: countriesError,\n } = useGetCountries()\n\n const {\n data: states,\n refetch: refetchStates,\n isLoading: isLoadingStates,\n error: statesError,\n remove: removeData,\n } = useGetStates(countryCode || ' ')\n\n useEffect(() => {\n if (isDataEmpty) {\n setIsAddingNewInfo(true)\n }\n }, [isDataEmpty])\n\n useEffect(() => {\n refetchStates()\n }, [countryCode])\n\n return (\n <Wrapper>\n {isAddingNewInfo ? (\n <Formik\n initialValues={initialFormValues}\n validationSchema={validation}\n validateOnChange\n validateOnBlur\n onSubmit={async () => {\n // No submit needed , we pass sync values to parent\n }}\n >\n {(formikProps) => {\n const isCountryStates = formikProps.values.country === 'US'\n\n return (\n <Form>\n <SyncValuesWithParent\n onStripeSubmit={onStripeSubmit}\n onValuesChange={(newValues, isValid) => {\n if (newValues.noCompany) {\n formikProps.setFieldValue('companyName', '')\n }\n if (newValues.country === 'US') {\n setValidation(statesValidationSchema)\n } else {\n setValidation(validationSchema)\n formikProps.setFieldValue('state', '')\n }\n handleValues(newValues)\n onValuesChange(newValues, isValid)\n }}\n />\n <CustomInputField\n name={'companyName'}\n type={'text'}\n label={'Company Name'}\n disabled={noCompany}\n />\n <WrapperInputCheckbox>\n <FormikInputCheckbox name={'noCompany'}>\n I'm not a company\n </FormikInputCheckbox>\n </WrapperInputCheckbox>\n <InputWrapper>\n <FormikInputField\n type={'tel'}\n name={'phone'}\n label={'Phone (with prefix)'}\n style={{ backgroundColor: '#ededee' }}\n />\n </InputWrapper>\n <FormInputGroup twoColumns={!isCountryStates}>\n <InputWrapper>\n <FormikInputSmartSelect\n initialValues={\n (countries || []).map((item) => ({\n value: item.id,\n label: item.text,\n })) || []\n }\n name={'country'}\n label={'Country'}\n secondaryStyles\n noIcon\n isClearable={false}\n />\n </InputWrapper>\n {isCountryStates ? (\n <InputWrapper>\n <FormikInputSelect\n $optionsLabel={\n !states?.length || !isCountryStates\n ? undefined\n : 'State'\n }\n name={'state'}\n $options={\n !isCountryStates\n ? []\n : (states || []).map((item) => ({\n value: item.id,\n label: item.id,\n }))\n }\n $label={'State'}\n style={{ backgroundColor: '#ededee' }}\n disabled={!states?.length || !isCountryStates}\n />\n </InputWrapper>\n ) : null}\n\n <InputWrapper>\n <FormikInputField\n type={'text'}\n name={'zip'}\n label={'Zip'}\n style={{ backgroundColor: '#ededee' }}\n />\n </InputWrapper>\n </FormInputGroup>\n </Form>\n )\n }}\n </Formik>\n ) : (\n <BillingDetails\n billingInfo={initialFormValues}\n onEditRequest={() => setIsAddingNewInfo(true)}\n userInfo={userInfo}\n />\n )}\n </Wrapper>\n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport { ReactComponent as CardBoxImage } from '@assets/images/card_payments.svg'\nimport { SecurePaymentLogo } from './SecurePaymentLogo'\n\nexport const Wrapper = styled.div<{ hasPadding?: boolean }>`\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: space-between;\n align-items: stretch;\n border-radius: 8px;\n gap: 2rem;\n background: transparent;\n\n padding: ${({ hasPadding }) => (hasPadding ? '1rem' : '0')};\n @media (min-width: 500px) {\n padding: ${({ hasPadding }) => (hasPadding ? '2rem' : '0')};\n }\n\n .full-width {\n width: 100%;\n }\n\n h2 {\n font-size: 1.7rem;\n margin-bottom: 2rem;\n }\n`\n\nconst CardInfo = styled.div`\n flex: 1;\n`\nconst CardBoxASideWrapper = styled.div`\n width: 30%;\n text-align: center;\n\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n @media (max-width: 600px) {\n display: none;\n }\n`\nconst CardBoxASideImageWrapper = styled.div`\n svg {\n display: block;\n width: 75%;\n height: auto;\n }\n`\n\ninterface Props {\n showSecurePaymentLogo?: boolean\n title?: string\n hasPadding?: boolean\n}\n\nexport const BoxWrapperWithSideImage: React.FC<Props> = ({\n children,\n showSecurePaymentLogo,\n title,\n hasPadding,\n}) => {\n return (\n <Wrapper hasPadding={hasPadding}>\n <CardInfo>\n {title && <h2>{title}</h2>}\n {children}\n </CardInfo>\n <CardBoxASideWrapper>\n <CardBoxASideImageWrapper>\n <CardBoxImage />\n </CardBoxASideImageWrapper>\n {showSecurePaymentLogo && <SecurePaymentLogo />}\n </CardBoxASideWrapper>\n </Wrapper>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { CardDetails } from '@features/billing/CreditCardBox/CardDetails'\nimport { BoxWrapperWithSideImage } from '@features/billing/CreditCardBox/BoxWrapperWithSideImage'\nimport { StripePaymentProvider } from '@features/billing/stripe/StripePaymentProvider'\nimport { StripeForm } from '@features/billing/stripe/StripeForm'\nimport { CreditCardSubmitButtons } from '@features/billing/stripe/CreditCardSubmitButtons'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { useStoreCreditCard } from '@app/api/postCreditCard'\nimport { sendToast } from '@app/store/actions/ApplicationConfigurationActions'\nimport { parseApiError } from '@app/api/utils/error'\nimport { useAppDispatch } from '@app/store/hooks'\nimport { useGetUserInfo } from '@app/api/getUserInfo'\nimport { useTranslation } from 'react-i18next'\nimport { Loader } from '@components/Basic/Loader'\nimport styled from 'styled-components'\nimport { BsCreditCard2Back } from 'react-icons/bs'\nimport { trackEvent } from '@app/dataTracking'\nimport { makePricingTrackingStep } from '@app/dataTracking/utils'\n\nexport type CreditCardItem = {\n fullName?: string\n number: string\n expiration: string\n logoUri?: string\n}\n\nconst ButtonWrapper = styled.div`\n position: relative;\n\n svg {\n position: absolute;\n z-index: 100;\n top: 50%;\n left: 8%;\n transform: translate(-50%, -50%);\n }\n`\n\nexport const CreditCardBox: React.FC = () => {\n const [isAddingNewCard, setIsAddingNewCard] = useState(false)\n const dispatch = useAppDispatch()\n const { t } = useTranslation()\n\n const {\n data: userData,\n isLoading: isLoadingUser,\n refetch: refetchUserInfo,\n } = useGetUserInfo()\n const userBillingInfo = userData?.pricing\n\n const cards: CreditCardItem[] = (\n userBillingInfo && userBillingInfo.creditCard\n ? [\n {\n fullName: userBillingInfo.creditCardOwner || 'Saved card',\n number: userBillingInfo.creditCard,\n expiration: userBillingInfo.creditCardExpiration,\n },\n ]\n : []\n ).filter((card) => card.number && card.number !== 'N/A')\n\n const {\n mutate: storeCreditCardMutation,\n error: errorStoreCreditCard,\n isLoading: storeLoadingStateCreditCard,\n } = useStoreCreditCard()\n\n const storeCreditCard = (creditCardToken: string) => {\n storeCreditCardMutation(\n { creditCardToken },\n {\n onSuccess: () => {\n refetchUserInfo()\n setIsAddingNewCard(false)\n },\n }\n )\n }\n\n // on error\n useEffect(() => {\n if (errorStoreCreditCard) {\n const parsedError = parseApiError(errorStoreCreditCard)\n dispatch(\n sendToast({\n title: 'Error',\n message: parsedError.message,\n color: 'negative',\n })\n )\n\n trackEvent({\n eventName: 'UnexpectedErrorThrown',\n feature: 'Pricing',\n step: makePricingTrackingStep(location.pathname),\n params: {\n custom: {\n errorCode: parsedError.code,\n errorDescription: parsedError.message,\n },\n },\n sendEventToIntercom: true,\n })\n }\n }, [errorStoreCreditCard])\n\n return isLoadingUser ? (\n <div>\n <Loader $active $dimmer $size={'large'} />\n </div>\n ) : isAddingNewCard ? (\n <StripePaymentProvider>\n <StripeForm onCreditCardTokenRetrieved={storeCreditCard}>\n {({ isLoading }) => (\n <CreditCardSubmitButtons\n isLoading={isLoading || storeLoadingStateCreditCard}\n onCancelRequest={() => {\n setIsAddingNewCard(false)\n }}\n />\n )}\n </StripeForm>\n </StripePaymentProvider>\n ) : (\n <BoxWrapperWithSideImage\n hasPadding\n title={t('billing.payment.creditCardBoxTitle')}\n >\n {cards && cards.length ? (\n cards.map((card, idx) => (\n <CardDetails\n key={idx}\n card={cards[0]}\n onEditCardRequest={() => {\n setIsAddingNewCard(true)\n }}\n />\n ))\n ) : (\n <div>\n <p>{t('billing.payment.noPaymentMethods')}</p>\n <ButtonWrapper>\n <BsCreditCard2Back color={'#fff'} />\n <Button\n onClick={() => {\n setIsAddingNewCard(true)\n }}\n $variant={'action'}\n $size={'large'}\n $fluid\n style={{ maxWidth: '270px' }}\n >\n {t('billing.payment.addCard')}\n </Button>\n </ButtonWrapper>\n </div>\n )}\n </BoxWrapperWithSideImage>\n )\n}\n","import React from 'react'\nimport {\n CheckoutPrePrice,\n CeckoutTotalPrice,\n CheckoutTrialLimitsDisclaimer,\n} from './styled'\nimport { CheckoutTitle } from '@features/checkout/CheckoutTitle'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { useTranslation } from 'react-i18next'\n\ninterface Props {\n amountToPay: string\n buttonLabel: string\n billingCircle: string\n nextInvoiceAmount?: string\n nextBillingDate?: string\n onSubmit?: () => void\n isLoading?: boolean\n isTrialAvailable?: boolean\n isProrated?: boolean\n}\n\nexport const CheckoutFooter: React.FC<Props> = ({\n billingCircle,\n nextBillingDate,\n amountToPay,\n buttonLabel,\n onSubmit,\n isLoading,\n isTrialAvailable,\n nextInvoiceAmount,\n isProrated,\n}) => {\n const { t } = useTranslation()\n return (\n <>\n {isTrialAvailable || isProrated ? (\n <CheckoutPrePrice data-id={'checkout-pre-price'}>\n <p>{t('billing.checkout.paymentOnDate', { nextBillingDate })}</p>\n <p className={'text-right'}>\n <b>{nextInvoiceAmount}</b>\n <span style={{ opacity: 0.5 }}> {`per ${billingCircle}`}</span>\n </p>\n </CheckoutPrePrice>\n ) : null}\n {isTrialAvailable ? (\n <CheckoutTrialLimitsDisclaimer>\n {t('billing.checkout.trialLimitDisclaimer')}\n </CheckoutTrialLimitsDisclaimer>\n ) : null}\n <hr style={{ margin: '20px 0' }} />\n <CeckoutTotalPrice data-id={'checkout-total-price'}>\n <CheckoutTitle>{t('billing.checkout.todayYouPay')}</CheckoutTitle>\n <p>{amountToPay}</p>\n </CeckoutTotalPrice>\n <Button\n type={onSubmit ? 'button' : 'submit'}\n $size={'large'}\n $variant={'blue'}\n $loading={isLoading}\n disabled={isLoading}\n onClick={() => {\n if (onSubmit) {\n onSubmit()\n }\n }}\n >\n {buttonLabel}\n </Button>\n </>\n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport { FiChevronDown, FiChevronUp } from 'react-icons/fi'\n\ninterface CheckoutTitleProps {\n onClick?: () => void\n isOpen?: boolean\n}\n\nconst CheckoutTitleWrapper = styled.div<{ isClickable?: boolean }>`\n display: inline-block;\n cursor: ${({ isClickable }) => (isClickable ? 'pointer' : 'default')};\n`\n\nconst TitleStyled = styled.div`\n display: flex;\n align-items: center;\n\n h2 {\n margin: 0 12px 0 0;\n font-size: 1rem;\n font-weight: 600;\n }\n`\n\nexport const CheckoutTitle: React.FC<CheckoutTitleProps> = ({\n onClick,\n isOpen = false,\n children,\n}) => {\n return (\n <CheckoutTitleWrapper onClick={onClick} isClickable={!!onClick}>\n <TitleStyled>\n <h2>{children}</h2>\n {isOpen && onClick ? (\n <FiChevronUp />\n ) : !isOpen && onClick ? (\n <FiChevronDown />\n ) : null}\n </TitleStyled>\n </CheckoutTitleWrapper>\n )\n}\n","import React, { useEffect } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { PageEditor } from '@app/layouts/PageEditor'\nimport { Panel } from '@components/Panel'\nimport { makeGoogleAccountSteps } from '@features/googleAdsAccount/utils'\nimport { PanelBody } from '@features/googleAdsAccount/AccountActivate/PanelBody'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { appRoutes } from '@app/routes'\nimport { useHistory } from 'react-router-dom'\nimport { trackEvent } from '@app/dataTracking'\n\ninterface AccountActivateProps {\n billingData: number\n handlePollingState: (state: boolean) => void\n}\nexport const AccountActivate: React.FC<AccountActivateProps> = ({\n billingData,\n handlePollingState,\n}) => {\n const { t } = useTranslation()\n const steps = makeGoogleAccountSteps(1)\n const history = useHistory()\n const customerId = window.localStorage.getItem('customerId') || ''\n\n useEffect(() => {\n if (billingData === 2) {\n handlePollingState(false)\n trackEvent({\n eventName: 'GaacBillingAdded',\n feature: 'GAAC',\n step: 'Activate',\n params: {\n custom: {\n customerId,\n },\n },\n })\n history.push(appRoutes.googleAdsAccountConnect.makeUrl())\n }\n }, [billingData])\n return (\n <PageEditor\n steps={steps}\n activeStep={1}\n topbarValue={t('gaac.topbarTitle')}\n hasTopBar\n backlink={{\n url: '/app/googleAdsAccounts',\n label: t('gaac.topbarExitButton'),\n }}\n >\n <Panel body={<PanelBody />} />\n </PageEditor>\n )\n}\n","import React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { PageEditor } from '@app/layouts/PageEditor'\nimport { Panel } from '@components/Panel'\nimport { makeGoogleAccountSteps } from '@features/googleAdsAccount/utils'\nimport { PanelBody } from '@features/googleAdsAccount/AccountConnect/PanelBody'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { useHistory } from 'react-router-dom'\n\nexport const AccountConnect: React.FC = () => {\n const { t } = useTranslation()\n const steps = makeGoogleAccountSteps(2)\n const history = useHistory()\n return (\n <PageEditor\n steps={steps}\n activeStep={2}\n topbarValue={t('gaac.topbarTitle')}\n hasTopBar\n backlink={{\n url: '/app/googleAdsAccounts',\n label: t('gaac.topbarExitButton'),\n }}\n >\n <Panel\n body={<PanelBody />}\n footer={{\n left: null,\n right: (\n <a href={'/app/bridges'}>\n <Button\n data-testid='connect_later_btn'\n type={'submit'}\n $variant={'link-primary'}\n >\n {t('gaac.steps.stepConnect.buttonConnectLater')}\n </Button>\n </a>\n ),\n }}\n />\n </PageEditor>\n )\n}\n","import React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { PageEditor } from '@app/layouts/PageEditor'\nimport { Panel } from '@components/Panel'\nimport { makeGoogleAccountSteps } from '@features/googleAdsAccount/utils'\nimport { PanelBody } from '@features/googleAdsAccount/AccountCreationDone/PanelBody'\nimport { useHistory, useLocation } from 'react-router-dom'\n\nexport const AccountCreationDone: React.FC = () => {\n const { t } = useTranslation()\n const steps = makeGoogleAccountSteps(0)\n const history = useHistory()\n const location = useLocation()\n\n return (\n <PageEditor\n steps={steps}\n activeStep={0}\n topbarValue={t('gaac.topbarTitle')}\n hasTopBar\n backlink={{\n url: '/app/googleAdsAccounts',\n label: t('gaac.topbarExitButton'),\n }}\n >\n <Panel body={<PanelBody />} />\n </PageEditor>\n )\n}\n","import { FormikInputField } from '@components/Formik/FormikInputField'\nimport React from 'react'\nimport { FormikInputSelect } from '@components/Formik/FormikInputSelect'\nimport {\n AccountCreationFormWrapperStyled,\n AccountCreationInputGroup,\n IntegrationLogoWrapper,\n} from './styled'\nimport { useGetCurrencies } from '@app/api/getCurrencies'\nimport { useGetTimezones } from '@app/api/getTimezones'\nimport { useTranslation } from 'react-i18next'\nimport { FormikInputSmartSelect } from '@components/Formik/FormikInputSmartSelect'\nimport { useFormikContext } from 'formik'\nimport { IntegrationLogo } from '@features/googleAdsAccount/AccountActivate/styled'\nimport googleAdsLogo from '@assets/images/gads-logo_2.svg'\n\nexport const AccountCreationFormInner: React.FC = () => {\n const { t } = useTranslation()\n const { values } = useFormikContext()\n\n const { data: currenciesData, isLoading: isLoadingCurrencies } =\n useGetCurrencies()\n const { data: timezonesData, isLoading: isLoadingTimezones } =\n useGetTimezones()\n\n return (\n <>\n <IntegrationLogoWrapper>\n <IntegrationLogo>\n <img src={googleAdsLogo} alt={'logo'} width={170} />\n </IntegrationLogo>\n <h2>{t('gaac.steps.stepCreate.title')}</h2>\n </IntegrationLogoWrapper>\n\n <AccountCreationFormWrapperStyled>\n <AccountCreationInputGroup>\n <FormikInputField\n data-testid='display_name_input'\n label={t('gaac.steps.stepCreate.labelFullname')}\n name={'fullname'}\n type={'text'}\n />\n <FormikInputField\n data-testid='email_input'\n label={t('gaac.steps.stepCreate.labelEmail')}\n name={'email'}\n type={'text'}\n />\n </AccountCreationInputGroup>\n <AccountCreationInputGroup>\n <FormikInputSmartSelect\n initialValues={currenciesData || []}\n name={'currency'}\n label={t('gaac.steps.stepCreate.labelCurrency')}\n isLoading={isLoadingCurrencies}\n />\n <FormikInputSmartSelect\n initialValues={timezonesData || []}\n name={'timezone'}\n label={t('gaac.steps.stepCreate.labelTimezone')}\n isLoading={isLoadingTimezones}\n />\n </AccountCreationInputGroup>\n </AccountCreationFormWrapperStyled>\n </>\n )\n}\n","import React, { Fragment } from 'react'\nimport { Formik, Form, FormikHelpers } from 'formik'\nimport { useTranslation } from 'react-i18next'\nimport { PageEditor } from '@app/layouts/PageEditor'\nimport { Panel } from '@components/Panel'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { makeGoogleAccountSteps } from '@features/googleAdsAccount/utils'\nimport { AccountCreationFormInner } from '@features/googleAdsAccount/AccountCreationFormInner'\nimport { useHistory } from 'react-router-dom'\nimport { GoogleAdsAccountFormValues } from 'GoogleAdsAccount'\nimport { googleAdsAccountFormValidationSchema } from '@features/googleAdsAccount/AccountCreationForm/validation'\n\ninterface StepAccountConnectProps {\n initialValues: GoogleAdsAccountFormValues\n onSubmit: (\n formValues: GoogleAdsAccountFormValues,\n formikHelpers: FormikHelpers<GoogleAdsAccountFormValues>\n ) => void\n isSavingApi?: boolean\n}\n\nexport const AccountCreationForm: React.FC<StepAccountConnectProps> = ({\n initialValues,\n onSubmit,\n isSavingApi,\n}) => {\n const { t } = useTranslation()\n const steps = makeGoogleAccountSteps(0)\n const history = useHistory()\n return (\n <Formik\n initialValues={initialValues}\n validationSchema={googleAdsAccountFormValidationSchema}\n enableReinitialize={true}\n validateOnMount\n onSubmit={(values, formikHelpers) => {\n onSubmit(values, formikHelpers)\n }}\n >\n {(formikProps) => {\n // here we handle all cases where button is disabled\n\n return (\n <Fragment>\n <PageEditor\n steps={steps}\n activeStep={0}\n topbarValue={t('gaac.topbarTitle')}\n hasTopBar\n backlink={{\n url: '/app/googleAdsAccounts',\n label: t('gaac.topbarExitButton'),\n }}\n >\n <Form>\n <Panel\n body={<AccountCreationFormInner />}\n footer={{\n left: null,\n right: (\n <Button\n type={'submit'}\n $loading={isSavingApi}\n disabled={!formikProps.isValid || isSavingApi}\n data-testid={'create_btn'}\n $variant={'primary'}\n >\n {t('common.continue')}\n </Button>\n ),\n }}\n />\n </Form>\n </PageEditor>\n </Fragment>\n )\n }}\n </Formik>\n )\n}\n","import React, { useState } from 'react'\nimport {\n IntegrationPanelStyled,\n IntegrationPanelBody,\n IntegrationPanelHead,\n IntegrationPanelWrapper,\n PanelHeadLeft,\n PanelHeadRight,\n PanelHeadTitle,\n IntegrationPanelFooter,\n ButtonGroup,\n PanelHeadRightLink,\n} from './styled'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { FaChevronUp } from 'react-icons/fa'\nimport ReactTooltip from 'react-tooltip'\nimport { Checkbox } from '@components/Form/Checkbox'\n\nexport interface IntegrationPanelBodyProps {\n $open: boolean\n}\ninterface Props {\n integrationLogo: string\n panelTitle: string\n isTosAccepted?: boolean\n btnMoreUrl?: string\n panelDescription?: string\n btnPrimaryLabel?: string\n btnPrimaryLink?: string\n isbtnPrimaryAccordion?: boolean\n btnLinkLabel?: string\n btnLinkUrl?: string\n accordionButtonLabel?: string\n accordionButtonUrl?: string\n closeTooltipText?: string\n handleAction?: (status: string) => void\n children?: React.ReactNode\n testIdPrimaryButton?: string\n testIdLinkButton?: string\n testIdPolicyButton?: string\n accordionCheckboxLabel?: string\n}\nexport const IntegrationPanel: React.FC<Props> = ({\n integrationLogo,\n isTosAccepted,\n panelTitle,\n panelDescription,\n btnPrimaryLabel,\n btnPrimaryLink,\n isbtnPrimaryAccordion,\n btnLinkLabel,\n btnLinkUrl,\n accordionButtonLabel,\n accordionButtonUrl,\n closeTooltipText,\n handleAction,\n children,\n testIdPrimaryButton,\n testIdLinkButton,\n testIdPolicyButton,\n accordionCheckboxLabel,\n}) => {\n const [open, setOpen] = useState(false)\n\n return (\n <IntegrationPanelStyled>\n <IntegrationPanelWrapper>\n <IntegrationPanelHead>\n <PanelHeadLeft>\n <div>\n <img src={integrationLogo} width={30} />\n {panelTitle ? (\n <PanelHeadTitle>{panelTitle}</PanelHeadTitle>\n ) : null}\n </div>\n {panelDescription ? <div>{panelDescription}</div> : null}\n </PanelHeadLeft>\n <PanelHeadRight>\n {isbtnPrimaryAccordion && btnPrimaryLabel ? (\n <ButtonGroup>\n <ReactTooltip effect='solid' id='panel-integration-chevron'>\n {closeTooltipText}\n </ReactTooltip>\n {open ? (\n <div style={{ textAlign: 'center' }}>\n <FaChevronUp\n data-tip=''\n data-for='panel-integration-chevron'\n data-place='top'\n onClick={() => setOpen(!open)}\n style={{\n cursor: 'pointer',\n }}\n />\n </div>\n ) : (\n <Button\n $variant={'primary'}\n onClick={() => {\n setOpen(!open)\n }}\n disabled={open}\n >\n {btnPrimaryLabel}\n </Button>\n )}\n </ButtonGroup>\n ) : btnPrimaryLink && btnPrimaryLabel ? (\n <a rel='noreferrer' target={'_blank'} href={btnPrimaryLink}>\n <Button data-testid={testIdPrimaryButton} $variant={'primary'}>\n {btnPrimaryLabel}\n </Button>\n </a>\n ) : null}\n <PanelHeadRightLink\n data-testid={testIdLinkButton}\n target={'_blank'}\n href={btnLinkUrl}\n rel='noreferrer'\n >\n {btnLinkLabel}\n </PanelHeadRightLink>\n </PanelHeadRight>\n </IntegrationPanelHead>\n {isbtnPrimaryAccordion ? (\n <IntegrationPanelBody $open={open}>\n <IntegrationPanelFooter>\n <Checkbox\n data-testid={testIdPolicyButton}\n name={'tos'}\n onChange={() => {\n if (handleAction) {\n handleAction(status)\n }\n }}\n checked={isTosAccepted}\n >\n {accordionCheckboxLabel}\n </Checkbox>\n\n {accordionButtonLabel ? (\n <a target={'_blank'} rel='noreferrer' href={accordionButtonUrl}>\n <Button\n data-testid={testIdPrimaryButton}\n disabled={!isTosAccepted}\n $variant={'primary'}\n >\n {accordionButtonLabel}\n </Button>\n </a>\n ) : null}\n </IntegrationPanelFooter>\n </IntegrationPanelBody>\n ) : null}\n </IntegrationPanelWrapper>\n {children}\n </IntegrationPanelStyled>\n )\n}\n","import React, { Fragment, useState } from 'react'\nimport { Formik, Form } from 'formik'\nimport styled from 'styled-components'\nimport { BridgeFormValues } from 'Nbee'\nimport { FormInner } from './FormInner'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { PageEditor } from '@app/layouts/PageEditor'\nimport { Panel } from '@components/Panel'\nimport { useTranslation } from 'react-i18next'\nimport { validateBridgeChooserForm } from './validation'\nimport { isInIframe } from '@app/utils/isInFrame'\nimport { AppCombination } from '@features/nbee/AppCombination'\nimport { useFetchPopularConnections } from '@app/api/getPopularConnections'\nimport { ApiConnection } from 'BackendApi'\nimport { Loader } from '@components/Basic/Loader'\n\nconst CombinationsWrapper = styled.div`\n position: relative;\n margin-top: 4rem;\n\n h3 {\n font-size: 1.1rem;\n }\n`\n\ninterface SimpleBridgeBuilderFormProps {\n initialValues: BridgeFormValues\n onSubmit: (formValues: BridgeFormValues) => void\n}\n\nexport const BridgeChooserForm: React.FC<SimpleBridgeBuilderFormProps> = ({\n initialValues,\n onSubmit,\n}) => {\n const { t } = useTranslation()\n const isEmbedded = isInIframe()\n\n const [initialData, setInitialData] =\n useState<BridgeFormValues>(initialValues)\n\n /* const { data: popularConnections, isLoading: isLoadingConnections } =\n useFetchPopularConnections() */\n\n const handleClick = (appCombination: ApiConnection) => {\n setInitialData({\n ...initialValues,\n source: { appId: appCombination.source.id },\n destination: { appId: appCombination.destination.id },\n })\n }\n\n return (\n <Formik\n initialValues={initialData}\n validate={validateBridgeChooserForm}\n validateOnMount\n enableReinitialize={true}\n onSubmit={(values) => {\n onSubmit(values)\n }}\n >\n {(formikProps) => {\n return (\n <Fragment>\n <PageEditor\n formikContext={formikProps}\n pageTitle={t('nbee.bridgeChooser.title')}\n hasTopBar={!isEmbedded}\n backlink={{\n url: '/bridges',\n label: t('nbee.bridgeBuilder.exitNbee'),\n }}\n >\n <Form>\n <Panel\n body={\n <>\n <FormInner />\n {/* <CombinationsWrapper>\n <h3>\n {t('nbee.bridgeChooser.popularCombinationsTitle')}\n </h3>\n {isLoadingConnections ? (\n <div style={{ height: '5rem' }}>\n <Loader $dimmer $active />\n </div>\n ) : (\n popularConnections?.data?.connections &&\n popularConnections.data.connections.map(\n (item, index) => (\n <AppCombination\n key={index}\n appConnection={item}\n handleClick={handleClick}\n />\n )\n )\n )}\n </CombinationsWrapper> */}\n </>\n }\n footer={{\n left: null,\n right: (\n <>\n <Button\n type={'submit'}\n $variant={'primary'}\n disabled={\n formikProps.isSubmitting || !formikProps.isValid\n }\n $loading={formikProps.isSubmitting}\n $loadingText={'Checking...'}\n $minWidth\n >\n {t('common.continue')}\n </Button>\n </>\n ),\n }}\n />\n </Form>\n </PageEditor>\n </Fragment>\n )\n }}\n </Formik>\n )\n}\n","import React, { useEffect } from 'react'\nimport { useCheckAppsCompatibility } from '@app/api/checkAppsCompatibility'\nimport { LoadingStep } from '@features/nbee/LoadingStep'\nimport { Redirect, useHistory, useParams } from 'react-router-dom'\nimport { BridgeChooserStep2RouteParams } from 'LeadsBridgeApp'\nimport { appRoutes } from '@app/routes'\n\nexport const BridgeChooserRedirector: React.VFC = () => {\n const urlParams = useParams<BridgeChooserStep2RouteParams>()\n const history = useHistory()\n\n const sourceAppId = parseInt(urlParams.sourceAppId, 10)\n const destinationAppId = parseInt(urlParams.destinationAppId, 10)\n\n const {\n data: appCompatibilityCheck,\n isLoading: isCheckingAppsCompatibility,\n } = useCheckAppsCompatibility(sourceAppId, destinationAppId)\n\n const obeUri = appCompatibilityCheck?.combination.obeUri\n const nbeeUri = appCompatibilityCheck?.combination.nbeeUri\n\n useEffect(() => {\n if (obeUri && !nbeeUri) {\n window.location.href = obeUri\n } else if ((!obeUri && nbeeUri) || (obeUri && nbeeUri)) {\n // if we only have nbeeUri, or if we both have obeUri and nbeeUri,\n // we want to redirect the user directly to NBEE and never display the chooser.\n history.push(nbeeUri)\n }\n }, [obeUri, nbeeUri])\n\n if (appCompatibilityCheck?.combination.compatibility === 'none') {\n return <Redirect to={appRoutes.nbeeBridgeChooserStep1.makeUrl()} />\n }\n\n return isCheckingAppsCompatibility || !nbeeUri ? <LoadingStep /> : null\n}\n","import React from 'react'\nimport { useFormikContext } from 'formik'\nimport { BridgeFormValues, EmailReceiptSettings } from 'Nbee'\nimport { emailReceiptValidationSchema } from '@features/nbee/EmailReceipt/validation'\nimport { FormInner } from '@features/nbee/EmailReceipt/FormInner'\nimport { FeatureNotAvailable } from '@features/nbee/EmailReceipt/FeatureNotAvailable'\nimport { minimumPlanName } from '@features/nbee/FieldsMappingForm'\nimport { StarterLabel } from '@features/nbee/AddFilterButton/styled'\nimport { FaLock } from 'react-icons/fa'\nimport { EmailReceiptStyled } from '@features/nbee/EmailReceipt/styled'\nimport { useUpdateBridgeToPricing } from '@features/nbee/utils'\nimport { ApiUserModuleItem, ApiUser } from 'BackendApi'\n\ninterface Props {\n bridgeId?: string | number\n emailReceiptUserModule?: ApiUserModuleItem\n userData?: ApiUser\n}\n\nexport const EmailReceipt: React.VFC<Props> = ({\n bridgeId,\n emailReceiptUserModule,\n userData,\n}) => {\n const { values, setValues, isValid, isSubmitting, errors } =\n useFormikContext<BridgeFormValues>()\n\n const isBridgeEnabled = values?.ui?.isBridgeEnabled\n const { TitleWrapper, IconLockWrapper } = EmailReceiptStyled\n\n const moduleReceiptId = emailReceiptUserModule?.id\n\n const userEmail = userData?.user.email ? [userData?.user.email] : []\n\n const isAvailableToUser = Boolean(emailReceiptUserModule?.enabled)\n const minimumPlanRequired = emailReceiptUserModule?.minimumPlan\n\n const updateBridgeToPricing = useUpdateBridgeToPricing(\n bridgeId,\n moduleReceiptId,\n minimumPlanRequired\n )\n\n const planLabelName = minimumPlanRequired\n ? minimumPlanName[minimumPlanRequired.toString()].toUpperCase()\n : ''\n\n const settings = values?.settings\n const emailReceiptRecipients = settings?.emailReceipt?.recipients || []\n const userDefaultRecipients =\n emailReceiptUserModule?.userDefaults.recipients || []\n\n const recipients =\n emailReceiptRecipients.length > 0\n ? emailReceiptRecipients\n : userDefaultRecipients.length > 0\n ? userDefaultRecipients\n : userEmail\n\n const initialValues: EmailReceiptSettings = {\n active:\n settings?.emailReceipt?.active ??\n emailReceiptUserModule?.userDefaults.active ??\n false,\n recipients: recipients || [],\n subject:\n settings?.emailReceipt?.subject ||\n emailReceiptUserModule?.userDefaults.subject ||\n 'New Lead',\n canShow: values.settings?.emailReceipt?.canShow ?? false, // canShow value is in Formik context due to useHandleAppsCompatibility hook result\n }\n\n const isEmailReceiptCompatible = values?.settings?.emailReceipt?.canShow\n\n const canShowEmailReceipt =\n initialValues &&\n isEmailReceiptCompatible &&\n isValid &&\n !isSubmitting &&\n Object.keys(errors).length === 0\n\n const handleSaveSettings = (emailReceiptValues: EmailReceiptSettings) => {\n setValues({\n ...values,\n settings: {\n emailReceipt: {\n ...values.settings?.emailReceipt,\n ...emailReceiptValues,\n },\n },\n })\n }\n\n return canShowEmailReceipt ? (\n <div style={{ marginTop: '3rem' }}>\n <TitleWrapper>\n <h2 style={{ margin: '0 1rem 1rem 0' }}>Email Receipt</h2>\n <IconLockWrapper>\n {!isAvailableToUser && (\n <StarterLabel small onClick={() => updateBridgeToPricing()}>\n <FaLock /> {planLabelName}\n </StarterLabel>\n )}\n </IconLockWrapper>\n </TitleWrapper>\n\n {isAvailableToUser || initialValues.active ? (\n <FormInner\n isBridgeEnabled={isBridgeEnabled}\n handleSubmit={handleSaveSettings}\n initialValues={initialValues}\n />\n ) : (\n <FeatureNotAvailable\n moduleReceiptId={moduleReceiptId}\n requiredLbPlanId={minimumPlanRequired}\n bridgeId={bridgeId}\n />\n )}\n </div>\n ) : null\n}\n","import React from 'react'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport NoResults from '@assets/images/illustrations/nbee-no-results.svg'\nimport styled from 'styled-components'\nimport { useTranslation } from 'react-i18next'\n\ninterface Props {\n onResetFilterRequest: () => void\n isFiltered?: boolean\n}\n\nconst Wrapper = styled.div`\n width: 80%;\n margin: 0 auto;\n padding-top: 2rem;\n display: flex;\n text-align: center;\n flex-direction: column;\n align-items: center;\n & > *:not(:last-child) {\n margin-bottom: 2rem;\n }\n`\n\nconst Text = styled.div`\n font-weight: 600;\n`\n\nconst Image = styled.img`\n max-width: 100%;\n width: 200px;\n`\n\nexport const FieldMappingEmptyState: React.VFC<Props> = ({\n onResetFilterRequest,\n isFiltered,\n}) => {\n const { t } = useTranslation()\n\n return (\n <Wrapper>\n <Text>\n {isFiltered\n ? t('nbee.fieldsMapping.noFieldsFoundForFilters')\n : t('nbee.fieldsMapping.noFieldsFound')}\n </Text>\n <Image src={NoResults} alt={t('nbee.fieldsMapping.noFieldsFound')} />\n {isFiltered ? (\n <Button\n type={'button'}\n $variant={'filter'}\n onClick={onResetFilterRequest}\n >\n {t('nbee.fieldsMapping.resetFilters')}\n </Button>\n ) : null}\n </Wrapper>\n )\n}\n","import { SelectValueMulti } from '@components/Form/MultiCreatableCustom'\nimport { ApiFormulasSchemaResponseData, ApiUserModuleItem } from 'BackendApi'\n\nexport interface RowProps {\n index: number\n selectOptions: SelectValueMulti[]\n formulaUserModule?: ApiUserModuleItem | undefined\n showWelcomeMessage?: boolean\n formulaSchema?: ApiFormulasSchemaResponseData[]\n sourceLogoUri?: string\n onRedirectToPricing?: (redirect: boolean) => void\n}\n\ntype ErrorObject = {\n [key: string]: any\n}\n\n// function to flatten the hasError object and extract the errors from the params\nexport const flattenErrors = (errorObject: ErrorObject): string[] => {\n return Object.entries(errorObject).reduce(\n (messages: string[], [key, value]) => {\n if (typeof value === 'object') {\n // when we have a formula,\n // checks if we need to retrieve the error message\n // from the values in the param array\n const subErrors = flattenErrors(value as ErrorObject)\n return [...messages, ...subErrors]\n } else {\n return [...messages, value as string]\n }\n },\n []\n )\n}\n","import React, { useState, useEffect, Fragment } from 'react'\nimport { useField, useFormikContext } from 'formik'\nimport { useTranslation } from 'react-i18next'\n\nimport {\n BridgeFormValues,\n MappedField,\n MappedFieldFormula,\n MappedFieldMapping,\n} from 'Nbee'\n\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { Loader } from '@components/Basic/Loader'\nimport { Modal } from '@components/Basic/Modal'\nimport { InputField } from '@app/components/Form/InputField'\nimport {\n InputSmartSelect,\n SelectValue,\n} from '@components/Form/InputSmartSelect'\nimport { InputSmartCreatableSelect } from '@app/components/Form/InputSmartSelect/Creatable'\n\nimport {\n FormulaModalBody,\n FormulaModalCloseIcon,\n FormulaModalFooter,\n FormulaModalHeader,\n FormulaModalHero,\n FormulaModalWrapper,\n} from '@features/nbee/FieldsMappingForm/FormulaModal/styled'\nimport { IoCloseOutline } from 'react-icons/io5'\n\nimport { useGetSingleFormulaSchema } from '@app/api/getSingleFormulaSchema'\n\ninterface ModalProps {\n selectedMapping?: MappedFieldMapping\n isOpen: boolean\n onCloseModal: (formula: MappedFieldFormula) => void\n sourceFieldOptions?: SelectValue[] | []\n index: number\n}\n\nexport const FormulaModal: React.FC<ModalProps> = ({\n selectedMapping,\n isOpen,\n onCloseModal,\n sourceFieldOptions,\n index,\n}) => {\n const mappingId = selectedMapping?.id\n const formulaId = selectedMapping?.formula?.id\n const isNew = selectedMapping?.formula?.isNew\n const modalTitle = isNew ? 'Add' : 'Edit'\n\n const { t } = useTranslation()\n\n // Extract information from Formik context\n const { values } = useFormikContext<BridgeFormValues>()\n\n const fieldName = `fieldsMapping.${index}`\n const [field, meta, helpers] = useField<MappedField>(fieldName)\n\n const currentFieldValue = field.value\n const currentFieldMappingWithFormula = field.value.mapping.find(\n (m) => m.formula && m.id === mappingId // Matches the mapping ID\n )\n\n // Now you can access the formula and its params directly\n const currentFieldFormula = currentFieldMappingWithFormula?.formula\n const currentFieldFormulaParams = currentFieldFormula?.params\n\n // Create a temporary state to not save immediately in Formik context\n const [formulaTemporaryState, setFormulaTemporaryState] =\n useState<MappedFieldFormula>(currentFieldFormula as MappedFieldFormula)\n\n // Disable submit button if there are errors in the form\n const [isSubmitButtonDisabled, setIsSubmitButtonDisabled] =\n useState<boolean>(false)\n\n // Retrieve single formula schema, passing bridge ID and formula ID\n const { data: singleFormulaSchema, isLoading: isGettingSingleFormulaSchema } =\n useGetSingleFormulaSchema(`${values.ui?.bridgeId}`, formulaId)\n\n // Memoize formula name, formula description and param title to avoid re-rendering\n const formulaName = React.useMemo(\n () =>\n singleFormulaSchema && singleFormulaSchema.data.length\n ? `${singleFormulaSchema?.data[0]?.category} >> ${t(\n `nbee.formulas.${singleFormulaSchema?.data[0]?.id}.Name` as any\n )}`\n : undefined,\n [t, singleFormulaSchema]\n )\n const formulaDescription = React.useMemo(\n () =>\n singleFormulaSchema\n ? t(\n `nbee.formulas.${singleFormulaSchema?.data[0]?.id}.Description` as any\n )\n : undefined,\n [t, singleFormulaSchema]\n )\n const getParamDescription = React.useMemo(\n () => (paramId: string) =>\n t(\n `nbee.formulas.${singleFormulaSchema?.data[0]?.id}.Params.${paramId}` as any\n ),\n [t, singleFormulaSchema]\n )\n\n const singleFormulaSchemaParams = singleFormulaSchema?.data[0]?.params || []\n\n // if there are no params in the formik context it's because we've just changed the formula.\n // in that case, we need to load in the state the params of the new formula\n useEffect(() => {\n if (singleFormulaSchema && !currentFieldFormulaParams?.length) {\n setFormulaTemporaryState({\n ...(currentFieldFormula as MappedFieldFormula),\n params:\n singleFormulaSchema?.data[0]?.params?.map((p, index) => {\n return {\n ...p,\n required: p.type === 'field' && index === 0,\n }\n }) || [],\n })\n } else if (singleFormulaSchema && currentFieldFormulaParams?.length) {\n // otherwise, we need to update the state with the params of the formik context\n setFormulaTemporaryState({\n ...(currentFieldFormula as MappedFieldFormula),\n params:\n currentFieldFormulaParams?.map((p) => ({\n ...p,\n values: p.values,\n required: p.type === 'field' && index === 0,\n })) || [],\n })\n }\n }, [singleFormulaSchema])\n\n const handleValueChange = (\n paramId: string,\n value: string | string[] | number\n ) => {\n if (!formulaTemporaryState) {\n return undefined\n }\n\n const updatedFormula: MappedFieldFormula = {\n id: formulaTemporaryState.id,\n params: [...formulaTemporaryState?.params] || [],\n }\n const paramIndex = updatedFormula.params.findIndex((p) => p.id === paramId)\n if (paramIndex >= 0) {\n updatedFormula.params[paramIndex].values = value as string | string[]\n }\n\n // Handle field value change and update state, not formik context\n setFormulaTemporaryState(updatedFormula)\n }\n\n const getOptionsForSelectDropdown = (paramId: string) => {\n const selectedParam = singleFormulaSchema?.data[0]?.params?.find(\n (p) => p.id === paramId\n )\n if (Array.isArray(selectedParam?.values) && selectedParam?.values) {\n return selectedParam?.values.map(\n (v) => ({ value: v, label: v } as SelectValue)\n )\n } else {\n return []\n }\n }\n\n const getDefaultValueForSelect = (paramId: string) => {\n if (formulaTemporaryState?.isNew) return undefined\n if (!formulaTemporaryState?.params || !sourceFieldOptions) return undefined\n\n const selectedParam = formulaTemporaryState?.params.find(\n (p) => p.id === paramId\n )\n if (!selectedParam) {\n return undefined\n }\n if (selectedParam.type === 'field') {\n return sourceFieldOptions.find(\n (option) => option.value === selectedParam.values\n )\n }\n if (selectedParam.type === 'dropdown') {\n const dropdownOptions = getOptionsForSelectDropdown(paramId)\n let defaultValue = dropdownOptions?.find(\n (option) => option.value === selectedParam.values\n )\n if (defaultValue === undefined && dropdownOptions.length > 0) {\n defaultValue = {\n value: dropdownOptions[0].value,\n label: dropdownOptions[0].value,\n } as SelectValue\n handleValueChange(paramId, dropdownOptions[0].value)\n }\n\n return defaultValue\n }\n }\n\n const getDefaultValueForCreatableSelect = (paramId: string) => {\n if (!formulaTemporaryState?.params?.length) {\n return undefined\n }\n const selectedParam = formulaTemporaryState?.params.find(\n (p) => p.id === paramId\n )\n return (selectedParam?.values as string[]) || []\n }\n\n const transformFieldId = (paramId?: string): string | null => {\n if (!paramId) return null\n\n return paramId\n .toLowerCase()\n .replace(/_/g, ' ')\n .replace(/field\\.(\\d+)/gi, (_, num) => `Field ${Number(num) + 1}`)\n .replace(/\\b(\\w)/g, (char) => char.toUpperCase())\n }\n\n // Handle submit button disabled state\n useEffect(() => {\n if (isGettingSingleFormulaSchema) {\n setIsSubmitButtonDisabled(true)\n }\n if (!formulaTemporaryState?.params[0]?.values) {\n setIsSubmitButtonDisabled(true)\n } else {\n setIsSubmitButtonDisabled(false)\n }\n }, [formulaTemporaryState])\n\n const handleAbort = () => {\n // Find the index of the mapping formula to reset\n const mappingIndex = currentFieldValue.mapping.findIndex(\n (m) => m.id === mappingId\n )\n\n if (mappingIndex !== -1 && isNew) {\n // Remove the mapping formula from the array only when it's a new formula\n const newMappings = currentFieldValue.mapping.filter(\n (m, i) => i !== mappingIndex\n )\n\n // Update the MappedField with the modified mappings\n helpers.setValue({\n ...currentFieldValue,\n mapping: newMappings,\n })\n }\n // if we're editing an existing formula, don't do anything\n\n onCloseModal(currentFieldFormula as MappedFieldFormula)\n }\n\n const handleSubmit = () => {\n // Create a new mapping array by mapping over the currentFieldValue.mapping\n const updatedMapping = currentFieldValue.mapping.map((mapping) => {\n // Check if the current mapping is the one being edited (matched by mappingId)\n if (mapping.id === mappingId) {\n // If it is, return a new mapping object with the updated formulaTemporaryState\n return {\n ...mapping,\n formula: { ...formulaTemporaryState, isNew: false },\n }\n }\n // For all other mappings, return them unchanged\n return mapping\n })\n\n // Set the updated mapping array back into the Formik state\n helpers.setValue({\n ...currentFieldValue,\n mapping: updatedMapping,\n })\n\n // Close the modal and pass the updated formula back as a confirmation (if needed)\n onCloseModal(formulaTemporaryState)\n }\n\n return (\n <Modal\n noPadding\n isOpen={isOpen}\n onCloseModal={() =>\n onCloseModal(currentFieldFormula as MappedFieldFormula)\n }\n >\n {isGettingSingleFormulaSchema && (\n <Loader $active $dimmer $text='Populating fields...' />\n )}\n\n <FormulaModalWrapper>\n <FormulaModalHeader>\n <div>\n <h3>\n {modalTitle} {(formulaName && formulaName.toUpperCase()) || ''}\n </h3>\n <FormulaModalHero>\n <small>{formulaDescription}</small>\n </FormulaModalHero>\n </div>\n <FormulaModalCloseIcon onClick={handleAbort}>\n <IoCloseOutline />\n </FormulaModalCloseIcon>\n </FormulaModalHeader>\n\n <FormulaModalBody>\n {singleFormulaSchemaParams &&\n singleFormulaSchemaParams.map((param) => (\n <Fragment key={`${param.id}-${isOpen ? 'open' : 'closed'}`}>\n <div style={{ marginTop: '.6rem' }}>\n <h5>{transformFieldId(param?.id)}</h5>\n <small\n style={{\n display: 'inline-block',\n maxWidth: '40rem',\n wordWrap: 'break-word',\n }}\n >\n {getParamDescription(param.id)}\n </small>\n </div>\n <div style={{ margin: '.6rem 0' }}>\n {formulaTemporaryState ? (\n param.type === 'field' ? (\n <InputSmartSelect\n initialValues={sourceFieldOptions || []}\n defaultValue={getDefaultValueForSelect(param.id)}\n onSelect={(selectedValue) => {\n const singleValue = selectedValue as SelectValue\n if (singleValue) {\n handleValueChange(param.id, singleValue.value)\n }\n }}\n upDownIconsStyle\n isClearable\n />\n ) : param.type === 'dropdown' ? (\n <InputSmartSelect\n initialValues={getOptionsForSelectDropdown(param.id)}\n defaultValue={getDefaultValueForSelect(param.id)}\n onSelect={(selectedValue) => {\n const singleValue = selectedValue as SelectValue\n if (singleValue) {\n handleValueChange(param.id, singleValue.value)\n }\n }}\n upDownIconsStyle\n isClearable\n />\n ) : param.type === 'text' ||\n param.type === 'char' ||\n param.type === 'int' ? (\n <InputField\n name={`${param.id}`}\n type={'text'}\n maxLength={param.type === 'char' ? 1 : undefined}\n value={\n (formulaTemporaryState &&\n formulaTemporaryState?.params.find(\n (p) => p.id === param.id\n )?.values) ||\n ''\n }\n onChange={(e) =>\n handleValueChange(param.id, e.target.value)\n }\n />\n ) : param.type === 'tags' ? (\n <InputSmartCreatableSelect\n name={`${param.id}`}\n placeholder={''}\n defaultValue={getDefaultValueForCreatableSelect(\n param.id\n )}\n onSelect={(newValues) =>\n handleValueChange(param.id, newValues)\n }\n isClearable={false}\n />\n ) : null\n ) : null}\n </div>\n </Fragment>\n ))}\n </FormulaModalBody>\n\n <FormulaModalFooter>\n <Button type={'button'} $variant={'secondary'} onClick={handleAbort}>\n {'Abort'}\n </Button>\n <Button\n type={'button'}\n $variant={'primary'}\n onClick={handleSubmit}\n disabled={isSubmitButtonDisabled}\n >\n {'Confirm'}\n </Button>\n </FormulaModalFooter>\n </FormulaModalWrapper>\n </Modal>\n )\n}\n","import React, { useEffect } from 'react'\nimport { HeaderSearchComponent } from './HeaderSearchComponent'\nimport { useFormikContext } from 'formik'\nimport { App, BridgeFormValues } from 'Nbee'\nimport {\n isFieldMapped,\n isFieldUnmapped,\n} from '@features/nbee/FieldsMappingForm/utils'\nimport { WelcomeMessageProps } from '@features/nbee/FieldsMappingForm'\n\ninterface Props {\n sourceAppId?: number\n destinationAppId?: number\n totalFields: number\n mappedFields: number\n inputValue: string\n onInputChange: (value: string) => void\n showAllFields: boolean\n onShowAllFieldsRequest: (showAllFields: boolean) => void\n isInTestScreen?: boolean\n isReloadingAllBridgeFields: boolean\n onRefetchBridgeFieldRequest: () => void\n maxFields?: number\n welcomeMessageProps?: WelcomeMessageProps\n connectedApps: App[] | undefined\n}\n\nexport const HeaderSearch: React.FC<Props> = ({\n sourceAppId,\n destinationAppId,\n totalFields,\n inputValue,\n mappedFields,\n onInputChange,\n showAllFields,\n onShowAllFieldsRequest,\n isReloadingAllBridgeFields,\n onRefetchBridgeFieldRequest,\n isInTestScreen,\n maxFields,\n welcomeMessageProps,\n connectedApps,\n}) => {\n const sourceApp = (connectedApps || []).find((app) => app.id === sourceAppId)\n const destinationApp = (connectedApps || []).find(\n (app) => app.id === destinationAppId\n )\n\n const defaultTransparentPixel = `data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==`\n\n const sourceName = sourceApp?.name || ''\n const sourceLogoUri = sourceApp?.logoUriSmall || defaultTransparentPixel\n const destinationName = destinationApp?.name || ''\n const destinationLogoUri =\n destinationApp?.logoUriSmall || defaultTransparentPixel\n\n const { values, setFieldValue } = useFormikContext<BridgeFormValues>()\n // setting app names, it will be useful in case we need to access in other parts of the form (eg. tracking events)\n useEffect(() => {\n if (sourceName) {\n setFieldValue('ui.source.selectedAppName', sourceName)\n }\n if (destinationName) {\n setFieldValue('ui.destination.selectedAppName', destinationName)\n }\n }, [sourceName, destinationName])\n\n // show button logic\n const fieldsMappingValues = values.fieldsMapping || []\n\n const allAreMapped =\n fieldsMappingValues && fieldsMappingValues.length\n ? fieldsMappingValues.every(isFieldMapped)\n : false\n\n const allAreUnmapped =\n fieldsMappingValues && fieldsMappingValues.length\n ? fieldsMappingValues.every(isFieldUnmapped)\n : false\n\n // we show the button only when user is not typing in the search box or when there is something to toggle\n // when all fields are mapped or all is unmapped there is nothing to toggle\n const thereIsNothingToToggle = allAreMapped || allAreUnmapped\n const showFilterButton = inputValue ? false : !thereIsNothingToToggle\n\n useEffect(() => {\n // when we hide the button we need to be sure to show all fields\n if (!showFilterButton) {\n onShowAllFieldsRequest(true)\n }\n }, [showFilterButton])\n\n return (\n <HeaderSearchComponent\n totalFields={totalFields}\n mappedFields={mappedFields}\n sourceName={sourceName}\n sourceLogoUri={sourceLogoUri}\n destinationName={destinationName}\n destinationLogoUri={destinationLogoUri}\n onInputChange={onInputChange}\n inputValue={inputValue}\n showAllFields={showAllFields}\n onShowAllFieldsRequest={onShowAllFieldsRequest}\n isInTestScreen={isInTestScreen}\n showFilterButton={showFilterButton}\n isReloadingAllBridgeFields={isReloadingAllBridgeFields}\n onRefetchFieldRequest={onRefetchBridgeFieldRequest}\n isReadonlyModeEnabled={values.ui?.isBridgeEnabled}\n maxFields={maxFields}\n welcomeMessageProps={welcomeMessageProps}\n />\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { Modal } from '@components/Basic/Modal'\nimport { SelectValue } from '@components/Form/InputSmartSelect'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport {\n ApiBridgeFieldDefinition,\n ApiUserModuleItem,\n ApiBridgeFieldDefinitionType,\n ApiBridgeType,\n} from 'BackendApi'\nimport { BridgeFilterCondition } from 'Nbee'\nimport { usePostSaveBridgeFilterRules } from '@app/api/postSaveBridgeFilterRules'\nimport { Loader } from '@components/Basic/Loader'\nimport { FilterRuleRow } from '@features/nbee/AddFilterButton/AddFilterButtonModal/FilterRuleRow'\nimport { Panel } from '@components/Panel'\nimport { Trans, useTranslation } from 'react-i18next'\nimport { useGetFiltersSchema } from '@app/api/getFiltersSchema'\nimport { useDeleteBridgeFilterRules } from '@app/api/deleteBridgeFilterRules'\nimport { IoCloseOutline } from 'react-icons/io5'\nimport {\n FilterModalBody,\n FilterModalCloseIcon,\n FilterModalFooter,\n FilterModalHeader,\n FilterModalWrapper,\n} from '@features/nbee/AddFilterButton/styled'\n\nimport { FilterNotAvailablePage } from './FilterNotAvailablePage'\nimport { apiBridgeFieldTypes } from '@app/@typings/Api/bridgeFieldsArrayTypes'\n\ninterface ModalProps {\n isOpen: boolean\n onCloseModal: () => void\n sourceFields?: ApiBridgeFieldDefinition[] | []\n initialFilterRules?: BridgeFilterCondition[] | []\n modalTitle: string\n bridgeId: number\n onSaveOrDeleteFilterRules: (filterRules: BridgeFilterCondition[]) => void\n filterUserModules: ApiUserModuleItem | undefined\n isBridgeDisabled: boolean\n bridgeType?: ApiBridgeType\n}\n\nconst emptyFilterRule: BridgeFilterCondition = {\n type: '',\n values: '',\n operator: '',\n field: {\n id: '-1',\n label: '',\n },\n}\nexport const AddFilterButtonModal: React.FC<ModalProps> = ({\n isOpen,\n onCloseModal,\n sourceFields,\n initialFilterRules,\n modalTitle,\n bridgeId,\n onSaveOrDeleteFilterRules,\n filterUserModules,\n isBridgeDisabled,\n bridgeType,\n}) => {\n const { t } = useTranslation()\n // Retrieve filter schema\n const { data: filtersSchema, isLoading: isGettingFiltersSchema } =\n useGetFiltersSchema()\n const [allInputsEmpty, setAllInputsEmpty] = useState(false)\n\n // Save Filter\n const {\n mutate: saveBridgeFilterRules,\n isLoading: isSavingBridgeFilterRules,\n data: saveBridgeFilterRulesResult,\n } = usePostSaveBridgeFilterRules()\n\n const {\n mutate: deleteBridgeFilterRules,\n isLoading: isDeletingBridgeFilterRules,\n data: deleteBridgeFilterRulesResult,\n status: deleteBridgeFilterRulesStatus,\n } = useDeleteBridgeFilterRules()\n\n const userHasFiltersEnabled = filterUserModules?.enabled\n const minimumPlanRequired = filterUserModules?.minimumPlan\n\n // This state will contain the filter rules and will bind with the form displayed on screen.\n // The content of this state will also reflect the expected payload by BE.\n const [filterRules, setFilterRules] = useState<BridgeFilterCondition[]>([\n emptyFilterRule,\n ])\n\n // Loads existing filter rules into state, if any, when the component renders for the first time.\n useEffect(() => {\n if (initialFilterRules?.length) {\n setFilterRules(initialFilterRules)\n }\n }, [])\n\n // If there are no rules or if all rules were deleted, displays an empty rule.\n useEffect(() => {\n // Debugging console logs\n // console.log('filtersSchema', filtersSchema)\n // console.log('sourceFields', sourceFields)\n // console.log('initialFilterRules', initialFilterRules)\n // console.log('filterRules', filterRules)\n\n if (filterRules.length === 0) {\n setFilterRules([emptyFilterRule])\n }\n\n if (filterRules.length === 1 && filterRules[0].field.id === '-1') {\n setAllInputsEmpty(true)\n } else setAllInputsEmpty(false)\n }, [filterRules])\n\n // Adds a new rule\n const handleAddFilterRule = (idx: number) => {\n const newIndex = Math.min(\n idx !== undefined ? idx + 1 : filterRules.length,\n filterRules.length\n )\n const newFilterRules = [...filterRules]\n newFilterRules.splice(newIndex, 0, emptyFilterRule)\n setFilterRules(newFilterRules)\n }\n\n // Removes a rule\n const handleRemoveFilterRule = (idx: number) => {\n setFilterRules([\n ...filterRules.slice(0, idx),\n ...filterRules.slice(idx + 1),\n ])\n }\n\n // Deletes all rules\n const handleDeleteAllRules = () => {\n setFilterRules([])\n }\n\n // Copies an existing rule\n const handleCopyFilterRule = (idx: number) => {\n const newIndex =\n idx !== undefined && idx < filterRules.length\n ? idx + 1\n : filterRules.length\n const newFilterRules = [...filterRules]\n newFilterRules.splice(newIndex, 0, filterRules[idx])\n setFilterRules(newFilterRules)\n }\n\n // Triggers on the onSelect event for the first select (select field)\n\n /* `ApiBridgeFieldDefinitionType` is a TypeScript type and, unfortunately, there's no direct way to retrieve the values from a union type.\n Therefore, we need to declare the valid types manually in an array \"apiBridgeFieldTypes\".\n We then check if `selectedField?.type` is one of the valid types.\n If it is, we use `selectedField.type`, else we default to 'text'.\n */\n const handleFieldChange = (idx: number, { label }: SelectValue) => {\n const selectedField = sourceFields?.find((f) => f.label === label)\n\n const selectedFieldType = selectedField?.type\n ? apiBridgeFieldTypes.includes(\n selectedField.type as ApiBridgeFieldDefinitionType\n )\n ? selectedField.type\n : 'text'\n : ''\n\n setFilterRules((prevRules) => {\n const newRules = [...prevRules]\n newRules[idx] = {\n ...newRules[idx],\n field: {\n label: selectedField?.label || '',\n id: selectedField?.id || '-1',\n },\n type: selectedFieldType || 'text',\n operator: '',\n values: '',\n }\n return newRules\n })\n }\n\n // Triggers on the onSelect event for the second select (select operator)\n const handleOperatorChange = (idx: number, operator: string) => {\n const newRules = [...filterRules]\n newRules[idx] = { ...newRules[idx], operator: `${operator}`, values: '' }\n setFilterRules(newRules)\n }\n\n // Triggers on the change of input value for the third input (in case of text operators)\n const handleValueChange = (idx: number, value: string | string[] | []) => {\n setFilterRules((prevRules) => {\n const newRules = [...prevRules]\n newRules[idx] = {\n ...newRules[idx],\n values: value,\n }\n return newRules\n })\n }\n\n // Obtains the default value to display in the first select (select field) OR in the second select (select operator)\n const getDefaultSelectOption = (\n label: string,\n value: string,\n fieldId: string\n ) => {\n if (fieldId !== '-1') {\n return {\n label: `${label}`,\n value: `${value}`,\n }\n } else {\n return []\n }\n }\n\n // Obtains list of possible options for first select (select field)\n const getFieldsForSelect = (fields: ApiBridgeFieldDefinition[]) => {\n return (\n fields?.map((field) => ({\n value: field.label,\n label: field.label,\n })) || []\n )\n }\n\n // Obtains list of possible options for second select (select operator)\n const getOperatorsForSelect = (fieldType: string) => {\n const schemaEntry = filtersSchema?.data\n .find((entry) => entry.key === fieldType)\n ?.rules.map((operator) => {\n return {\n value: operator.type,\n label: operator.type\n .toLowerCase()\n .replace(/_/g, ' ')\n .replace(/\\b(\\w)/g, (char) => char.toUpperCase()),\n }\n })\n if (!schemaEntry) {\n return []\n } else {\n return schemaEntry\n }\n }\n\n // Obtains the type of input to use depending on the selected operator\n const getInputTypeForCondition = (rule: BridgeFilterCondition) => {\n return filtersSchema?.data\n .find((entry) => entry.key === rule.type)\n ?.rules.find((entry) => entry.type === rule.operator)?.value\n }\n\n // Determines whether there are rules with empty input fields (and the operator value is not 'disabled')\n const hasEmptyFilterRules: boolean = filterRules.some((rule) =>\n rule.field.id === '-1'\n ? false\n : rule.field.label === '' ||\n rule.operator === '' ||\n (filtersSchema?.data\n .find((entry) => entry.key === rule.type)\n ?.rules.find(\n (operatorRule) =>\n operatorRule.type === rule.operator &&\n operatorRule.value !== 'disabled'\n ) &&\n rule.values === '')\n )\n\n // Determines if there are two rules with the same field and the same operator\n /* const hasDuplicates =\n filterRules.length !==\n filterRules.filter((rule, index, self) => {\n const isUnique: boolean =\n self.findIndex(\n (r) => r.field.id === rule.field.id && r.operator === rule.operator\n ) === index\n return isUnique\n }).length */\n\n // Determines whether the submit button should be disabled\n const isSubmitButtonDisabled: boolean =\n hasEmptyFilterRules ||\n /* hasDuplicates || */\n isDeletingBridgeFilterRules ||\n isSavingBridgeFilterRules ||\n isGettingFiltersSchema ||\n isBridgeDisabled\n\n // Submits payload to API\n const handleSubmitSaveFilters = () => {\n // just close the modal if there are no existing nor new rules\n if (allInputsEmpty && !initialFilterRules?.length) {\n onCloseModal()\n return\n }\n // if there are existing rules, but all inputs are empty, delete all rules\n if (allInputsEmpty) {\n deleteBridgeFilterRules({ bridgeId })\n } else {\n // otherwise, save the rules\n const requestBody = {\n conditions: [...filterRules].filter(\n (el) => el.field.id !== '-1' // filters out rules that have empty field\n ),\n sourceFields: [...(sourceFields || [])],\n }\n saveBridgeFilterRules({ bridgeId, requestBody })\n }\n }\n\n useEffect(() => {\n if (\n saveBridgeFilterRulesResult ||\n deleteBridgeFilterRulesStatus === 'success'\n ) {\n const newFilterRules =\n saveBridgeFilterRulesResult?.data?.sourceFilters?.conditions || []\n onSaveOrDeleteFilterRules(newFilterRules)\n onCloseModal()\n }\n }, [saveBridgeFilterRulesResult, deleteBridgeFilterRulesResult])\n\n return (\n <Modal\n noPadding\n isOpen={isOpen}\n onCloseModal={onCloseModal}\n isTransparent={false}\n hideCloseButton={false}\n >\n {isGettingFiltersSchema ||\n isSavingBridgeFilterRules ||\n (isDeletingBridgeFilterRules && <Loader $active />)}\n\n <FilterModalWrapper>\n <FilterModalHeader>\n <h3>{modalTitle}</h3>\n <FilterModalCloseIcon onClick={onCloseModal}>\n <IoCloseOutline />\n </FilterModalCloseIcon>\n </FilterModalHeader>\n {(userHasFiltersEnabled && (\n <div>\n <p style={{ padding: '1rem 1.5rem 1.2rem 1.5rem', margin: 0 }}>\n <Trans\n ns={'all'}\n i18nKey={'nbee.filters.modalFiltersSubtitle'}\n components={{\n strong: <strong />,\n }}\n />\n </p>\n {bridgeType === 'Audience' && (\n <p style={{ padding: '0 1.5rem 0rem 1.5rem', margin: 0 }}>\n <Trans\n ns={'all'}\n i18nKey={'nbee.filters.warningHashedValues'}\n components={{\n strong: <strong />,\n }}\n />\n </p>\n )}\n </div>\n )) ||\n null}\n <FilterModalBody>\n <>\n {filterRules &&\n filterRules.length > 0 &&\n filterRules.map((filterRule, index) => (\n <FilterRuleRow\n key={`${index}|${filterRule.operator}|${filterRule.field.id}`}\n index={index}\n filterRule={filterRule}\n isDefaultValueNotInSourceAnymore={\n !sourceFields?.find(\n (el) => el.label === filterRule.field?.label\n )\n }\n fieldSelectDefaultValue={getDefaultSelectOption(\n filterRule.field?.label,\n filterRule.field?.label,\n filterRule.field?.id\n )}\n fieldSelectInitialValues={getFieldsForSelect(\n sourceFields ?? []\n )}\n onFieldChange={handleFieldChange}\n operatorSelectDefaultValue={getDefaultSelectOption(\n filterRule.operator\n .toLowerCase()\n .replace(/_/g, ' ')\n .replace(/\\b(\\w)/g, (char) => char.toUpperCase()),\n filterRule.operator,\n filterRule.field?.id\n )}\n operatorSelectInitialValues={getOperatorsForSelect(\n filterRule.type || 'text' // default value for field type should be 'text'\n )}\n onOperatorChange={handleOperatorChange}\n inputValueType={getInputTypeForCondition(filterRule)}\n onValueChange={handleValueChange}\n onCopyFilterRule={handleCopyFilterRule}\n onAddFilterRule={handleAddFilterRule}\n onRemoveFilterRule={handleRemoveFilterRule}\n isRemoveFilterRuleDisabled={filterRules.length === 1}\n isBridgeDisabled={isBridgeDisabled}\n />\n ))}\n </>\n </FilterModalBody>\n <FilterModalFooter>\n <Button\n onClick={() => handleDeleteAllRules()}\n type={'button'}\n $variant={'link-primary'}\n $size={'large'}\n data-testid='delete-all-rules-button'\n disabled={isBridgeDisabled}\n >\n Delete all rules\n </Button>\n <div style={{ display: 'flex', gap: '1rem' }}>\n <Button\n data-testid='cancel-filter-button'\n type={'button'}\n $variant={'secondary'}\n onClick={onCloseModal}\n >\n {'Cancel'}\n </Button>\n\n <Button\n data-testid='save-filter-button'\n type={'button'}\n $variant={'primary'}\n onClick={() => handleSubmitSaveFilters()}\n disabled={isSubmitButtonDisabled}\n data-tip\n data-for={'filter-disabled-button'}\n >\n {'Save Changes'}\n </Button>\n </div>\n </FilterModalFooter>\n </FilterModalWrapper>\n </Modal>\n )\n}\n","import React, { useState } from 'react'\nimport { BridgeFilterCondition } from 'Nbee'\nimport {\n ApiBridgeFieldDefinition,\n ApiBridgeType,\n ApiUserModuleItem,\n} from 'BackendApi'\nimport { Button } from '@components/Basic/ButtonNbe'\n\nimport {\n AddFilterButtonWrapper,\n ButtonStyledLabel,\n EditIcon,\n FilterIcon,\n HasFilterMessage,\n HasFilterMessageTitle,\n StarterLabel,\n} from './styled'\nimport { AddFilterButtonModal } from '@features/nbee/AddFilterButton/AddFilterButtonModal'\nimport { FaFilter, FaLock } from 'react-icons/fa'\nimport { useTranslation } from 'react-i18next'\nimport { minimumPlanName } from '@features/nbee/FieldsMappingForm'\nimport { useUpdateBridgeToPricing } from '@features/nbee/utils'\n\ninterface Props {\n initialFilterRules?: BridgeFilterCondition[]\n allSourceFields?: ApiBridgeFieldDefinition[]\n bridgeId: number\n onRefetchBridgeFormValues?: () => void\n isBridgeDisabled: boolean | undefined\n filterUserModules: ApiUserModuleItem | undefined\n bridgeType?: ApiBridgeType\n}\n\nexport const AddFilterButton: React.FC<Props> = ({\n initialFilterRules,\n allSourceFields,\n bridgeId,\n onRefetchBridgeFormValues,\n isBridgeDisabled,\n filterUserModules,\n bridgeType,\n}) => {\n // State variables and functions to handle modal display on page\n const [rules, setRules] = useState<BridgeFilterCondition[]>(\n initialFilterRules || []\n )\n\n const [isModalOpen, toggleIsModalOpen] = useState<boolean>(false)\n const userHasFiltersEnabled = filterUserModules?.enabled\n const minimumPlanRequired = filterUserModules?.minimumPlan\n const moduleFilterId = filterUserModules?.id\n\n const updateBridgeToPricing = useUpdateBridgeToPricing(\n bridgeId,\n moduleFilterId,\n minimumPlanRequired\n )\n\n const planLabelName = minimumPlanRequired\n ? minimumPlanName[minimumPlanRequired.toString()].toUpperCase()\n : ''\n\n const handleCloseModal = () => {\n toggleIsModalOpen(false)\n }\n const handleLabelUpdate = (newRules: BridgeFilterCondition[]) =>\n setRules(newRules)\n const { t } = useTranslation()\n\n // Helper variables to easily handle button label message\n const hasFilters = !!rules?.length\n const firstRule = rules?.[0]\n const firstRuleField = firstRule?.field.label\n const firstRuleCondition = firstRule?.operator\n .toLowerCase()\n .replace(/_/g, ' ')\n const firstRuleValue = firstRule?.values\n const otherRulesNumber = rules?.length && rules.length - 1\n const hasMoreThanOneRule = !!otherRulesNumber\n const hasTwoRules = rules?.length === 2\n const buttonLabel = hasFilters ? (\n isBridgeDisabled ? (\n <>{'Show Filter'}</>\n ) : (\n <>\n {t('nbee.filters.buttonHasFiltersTitle')}\n <EditIcon />\n </>\n )\n ) : (\n <> {t('nbee.filters.buttonNoFiltersTitle')}</>\n )\n\n const handleOpenModal = () => {\n if (userHasFiltersEnabled || (!userHasFiltersEnabled && hasFilters)) {\n toggleIsModalOpen(true)\n } else {\n // Redirect user to pricing page\n // if they do not have the 'filters' module\n updateBridgeToPricing()\n }\n }\n\n return (\n <>\n <AddFilterButtonWrapper>\n <FilterIcon hasFilters={hasFilters}>\n <FaFilter />\n </FilterIcon>\n {hasFilters && (\n <HasFilterMessage data-testid='add-filter-button-message'>\n <HasFilterMessageTitle>\n {t('nbee.filters.buttonHasFiltersMessageTitle')}\n </HasFilterMessageTitle>\n {t('nbee.filters.buttonHasFiltersMessageOneRule', {\n firstRuleField,\n firstRuleCondition,\n firstRuleValue,\n })}\n {hasMoreThanOneRule && (\n <span>\n {t('nbee.filters.buttonHasFiltersMessageMoreRules', {\n otherRulesNumber,\n })}\n {hasTwoRules ? '' : 's'}\n </span>\n )}\n </HasFilterMessage>\n )}\n <Button\n data-testid='add-filter-button'\n disabled={isBridgeDisabled && !hasFilters}\n type={'button'}\n $variant={'link-primary'}\n onClick={handleOpenModal}\n style={{ fontSize: '0.95em', paddingLeft: '0.2em' }}\n >\n <ButtonStyledLabel>\n {buttonLabel}{' '}\n {!userHasFiltersEnabled && (\n <StarterLabel>\n <FaLock /> {planLabelName}\n </StarterLabel>\n )}\n </ButtonStyledLabel>\n </Button>\n </AddFilterButtonWrapper>\n {isModalOpen && (\n <AddFilterButtonModal\n modalTitle={\n !hasFilters\n ? 'Add Filter'\n : isBridgeDisabled\n ? 'Show Filter'\n : 'Edit Filter'\n }\n bridgeType={bridgeType}\n isOpen={isModalOpen}\n onCloseModal={handleCloseModal}\n sourceFields={allSourceFields}\n initialFilterRules={rules}\n bridgeId={bridgeId}\n onSaveOrDeleteFilterRules={handleLabelUpdate}\n filterUserModules={filterUserModules}\n isBridgeDisabled={!!isBridgeDisabled}\n />\n )}\n </>\n )\n}\n","import React from 'react'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { useTranslation } from 'react-i18next'\nimport SuccessImage from '@assets/images/illustrations/field-mapping-test-success.svg'\nimport ErrorImage from '@assets/images/illustrations/field-mapping-test-error.svg'\nimport styled from 'styled-components'\nimport { useFormikContext } from 'formik'\nimport { BridgeFormValues } from 'Nbee'\n\ninterface Props {\n onBackToEditRequest: () => void\n onProceedRequest: () => void\n status: 'success' | 'error'\n debugUri?: string\n errorMessage?: string\n isBridgeEnabled: boolean\n}\n\nconst Wrapper = styled.div`\n max-width: 490px;\n margin: 2rem auto 0;\n text-align: center;\n`\n\nconst Image = styled.img`\n width: 250px;\n max-width: 100%;\n margin: 1rem auto;\n`\n\nconst ButtonWrapper = styled.div`\n display: flex;\n gap: 1rem;\n justify-content: center;\n padding: 2rem 3.5rem 0;\n button {\n flex: 1;\n }\n`\n\nexport const SendTestLeadFeedback: React.VFC<Props> = ({\n onBackToEditRequest,\n onProceedRequest,\n status,\n debugUri,\n errorMessage,\n isBridgeEnabled,\n}) => {\n const { t } = useTranslation()\n const { isSubmitting } = useFormikContext<BridgeFormValues>()\n\n return status === 'success' ? (\n <Wrapper>\n <h4>{t('nbee.fieldsMapping.testSuccessTitle')}</h4>\n {debugUri && (\n <div>\n <a\n style={{ display: 'inline-block' }}\n target={'_blank'}\n rel={'noopener noreferrer'}\n href={debugUri}\n >\n {t('nbee.fieldsMapping.testLeadDebugCta')}\n </a>\n </div>\n )}\n <Image\n src={SuccessImage}\n alt={t('nbee.fieldsMapping.testSuccessTitle')}\n />\n <ButtonWrapper>\n <Button\n type={'button'}\n $variant={'secondary'}\n onClick={onBackToEditRequest}\n disabled={isSubmitting}\n >\n {t('nbee.fieldsMapping.goBackToFieldsMapping')}\n </Button>\n\n <Button\n type={'button'}\n $variant={'primary'}\n onClick={onProceedRequest}\n disabled={isSubmitting}\n $loading={isSubmitting}\n >\n {!isBridgeEnabled\n ? t('nbee.fieldsMapping.saveAndPublish')\n : t('common.continue')}\n </Button>\n </ButtonWrapper>\n </Wrapper>\n ) : (\n <Wrapper>\n <h4>{t('nbee.fieldsMapping.testErrorTitle')}</h4>\n <h5 style={{ color: 'red' }}>{errorMessage}</h5>\n {debugUri && (\n <div>\n <a\n style={{ display: 'inline-block' }}\n target={'_blank'}\n rel={'noopener noreferrer'}\n href={debugUri}\n >\n {t('nbee.fieldsMapping.testLeadDebugCta')}\n </a>\n </div>\n )}\n <Image src={ErrorImage} alt={t('nbee.fieldsMapping.testSuccessTitle')} />\n <ButtonWrapper>\n <a\n href={process.env.REACT_APP_SUPPORT_URL}\n target={'_blank'}\n rel={'noopener noreferrer'}\n >\n <Button type={'button'} $variant={'secondary'}>\n {t('nbee.fieldsMapping.chatWithSupport')}\n </Button>\n </a>\n\n <Button\n type={'button'}\n $variant={'primary'}\n onClick={onBackToEditRequest}\n >\n {t('nbee.fieldsMapping.goBackToFieldsMapping')}\n </Button>\n </ButtonWrapper>\n </Wrapper>\n )\n}\n","import React from 'react'\n\nimport { InputField } from '@components/Form/InputField'\nimport {\n TestMapperField,\n TestMapperFieldLabel,\n TestMapperWrapper,\n} from '@features/nbee/FieldsMappingForm/SendTestLeadSubForm/styled'\nimport { useTranslation } from 'react-i18next'\nimport { ApiTestableField } from 'BackendApi'\n\ninterface Props {\n fieldsToRender: ApiTestableField[]\n setFieldValue: (field: string, value: ApiTestableField[]) => void\n fieldMappingTestingFieldName: string\n}\n\nexport const SendTestLeadSubForm: React.VFC<Props> = ({\n fieldsToRender,\n setFieldValue,\n fieldMappingTestingFieldName,\n}) => {\n const { t } = useTranslation()\n\n return (\n <TestMapperWrapper>\n {!fieldsToRender.length ? (\n <div>{t('nbee.fieldsMapping.noFieldsToTestFound')}</div>\n ) : (\n <>\n <h4 className={'text-center'}>{t('nbee.fieldsMapping.testTitle')}</h4>\n {fieldsToRender.map((field) => (\n <TestMapperField key={field.id}>\n <div>\n <TestMapperFieldLabel>{field.label}</TestMapperFieldLabel>\n </div>\n <InputField\n type={'text'}\n name={field.id}\n value={field.value || ''}\n onChange={({ target: { value } }) => {\n setFieldValue(\n fieldMappingTestingFieldName,\n fieldsToRender.map((oldField) =>\n oldField.id === field.id\n ? {\n ...oldField,\n value,\n }\n : oldField\n )\n )\n }}\n />\n </TestMapperField>\n ))}\n </>\n )}\n </TestMapperWrapper>\n )\n}\n","import React, { useEffect } from 'react'\nimport { useFormikContext } from 'formik'\nimport { BridgeFormValues } from 'Nbee'\nimport { useTranslation } from 'react-i18next'\nimport { Loader } from '@components/Basic/Loader'\nimport { Message } from '@components/Basic/Message'\nimport { parseApiError } from '@app/api/utils/error'\nimport { useGetBridgeTestableFields } from '@app/api/getBridgeTestableFields'\nimport { tranformApiResponseToFormValues } from '@features/nbee/FieldsMappingForm/SendTestLeadSubForm/utils'\nimport { ApiBridgeAvailablePermissionCheckResponse } from 'BackendApi'\nimport { SendTestLeadSubForm } from '../SendTestLeadSubForm'\ninterface Props {\n bridgeId: number\n availablePermissionChecks:\n | ApiBridgeAvailablePermissionCheckResponse\n | undefined\n}\n\nexport const TestConnectionView: React.VFC<Props> = ({ bridgeId }) => {\n const { t } = useTranslation()\n const { values, setFieldValue } = useFormikContext<BridgeFormValues>()\n\n const fieldsToRender = values.ui?.fieldMappingTesting || []\n const fieldMappingTestingFieldName = `ui.fieldMappingTesting`\n\n const {\n data: fieldsToTestResponse,\n error: errorGettingFieldsToTest,\n isLoading: isLoadingFieldsToTest,\n isRefetching: isRefetchingFieldsToTest,\n } = useGetBridgeTestableFields(bridgeId)\n\n const isLoadingAll = isLoadingFieldsToTest || isRefetchingFieldsToTest\n\n const apiError = errorGettingFieldsToTest\n\n useEffect(() => {\n if (fieldsToTestResponse) {\n // we update formik state with the fields to render\n const sourceFieldsToTest =\n tranformApiResponseToFormValues(fieldsToTestResponse)\n setFieldValue(fieldMappingTestingFieldName, sourceFieldsToTest)\n }\n }, [fieldsToTestResponse])\n\n return (\n <>\n {isLoadingAll ? (\n <div>\n <Loader $active $size={'large'} $text={t('common.loadingData')} />\n </div>\n ) : apiError ? (\n <Message $status={'error'}>{parseApiError(apiError).message}</Message>\n ) : (\n <>\n <SendTestLeadSubForm\n fieldsToRender={fieldsToRender}\n setFieldValue={setFieldValue}\n fieldMappingTestingFieldName={fieldMappingTestingFieldName}\n />\n </>\n )}\n </>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { InputField } from '@components/Form/InputField'\nimport { Textarea } from '@components/Form/Textarea'\nimport { InputToggle } from '@components/Form/InputToggle'\nimport { useField, useFormikContext } from 'formik'\nimport { Dropdown } from '@features/nbee/WelcomeMessageForm/DropDown'\nimport { BridgeFormValues } from 'Nbee'\nimport { ApiBridgeFieldsList, TemplateBasedFieldsMapping } from 'BackendApi'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { InputSmartCreatableSelect } from '@components/Form/InputSmartSelect/Creatable'\nimport { FaInfoCircle } from 'react-icons/fa'\nimport { calculateDropdownPosition } from '@features/nbee/WelcomeMessageForm/utils'\nimport { InputFeedback } from '@components/Basic/InputFeedback'\n\nexport interface VariableObjType {\n id: string\n label?: string\n}\n\ninterface Props {\n bridgeFields: ApiBridgeFieldsList | undefined\n}\n\nexport const WelcomeMessageForm: React.FC<Props> = ({ bridgeFields }) => {\n const { t } = useTranslation()\n const dropdownWrapperRef = useRef<HTMLDivElement>(null)\n const textAreaRef = useRef<HTMLTextAreaElement>(null)\n const charToOpen = '['\n const charToClose = ']'\n\n const { values, setFieldValue } = useFormikContext<BridgeFormValues>()\n const [allAvailableCoupons, setAllAvailableCoupons] = useState<string[]>([])\n const [subjectField, metaSubject, helpersSubject] = useField(\n 'templateBasedFieldsMapping.subject'\n )\n const [bodyField, metaBody, bodyHelpers] = useField(\n 'templateBasedFieldsMapping.body'\n )\n const [isCouponActive, , couponActiveHelpers] = useField(\n 'templateBasedFieldsMapping.isCouponActive'\n )\n const [couponsField, , couponsHelpers] = useField(\n 'templateBasedFieldsMapping.coupons'\n )\n\n const templateBasedFieldsMapping = values.templateBasedFieldsMapping\n const isBridgeEnabled = values.ui?.isBridgeEnabled\n\n const subjectError = metaSubject.touched && metaSubject.error\n const bodyError = metaBody.touched && metaBody.error\n const subjectErrorStatus = subjectError ? { error: subjectError } : undefined\n const bodyErrorStatus = bodyError ? { error: bodyError } : undefined\n\n const initialValues: TemplateBasedFieldsMapping = {\n subject: templateBasedFieldsMapping?.subject ?? 'Welcome on board, ',\n body:\n templateBasedFieldsMapping?.body ??\n 'Hi\\nHere is your [COUPON]\\nHave a nice day',\n isCouponActive: templateBasedFieldsMapping?.isCouponActive ?? false,\n coupons: templateBasedFieldsMapping?.coupons ?? [],\n }\n\n const [inputSelectPosition, setInputSelectPosition] = useState({ x: 0, y: 0 })\n const [showDropdown, setShowDropdown] = useState(false)\n const [highlightedIndex, setHighlightedIndex] = useState<number>(0)\n const [inputElement, setInputElement] = useState<HTMLInputElement | null>(\n null\n )\n const [lastFocusedField, setLastFocusedField] = useState<\n 'subject' | 'body' | null\n >(null)\n const [isFirstRender, setIsFirstRender] = useState(true)\n useEffect(() => {\n setIsFirstRender(false)\n }, [])\n\n const [dropdownHeight, setDropdownHeight] = useState(0)\n\n const [textInsideBrackets, setTextInsideBrackets] = useState('')\n const [filteredData, setFilteredData] = useState<VariableObjType[]>([])\n\n const source = bridgeFields?.source\n const templateFields = bridgeFields?.templateFields\n const isSmsMessage =\n templateFields && !templateFields.some((field) => field.id === 'subject')\n\n const couponValue = { id: 'COUPON', label: 'COUPON' }\n\n useEffect(() => {\n if (!values.templateBasedFieldsMapping) {\n setFieldValue('templateBasedFieldsMapping.subject', initialValues.subject)\n setFieldValue('templateBasedFieldsMapping.body', initialValues.body)\n setFieldValue(\n 'templateBasedFieldsMapping.isCouponActive',\n initialValues.isCouponActive\n )\n setFieldValue('templateBasedFieldsMapping.coupons', initialValues.coupons)\n }\n }, [setFieldValue, values.templateBasedFieldsMapping, initialValues])\n\n useEffect(() => {\n setAllAvailableCoupons([...new Set([...initialValues.coupons])])\n }, [])\n\n useEffect(() => {\n if (source) {\n const initialData = source.map((item) => ({\n id: item.id.toUpperCase(),\n label: item.label.toUpperCase(),\n }))\n setFilteredData(\n isSmsMessage ? initialData : [couponValue, ...initialData]\n )\n }\n }, [source, isSmsMessage])\n\n useEffect(() => {\n if (textInsideBrackets) {\n const filtered = source\n ? source\n .filter((item) =>\n item.id.toLowerCase().startsWith(textInsideBrackets.toLowerCase())\n )\n .map((item) => ({\n id: item.id.toUpperCase(),\n label: item.label.toUpperCase(),\n }))\n : []\n setFilteredData(isSmsMessage ? filtered : [couponValue, ...filtered])\n } else {\n const newData = source\n ? source.map((item) => ({\n id: item.id.toUpperCase(),\n label: item.label.toUpperCase(),\n }))\n : []\n setFilteredData(isSmsMessage ? newData : [couponValue, ...newData])\n }\n }, [textInsideBrackets, source, isSmsMessage])\n\n useEffect(() => {\n if (!isFirstRender && dropdownWrapperRef.current) {\n setDropdownHeight(dropdownWrapperRef.current.clientHeight)\n }\n }, [isFirstRender, dropdownWrapperRef])\n\n useEffect(() => {\n if (dropdownWrapperRef.current) {\n setDropdownHeight(dropdownWrapperRef.current.clientHeight)\n }\n }, [filteredData])\n\n useEffect(() => {\n if (!dropdownWrapperRef.current || !textAreaRef.current) return\n\n const fieldRef =\n lastFocusedField === 'subject' && inputElement\n ? inputElement\n : textAreaRef.current\n\n const value = fieldRef.value\n const cursorPosition = fieldRef.selectionEnd ?? 0\n const indexOfLastOpenBracket = value.lastIndexOf(charToOpen, cursorPosition)\n\n const newPosition = calculateDropdownPosition(\n fieldRef,\n value,\n dropdownWrapperRef.current.clientHeight,\n indexOfLastOpenBracket\n )\n\n setInputSelectPosition(newPosition)\n }, [\n dropdownHeight,\n inputSelectPosition.x,\n inputSelectPosition.y,\n lastFocusedField,\n textInsideBrackets,\n inputElement,\n ])\n\n useEffect(() => {\n const handleScroll = () => {\n if (!dropdownWrapperRef.current || !inputElement || !textAreaRef.current)\n return\n\n const fieldRef =\n lastFocusedField === 'subject' ? inputElement : textAreaRef.current\n const value = fieldRef.value\n const cursorPosition = fieldRef.selectionEnd ?? 0\n const indexOfLastOpenBracket = value.lastIndexOf(\n charToOpen,\n cursorPosition\n )\n\n const newPosition = calculateDropdownPosition(\n fieldRef,\n value,\n dropdownWrapperRef.current.clientHeight,\n indexOfLastOpenBracket\n )\n\n setInputSelectPosition(newPosition)\n }\n\n window.addEventListener('scroll', handleScroll)\n\n return () => {\n window.removeEventListener('scroll', handleScroll)\n }\n }, [lastFocusedField, dropdownHeight])\n\n const setInputRef = (input: HTMLInputElement | null) => {\n setInputElement(input)\n }\n\n const checkForChar = (\n value: string,\n element: HTMLInputElement | HTMLTextAreaElement | null,\n isClosingBracketDeleted = false\n ) => {\n if (!element) return\n\n const cursorPosition = element.selectionStart ?? 0\n const indexOfLastOpenBracketBeforeCursor = value.lastIndexOf(\n charToOpen,\n cursorPosition - 1\n )\n const indexOfLastCloseBracketBeforeCursor = value.lastIndexOf(\n charToClose,\n cursorPosition - 1\n )\n\n if (\n indexOfLastOpenBracketBeforeCursor >\n indexOfLastCloseBracketBeforeCursor ||\n isClosingBracketDeleted\n ) {\n const text = value.substring(\n indexOfLastOpenBracketBeforeCursor + 1,\n cursorPosition\n )\n setTextInsideBrackets(text)\n setShowDropdown(true)\n\n const newPosition = calculateDropdownPosition(\n element,\n value,\n dropdownHeight,\n indexOfLastOpenBracketBeforeCursor\n )\n setInputSelectPosition(newPosition)\n } else {\n setShowDropdown(false)\n }\n }\n\n const handleFieldFocus = (field: 'subject' | 'body') => {\n setLastFocusedField(field)\n if (field === 'subject') {\n helpersSubject.setTouched(true)\n } else if (field === 'body') {\n bodyHelpers.setTouched(true)\n }\n }\n\n const handleOnSelect = (item: VariableObjType) => {\n const fieldToUpdate =\n lastFocusedField === 'subject' ? inputElement : textAreaRef.current\n if (!fieldToUpdate) {\n return\n }\n\n const helpersToUpdate =\n lastFocusedField === 'subject' ? helpersSubject : bodyHelpers\n const currentText = fieldToUpdate.value\n\n const cursorPosition = fieldToUpdate.selectionEnd ?? 0\n const indexOfLastOpenBracket = currentText.lastIndexOf(\n charToOpen,\n cursorPosition\n )\n\n let newText\n let newCursorPosition: number\n\n if (indexOfLastOpenBracket >= 0) {\n newText =\n currentText.substring(0, indexOfLastOpenBracket) +\n '[' +\n item.id +\n ']' +\n currentText.substring(cursorPosition)\n newCursorPosition = indexOfLastOpenBracket + item.id.length + 2\n } else {\n newText = currentText + '[' + item.id + ']'\n newCursorPosition = currentText.length + item.id.length + 2\n }\n\n helpersToUpdate.setValue(newText)\n\n setTimeout(() => {\n fieldToUpdate.focus()\n fieldToUpdate.setSelectionRange(newCursorPosition, newCursorPosition)\n }, 0)\n\n setShowDropdown(false)\n }\n\n const handleInputChange = (\n e:\n | React.ChangeEvent<HTMLInputElement>\n | React.ChangeEvent<HTMLTextAreaElement>\n ) => {\n const { name, value } = e.target\n\n if (name === 'subject') {\n helpersSubject.setValue(value)\n checkForChar(value, inputElement)\n } else if (name === 'body') {\n bodyHelpers.setValue(value)\n checkForChar(value, textAreaRef.current)\n }\n }\n\n useEffect(() => {\n if (showDropdown && highlightedIndex < 0 && filteredData.length > 0) {\n setHighlightedIndex(0)\n }\n }, [showDropdown, highlightedIndex, filteredData])\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n let newIndex = highlightedIndex\n if (e.key === 'ArrowDown' && highlightedIndex < filteredData.length - 1) {\n newIndex = highlightedIndex + 1\n } else if (e.key === 'ArrowUp' && highlightedIndex > 0) {\n newIndex = highlightedIndex - 1\n }\n setHighlightedIndex(newIndex)\n\n if (dropdownWrapperRef.current) {\n const selectedItem = dropdownWrapperRef.current.children[newIndex]\n selectedItem?.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n }\n }\n if (e.key === 'Enter' && showDropdown && filteredData.length > 0) {\n e.preventDefault()\n handleOnSelect(filteredData[highlightedIndex])\n setShowDropdown(false)\n } else if (e.key === 'Backspace') {\n const fieldRef =\n lastFocusedField === 'subject' ? inputElement : textAreaRef.current\n if (fieldRef && fieldRef.selectionStart != null) {\n const cursorPosition = fieldRef.selectionStart\n\n const isClosingBracketDeleted =\n fieldRef.value[cursorPosition - 1] === charToClose\n\n setTimeout(() => {\n checkForChar(fieldRef.value, fieldRef, isClosingBracketDeleted)\n }, 0)\n }\n }\n }\n\n const handleAddVariableClick = () => {\n const fieldRef =\n lastFocusedField === 'subject' ? inputElement : textAreaRef.current\n\n if (fieldRef && document.body.contains(fieldRef)) {\n const cursorPosition = fieldRef.selectionStart || 0\n\n const value = fieldRef.value\n const newValue =\n value.slice(0, cursorPosition) + '[' + value.slice(cursorPosition)\n\n const helpersToUpdate =\n lastFocusedField === 'subject' ? helpersSubject : bodyHelpers\n helpersToUpdate.setValue(newValue)\n\n setTimeout(() => {\n fieldRef.focus()\n fieldRef.setSelectionRange(cursorPosition + 1, cursorPosition + 1)\n\n checkForChar(newValue, fieldRef)\n }, 0)\n }\n }\n\n const managePastedData = (e: React.ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault()\n const pastedData = e.clipboardData.getData('text')\n const newCoupons = pastedData\n .replace(/\\r?\\n|\\r/g, ' ')\n .split(/[\\s,]+/)\n .filter((coupon) => coupon.trim() !== '')\n\n const updatedCoupons = [...initialValues.coupons, ...newCoupons]\n couponsHelpers.setValue(updatedCoupons)\n setAllAvailableCoupons((prev) => [...new Set([...prev, ...newCoupons])])\n }\n\n const handleSelectCoupon = (coupons: string[]) => {\n couponsHelpers.setValue(coupons)\n setAllAvailableCoupons((prev) => [...new Set([...prev, ...coupons])])\n }\n\n return (\n <>\n <div style={{ position: 'relative', marginTop: '1rem' }}>\n {!isSmsMessage && (\n <>\n <InputField\n value={initialValues.subject}\n onKeyDown={handleKeyDown}\n inputRefCallback={setInputRef}\n name={'subject'}\n type={'text'}\n label={'Subject'}\n onChange={handleInputChange}\n onFocus={() => handleFieldFocus('subject')}\n disabled={isBridgeEnabled}\n $hasMargin\n />\n {subjectErrorStatus && (\n <InputFeedback $status={subjectErrorStatus} />\n )}\n </>\n )}\n <Textarea\n value={initialValues.body}\n onKeyDown={handleKeyDown}\n ref={textAreaRef}\n name={'body'}\n type={'text'}\n label={'Body'}\n onChange={handleInputChange}\n onFocus={() => handleFieldFocus('body')}\n style={{ height: '200px', resize: 'none', outline: 'none' }}\n disabled={isBridgeEnabled}\n />\n {bodyErrorStatus && <InputFeedback $status={bodyErrorStatus} />}\n <Button\n $variant={'link-primary'}\n type={'button'}\n onClick={handleAddVariableClick}\n style={{\n position: 'absolute',\n right: 0,\n bottom: 0,\n zIndex: 2,\n }}\n disabled={isBridgeEnabled}\n >\n Add Variable\n </Button>\n <Dropdown\n ref={dropdownWrapperRef}\n items={filteredData}\n onSelect={(item: VariableObjType) => {\n handleOnSelect(item)\n }}\n isVisible={showDropdown}\n position={inputSelectPosition}\n highlightedIndex={highlightedIndex}\n setHighlightedIndex={setHighlightedIndex}\n />\n </div>\n <div style={{ marginTop: '1rem' }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '.5rem',\n marginBottom: '1rem',\n }}\n >\n <FaInfoCircle color={'#22a7f0'} />\n <span style={{ color: '#696f8c', fontSize: '0.875rem' }}>\n Use shortcut: type “[“ to open menu with variables\n </span>\n </div>\n {!isSmsMessage && (\n <>\n <InputToggle\n $variant={'primary'}\n $size={'small'}\n $labelRight={'Use Coupons'}\n $isChecked={initialValues.isCouponActive}\n $isDisabled={isBridgeEnabled}\n onChange={() => {\n const newState = !initialValues.isCouponActive\n couponActiveHelpers.setValue(newState)\n }}\n />\n\n {initialValues.isCouponActive && (\n <div style={{ marginTop: '1rem' }}>\n <InputSmartCreatableSelect\n key={JSON.stringify(initialValues.coupons || [])}\n defaultValue={initialValues.coupons}\n initialValues={allAvailableCoupons}\n onPaste={managePastedData}\n onSelect={handleSelectCoupon}\n isDisabled={isBridgeEnabled}\n />\n </div>\n )}\n </>\n )}\n </div>\n </>\n )\n}\n","import React, { Fragment, useEffect, useState } from 'react'\nimport { Panel } from '@components/Panel'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { PageEditor } from '@app/layouts/PageEditor'\nimport { appRoutes } from '@app/routes'\nimport { useTranslation } from 'react-i18next'\nimport { makeNbeeSteps } from '@features/nbee/utils'\nimport { HeaderSearch } from '@features/nbee/FieldsMappingForm/HeaderSearch'\nimport { FormInner } from '@features/nbee/FieldsMappingForm/FormInner'\nimport { AddFilterButton } from '@features/nbee/AddFilterButton'\nimport { BridgeFilterCondition, BridgeFormValues } from 'Nbee'\nimport {\n ApiBridgeAvailablePermissionCheckResponse,\n ApiBridgeFieldsList,\n} from 'BackendApi'\nimport { Formik, Form, FormikHelpers } from 'formik'\nimport { useHistory } from 'react-router-dom'\nimport { makeFieldMappingValidationSchema } from '@features/nbee/FieldsMappingForm/validation'\nimport { SendTestLeadFeedback } from '@features/nbee/FieldsMappingForm/SendTestLeadFeedback'\nimport { ButtonTestBeforeProceeding } from '@features/nbee/FieldsMappingForm/ButtonTestBeforeProceeding'\nimport { getShowUnmappedInitialState } from '@features/nbee/FieldsMappingForm/utils'\nimport { ButtonSendTestLead } from '@features/nbee/FieldsMappingForm/SendTestLeadSubForm/ButtonSendTestLead'\nimport { FaAngleLeft } from 'react-icons/fa'\nimport { useGetBridgeAllFields } from '@app/api/getBridgeAllFields'\nimport { Loader } from '@app/components/Basic/Loader'\nimport { StatusBarBridge } from '@features/nbee/StatusBarBridge'\nimport { isInIframe } from '@app/utils/isInFrame'\nimport { useGetUserModules } from '@app/api/getUserModules'\nimport { TestConnectionView } from './TestConnectionView'\nimport { WelcomeMessageForm } from '@features/nbee/WelcomeMessageForm'\nimport { useFetchConnectedApps } from '@app/api/getConnectedApps'\n\ninterface Props {\n bridgeId: number\n initialValues: BridgeFormValues\n onSubmit: (\n formValues: BridgeFormValues,\n formikHelpers: FormikHelpers<BridgeFormValues>\n ) => void\n isSavingApi?: boolean\n allBridgeFields?: ApiBridgeFieldsList\n isFirstBridge?: boolean\n bridgeFilterRulesList?: BridgeFilterCondition[]\n onRefetchBridgeFormValues?: () => void\n availablePermissionChecks?:\n | ApiBridgeAvailablePermissionCheckResponse\n | undefined\n showWelcomeMessage: boolean\n}\n\nexport type WelcomeMessageProps = {\n isWelcomeMessageForm: boolean\n isSmsForm: boolean\n}\n\nexport type MinimumPlanNameTypes = {\n [key: string]: string\n}\nexport const minimumPlanName: MinimumPlanNameTypes = {\n '6': 'Free',\n '7': 'pro',\n '8': 'team', // only a constant\n '9': 'appsumo',\n '10': 'starter',\n}\n\nexport type FieldMappingScreenState =\n | 'mapping'\n | 'testing'\n | 'test-success'\n | 'test-error'\n\nexport const FieldsMappingForm: React.FC<Props> = ({\n bridgeId,\n initialValues,\n onSubmit,\n isSavingApi,\n allBridgeFields,\n bridgeFilterRulesList,\n onRefetchBridgeFormValues,\n availablePermissionChecks,\n showWelcomeMessage,\n}) => {\n const { t } = useTranslation()\n const history = useHistory()\n const steps = makeNbeeSteps(1, bridgeId, showWelcomeMessage)\n const isEmbedded = isInIframe()\n\n const testEnabled = initialValues?.ui?.testEnabled\n\n const {\n refetch: onRefetchFieldRequest,\n isRefetching: isReloadingAllBridgeFields,\n } = useGetBridgeAllFields(bridgeId)\n\n const {\n data: userModulesResponse,\n isLoading: isLoadingUserModules,\n error: apiUserModulesError,\n } = useGetUserModules()\n\n const { data: connectedApps, isLoading: isLoadingConnectedApps } =\n useFetchConnectedApps()\n\n const sourceApp = (connectedApps || []).find(\n (app) => app.id === initialValues.source.appId\n )\n const defaultTransparentPixel = `data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==`\n\n const sourceLogoUri = sourceApp?.logoUriSmall || defaultTransparentPixel\n\n // this state handles which screen of the FieldsMappingForm to display\n const [screenState, setScreenState] =\n useState<FieldMappingScreenState>('mapping')\n\n const [showAllFields, setShowAllFields] = useState(\n getShowUnmappedInitialState(initialValues.fieldsMapping)\n )\n const [filterText, setFilterText] = useState('')\n\n const [testLeadDebugUri, setTestLeadDebugUri] = useState<string | undefined>()\n const [testLeadDebugError, setTestLeadDebugError] = useState<\n string | undefined\n >()\n const validationSchema = makeFieldMappingValidationSchema()\n const destinationFields = allBridgeFields?.destination || []\n\n const isAPILoading = isReloadingAllBridgeFields || isLoadingUserModules\n\n const userModules = userModulesResponse?.modules || []\n const filterUserModules = userModules.find((i) => i.id === 'bridge-filter')\n const formulaUserModules = userModules.find((i) => i.id === 'bridge-formula')\n const fieldMappingModules = userModules.find((i) => i.id === 'fields-mapping')\n\n const maxFieldsToMap = testEnabled\n ? fieldMappingModules?.userDefaults?.maxFieldsMapping\n : undefined\n\n const templateFields = allBridgeFields?.templateFields\n\n const isSmsForm =\n (templateFields &&\n !templateFields.some((field) => field.id === 'subject')) ||\n false\n\n const welcomeMessageProps: WelcomeMessageProps = {\n isWelcomeMessageForm: showWelcomeMessage,\n isSmsForm,\n }\n\n useEffect(() => {\n if (filterText) {\n setShowAllFields(true)\n }\n }, [filterText])\n\n // UI\n const isInFieldMappingForm = screenState === 'mapping'\n const isInTestFieldMapping = screenState === 'testing'\n const isInTestFeedback =\n screenState === 'test-success' || screenState === 'test-error'\n\n return (\n <Formik\n initialValues={initialValues}\n validationSchema={validationSchema}\n enableReinitialize={true}\n onSubmit={(values, helpers) => {\n onSubmit(values, helpers)\n }}\n validateOnMount\n >\n {(formikProps) => {\n const totalFieldsToMap = (formikProps.values.fieldsMapping || []).length\n const totalFieldsMapped = (\n formikProps.values.fieldsMapping || []\n ).filter((f) =>\n f.mapping.some(\n (item) => item.formula?.id || item.sourceFieldId || item.text\n )\n ).length\n\n const isTestLeadEnabled = formikProps.values.ui?.testEnabled\n\n const isBridgeEnabled = formikProps.values.ui?.isBridgeEnabled\n\n return (\n <Fragment>\n {isLoadingUserModules && <Loader $size='large' $active $dimmer />}\n <PageEditor\n formikContext={formikProps}\n steps={steps}\n activeStep={1}\n topbarValue={formikProps.values.name}\n infoBar={\n formikProps.values.ui?.bridgeId ? (\n <StatusBarBridge\n isVisible={\n !(\n initialValues?.manualStatus === 1 ||\n initialValues?.manualStatus === 'new'\n ) // checks if the bridge is in status \"new\"; in that case we will NOT want to display the edit bar.\n }\n bridgeId={formikProps.values.ui.bridgeId}\n />\n ) : null\n }\n onTopbarValueChange={\n formikProps.values.ui?.isBridgeEnabled\n ? undefined\n : (newBridgeName) => {\n formikProps.setFieldValue('name', newBridgeName)\n }\n }\n hasTopBar={!isEmbedded}\n backlink={{\n url: '/bridges',\n label: t('nbee.bridgeBuilder.exitNbee'),\n }}\n >\n <Form>\n <Panel\n head={\n <HeaderSearch\n connectedApps={connectedApps}\n sourceAppId={initialValues.source.appId}\n destinationAppId={initialValues.destination.appId}\n totalFields={totalFieldsToMap}\n mappedFields={totalFieldsMapped}\n inputValue={filterText}\n onInputChange={setFilterText}\n showAllFields={showAllFields}\n onRefetchBridgeFieldRequest={onRefetchFieldRequest}\n isReloadingAllBridgeFields={isAPILoading}\n maxFields={maxFieldsToMap}\n onShowAllFieldsRequest={(showAllFields) => {\n setShowAllFields(showAllFields)\n }}\n isInTestScreen={\n isInTestFieldMapping ||\n isInTestFeedback ||\n showWelcomeMessage\n }\n welcomeMessageProps={welcomeMessageProps}\n />\n }\n progressBarPercentage={isEmbedded ? 66 : undefined}\n body={\n <>\n {isAPILoading ? (\n <Loader\n $text={t(\n 'nbee.fieldsMapping.refetchBridgeFieldLoaderMessage'\n )}\n $active={true}\n />\n ) : isInTestFieldMapping ? (\n <>\n <TestConnectionView\n bridgeId={bridgeId}\n availablePermissionChecks={\n availablePermissionChecks\n }\n />\n </>\n ) : isInTestFeedback ? (\n <SendTestLeadFeedback\n status={\n screenState === 'test-success' ? 'success' : 'error'\n }\n debugUri={testLeadDebugUri}\n errorMessage={testLeadDebugError}\n onBackToEditRequest={() => {\n setScreenState('mapping')\n }}\n isBridgeEnabled={\n formikProps.values.ui?.isBridgeEnabled ?? false\n }\n onProceedRequest={() => {\n // if the bridge is already enabled I go directly to the next step\n // if it's not enabled I save and publish the bridge\n if (!formikProps.values.ui?.isBridgeEnabled) {\n formikProps.submitForm()\n } else {\n history.push(\n appRoutes.nbeeStep3.makeUrl(`${bridgeId}`)\n )\n }\n }}\n />\n ) : (\n <>\n <AddFilterButton\n initialFilterRules={bridgeFilterRulesList}\n allSourceFields={allBridgeFields?.source}\n bridgeId={bridgeId}\n onRefetchBridgeFormValues={\n onRefetchBridgeFormValues\n }\n isBridgeDisabled={isBridgeEnabled}\n filterUserModules={filterUserModules}\n bridgeType={initialValues.type}\n />\n {isSavingApi && (\n <Loader\n $active\n $dimmer\n $size={'large'}\n $text={t(\n 'nbee.bridgeBuilder.step2PublishLoadingMessage'\n )}\n />\n )}\n <FormInner\n bridgeId={bridgeId}\n filterText={filterText}\n showAllFields={showAllFields}\n onResetFilterRequest={() => {\n setShowAllFields(true)\n setFilterText('')\n }}\n allBridgeFields={allBridgeFields}\n formulaUserModule={formulaUserModules}\n totalFieldsMapped={totalFieldsMapped}\n maxFields={maxFieldsToMap}\n showWelcomeMessage={showWelcomeMessage}\n sourceLogoUri={sourceLogoUri}\n />\n {showWelcomeMessage && (\n <WelcomeMessageForm\n bridgeFields={allBridgeFields}\n />\n )}\n </>\n )}\n </>\n }\n footer={\n // FOOTER FOR FIELD MAPPING SCREEN\n isInFieldMappingForm\n ? {\n left: (\n <Button\n $hasIcon\n type={'button'}\n $variant={'link-secondary'}\n disabled={isAPILoading}\n onClick={() => {\n history.push(\n appRoutes.nbeeStep1Edit.makeUrl(`${bridgeId}`)\n )\n }}\n >\n <FaAngleLeft />\n {t('nbee.fieldsMapping.goPreviewStep')}\n </Button>\n ),\n right: (\n <div style={{ display: 'flex', gap: '1rem' }}>\n {/* Open screenState to submit a test lead */}\n {isTestLeadEnabled &&\n !formikProps.values.ui?.isBridgeEnabled ? (\n <ButtonTestBeforeProceeding\n scope={'test'}\n destinationFields={destinationFields}\n formikProps={formikProps}\n bridgeId={bridgeId}\n isDisabledFromParent={isAPILoading}\n onSuccess={() => {\n // when we check actual mapping, we take the user to the test screen\n setScreenState('testing')\n }}\n />\n ) : isTestLeadEnabled ? (\n // in case of view only mode we just show a link to the test lead\n <Button\n $variant={'secondary'}\n type={'button'}\n onClick={() => {\n setScreenState('testing')\n }}\n >\n {t('nbee.fieldsMapping.testFieldsMapping')}\n </Button>\n ) : null}\n {/* Save mapping */}\n\n {!formikProps.values.ui?.isBridgeEnabled ? (\n <ButtonTestBeforeProceeding\n scope={'save'}\n destinationFields={destinationFields}\n formikProps={formikProps}\n isDisabledFromParent={isAPILoading}\n isSavingFromParent={isSavingApi}\n bridgeId={bridgeId}\n onSuccess={() => {\n formikProps.submitForm()\n }}\n />\n ) : (\n // in case of view only mode we just show a link to next step\n <Button\n $variant={'primary'}\n type={'button'}\n onClick={() => {\n history.push(\n appRoutes.nbeeStep3.makeUrl(`${bridgeId}`)\n )\n }}\n >\n {t('common.continue')}\n </Button>\n )}\n </div>\n ),\n }\n : // FOOTER FOR TEST FIELD MAPPING SCREEN\n isInTestFieldMapping\n ? {\n left: (\n <Button\n $hasIcon\n type={'button'}\n $variant={'link-secondary'}\n onClick={() => {\n setScreenState('mapping')\n }}\n >\n <FaAngleLeft />\n {t('nbee.fieldsMapping.goPreviewStep')}\n </Button>\n ),\n right: (\n <ButtonSendTestLead\n bridgeId={bridgeId}\n onSendTestLead={({\n status,\n debugUri,\n errorMessage,\n }) => {\n setScreenState(\n status === 'success'\n ? 'test-success'\n : 'test-error'\n )\n setTestLeadDebugUri(debugUri)\n setTestLeadDebugError(errorMessage)\n }}\n />\n ),\n }\n : // NO FOOTER FOR TEST FIELD MAPPING FEEDBACK\n null\n }\n />\n </Form>\n </PageEditor>\n </Fragment>\n )\n }}\n </Formik>\n )\n}\n","import React from 'react'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport LbLogoSvg from '@assets/images/logo-lb-small.svg'\nimport { MdOutlineCheckCircleOutline } from 'react-icons/md'\nimport { Trans, useTranslation } from 'react-i18next'\nimport {\n Wrapper,\n ButtonWrapper,\n Header,\n Paragraph,\n Body,\n Label,\n Disclaimer,\n} from './styled'\nimport { InputField } from '@components/Form/InputField'\nimport { BiShieldQuarter } from 'react-icons/bi'\n\ninterface Props {\n appLogoUri?: string\n onSave: () => void\n onCancel: () => void\n integrationName: string\n onEditIntegrationName: (name: string) => void\n isUpdatingIntegration: boolean\n appName: string\n}\n\nexport const IncomingDataFinalStep: React.FC<Props> = ({\n onSave,\n integrationName,\n onEditIntegrationName,\n onCancel,\n isUpdatingIntegration,\n appName,\n}) => {\n const { t } = useTranslation()\n\n const showedName =\n appName &&\n (appName === 'Incoming Webhook' ? 'your webhook system' : appName)\n\n return (\n <Wrapper>\n <Header>\n <img src={LbLogoSvg} width='40' />\n </Header>\n <Body>\n <MdOutlineCheckCircleOutline color={'#2ECD72'} size={100} />\n <Paragraph>\n {t('incomingDataPopup.paragraphLastStepWebhook', {\n appName: showedName,\n })}\n </Paragraph>\n <Label>{t('nbee.bridgeBuilder.integrationName')}</Label>\n <div style={{ width: '450px' }}>\n <InputField\n name={'name'}\n type={'text'}\n value={integrationName}\n onChange={(e) => onEditIntegrationName(e.target.value)}\n style={{ textAlign: 'center' }}\n />\n </div>\n <ButtonWrapper>\n <Button\n style={{ width: '100%' }}\n $variant={'primary'}\n $size={'large'}\n onClick={onSave}\n disabled={isUpdatingIntegration || integrationName === ''}\n >\n {t('common.save')}\n </Button>\n <Button\n $variant={'link-primary'}\n style={{ textDecoration: 'underline', marginTop: '.5rem' }}\n onClick={onCancel}\n >\n {t('common.cancel')}\n </Button>\n </ButtonWrapper>\n <Disclaimer>\n <BiShieldQuarter size={'1.2rem'} />\n <div>\n <Trans\n ns={'all'}\n i18nKey={'integrationAuthPopup.disclaimerLine'}\n components={{\n a: <a />,\n }}\n />\n </div>\n </Disclaimer>\n </Body>\n </Wrapper>\n )\n}\n","import React from 'react'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { InputAutoSelectCopy } from '@components/InputAutoSelectCopy'\nimport LbLogoSvg from '@assets/images/logo-lb-small.svg'\nimport { useTranslation } from 'react-i18next'\nimport {\n Wrapper,\n ButtonWrapper,\n Header,\n Title,\n Paragraph,\n Body,\n} from './styled'\nimport { useAppSelector } from '@app/store/hooks'\nimport { IntegrationFormValues } from 'Nbee'\nimport { Formik, Form, FormikHelpers } from 'formik'\nimport { FormInner } from '@features/nbee/IntegrationCredentialsContent/AppAuthCredentialForm/FormInner'\nimport { SubmitAction } from '@features/nbee/IntegrationCredentialsContent/AppAuthCredentialForm'\nimport { makeAuthCredentialValidationSchema } from '@features/nbee/IntegrationCredentialsContent/AppAuthCredentialForm/validation'\n\ninterface Props {\n appLogoUri: string\n onContinueRequest: (\n formValues: IntegrationFormValues,\n formikHelpers: FormikHelpers<IntegrationFormValues>,\n action: SubmitAction\n ) => void\n appId: number\n appName: string\n initialValues: IntegrationFormValues\n isLoading: boolean\n}\n\nexport const IncomingDataInitialStep: React.FC<Props> = ({\n appLogoUri,\n isLoading,\n onContinueRequest,\n appName,\n appId,\n initialValues,\n}) => {\n const { t } = useTranslation()\n const integrationListener = useAppSelector(\n (state) => state.integrationListener\n )\n\n const showedName = appName\n const listenerType = integrationListener.data?.type ?? 'url'\n return (\n <Wrapper>\n <Header>\n <img src={LbLogoSvg} width='40' alt='Logo description' />\n </Header>\n <Body>\n <Title>\n <img src={appLogoUri} width='45' alt='App logo' />\n <h2>\n {t(`incomingDataPopup.${listenerType}.titleFirstStepWebhook`, {\n appName: showedName,\n })}\n </h2>\n </Title>\n <Paragraph>\n {t(`incomingDataPopup.${listenerType}.paragraphFirstStepWebhook`, {\n appName: showedName,\n })}\n </Paragraph>\n {integrationListener.data ? (\n <InputAutoSelectCopy\n // docUrl={'https://leadsbridge.com'}\n linkKey={t('incomingDataPopup.linkTextFirstStepWebhook')}\n label={t(`incomingDataPopup.${listenerType}.inputLabel`)}\n inputValue={integrationListener.data?.slug}\n tooltip={t(\n `incomingDataPopup.${listenerType}.inputCopyTooltipWebhook`,\n {\n appName: showedName,\n }\n )}\n />\n ) : null}\n <Formik\n initialValues={initialValues}\n validationSchema={() => makeAuthCredentialValidationSchema(false)}\n onSubmit={(values, formikHelpers) => {\n onContinueRequest(values, formikHelpers, 'update')\n }}\n >\n {() => {\n return (\n <div\n style={{\n width: '100%',\n }}\n >\n <Form>\n <FormInner\n appId={appId}\n appName={appName}\n showName={false}\n handleErrorsUpdate={() => {\n console.log('error')\n }}\n />\n\n <ButtonWrapper>\n <Button\n style={{ width: '100%' }}\n $variant={'primary'}\n type={'submit'}\n disabled={isLoading}\n >\n {t('incomingDataPopup.ctaRecognizedWebhook')}\n </Button>\n </ButtonWrapper>\n </Form>\n </div>\n )\n }}\n </Formik>\n </Body>\n </Wrapper>\n )\n}\n","import React from 'react'\nimport { Checkbox } from '@components/Form/Checkbox'\nimport { Wrapper, FieldsRow, InputBox, ValueBox, DataTable } from './styled'\nimport { ApiIntegrationListenerField } from '@app/@typings/Api/integration'\n\ninterface Props {\n fields: ApiIntegrationListenerField[]\n onFieldChange: (fieldId: string, enabled: boolean) => void\n}\n\nexport const IncomingDataTable: React.FC<Props> = ({\n fields,\n onFieldChange,\n}) => {\n const handleCheckboxChange = (item: ApiIntegrationListenerField) => {\n const enabled = !item.enabled\n onFieldChange(item.id, enabled)\n }\n return (\n <Wrapper data-testid={'table'}>\n <DataTable>\n {fields.map((field) => (\n <FieldsRow key={field.id}>\n <InputBox>\n <Checkbox\n aria-label={field.label}\n checked={field.enabled}\n name={`checkbox-${field.label}`}\n onChange={() => handleCheckboxChange(field)}\n />\n </InputBox>\n <ValueBox style={{ fontWeight: 600 }}>{field.label}</ValueBox>\n <ValueBox>{field.lastValue}</ValueBox>\n </FieldsRow>\n ))}\n </DataTable>\n </Wrapper>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { InputAutoSelectCopy } from '@components/InputAutoSelectCopy'\nimport { useTranslation } from 'react-i18next'\nimport { Title, Paragraph, Body } from './styled'\nimport { Loader } from '@components/Basic/Loader'\nimport { ButtonWrapper } from '@features/nbee/IncomingDataContent/IncomingDataFinalStep/styled'\nimport { useAppSelector } from '@app/store/hooks'\nimport { appRoutes } from '@app/routes'\nimport { useHistory } from 'react-router-dom'\n\ninterface Props {\n appLogoUri?: string\n appId: string\n integrationId: string\n appName: string\n listenerType: 'url' | 'email'\n}\n\nexport const LoadingStep: React.FC<Props> = ({\n appLogoUri,\n appName,\n appId,\n integrationId,\n listenerType,\n}) => {\n const { t } = useTranslation()\n const integrationListener = useAppSelector(\n (state) => state.integrationListener\n )\n const [step, setStep] = useState(1)\n const history = useHistory()\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n if (step < 3) {\n setStep((prevState) => prevState + 1)\n }\n }, 5000)\n\n return () => {\n clearTimeout(timeoutId)\n }\n }, [step])\n const loadingText =\n step === 1\n ? `incomingDataPopup.loadingText1`\n : step === 2\n ? `incomingDataPopup.loadingText2`\n : `incomingDataPopup.errorTitleWebhook`\n\n // If it's the second step, and appName is to be included, pass it to the translation function.\n const loadingTextTranslation =\n step === 2 ? t(loadingText, { appName }) : t(loadingText)\n\n return (\n <Body>\n <Title>\n <img src={appLogoUri} width='45' />\n <h2>{loadingTextTranslation}</h2>\n </Title>\n {step === 3 && (\n <>\n <Paragraph>\n {t(`incomingDataPopup.${listenerType}.errorParagraphWebhook`)}\n </Paragraph>\n <InputAutoSelectCopy\n label={t(`incomingDataPopup.${listenerType}.inputLabel`)}\n // docUrl={'https://leadsbridge.com'}\n linkKey={t('incomingDataPopup.linkTextFirstStepWebhook')}\n inputValue={integrationListener.data?.slug}\n tooltip={t(\n `incomingDataPopup.${listenerType}.inputCopyTooltipWebhook`,\n {\n appName: appName,\n }\n )}\n />\n </>\n )}\n <div style={{ position: 'relative', margin: '4rem 0 2rem' }}>\n <Loader\n $size={'large'}\n $text={step < 3 ? t('common.loading') : ''}\n $active={true}\n />\n </div>\n {step === 3 && (\n <ButtonWrapper>\n <Button\n style={{ width: '100%' }}\n $variant={'primary'}\n $size={'large'}\n onClick={() => {\n setStep(1)\n }}\n >\n {t('incomingDataPopup.ctaErrorReloadWebhook', {\n appName: appName,\n })}\n </Button>\n <div style={{ marginTop: '1rem' }}>\n <Button\n onClick={() =>\n history.push(\n appRoutes.incomingDataScreenEdit.makeUrl({\n appId,\n integrationId,\n })\n )\n }\n $variant={'link-secondary'}\n >\n {'Go Back'}\n </Button>\n </div>\n </ButtonWrapper>\n )}\n </Body>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport LbLogoSvg from '@assets/images/logo-lb-small.svg'\nimport { useTranslation, Trans } from 'react-i18next'\nimport {\n Wrapper,\n ButtonWrapper,\n Header,\n Title,\n Paragraph,\n FooterWrapper,\n Body,\n BodyInner,\n TableHeader,\n ElementWrapper,\n WarningMessage,\n} from './styled'\nimport { IncomingDataTable } from '@components/IncomingDataTable'\nimport { LoadingStep } from '@features/nbee/IncomingDataContent/LoadingStep'\nimport { Checkbox } from '@components/Form/Checkbox'\nimport { ApiIntegrationListenerField } from '@app/@typings/Api/integration'\nimport { useAppDispatch } from '@app/store/hooks'\nimport { setIntegrationListenerFields } from '@app/store/actions/IntegrationListenerActions'\n\nexport interface Props {\n appLogoUri: string\n isRecognizingFields: boolean\n isHeaderStuck?: boolean\n onContinue: () => void\n onReload: () => void\n resetConfirmingReload: (value: number) => void\n fields: ApiIntegrationListenerField[]\n isConfirmingReload: number\n activeBridges: number\n totalBridges: number\n appName: string\n appId: string\n integrationId: string\n listenerType: 'url' | 'email'\n}\n\nexport const IncomingDataTableStep: React.FC<Props> = ({\n appLogoUri,\n isRecognizingFields,\n onContinue,\n isHeaderStuck = false,\n onReload,\n isConfirmingReload,\n fields,\n activeBridges,\n totalBridges,\n resetConfirmingReload,\n appName,\n appId,\n integrationId,\n listenerType,\n}) => {\n const { t } = useTranslation()\n const tableRef = useRef<HTMLDivElement>(null)\n const dispatch = useAppDispatch()\n const [isStuck, setIsStuck] = React.useState(isHeaderStuck)\n const [selectAll, setSelectAll] = useState<boolean>(\n fields.every((field) => field.enabled)\n )\n const warningRef = useRef(null)\n\n const handleSelectAllChange = () => {\n const newSelectAllState = !selectAll\n setSelectAll(newSelectAllState)\n\n const updatedFields = fields.map((field) => {\n return { ...field, enabled: newSelectAllState }\n })\n\n dispatch(\n setIntegrationListenerFields({\n data: { recognizedFields: updatedFields },\n })\n )\n }\n\n const handleFieldChange = (fieldId: string, enabled: boolean) => {\n const updatedFields = fields.map((field) =>\n field.id === fieldId ? { ...field, enabled: enabled } : field\n )\n\n dispatch(\n setIntegrationListenerFields({\n data: { recognizedFields: updatedFields },\n })\n )\n\n const selectAllStatus = updatedFields.every((field) => field.enabled)\n setSelectAll(selectAllStatus)\n }\n\n const reloadMessages = [\n 'incomingDataPopup.ctaReloadWebhook',\n 'incomingDataPopup.ctaReloadWebhookWarning',\n 'incomingDataPopup.ctaReloadWebhookLastWarning',\n ]\n\n const isLastStepOfWarning = isConfirmingReload && isConfirmingReload > 0\n\n useEffect(() => {\n if (totalBridges && activeBridges && isLastStepOfWarning) {\n window.scrollTo(0, document.body.scrollHeight)\n }\n }, [totalBridges, activeBridges, isLastStepOfWarning])\n\n // TODO: Fix handleScrollEvent ?\n /*\n const handleScrollEvent = () => {\n const tableOffsetTop = tableRef?.current?.offsetTop\n const bodyOffsetTop =\n Math.abs(document.body.getBoundingClientRect().top) + 35\n\n if (tableOffsetTop && bodyOffsetTop) {\n setIsStuck(tableOffsetTop === bodyOffsetTop)\n }\n }\n\n useEffect(() => {\n window.addEventListener('scroll', handleScrollEvent)\n return () => {\n window.removeEventListener('scroll', handleScrollEvent)\n }\n })\n */\n\n const showedName = appName\n\n return (\n <Wrapper>\n <Header>\n <img src={LbLogoSvg} width='40' />\n </Header>\n {isRecognizingFields ? (\n <LoadingStep\n appId={appId}\n integrationId={integrationId}\n appLogoUri={appLogoUri}\n appName={showedName}\n listenerType={listenerType}\n />\n ) : (\n <Body>\n <Title>\n <img src={appLogoUri} width='45' />\n <h2>\n {t('incomingDataPopup.titleSecondStepWebhook', {\n totalFields: fields.length,\n appName: showedName,\n })}\n </h2>\n </Title>\n <Paragraph>\n {t('incomingDataPopup.paragraphSecondStepWebhook')}\n </Paragraph>\n <TableHeader isHeaderStuck={isStuck} ref={tableRef}>\n <ElementWrapper>\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n padding: '0 0.1rem',\n }}\n >\n <Checkbox\n checked={selectAll}\n name={'checkbox'}\n onChange={handleSelectAllChange}\n />\n </div>\n <div>Key</div>\n <div>Value</div>\n </ElementWrapper>\n </TableHeader>\n <BodyInner>\n <IncomingDataTable\n fields={fields}\n onFieldChange={handleFieldChange}\n />\n {totalBridges && activeBridges && isLastStepOfWarning ? (\n <WarningMessage ref={warningRef}>\n {t('integrationAuthPopup.integrationUsage', {\n totalBridges,\n activeBridges,\n action: 'Reload',\n })}\n </WarningMessage>\n ) : null}\n </BodyInner>\n <FooterWrapper>\n <ButtonWrapper>\n <Button\n $variant={isLastStepOfWarning ? 'action' : 'secondary'}\n onClick={onReload}\n // style={{ width: '' }}\n >\n <span>\n <span>{t(reloadMessages[isConfirmingReload] as any)}</span>\n </span>\n </Button>\n\n <Button\n $variant={'primary'}\n onClick={\n isLastStepOfWarning\n ? () => resetConfirmingReload(0)\n : onContinue\n }\n >\n {isLastStepOfWarning\n ? t('incomingDataPopup.ctaGoBackWebhook')\n : t('incomingDataPopup.ctaContinueWebhook')}\n </Button>\n </ButtonWrapper>\n </FooterWrapper>\n </Body>\n )}\n </Wrapper>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Formik, Form, FormikHelpers } from 'formik'\nimport { startOAuthFlow } from './utils'\nimport { FormInner } from './FormInner'\nimport { makeAuthCredentialValidationSchema } from './validation'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport {\n ActionButtonWrapper,\n FormWrapper,\n EditButtonWrapper,\n SubmitButtonWrapper,\n FormRow,\n} from '@features/nbee/IntegrationCredentialsContent/styled'\nimport { useTranslation } from 'react-i18next'\nimport { IntegrationFormValues } from 'Nbee'\nimport { SubmitButton } from '@features/nbee/IntegrationCredentialsContent/AppAuthCredentialForm/SubmitButton'\nimport { useGetIntegrationUsage } from '@app/api/getIntegrationUsage'\nimport { InputFeedback } from '@components/Basic/InputFeedback'\nimport { Message } from '@components/Basic/Message'\nimport { InfoSection } from '@features/nbee/IntegrationCredentialsContent/InfoSection'\nimport { trackEvent } from '@app/dataTracking'\nimport { useGenIntegrationRedirectUri } from '@app/api/postGenIntegrationRedirectUri'\nimport { sendToast } from '@app/store/actions/ApplicationConfigurationActions'\nimport { parseApiError } from '@app/api/utils/error'\nimport { useAppDispatch } from '@app/store/hooks'\n\nexport type SubmitAction = 'update' | 'save-new'\n\ninterface Props {\n appId: number\n bridgeId?: number\n onSubmit: (\n formValues: IntegrationFormValues,\n formikHelpers: FormikHelpers<IntegrationFormValues>,\n action: SubmitAction\n ) => void\n initialValues: IntegrationFormValues\n isSavingApi: boolean\n isOauthUri?: boolean\n skipParams?: boolean\n appName: string\n integrationId?: number\n // when we receive an error after testing the credentials, we show it inline in the first scrren\n isNotValidIntegrationErrorMessage?: string\n}\n\nexport const AppAuthCredentialForm: React.VFC<Props> = ({\n appId,\n bridgeId,\n onSubmit,\n initialValues,\n isSavingApi,\n isOauthUri,\n skipParams,\n appName,\n integrationId,\n isNotValidIntegrationErrorMessage,\n}) => {\n const { t } = useTranslation()\n const dispatch = useAppDispatch()\n\n // this is used to control if we are in the first step (credentials form or oauth flow start) or if user is in the final step with the input \"integration's name\" (showName will be true)\n // after the oauth flow, this component will be mounted but will receive `skipParams` as true, in this case we take the user directly to the name step\n const [showName, setShowName] = useState(Boolean(skipParams))\n const [submitAction, setSubmitAction] = useState<SubmitAction>(\n integrationId ? 'update' : 'save-new'\n )\n const [hasError, setHasError] = useState(false)\n\n // State to disable the submit button when user select email that it's not verified yet or empty string\n // let hasError = true\n // This callback is passed to the form inner component which will pass it to the CredentialFieldVerifyEmail component\n const handleErrorsUpdate = (status: boolean) => {\n setHasError(status)\n }\n\n const { data: integrationUsage } = useGetIntegrationUsage(\n integrationId,\n bridgeId\n )\n\n const {\n mutate: generateRedirectUri,\n isLoading: isLoadingRedirectUri,\n error: genRedirectUriApiError,\n data: redirectUriData,\n } = useGenIntegrationRedirectUri()\n\n useEffect(() => {\n if (isNotValidIntegrationErrorMessage) {\n setShowName(false)\n }\n }, [isNotValidIntegrationErrorMessage])\n\n const totalBridges = integrationUsage?.data.totalBridges\n const activeBridges = integrationUsage?.data.activeBridges\n const isIntegrationUsed = Boolean(totalBridges)\n\n return (\n <Formik\n initialValues={initialValues}\n validationSchema={() => makeAuthCredentialValidationSchema(showName)}\n onSubmit={(values, formikHelpers) => {\n // When user proceed with the second step we send the `AuthorizeStarted` event\n if (!showName) {\n trackEvent({\n eventName: 'AuthorizeStarted',\n feature: 'NBEE',\n step: 'Integration',\n params: {\n appId: appId,\n appName: appName,\n integrationId: integrationId,\n integrationName: initialValues?.name,\n bridgeId,\n oauth: isOauthUri,\n },\n })\n }\n\n // if we found an OAuth uri, we must start the oauth flow\n if (!showName && isOauthUri) {\n formikHelpers.setSubmitting(true)\n generateRedirectUri(\n { appId, credentials: values.credentials },\n {\n onSuccess: (data) => {\n const redirectUri = data?.data?.redirectUri as string\n const isLegacy = data?.data?.isLegacy as boolean\n startOAuthFlow({\n credentials: values.credentials,\n redirectUri,\n appId,\n integrationId,\n isLegacy,\n })\n },\n onError: (error) => {\n dispatch(\n sendToast({\n title: 'Error',\n messages: [parseApiError(error).message],\n color: 'negative',\n })\n )\n },\n }\n )\n return\n }\n\n // otherwise first submit is not the real one, we'll run validation just\n // to move to second step where the user can select the name and perform\n // the real saving\n if (!showName) {\n setShowName(true)\n formikHelpers.setSubmitting(false)\n return\n }\n values.integrationId = integrationId\n\n // real submit :)\n onSubmit(values, formikHelpers, submitAction)\n }}\n >\n {(formikProps) => {\n return (\n <FormWrapper>\n {isNotValidIntegrationErrorMessage && !showName ? (\n <div className={'mb-1'}>\n <Message $status={'error'}>\n {isNotValidIntegrationErrorMessage}\n </Message>\n </div>\n ) : null}\n <Form>\n <FormRow>\n <div style={{ flex: 1, padding: '0 1rem' }}>\n <FormInner\n appId={appId}\n appName={appName}\n showName={showName}\n handleErrorsUpdate={handleErrorsUpdate}\n />\n {integrationId && isIntegrationUsed && showName && (\n <InputFeedback\n $status={{\n error: t('integrationAuthPopup.integrationUsage', {\n totalBridges,\n activeBridges,\n action: 'Editing',\n }),\n }}\n />\n )}\n </div>\n {/* Video and Doc section */}\n {!showName && !isOauthUri && (\n <InfoSection\n appId={appId}\n integrationId={integrationId}\n integrationName={formikProps.values.name}\n bridgeId={bridgeId}\n />\n )}\n </FormRow>\n <ActionButtonWrapper>\n {integrationId && isIntegrationUsed && showName && (\n <EditButtonWrapper>\n <SubmitButton\n appName={appName}\n isDisabled={isSavingApi || formikProps.isSubmitting}\n isLoading={\n (isSavingApi && submitAction === 'save-new') ||\n (formikProps.isSubmitting &&\n submitAction === 'save-new')\n }\n isStepName={showName}\n action={'save-new'}\n onSubmitRequest={() => {\n setSubmitAction('save-new')\n formikProps.submitForm()\n }}\n />\n <SubmitButton\n appName={appName}\n isDisabled={isSavingApi || formikProps.isSubmitting}\n isLoading={\n (isSavingApi && submitAction === 'update') ||\n (formikProps.isSubmitting && submitAction === 'update')\n }\n isStepName={showName}\n action={'update'}\n onSubmitRequest={() => {\n setSubmitAction('update')\n formikProps.submitForm()\n }}\n />\n </EditButtonWrapper>\n )}\n {!isIntegrationUsed && showName ? (\n <SubmitButtonWrapper>\n <SubmitButton\n appName={appName}\n isDisabled={isSavingApi || formikProps.isSubmitting}\n isLoading={isSavingApi || formikProps.isSubmitting}\n isStepName={showName}\n />\n </SubmitButtonWrapper>\n ) : !showName ? (\n <SubmitButtonWrapper>\n <SubmitButton\n appName={appName}\n isDisabled={\n isSavingApi || formikProps.isSubmitting || hasError\n }\n isLoading={isSavingApi || formikProps.isSubmitting}\n isStepName={showName}\n />\n </SubmitButtonWrapper>\n ) : null}\n\n <Button\n type={'button'}\n $variant={'link-secondary'}\n $size={'standard'}\n disabled={isSavingApi || formikProps.isSubmitting}\n onClick={() => {\n // back to previus step (credentials fields) is we are in the edit name screen\n // otherwise we close the popup\n if (showName) {\n setShowName(false)\n } else {\n window.close()\n }\n }}\n >\n {t('common.goBack')}\n </Button>\n </ActionButtonWrapper>\n </Form>\n </FormWrapper>\n )\n }}\n </Formik>\n )\n}\n","import React, { useEffect } from 'react'\nimport { StyledAuthorizationPopup } from './styled'\nimport LbLogoSvg from '@assets/images/logo-lb-small.svg'\nimport { Trans, useTranslation } from 'react-i18next'\nimport {\n AppAuthCredentialForm,\n SubmitAction,\n} from '@features/nbee/IntegrationCredentialsContent/AppAuthCredentialForm'\nimport { IntegrationFormValues } from 'Nbee'\nimport { ApiErrorResponse } from 'BackendApi'\nimport { FormikHelpers } from 'formik'\nimport { AiOutlineCheckCircle } from 'react-icons/ai'\nimport { BiShieldQuarter } from 'react-icons/bi'\n\ninterface Props {\n appId: number\n bridgeId?: number\n appName: string\n appLogoUri: string\n onSubmit: (\n formValues: IntegrationFormValues,\n formikHelpers: FormikHelpers<IntegrationFormValues>,\n action: SubmitAction\n ) => void\n initialValues: IntegrationFormValues\n isSavingApi: boolean\n isOauthUri?: boolean\n // skip step1 (params fields) and load the form at the integration name (final) step\n skipParams?: boolean\n // in case of edit we also need the integrationId we want to update\n integrationId?: number\n // when we receive an error after testing the credentials, we show it inline in the first scrren\n isNotValidIntegrationErrorMessage?: string\n}\n\nexport const IntegrationCredentialsContent: React.FC<Props> = ({\n appId,\n bridgeId,\n appName,\n appLogoUri,\n onSubmit,\n initialValues,\n isSavingApi,\n isOauthUri,\n skipParams,\n integrationId,\n isNotValidIntegrationErrorMessage,\n}) => {\n const { t } = useTranslation()\n\n const { Wrapper, Header, Disclaimer, Body, Logo, Title, SubTitle } =\n StyledAuthorizationPopup\n\n const isFinalStepFromOauthFlow = isOauthUri && skipParams\n\n return (\n <Wrapper>\n <Header>\n <img src={LbLogoSvg} width='40' />\n </Header>\n\n <Body>\n {isFinalStepFromOauthFlow ? (\n <>\n <div style={{ margin: '2rem 0', textAlign: 'center' }}>\n <AiOutlineCheckCircle size={'90'} color='#2ECD72' />\n <Title>\n {t('integrationAuthPopup.textSuccess', {\n appName,\n })}\n </Title>\n </div>\n </>\n ) : (\n <>\n <Logo src={appLogoUri} alt={appName} />\n <Title>\n {t('integrationAuthPopup.authorizationTitle', {\n appName,\n })}\n </Title>\n <SubTitle>\n {t('integrationAuthPopup.authorizationSubtitle', {\n appName,\n })}\n </SubTitle>\n </>\n )}\n\n <AppAuthCredentialForm\n appId={appId}\n appName={appName}\n initialValues={initialValues}\n onSubmit={onSubmit}\n isSavingApi={isSavingApi}\n isOauthUri={isOauthUri}\n skipParams={skipParams}\n integrationId={integrationId}\n bridgeId={bridgeId}\n isNotValidIntegrationErrorMessage={isNotValidIntegrationErrorMessage}\n />\n\n <Disclaimer>\n <BiShieldQuarter size={'1.2rem'} />\n <div>\n <Trans\n ns={'all'}\n i18nKey={'integrationAuthPopup.disclaimerLine'}\n components={{\n a: <a />,\n }}\n />\n </div>\n </Disclaimer>\n </Body>\n </Wrapper>\n )\n}\n","import React from 'react'\nimport { PageEditor } from '@app/layouts/PageEditor'\nimport { Panel } from '@components/Panel'\nimport { makeNbeeSteps } from '@features/nbee/utils'\nimport { Loader } from '@components/Basic/Loader'\nimport { isInIframe } from '@app/utils/isInFrame'\n\ninterface Props {\n activeStepIndex?: number\n bridgeId?: number | string\n loadingText?: string\n}\n\nconst embeddablePercentage: Record<number, number> = {\n 0: 33,\n 1: 66,\n 2: 100,\n}\n\nexport const LoadingStep: React.FC<Props> = ({\n activeStepIndex,\n bridgeId,\n loadingText,\n}) => {\n const steps = makeNbeeSteps(activeStepIndex, bridgeId)\n const isEmbedded = isInIframe()\n return (\n <PageEditor\n steps={isEmbedded ? undefined : steps}\n activeStep={activeStepIndex}\n hasTopBar={!isEmbedded}\n >\n <Panel\n progressBarPercentage={\n isEmbedded && activeStepIndex\n ? embeddablePercentage[activeStepIndex] || 0\n : undefined\n }\n body={\n <div\n style={{\n position: 'relative',\n height: 400,\n }}\n >\n <Loader $active $size={'large'} $text={loadingText} />\n </div>\n }\n />\n </PageEditor>\n )\n}\n","import React from 'react'\nimport { Modal } from '@components/Basic/Modal'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { ReactComponent as SuperHeroImg } from '@assets/images/superhero.svg'\nimport { Trans, useTranslation } from 'react-i18next'\nimport {\n ModalBody,\n ModalFooter,\n ModalHeader,\n ModalWrapper,\n} from '@features/nbee/ModalTrialInfo/styled'\nimport { appRoutes } from '@app/routes'\n\ninterface ModalProps {\n isOpen: boolean\n showSurpriseMessage?: boolean\n planName?: string\n onCloseModal: () => void\n}\n\nexport const ModalTrialInfo: React.FC<ModalProps> = ({\n isOpen,\n onCloseModal,\n showSurpriseMessage,\n planName,\n}) => {\n const { t } = useTranslation()\n\n return (\n <Modal\n isWide\n isTransparent={false}\n isOpen={isOpen}\n onCloseModal={onCloseModal}\n hideCloseButton\n >\n <ModalWrapper>\n {showSurpriseMessage ? (\n <>\n <ModalHeader>\n 🎉 {t('nbee.trialInfoModal.fromFreeHeader')} 🎉\n </ModalHeader>\n <ModalBody>\n <p>\n {t('nbee.trialInfoModal.fromFreeParagraph1', {\n planName: planName,\n })}{' '}\n 🚀\n </p>\n <p>{t('nbee.trialInfoModal.fromFreeParagraph2')}</p>\n <SuperHeroImg />\n <p>{t('nbee.trialInfoModal.fromFreeParagraph3')}</p>\n <p>\n <Trans\n i18nKey={'nbee.trialInfoModal.fromFreeParagraph4'}\n components={{\n a: <a href={appRoutes.pricing.makeUrl()} />,\n }}\n />\n 🌟\n </p>\n <p>{t('nbee.trialInfoModal.fromFreeParagraph5')} 🤝</p>\n </ModalBody>\n </>\n ) : (\n <>\n <ModalHeader>\n 🎉 {t('nbee.trialInfoModal.fromProHeader')} 🎉\n </ModalHeader>\n <ModalBody>\n <p>{t('nbee.trialInfoModal.fromProParagraph1')} 🚀</p>\n <p>{t('nbee.trialInfoModal.fromProParagraph2')}</p>\n <SuperHeroImg />\n <p>{t('nbee.trialInfoModal.fromProParagraph3')}</p>\n <p>\n <Trans\n i18nKey={'nbee.trialInfoModal.fromProParagraph4'}\n components={{\n a: <a href={appRoutes.pricing.makeUrl()} />,\n }}\n />\n 🌟\n </p>\n <p>{t('nbee.trialInfoModal.fromProParagraph5')} 🤝</p>\n </ModalBody>\n </>\n )}\n\n <ModalFooter>\n <Button\n onClick={onCloseModal}\n $fluid\n type={'button'}\n $variant={'primary'}\n >\n Continue to LeadsBridge\n </Button>\n </ModalFooter>\n </ModalWrapper>\n </Modal>\n )\n}\n","import React, { useEffect } from 'react'\nimport { PageEditor } from '@app/layouts/PageEditor'\nimport { makeNbeeSteps } from '@features/nbee/utils'\nimport { useTranslation } from 'react-i18next'\nimport { Message } from '@components/Basic/Message'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { useHistory } from 'react-router-dom'\nimport { appRoutes } from '@app/routes'\nimport { trackEvent } from '@app/dataTracking'\nimport { isInIframe } from '@app/utils/isInFrame'\n\ninterface Props {\n errorMessage: string\n activeStepIndex: number\n bridgeId?: number | string\n statusCode?: number\n errorCode: number | string\n}\n\nexport const NbeeError: React.FC<Props> = ({\n errorMessage,\n activeStepIndex,\n bridgeId,\n statusCode,\n errorCode,\n}) => {\n const steps = makeNbeeSteps(activeStepIndex, bridgeId)\n const { t } = useTranslation()\n const history = useHistory()\n const isEmbedded = isInIframe()\n\n useEffect(() => {\n trackEvent({\n eventName: 'UnableToLoadBridge',\n feature: 'NBEE',\n step: 'Apps',\n params: {\n bridgeId: bridgeId ? parseInt(`${bridgeId}`, 10) : undefined,\n custom: {\n errorCode: errorCode || statusCode,\n errorDescription: errorMessage,\n },\n },\n sendEventToIntercom: true,\n })\n }, [bridgeId])\n\n return (\n <PageEditor\n steps={steps}\n activeStep={activeStepIndex}\n pageTitle={t('common.genericError')}\n hasTopBar={!isEmbedded}\n backlink={{\n url: '/bridges',\n label: 'Exit',\n }}\n >\n <Message $status={'error'}>{errorMessage}</Message>\n\n {/* Go back button only in ca */}\n {statusCode === 404 || bridgeId ? (\n <Button\n $variant={'primary'}\n onClick={() => {\n if (statusCode === 404) {\n window.location.href = `${process.env.REACT_APP_V1_URL}/bridges`\n return\n }\n\n if (bridgeId) {\n history.push(appRoutes.nbeeStep1Edit.makeUrl(`${bridgeId}`))\n }\n }}\n >\n {t('common.goBack')}\n </Button>\n ) : null}\n </PageEditor>\n )\n}\n","import React from 'react'\nimport { StyledSkeleton } from '@components/Basic/Skeleton/styled'\nimport {\n SkeletonAllowedElement,\n skeletonElementSizes,\n SkeletonSizes,\n} from '@components/Basic/Skeleton/elementSizes'\n\ninterface SkeletonProps {\n width?: string\n height?: string\n forElement?: SkeletonAllowedElement\n}\n\nconst getDefaultSize = (width?: string, height?: string): SkeletonSizes => ({\n width: width || '100%',\n height: height || '1.4em',\n marginBottom: '0',\n marginTop: '0',\n})\n\nconst getSpecificSize = (forElement: SkeletonAllowedElement) =>\n skeletonElementSizes[forElement] || getDefaultSize()\n\nexport const Skeleton: React.FC<SkeletonProps> = ({\n width,\n height,\n forElement,\n}) => {\n const hasCustomSize = width && height\n if (!hasCustomSize && !forElement) {\n console.warn(\n 'Custom size or a specific element is required to use skeleton'\n )\n return null\n }\n\n const defaultSizes = getDefaultSize(width, height)\n\n const computedSizes = forElement ? getSpecificSize(forElement) : defaultSizes\n\n return (\n <StyledSkeleton\n width={computedSizes.width}\n height={computedSizes.height}\n marginBottom={computedSizes.marginBottom}\n marginTop={computedSizes.marginTop}\n />\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { useFetchIntegrationsByAppId } from '@app/api/getIntegrationsByAppId'\nimport {\n InputSmartSelect,\n SelectValue,\n} from '@components/Form/InputSmartSelect'\nimport { Skeleton } from '@components/Basic/Skeleton'\nimport { useFetchAllApps } from '@app/api/getAllApps'\nimport { Trans, useTranslation } from 'react-i18next'\nimport {\n AppConfigurationType,\n PartialConfiguredApp,\n BridgeFormValues,\n} from 'Nbee'\nimport { useField, useFormikContext } from 'formik'\nimport { ConnectedPopupWindow } from '@components/ConnectedPopupWindow'\nimport { appRoutes } from '@app/routes'\nimport { PopupInstanceDetector } from '@features/nbee/SimpleBridgeBuilderForm/fields/IntegrationSelector/styled'\nimport { TinyTextualButton } from '@components/Basic/TinyTextualButton'\nimport { MdEdit } from 'react-icons/md'\nimport { useTriggerSettingsUpdate } from '@features/nbee/SimpleBridgeBuilderForm/fields/IntegrationSettings/useTriggerSettingsUpdate'\nimport { InputFeedback } from '@components/Basic/InputFeedback'\nimport { Loader } from '@components/Basic/Loader'\nimport {\n getPopupHeight,\n getPopupWeight,\n} from '@components/ConnectedPopupWindow/utils'\nimport { usePostNewIntegration } from '@app/api/postNewIntegration'\nimport { ApiSaveIntegrationRequestBody } from 'BackendApi'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { RootState } from '@app/index'\nimport { HandleSignupCognitoProps } from '@app/services/apiAuthClient/utils'\nimport { Auth } from 'aws-amplify'\n\ninterface Props {\n appId: number\n parentAppId?: number | '' | null\n type: AppConfigurationType\n disabled?: boolean\n isTesting?: boolean\n onTestIntegrationRequest: () => void\n}\n\nexport const IntegrationSelector: React.FC<Props> = ({\n appId,\n type,\n parentAppId,\n disabled,\n isTesting,\n onTestIntegrationRequest,\n}) => {\n const [currentId, setCurrentId] = useState<number>(0)\n\n useEffect(() => {\n if (parentAppId === '') {\n setCurrentId(appId)\n } else if (typeof parentAppId === 'number') {\n setCurrentId(parentAppId)\n }\n }, [parentAppId, appId])\n\n const {\n isLoading,\n data,\n refetch: refetchIntegrationsByAppId,\n } = useFetchIntegrationsByAppId(currentId)\n\n const dispatch = useDispatch()\n const selectedIdState = useSelector(\n (state: RootState) => state.application.integrationId\n )\n const { values, setFieldValue } = useFormikContext<BridgeFormValues>()\n\n // integrationId field\n const [integrationIdField, integrationIdMeta, integrationIdHelpers] =\n useField<PartialConfiguredApp['integrationId']>(`${type}.integrationId`)\n const selectedIntegrationId = integrationIdField.value\n\n const { refetchSettings } = useTriggerSettingsUpdate(type)\n\n // getting app logo from cached react-query hook\n const { data: allApps } = useFetchAllApps()\n\n const { mutateAsync: saveIntegrationAsync, isLoading: isSavingIntegration } =\n usePostNewIntegration()\n\n const selectedApp = (allApps || []).find((app) => app.id === appId)\n const selectedAppLogoUri = selectedApp?.logoUriSmall\n const selectedAppAuthType = selectedApp?.authType\n const selectedAppId = selectedApp?.id\n\n const initialValues: SelectValue[] = (data || []).map((o) => ({\n label: o.name,\n value: `${o.id}`,\n logoUri: selectedAppLogoUri,\n }))\n\n // auth credentials popup\n const [popupDestinationUrl, setPopupDestinationUrl] = useState<string | null>(\n null\n )\n const [popupInstace, setPopupInstace] = useState<Window | null>(null)\n const popupIsOpen = Boolean(popupInstace && !popupInstace.closed)\n\n const [integrationDataFromPopup, setIntegrationDataFromPopup] = useState<{\n id: number\n name: string\n }>()\n\n // if is an edit we append to popup url the integration id as query string\n // we also need to check if an edit from v1 or is from v2 in that case has a bridgeId\n const bridgeId = values.ui?.bridgeId\n const onConnectNewAccountRequest = async (integrationIdToEdit?: number) => {\n setIntegrationDataFromPopup(undefined)\n let newIntegrationId: number | undefined\n\n // special case for new integrations of type listener\n // we need to create a new integration to allow BE to create the listener\n // name and credentials can be left empty\n if (\n selectedAppAuthType === 'listener' &&\n selectedAppId === values?.source.appId &&\n !integrationIdToEdit\n ) {\n const requestBody: ApiSaveIntegrationRequestBody = {\n name: '',\n appId: Number(appId),\n credentials: [],\n }\n const newIntegrationResponse = await saveIntegrationAsync({ requestBody })\n newIntegrationId = Number(newIntegrationResponse?.data?.integration?.id)\n }\n\n const popupUrl =\n selectedAppAuthType === 'listener' &&\n selectedAppId === values?.source.appId && // special case for webhook\n !integrationIdToEdit\n ? appRoutes.incomingDataScreen.makeUrl({\n appId: `${appId}`,\n integrationId: `${newIntegrationId}`,\n })\n : selectedAppAuthType === 'listener' &&\n integrationIdToEdit &&\n selectedAppId === values?.source.appId\n ? appRoutes.incomingDataScreenEdit.makeUrl({\n appId: `${appId}`,\n integrationId: `${integrationIdToEdit}`,\n })\n : integrationIdToEdit && bridgeId\n ? appRoutes.integrationAuthScreenEditWithBridgeId.makeUrl({\n integrationId: `${integrationIdToEdit}`,\n appId: `${currentId}`,\n bridgeId: `${bridgeId}`,\n })\n : integrationIdToEdit\n ? appRoutes.integrationAuthScreenEdit.makeUrl({\n integrationId: `${integrationIdToEdit}`,\n appId: `${currentId}`,\n })\n : appRoutes.integrationAuthScreen.makeUrl({\n appId: `${currentId}`,\n })\n setPopupDestinationUrl(popupUrl)\n }\n\n useEffect(() => {\n if (selectedIdState !== null && selectedIdState === selectedIntegrationId) {\n onConnectNewAccountRequest(selectedIntegrationId)\n\n dispatch({ type: 'RESET_TRIGGER_CONNECT_ACCOUNT_POPUP' })\n }\n }, [selectedIdState])\n\n const defaultValue = integrationDataFromPopup\n ? {\n label: integrationDataFromPopup.name,\n value: integrationDataFromPopup.id,\n logoUri: selectedAppLogoUri,\n }\n : selectedIntegrationId\n ? initialValues.find((o) => o.value === `${selectedIntegrationId}`)\n : undefined\n\n useEffect(() => {\n setFieldValue(\n `ui.${type}.selectedIntegrationName`,\n defaultValue?.label || ''\n )\n }, [defaultValue?.label])\n\n const errorMessage = integrationIdMeta.error\n const isTouched = integrationIdMeta.touched\n const hasIntegrationApiError =\n values.ui && values.ui[type] && values.ui[type]?.hasIntegrationApiError\n const isLoadingApi =\n (values.ui && values.ui[type] && values.ui[type]!.isLoadingApi) ||\n isTesting ||\n isSavingIntegration\n\n const [authData, setAuthData] = useState<HandleSignupCognitoProps | null>(\n null\n )\n\n // Set Auth Data on mount\n useEffect(() => {\n console.log('isIframe', window.self !== window.top)\n Auth.currentAuthenticatedUser()\n .then((authData_) => {\n setAuthData({\n username: authData_.username || '',\n idToken: authData_.signInUserSession.idToken.jwtToken,\n accessToken: authData_.signInUserSession.accessToken.jwtToken,\n refreshToken: authData_.signInUserSession.refreshToken.token,\n isIframe: window.self !== window.top,\n })\n })\n .catch((e) => {\n console.info('No auth state:', e)\n })\n }, [])\n\n return (\n <div>\n {isLoading && !defaultValue ? (\n <Skeleton forElement={'smart-select'} />\n ) : (\n <div style={{ position: 'relative' }}>\n {isLoading || isLoadingApi ? <Loader $active $dimmer /> : null}\n <InputSmartSelect\n placeholder={`Connect ${selectedApp?.name}`}\n initialValues={initialValues}\n defaultValue={defaultValue}\n key={defaultValue?.label}\n isLoading={popupIsOpen}\n isDisabled={isLoadingApi || values.ui?.isBridgeEnabled}\n isClearable={false}\n onSelect={(selectedValue) => {\n if (Array.isArray(selectedValue)) {\n return\n }\n const newValue = selectedValue\n ? parseInt(`${selectedValue.value}`, 10)\n : undefined\n integrationIdHelpers.setValue(newValue)\n }}\n addActionClick={{\n label: 'Create a new integration',\n onClick: () => onConnectNewAccountRequest(),\n }}\n onBlur={() => {\n integrationIdHelpers.setTouched(true)\n }}\n noOptionsMessageText={' '}\n $status={\n isTouched && errorMessage\n ? {\n error: errorMessage,\n }\n : undefined\n }\n />\n </div>\n )}\n\n {selectedIntegrationId && !popupIsOpen && !values.ui?.isBridgeEnabled ? (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: '1fr auto',\n gap: '1rem',\n\n // hiding content while loading but keeping height to prevent content jumping\n opacity: isLoadingApi ? 0 : 1,\n pointerEvents: isLoadingApi ? 'none' : undefined,\n }}\n >\n {hasIntegrationApiError ? (\n <InputFeedback\n $status={{\n error: (\n <Trans\n ns={'all'}\n i18nKey={\n 'nbee.bridgeBuilder.validation.integrationApiError'\n }\n components={{\n span: (\n <span\n style={{\n textDecoration: 'underline',\n cursor: 'pointer',\n }}\n onClick={() => {\n onConnectNewAccountRequest(selectedIntegrationId)\n }}\n />\n ),\n }}\n />\n ),\n }}\n />\n ) : (\n <div />\n )}\n <div style={{ textAlign: 'right' }}>\n <TinyTextualButton\n onClick={() => {\n onConnectNewAccountRequest(selectedIntegrationId)\n }}\n >\n <MdEdit /> edit\n </TinyTextualButton>\n </div>\n </div>\n ) : null}\n\n {popupIsOpen && (\n <PopupInstanceDetector>\n Account configuration screen is open.\n <span\n onClick={() => popupInstace!.focus()}\n style={{\n fontWeight: 600,\n textDecoration: 'underline',\n cursor: 'pointer',\n }}\n >\n click here to view\n </span>\n </PopupInstanceDetector>\n )}\n\n {popupDestinationUrl ? (\n <ConnectedPopupWindow\n initialData={authData?.isIframe ? authData : null} // passing auth data to popup only when we're in an iframe\n urlToOpen={popupDestinationUrl}\n popupName={type}\n widthPx={getPopupWeight()}\n heightPx={getPopupHeight()}\n onPopupOpen={(popup) => {\n setPopupInstace(popup)\n }}\n onPopupClose={(newData) => {\n if (newData) {\n const newIntegrationId = (newData as any).integrationId\n const newIntegrationName = (newData as any).integrationName\n\n // updating field with the just created integrationId\n if (newIntegrationId && newIntegrationName) {\n setIntegrationDataFromPopup({\n id: newIntegrationId,\n name: newIntegrationName,\n })\n onTestIntegrationRequest()\n integrationIdHelpers.setValue(newIntegrationId)\n }\n\n // we refetch all integrations for selected app to keep the list updated\n refetchIntegrationsByAppId()\n\n // in case we are edited the selected integration we need to refetch integration settings\n if (\n newIntegrationId &&\n newIntegrationId === selectedIntegrationId\n ) {\n refetchSettings()\n }\n }\n\n setPopupDestinationUrl(null)\n }}\n />\n ) : null}\n </div>\n )\n}\n","import React, { Fragment, useEffect, useRef, useState } from 'react'\nimport { useChooseIntegrationSettings } from '@app/api/postChooseIntegrationSetting'\nimport { useFormikContext } from 'formik'\nimport {\n AppConfigurationType,\n BridgeFormValues,\n RetrivedSettingField,\n AppIntegrationSetting,\n} from 'Nbee'\nimport { ApiAppSetting } from 'BackendApi'\nimport { Skeleton } from '@components/Basic/Skeleton'\nimport { SettingFieldSmartSelect } from './SettingFieldSmartSelect'\nimport { SettingFieldInput } from './SettingFieldInput'\nimport { SettingFieldToggle } from './SettingFieldToggle'\nimport {\n fieldsForSmartSelect,\n fieldsForInput,\n fieldsForToggle,\n fieldsForSmartCreatableSelect,\n fillNewSettingsWithExistingValues,\n fieldsForGooglePicker,\n} from './utils'\nimport { SettingFieldSmartCreatableSelect } from './SettingFieldSmartCreatableSelect'\nimport { useTranslation } from 'react-i18next'\nimport { useTriggerSettingsUpdate } from '@features/nbee/SimpleBridgeBuilderForm/fields/IntegrationSettings/useTriggerSettingsUpdate'\nimport { usePopupError } from './usePopupError'\nimport { GooglePicker } from '@components/ButtonProvider/Google/GooglePicker'\n\ninterface IntegrationSettingsProps {\n type: AppConfigurationType\n isValidIntegration?: boolean\n onCompletionChange?: (isComplete: boolean) => void\n templateSettings?: AppIntegrationSetting[]\n}\n\nexport const IntegrationSettings: React.FC<IntegrationSettingsProps> = ({\n type,\n isValidIntegration,\n onCompletionChange,\n templateSettings,\n}) => {\n const { t } = useTranslation()\n const skipRequestNewSettingsToApi = useRef<boolean>()\n const [firstRun, setFirstRun] = useState(false)\n\n // some formik helpers\n const {\n values,\n setFieldValue,\n setSubmitting,\n setFieldTouched,\n validateForm,\n } = useFormikContext<BridgeFormValues>()\n const selectedIntegrationId = values[type].integrationId\n const selectedAppId = values[type].appId\n const settingFieldName = `${type}.settings`\n\n console.log('currentSettingsValues', values[type].settings, selectedAppId)\n const currentSettingsValues = values[type].settings || []\n\n // chooseIntegrationSettings mutation\n const {\n data: integrationSettingsResponse,\n mutate: retrieveIntegrationSettings,\n isLoading: isLoadingIntegrationSettings,\n error: retrieveIntegrationSettingsApiError,\n } = useChooseIntegrationSettings()\n const [fieldsToRender, setFieldsToRender] = useState<ApiAppSetting[]>(\n currentSettingsValues as unknown as ApiAppSetting[]\n )\n\n const retrieveUpdatedSettingFields = (\n integrationId: number,\n appId: number\n ) => {\n retrieveIntegrationSettings({\n integrationSettingsData: {\n integrationId,\n appId,\n type,\n settings: currentSettingsValues.map((setting) => ({\n key: setting.key,\n value: setting.value || '',\n })),\n refresh:\n (values.ui && values.ui[type] && values.ui[type]!.refresh) || [],\n bridgeId: values.ui?.bridgeId, // this is only when we are editing an existing bridge, for new bridges this will be undefined, so it will be ignored\n },\n })\n }\n\n // handling api error\n const { showPopupError, clearPopupError } = usePopupError({\n type,\n showLogo: true,\n })\n useEffect(() => {\n clearPopupError()\n if (retrieveIntegrationSettingsApiError) {\n showPopupError(retrieveIntegrationSettingsApiError)\n }\n }, [retrieveIntegrationSettingsApiError])\n\n // saving in local state\n useEffect(() => {\n const newSettingsReceived =\n integrationSettingsResponse?.data?.schemaSettings\n if (newSettingsReceived) {\n setFieldsToRender(newSettingsReceived)\n\n // we need to inform formik about the new settings received, so it will be\n // able to proper handle touched states. To do this we merge existing\n // values into new settings data and we keep new settings with a default value.\n // This will also solve the case where a value was set but is not existing anymore\n // (example a filed that was depending from another value\n const existingSettings = values[type].settings || []\n const newSettingsWithDefaults = fillNewSettingsWithExistingValues(\n newSettingsReceived,\n existingSettings\n )\n\n // before updating form status we need to pause the re-fetching of new settings\n // and we set it back to normal once we are sure formik state has been updated\n // this is to prevent an endless loop, since api request to get new settings starts\n // is exectued every time formik state (settings field) changes\n skipRequestNewSettingsToApi.current = true\n setFieldValue(settingFieldName, newSettingsWithDefaults)\n // reset refresh array so we don't always request cache invalidation\n setFieldValue(`ui.${type}.refresh`, [])\n\n setTimeout(() => {\n skipRequestNewSettingsToApi.current = false\n }, 300)\n }\n }, [integrationSettingsResponse])\n\n // cleanup integration settings when selectedIntegrationId changes, if we don't have template values\n useEffect(() => {\n if (!selectedIntegrationId) {\n if (!templateSettings?.length) {\n console.log('emptying integration settings (IntegrationSettings)')\n setFieldsToRender([])\n setFieldValue(settingFieldName, [])\n validateForm()\n setFieldTouched(settingFieldName, false)\n clearPopupError()\n } else {\n // if we do have template settings values, we need to set them as default values\n setFieldsToRender(templateSettings as any)\n setFieldValue(settingFieldName, templateSettings)\n validateForm()\n setFieldTouched(settingFieldName, false)\n clearPopupError()\n }\n }\n }, [selectedIntegrationId])\n\n // re-run mutation to get new settings fields when form settings values are updated\n const triggerSettingsUpdate =\n values.ui && values.ui[type] && values.ui[type]!.triggerSettingsUpdate\n useEffect(() => {\n // if (skipRequestNewSettingsToApi.current) {\n // return\n // }\n\n if (\n selectedIntegrationId &&\n selectedAppId &&\n isValidIntegration &&\n !isLoadingIntegrationSettings\n ) {\n retrieveUpdatedSettingFields(selectedIntegrationId, selectedAppId)\n }\n }, [\n selectedIntegrationId,\n // currentSettingsValues,\n triggerSettingsUpdate,\n isValidIntegration,\n ])\n\n const { refetchSettings } = useTriggerSettingsUpdate(type)\n useEffect(() => {\n if (!firstRun && selectedIntegrationId) {\n setFirstRun(true)\n refetchSettings()\n }\n }, [currentSettingsValues, firstRun, selectedIntegrationId])\n\n useEffect(() => {\n setFirstRun(false)\n }, [selectedIntegrationId])\n\n // when retrieving new settings, we need to updated formik isSubmitting to disable continue button\n useEffect(() => {\n setSubmitting(isLoadingIntegrationSettings)\n setFieldValue(`ui.${type}.isLoadingApi`, isLoadingIntegrationSettings)\n }, [isLoadingIntegrationSettings])\n\n const canShowTitle = Boolean(\n selectedIntegrationId && isValidIntegration && fieldsToRender.length\n )\n\n const requiredFields: RetrivedSettingField[] = fieldsToRender.map(\n (field) => ({\n id: field.id,\n label: field.label,\n required: field.required || false,\n type: field.type,\n format: field.format,\n })\n )\n\n useEffect(() => {\n setFieldValue(`ui.${type}.allRetrivedSettingFields`, requiredFields)\n }, [fieldsToRender])\n\n return (\n <Fragment>\n {canShowTitle && (\n <h2>{t('nbee.bridgeBuilder.integrationSettingsTitle')}</h2>\n )}\n {fieldsToRender.map((field, idx) => {\n return field.hide ? null : (\n <Fragment key={field.id}>\n <div>\n {fieldsForSmartCreatableSelect.includes(field.type) ? (\n <SettingFieldSmartCreatableSelect\n fieldSchema={field}\n type={type}\n index={idx}\n isLoading={isLoadingIntegrationSettings}\n />\n ) : fieldsForGooglePicker.includes(field.type) ? (\n <GooglePicker\n fieldSchema={field}\n type={type}\n index={idx}\n isLoading={isLoadingIntegrationSettings}\n apiHasError={!!retrieveIntegrationSettingsApiError}\n />\n ) : fieldsForSmartSelect.includes(field.type) ? (\n <SettingFieldSmartSelect\n fieldSchema={field}\n type={type}\n index={idx}\n isLoading={isLoadingIntegrationSettings}\n apiHasError={!!retrieveIntegrationSettingsApiError}\n />\n ) : fieldsForInput.includes(field.type) ? (\n <SettingFieldInput\n fieldSchema={field}\n type={type}\n index={idx}\n isLoading={isLoadingIntegrationSettings}\n />\n ) : fieldsForToggle.includes(field.type) ? (\n <SettingFieldToggle\n fieldSchema={field}\n type={type}\n index={idx}\n isLoading={isLoadingIntegrationSettings}\n />\n ) : null}\n </div>\n </Fragment>\n )\n })}\n\n {/* Loading state (we need to keep existing fields visible */}\n {isLoadingIntegrationSettings ? (\n <div>\n <Skeleton forElement={'label'} />\n <Skeleton forElement={'input'} />\n </div>\n ) : null}\n </Fragment>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport {\n AppConfigurationType,\n BridgeFormValues,\n AppIntegrationSetting,\n} from 'Nbee'\nimport { ApiErrorResponse } from 'BackendApi'\nimport { AppSelector } from '@features/nbee/SimpleBridgeBuilderForm/fields/AppSelector'\nimport { useFormikContext } from 'formik'\nimport { IntegrationSelector } from '@features/nbee/SimpleBridgeBuilderForm/fields/IntegrationSelector'\nimport { IntegrationSettings } from '@features/nbee/SimpleBridgeBuilderForm/fields/IntegrationSettings'\nimport { useTestIntegrationCredentialsById } from '@app/api/testIntegrationCredentialsById'\nimport { useTranslation } from 'react-i18next'\nimport { usePopupError } from '@features/nbee/SimpleBridgeBuilderForm/fields/IntegrationSettings/usePopupError'\n\ninterface AppConfiguratorProps {\n type: AppConfigurationType\n canShowIntegrationField?: boolean\n templateSettings?: AppIntegrationSetting[]\n}\n\nexport const AppConfigurator: React.FC<AppConfiguratorProps> = ({\n type,\n canShowIntegrationField,\n templateSettings,\n}) => {\n const { t } = useTranslation()\n // some formik helpers\n const { values, setFieldValue, initialValues, setSubmitting } =\n useFormikContext<BridgeFormValues>()\n const selectedAppId = values[type].appId\n const parentAppId = values[type].parentAppId\n const selectedIntegrationId = values[type].integrationId\n\n // test integration once selected\n const {\n data: isValidIntegrationResponse,\n error: isValidIntegrationApiError,\n isLoading: isCheckingValidIntegration,\n isRefetching: isReCheckingValidIntegration,\n refetch: reCheckValidIntegration,\n } = useTestIntegrationCredentialsById(selectedIntegrationId, selectedAppId)\n\n const isTestingIntegrationCredentials =\n isCheckingValidIntegration || isReCheckingValidIntegration\n\n const isValidIntegration = Boolean(isValidIntegrationResponse?.data?.result)\n // handling error in case isValidIntegrationResponse retuns false\n const { showPopupError, clearPopupError, setIntegrationId } = usePopupError({\n type,\n showLogo: true,\n })\n\n useEffect(() => {\n clearPopupError()\n if (isValidIntegrationApiError && selectedIntegrationId) {\n setIntegrationId(selectedIntegrationId)\n showPopupError(isValidIntegrationApiError)\n }\n\n // Back-end does not return an error message in case integration is not valid,\n // instead it returns a 200 reponse with result: false, so in order to achieve same\n // behaviour of the 'integration-error' we need to simulate the ApiErrorResponse structure\n if (isValidIntegrationResponse?.data.result === false) {\n const popupErrorFake = {\n response: {\n data: {\n error: {\n code: 'integration-error',\n message:\n isValidIntegrationResponse.data.message ||\n t('nbee.bridgeBuilder.validation.integrationApiError'),\n },\n },\n },\n } as unknown as ApiErrorResponse\n showPopupError(popupErrorFake)\n }\n }, [isValidIntegrationResponse, isValidIntegrationApiError])\n\n const [localTemplateSettings, setLocalTemplateSettings] = useState<\n AppIntegrationSetting[]\n >(templateSettings || [])\n\n // we need to disable submit while testing integration\n useEffect(() => {\n setSubmitting(isTestingIntegrationCredentials)\n }, [isTestingIntegrationCredentials])\n\n // reset integrationId when appId changes\n // TODO: if user changes appId and then changes it back to the previous one, the initialValues are not restored\n useEffect(() => {\n if (!selectedAppId || selectedAppId !== initialValues[type].appId) {\n setFieldValue(`${type}.integrationId`, undefined)\n setLocalTemplateSettings([])\n }\n }, [selectedAppId])\n\n // when integrationID changes we need to empty the integration settings\n useEffect(() => {\n const isIntegrationIdChanged =\n !selectedIntegrationId ||\n selectedIntegrationId !== initialValues[type].integrationId\n const settingsAreFilled = values[type].settings?.length\n if (isIntegrationIdChanged && settingsAreFilled) {\n if (localTemplateSettings?.length) {\n // Special case: reset settings to template settings, if we have them\n setFieldValue(`${type}.settings`, localTemplateSettings)\n } else {\n // Normal case: reset settings\n console.log('emptying integration settings (AppConfigurator)')\n setFieldValue(`${type}.settings`, [])\n }\n }\n }, [selectedIntegrationId])\n\n const bothAppsAreSelected =\n Number.isInteger(values.source.appId) &&\n Number.isInteger(values.destination.appId) &&\n canShowIntegrationField\n\n const appHasSetting = values[type].settings?.length\n\n return (\n <>\n <h1>\n {type === 'source'\n ? t('nbee.bridgeBuilder.sourceTitle')\n : t('nbee.bridgeBuilder.destinationTitle')}\n </h1>\n <h4>\n {type === 'source'\n ? t('nbee.bridgeBuilder.sourceSubTitle')\n : t('nbee.bridgeBuilder.destinationSubTitle')}\n </h4>\n\n {/* Select app */}\n <AppSelector type={type} />\n\n {/* Select integration/connection */}\n {bothAppsAreSelected || appHasSetting ? (\n <IntegrationSelector\n type={type}\n appId={selectedAppId!}\n parentAppId={parentAppId}\n isTesting={\n !!(selectedIntegrationId && isTestingIntegrationCredentials)\n }\n onTestIntegrationRequest={() => {\n reCheckValidIntegration()\n }}\n />\n ) : null}\n\n {/* Dynamic settings returned by api */}\n <IntegrationSettings\n type={type}\n isValidIntegration={isValidIntegration}\n templateSettings={localTemplateSettings}\n />\n </>\n )\n}\n","import React, { useEffect, useMemo, useState } from 'react'\nimport { useFetchAllApps } from '@app/api/getAllApps'\nimport {\n InputSmartSelect,\n SelectValue,\n} from '@components/Form/InputSmartSelect'\nimport { useFetchMostPopularApps } from '@app/api/getMostPopularApp'\nimport { useTranslation } from 'react-i18next'\nimport {\n getAppOptionFromAppId,\n tranformApiAppsToSelectOptions,\n} from '@features/nbee/SimpleBridgeBuilderForm/fields/AppSelector/utils'\nimport { useFetchConnectedApps } from '@app/api/getConnectedApps'\nimport Fuse from 'fuse.js'\nimport { useField, useFormikContext } from 'formik'\nimport {\n AppConfigurationType,\n PartialConfiguredApp,\n BridgeFormValues,\n} from 'Nbee'\nimport { trackEvent } from '@app/dataTracking'\nimport { makeNbeeTrackingParams } from '@app/dataTracking/utils'\nimport { useRouteMatch } from 'react-router-dom'\nimport { bridgeBuilderStep1Paths, bridgeByUrlPartnersPaths } from '@app/routes'\n\ninterface AppSelectorProps {\n type: AppConfigurationType\n}\n\nexport const AppSelector: React.FC<AppSelectorProps> = ({ type }) => {\n const { t } = useTranslation()\n const [appNotFound, setAppNotFound] = useState(false)\n\n const step1MatchRoute = useRouteMatch([\n ...bridgeBuilderStep1Paths,\n ...bridgeByUrlPartnersPaths,\n ])\n const isInStep1 = !!step1MatchRoute?.isExact\n\n // appId field\n const inputName = `${type}.appId`\n const [appIdField, appIdMeta, appIdHelpers] =\n useField<PartialConfiguredApp['appId']>(inputName)\n const selectedAppId = appIdField.value\n\n // formik helpers\n const { values, setFieldValue } = useFormikContext<BridgeFormValues>()\n\n const { data: allApps, isLoading: isLoadingApps } = useFetchAllApps()\n const { data: mostPopular, isLoading: isLoadingMostPopular } =\n useFetchMostPopularApps({ type, limit: 50 })\n\n const { data: connectedApps, isLoading: isLoadingConnectedApps } =\n useFetchConnectedApps()\n\n const isLoadingAll =\n isLoadingApps || isLoadingMostPopular || isLoadingConnectedApps\n\n const mostPopularAppsOptions = tranformApiAppsToSelectOptions(mostPopular)\n const allAppsOptions = useMemo(\n () => tranformApiAppsToSelectOptions(allApps),\n [allApps]\n )\n\n const connectedAppsOptions = tranformApiAppsToSelectOptions(connectedApps)\n\n const defaultValue = getAppOptionFromAppId(selectedAppId, allAppsOptions)\n\n // every time we have a selected value (defaultValue) we store in our formik state its logo\n // so we can re-use it in case of need\n useEffect(() => {\n setFieldValue(`ui.${type}.logoUri`, defaultValue?.logoUri || '')\n setFieldValue(`ui.${type}.selectedAppName`, defaultValue?.label || '')\n setFieldValue(`${type}.parentAppId`, defaultValue?.parentAppId || '')\n }, [defaultValue])\n\n // sending track event every time a value is updated\n const selectedAppName =\n (allApps || []).find((a) => a.id === selectedAppId)?.name || ''\n useEffect(() => {\n if (selectedAppId && selectedAppName) {\n trackEvent({\n eventName: type === 'source' ? 'SourceSelected' : 'DestinationSelected',\n feature: 'NBEE',\n step: isInStep1 ? 'Apps' : 'BridgeChooser',\n params: {\n ...makeNbeeTrackingParams(values, type),\n // be sure we always send the just selected value and to avoid that form values are not being updated yet\n appName: selectedAppName,\n [`${type}AppId`]: selectedAppId, // computed sourceAppId or destinationAppID\n [`${type}AppName`]: selectedAppName, // computed sourceAppName or destinationAppName\n },\n sendEventToIntercom: true,\n })\n }\n }, [selectedAppId, selectedAppName])\n\n const initialValues = [\n {\n label: t('common.connectedApps'),\n options: connectedAppsOptions,\n },\n {\n label: t('common.mostPopular'),\n options: mostPopularAppsOptions,\n },\n ]\n\n // setting app fuzzy search with Fuse.js\n // to search with typo tollerance\n // https://fusejs.io/api/options.html\n const fuzzySearch = new Fuse(allAppsOptions, {\n isCaseSensitive: false,\n shouldSort: true,\n findAllMatches: true,\n includeMatches: true,\n includeScore: true,\n // minMatchCharLength: 3,\n threshold: 0.25, // 0 for exact match of letter and location, 1 to match everything\n distance: 30,\n // distance: 800,\n keys: ['label'],\n ignoreLocation: true, // in this way searching for `lead` will make \"Lead Metadata\" and \"Facebook Lead Ads\" at same position\n sortFn: (a, b) => {\n // this is the order that comes from original array (index position from 0 to array.length)\n const aPopularityOrder = a.idx + 1\n const bPopularityOrder = b.idx + 1\n\n // this is the score assigned by fuseJS\n const aScore = a.score\n const bScore = b.score\n\n // this is our computed score\n // it means we have our internal score calculated from popularity (1 - 1 / popularityOrder) and we add it tp the fuzzy search score\n // computed scores closest to zero will appear first\n const aComputedOrder = 1 - 1 / aPopularityOrder + aScore\n const bComputedOrder = 1 - 1 / bPopularityOrder + bScore\n\n return aComputedOrder < bComputedOrder ? -1 : 1\n },\n })\n\n // this function will be used to filter between all apps\n const filterResults = (pattern: string) =>\n fuzzySearch.search(pattern).slice(0, 40)\n\n // react-select option to load new options with async search\n const onAppSearch = (inputValue: string): Promise<SelectValue[]> =>\n new Promise((resolve) => {\n const fuzzyResults = filterResults(inputValue)\n const flattenResults = fuzzyResults.map(({ item }) => item)\n resolve(flattenResults)\n if (flattenResults.length) {\n setAppNotFound(false)\n }\n if (!flattenResults.length && !appNotFound) {\n setAppNotFound(true)\n trackEvent({\n eventName:\n type === 'source' ? 'SourceNotFound' : 'DestinationNotFound',\n step: isInStep1 ? 'Apps' : 'BridgeChooser',\n feature: 'NBEE',\n params: {\n ...makeNbeeTrackingParams(values, type),\n custom: {\n searchAppName: inputValue,\n },\n },\n sendEventToIntercom: true,\n })\n }\n })\n\n // we set a render key to force component in sync when is in edit\n const renderKey = defaultValue ? type + defaultValue.value : undefined\n\n const isLoadingApi =\n values.ui && values.ui[type] && values.ui[type]!.isLoadingApi\n\n return (\n <div>\n <InputSmartSelect\n placeholder={t('nbee.bridgeBuilder.selectApp')}\n isLoading={isLoadingAll}\n isDisabled={isLoadingApi || values.ui?.isBridgeEnabled}\n defaultValue={defaultValue}\n initialValues={initialValues}\n isClearable={false}\n // async search\n loadOptions={onAppSearch}\n // enforcing default value as key will force componente re-rending\n // when async default value arrives\n key={renderKey}\n onSelect={(selectedApp) => {\n if (Array.isArray(selectedApp)) {\n return\n }\n\n const newValue = selectedApp\n ? parseInt(`${selectedApp.value}`, 10)\n : undefined\n\n // update formik value\n appIdHelpers.setValue(newValue)\n }}\n name={inputName}\n onBlur={() => {\n appIdHelpers.setTouched(true)\n }}\n $status={\n appIdMeta.touched && appIdMeta.error\n ? {\n error: appIdMeta.error,\n }\n : undefined\n }\n />\n </div>\n )\n}\n","import React, { Fragment } from 'react'\nimport { Formik, Form, FormikHelpers } from 'formik'\nimport { BridgeFormValues, AppIntegrationSetting } from 'Nbee'\nimport { FormInner } from './FormInner'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { PageEditor } from '@app/layouts/PageEditor'\nimport { Panel } from '@components/Panel'\nimport { useTranslation } from 'react-i18next'\nimport { makeNbeeSteps } from '@features/nbee/utils'\nimport { validateNbeeForm } from './validation'\nimport { touchAllSettings } from '@features/nbee/SimpleBridgeBuilderForm/fields/IntegrationSettings/touchAllSettings'\nimport { trackEvent } from '@app/dataTracking'\nimport { makeNbeeTrackingParams } from '@app/dataTracking/utils'\nimport { StatusBarBridge } from '@features/nbee/StatusBarBridge'\nimport { useHistory } from 'react-router-dom'\nimport { appRoutes } from '@app/routes'\nimport { Loader } from '@components/Basic/Loader'\nimport { isInIframe } from '@app/utils/isInFrame'\nimport { ApiUserModuleItem, ApiUser } from 'BackendApi'\nimport { useEmailReceiptValidation } from '@features/nbee/EmailReceipt/useEmailReceiptValidation'\n\ninterface SimpleBridgeBuilderFormProps {\n initialValues: BridgeFormValues\n onSubmit: (\n formValues: BridgeFormValues,\n formikHelpers: FormikHelpers<BridgeFormValues>\n ) => void\n isSavingApi?: boolean\n emailReceiptUserModule?: ApiUserModuleItem\n userData?: ApiUser\n templateSettings?: AppIntegrationSetting[]\n}\n\nexport const SimpleBridgeBuilderForm: React.FC<SimpleBridgeBuilderFormProps> =\n ({\n initialValues,\n onSubmit,\n isSavingApi,\n emailReceiptUserModule,\n userData,\n templateSettings,\n }) => {\n const { t } = useTranslation()\n const steps = makeNbeeSteps(0)\n const history = useHistory()\n const isEmbedded = isInIframe()\n\n return (\n <Formik\n initialValues={initialValues}\n validate={validateNbeeForm}\n enableReinitialize={true}\n validateOnMount\n onSubmit={(values, formikHelpers) => {\n trackEvent({\n eventName: 'NextClicked',\n feature: 'NBEE',\n step: 'Apps',\n params: {\n ...makeNbeeTrackingParams(values),\n },\n sendEventToIntercom: Boolean(values.source.appId === 370), // only send to intercom if source is Facebook Lead Ads\n })\n if (values.ui?.isBridgeEnabled) {\n history.push(appRoutes.nbeeStep2.makeUrl(`${values.ui?.bridgeId}`))\n } else {\n onSubmit(values, formikHelpers)\n }\n }}\n >\n {(formikProps) => {\n // here we handle all cases where button is disabled\n const validationErrors = useEmailReceiptValidation(formikProps.values)\n const isEmailReceiptValid = !emailReceiptUserModule?.enabled\n ? true\n : Object.values(validationErrors).every((value) => value === null)\n\n const sourceHasApiError =\n formikProps.values.ui?.source?.hasSettingsApiError\n\n const destinationHasApiError =\n formikProps.values.ui?.destination?.hasSettingsApiError\n\n const cannotSubmit =\n formikProps.isSubmitting ||\n !formikProps.isValid ||\n sourceHasApiError ||\n destinationHasApiError ||\n isSavingApi ||\n !isEmailReceiptValid\n\n // when this is loaded inside an iframe, we show a progress bar in the <Panel> component to replace the regular step bar\n // we simulate the progress when both apps have been selected\n const embeddablePercentage =\n formikProps.values.source.appId &&\n formikProps.values.destination.appId\n ? 33\n : 1\n\n return (\n <Fragment>\n <PageEditor\n formikContext={formikProps}\n steps={steps}\n activeStep={0}\n infoBar={\n formikProps.values.ui?.bridgeId ? (\n <StatusBarBridge\n bridgeId={formikProps.values.ui.bridgeId}\n isVisible={\n !(\n initialValues?.manualStatus === 1 ||\n initialValues?.manualStatus === 'new'\n ) // checks if the bridge is in status \"new\"; in that case we will NOT want to display the edit bar.\n }\n />\n ) : null\n }\n topbarValue={formikProps.values.name}\n topbarError={formikProps.errors.name}\n onTopbarValueChange={\n // we don't want user to edit name while bridge is saving or is in readOnlyMode\n isSavingApi || formikProps.values.ui?.isBridgeEnabled\n ? undefined\n : (newBridgeName) => {\n formikProps.setFieldValue('name', newBridgeName)\n }\n }\n hasTopBar={!isEmbedded}\n backlink={{\n url: '/bridges',\n label: t('nbee.bridgeBuilder.exitNbee'),\n }}\n >\n <Form>\n <Panel\n progressBarPercentage={\n isEmbedded ? embeddablePercentage : undefined\n }\n body={\n <>\n {isSavingApi && (\n <Loader\n $active\n $dimmer\n $size={'large'}\n $text={t(\n 'nbee.bridgeBuilder.step1SetupLoadingMessage'\n )}\n />\n )}\n <FormInner\n emailReceiptUserModule={emailReceiptUserModule}\n userData={userData}\n templateSettings={templateSettings}\n />\n </>\n }\n footer={{\n left: null,\n right: (\n <span\n onClick={(e) => {\n // small workaround to show validation error messages since UX wants to keep the button disabled\n // and if user does not click on submit not yet touched fields are not set to touched\n touchAllSettings(formikProps)\n }}\n >\n <Button\n type={'submit'}\n $variant={'primary'}\n disabled={cannotSubmit}\n >\n {t('common.continue')}\n </Button>\n </span>\n ),\n }}\n />\n </Form>\n </PageEditor>\n </Fragment>\n )\n }}\n </Formik>\n )\n }\n","import { Button } from '@components/Basic/ButtonNbe'\nimport React, { useState } from 'react'\nimport {\n BarRight,\n BarLeft,\n StatusBarBridgeStyled,\n StatusBarBridgeWrapper,\n StatusBarStatus,\n StatusBarMessage,\n BarCenter,\n CloseIcon,\n} from './styled'\nimport { IoCloseOutline } from 'react-icons/io5'\n\ninterface StatusBarProps {\n text: string\n status: string\n onClick?: () => void\n buttonLabel?: string\n isLoading?: boolean\n allowManualClosing?: boolean\n}\n\nexport const StatusBar: React.FC<StatusBarProps> = ({\n text,\n status,\n buttonLabel,\n onClick,\n isLoading,\n allowManualClosing,\n}) => {\n const [isOpen, setIsOpen] = useState(true)\n\n if (!isOpen) return null\n\n return (\n <StatusBarBridgeStyled>\n <StatusBarBridgeWrapper>\n {allowManualClosing && (\n <CloseIcon onClick={() => setIsOpen(false)}>\n <IoCloseOutline size={25} />\n </CloseIcon>\n )}\n\n <BarLeft />\n <BarCenter>\n <StatusBarStatus>{status}</StatusBarStatus>\n <StatusBarMessage>{text}</StatusBarMessage>\n </BarCenter>\n <BarRight>\n {buttonLabel ? (\n <Button\n $variant={'secondary'}\n onClick={onClick}\n disabled={isLoading}\n $loading={isLoading}\n style={{ fontSize: '.75rem', padding: '8px 18px' }}\n >\n {buttonLabel}\n </Button>\n ) : null}\n </BarRight>\n </StatusBarBridgeWrapper>\n </StatusBarBridgeStyled>\n )\n}\n","import { StatusBar } from '@components/StatusBar'\nimport React, { useEffect, useState } from 'react'\nimport { useFormikContext } from 'formik'\nimport { useTranslation } from 'react-i18next'\nimport { useDisableBridgeById } from '@app/api/disableBridge'\nimport { parseApiError } from '@app/api/utils/error'\nimport { BridgeFormValues } from 'Nbee'\nimport { sendToast } from '@app/store/actions/ApplicationConfigurationActions'\nimport { useAppDispatch } from '@app/store/hooks'\nimport { trackEvent } from '@app/dataTracking'\nimport { makeNbeeTrackingParams } from '@app/dataTracking/utils'\n\ninterface StatusBarBridgeProps {\n bridgeId: number\n isVisible?: boolean\n}\nexport const StatusBarBridge: React.FC<StatusBarBridgeProps> = ({\n bridgeId,\n isVisible,\n}) => {\n const { values, setFieldValue } = useFormikContext<BridgeFormValues>()\n const isBridgeEnabled = values.ui?.isBridgeEnabled\n\n const { t } = useTranslation()\n const dispatch = useAppDispatch()\n\n const {\n mutate: disableBridge,\n isLoading: isDisablingBridge,\n error: disableBridgeApiError,\n data: disableBridgeResponse,\n } = useDisableBridgeById()\n\n // in case of success we update the form values setting the bridge as disabled\n useEffect(() => {\n if (disableBridgeResponse) {\n const newStatus = !!disableBridgeResponse?.data?.active\n setFieldValue('ui.isBridgeEnabled', newStatus)\n }\n }, [disableBridgeResponse])\n\n useEffect(() => {\n if (disableBridgeApiError) {\n const parsedError = parseApiError(disableBridgeApiError)\n dispatch(\n sendToast({\n title: 'Error',\n message: parsedError.message,\n color: 'negative',\n })\n )\n trackEvent({\n eventName: 'UnexpectedErrorThrown',\n feature: 'NBEE',\n step: 'Apps',\n params: {\n ...makeNbeeTrackingParams(values),\n custom: {\n errorCode: parsedError.code,\n errorDescription: parsedError.message,\n },\n },\n sendEventToIntercom: true,\n })\n }\n }, [disableBridgeApiError])\n\n return isBridgeEnabled ? (\n // enabled bridge can't be edited, user needs to disable it first\n <StatusBar\n onClick={() => {\n disableBridge({ bridgeId })\n }}\n buttonLabel={t('nbee.bridgeEnded.enableEditCta')}\n text={t('nbee.bridgeEnded.ViewDescription')}\n status={t('nbee.bridgeEnded.ViewMode')}\n isLoading={isDisablingBridge}\n allowManualClosing={false}\n />\n ) : bridgeId && isVisible ? (\n // Here bridge is not enabled and we tell the user that it needs to go all the way throught to publish it\n // This can only be shown in first step, because in step 2 we always have a bridgeId (when bridge is just been created)\n <StatusBar\n text={t('nbee.bridgeEnded.editingDescription')}\n status={t('nbee.bridgeEnded.editingMode')}\n allowManualClosing={false}\n />\n ) : null\n}\n","import React from 'react'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { StepCompletedWrapper, StepImage } from './styled'\nimport { ApiErrorResponse } from 'BackendApi'\nimport { PageEditor } from '@app/layouts/PageEditor'\nimport { Panel } from '@components/Panel'\nimport { Trans, useTranslation } from 'react-i18next'\nimport { makeNbeeSteps } from '@features/nbee/utils'\nimport { useHistory } from 'react-router-dom'\nimport { appRoutes } from '@app/routes'\nimport FinishImage from '@assets/images/illustrations/nbee-completed.svg'\nimport { isInIframe } from '@app/utils/isInFrame'\nimport Confetti from '@components/Confetti'\nimport { useQueryClient } from 'react-query'\nimport { Icon } from 'semantic-ui-react'\nimport { PerformanceBoosterBanner } from '@features/nbee/StepCompleted/PerformanceBoosterBanner'\nimport { PerformanceBoosterTip } from '@features/nbee/StepCompleted/PerformanceBoosterTip'\n\ninterface Props {\n bridgeName: string\n bridgeId: string\n sourceName?: string\n destinationName?: string\n redirectUri?: string\n isTestEnabledProp?: boolean\n performanceBoosterAvailable?: boolean\n errorPerformanceBooster?: ApiErrorResponse | null\n existingPerformanceBoosterAvailable?: boolean\n handleCreatePerformanceBoosterAndRedirect?: () => void\n existingPbId?: number\n}\n\nexport const StepCompleted: React.FC<Props> = ({\n bridgeId,\n bridgeName,\n sourceName,\n destinationName,\n redirectUri,\n isTestEnabledProp,\n performanceBoosterAvailable,\n existingPerformanceBoosterAvailable,\n errorPerformanceBooster,\n handleCreatePerformanceBoosterAndRedirect,\n existingPbId,\n}) => {\n const { t } = useTranslation()\n const history = useHistory()\n const steps = makeNbeeSteps(2, bridgeId)\n const isEmbedded = isInIframe()\n\n const queryClient = useQueryClient()\n\n return (\n <PageEditor\n steps={steps}\n activeStep={2}\n topbarValue={bridgeName}\n hasTopBar={!isEmbedded}\n bridgeIdProp={bridgeId}\n IsTestEnableProp={isTestEnabledProp}\n backlink={{\n url: '/bridges',\n label: t('nbee.bridgeBuilder.exitNbee'),\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n marginLeft:\n performanceBoosterAvailable && !errorPerformanceBooster\n ? '190px'\n : 0,\n }}\n >\n <Panel\n progressBarPercentage={isEmbedded ? 100 : undefined}\n body={\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Confetti />\n <StepCompletedWrapper>\n {performanceBoosterAvailable && !errorPerformanceBooster && (\n <Icon\n size='big'\n name={'check circle'}\n style={{\n color: '#2fcc71',\n margin: 0,\n padding: 0,\n alignSelf: 'center',\n }}\n />\n )}\n\n <h3\n style={{\n marginTop: '16px',\n marginBottom: '16px',\n fontSize:\n performanceBoosterAvailable && !errorPerformanceBooster\n ? '18px'\n : undefined,\n }}\n >\n {t('nbee.bridgeBuilder.step3SuccessHeader')}\n </h3>\n <p\n style={{\n margin: '0 0 16px 0',\n }}\n >\n <Trans\n ns={'all'}\n i18nKey={'nbee.bridgeBuilder.step3SuccessBody'}\n components={{\n strong: <strong />,\n bridgeName: bridgeName,\n sourceName: sourceName,\n destinationName: destinationName,\n }}\n />\n </p>\n {performanceBoosterAvailable && !errorPerformanceBooster && (\n <p\n style={{\n fontWeight: 'bold',\n margin: 0,\n }}\n >\n {t('nbee.bridgeBuilder.step3Enabled')}\n </p>\n )}\n\n {(!performanceBoosterAvailable || errorPerformanceBooster) && (\n <div style={{ marginTop: '12px', alignSelf: 'center' }}>\n <a\n rel='noreferrer'\n href={redirectUri}\n target={isInIframe() ? '_blank' : undefined}\n >\n <Button $variant={'primary'}>\n {t('nbee.bridgeBuilder.exploreLeadsBridge')}\n </Button>\n </a>\n </div>\n )}\n\n {performanceBoosterAvailable && !errorPerformanceBooster && (\n <PerformanceBoosterBanner\n existingPerformanceBoosterAvailable={\n existingPerformanceBoosterAvailable\n }\n handleCreatePerformanceBoosterAndRedirect={\n handleCreatePerformanceBoosterAndRedirect\n }\n existingPbId={existingPbId}\n bridgeId={bridgeId}\n />\n )}\n\n {!performanceBoosterAvailable && !errorPerformanceBooster && (\n <StepImage\n src={FinishImage}\n alt={t('nbee.bridgeBuilder.step3Title')}\n />\n )}\n\n {performanceBoosterAvailable && !errorPerformanceBooster && (\n <div>\n <a\n rel='noreferrer'\n href={redirectUri}\n target={isInIframe() ? '_blank' : undefined}\n >\n <Button\n $variant={'link-primary'}\n style={{\n textDecoration: 'underline',\n padding: 0,\n fontWeight: 400,\n }}\n >\n {t('nbee.bridgeBuilder.backToBridges')}\n </Button>\n </a>\n </div>\n )}\n </StepCompletedWrapper>\n </div>\n }\n footer={{\n left: (\n <Button\n type={'button'}\n $variant={'link-secondary'}\n onClick={() => {\n // we want to invalidate the permission checks query when the user goes back from here. This way the information will be refetched once the user lands on step2\n queryClient.invalidateQueries(['permission-checks'])\n history.push(appRoutes.nbeeStep2.makeUrl(bridgeId))\n }}\n >\n {t('nbee.fieldsMapping.goPreviewStep')}\n </Button>\n ),\n right: (\n <div style={{ display: 'flex', gap: '1rem' }}>\n <Button\n type={'button'}\n $variant={'secondary'}\n onClick={() => {\n history.push(appRoutes.nbeeBridgeChooserStep1.makeUrl())\n }}\n >\n {t('nbee.fieldsMapping.makeNewBridge')}\n </Button>\n </div>\n ),\n }}\n />\n {performanceBoosterAvailable && !errorPerformanceBooster && (\n <PerformanceBoosterTip />\n )}\n </div>\n </PageEditor>\n )\n}\n","import React, { useState } from 'react'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { Modal } from '@components/Basic/Modal'\nimport { useChangePlan } from '@app/api/postChangePlan'\nimport { sendToast } from '@app/store/actions/ApplicationConfigurationActions'\nimport { parseApiError } from '@app/api/utils/error'\nimport { useTranslation, Trans } from 'react-i18next'\nimport { useAppDispatch } from '@app/store/hooks'\nimport { trackEvent } from '@app/dataTracking'\nimport { useGetUserInfo } from '@app/api/getUserInfo'\nimport wellDoneImg from '@assets/images/well_done.png'\nimport { Content, ButtonWrapper } from './styled'\nimport { calculateDaysBetweenDates } from '@app/utils/calcDaysBetweenDates'\n\ninterface ModalProps {\n isOpen: boolean\n onCloseModal: () => void\n}\n\nexport const ModalChangePlan: React.FC<ModalProps> = ({\n isOpen,\n onCloseModal,\n}) => {\n const { t } = useTranslation()\n const dispatch = useAppDispatch()\n const [hasSwitched, setHasSwitched] = useState(false)\n const [showConfirm, setShowConfirm] = useState(false)\n\n const {\n data: userData,\n refetch: userDataRefetch,\n isRefetching: isUserDataRefetching,\n } = useGetUserInfo()\n\n const endOfTermsDate = new Date(\n userData?.pricing?.endOfTermsDate as string\n ).getTime()\n const dateNow = new Date().getTime()\n const remainDays = calculateDaysBetweenDates(endOfTermsDate, dateNow)\n\n // change plan\n const { mutate: changePlanMutation, isLoading: isChangingPlan } =\n useChangePlan()\n\n const changePlan = ({ planId }: { planId: string }) => {\n changePlanMutation(\n {\n planId,\n trial: false,\n },\n {\n onSuccess: () => {\n userDataRefetch().then(() => setHasSwitched(true))\n trackEvent({\n eventName: 'PlanChanged',\n feature: 'Pricing',\n step: 'Table',\n params: {\n custom: {\n previousPlanId: userData?.pricing?.cbPlanId,\n newPlanId: planId,\n previousMrr: userData?.pricing?.mrr\n ? (userData?.pricing?.mrr || 0) / 100\n : undefined,\n newMrr: 0, // here is always freemium\n trial: false,\n },\n },\n sendEventToIntercom: true,\n })\n },\n onError: (error) => {\n dispatch(\n sendToast({\n title: 'Error',\n messages: [parseApiError(error).message],\n color: 'negative',\n })\n )\n },\n }\n )\n }\n\n return (\n <Modal\n data-id={'modal-change-plan'}\n isOpen={isOpen}\n isWide={hasSwitched || showConfirm}\n onCloseModal={() => {\n setHasSwitched(false)\n if (isChangingPlan) {\n return\n }\n onCloseModal()\n }}\n >\n <Content>\n <h2>\n {hasSwitched\n ? t('billing.pricing.modalDowngradeTitleConfirm', {\n remainDays,\n })\n : showConfirm\n ? t('billing.pricing.modalDowngradeTitleSuccess')\n : t('billing.pricing.modalDowngradeTitle')}\n </h2>\n <hr />\n <p\n style={\n hasSwitched\n ? { marginBottom: '.5rem' }\n : showConfirm\n ? { marginBottom: '2rem' }\n : {}\n }\n >\n {hasSwitched ? (\n <Trans\n ns={'all'}\n i18nKey={'billing.pricing.modalDowngradeSubConfirm'}\n components={{\n br: <br />,\n }}\n values={{ remainDays }}\n />\n ) : showConfirm ? (\n t('billing.pricing.modalDowngradeTextSuccess')\n ) : (\n t('billing.pricing.modalDowngradeText')\n )}\n </p>\n {hasSwitched || showConfirm ? (\n <img\n style={showConfirm ? { marginBottom: '1rem' } : {}}\n src={wellDoneImg}\n alt={'wellDone'}\n />\n ) : null}\n {hasSwitched && (\n <p style={{ margin: '.5rem auto 1.5rem', width: '80%' }}>\n {t('billing.pricing.modalDowngradeTextConfirm')}\n </p>\n )}\n <ButtonWrapper>\n {hasSwitched || showConfirm ? null : (\n <Button\n $size={'large'}\n $variant={'link-primary'}\n onClick={onCloseModal}\n >\n {t('billing.pricing.modalDowngradeCtaCancel')}\n </Button>\n )}\n\n <Button\n onClick={\n !hasSwitched && !showConfirm\n ? () => changePlan({ planId: 'freemium' })\n : () => {\n onCloseModal()\n setHasSwitched(false)\n }\n }\n disabled={isChangingPlan || isUserDataRefetching}\n $loading={isChangingPlan || isUserDataRefetching}\n $size={'large'}\n $variant={'blue'}\n >\n {hasSwitched\n ? t('billing.pricing.modalDowngradeCtaOk')\n : showConfirm\n ? t('billing.pricing.modalDowngradeCtaSuccess')\n : t('billing.pricing.modalDowngradeCtaConfirm')}\n </Button>\n </ButtonWrapper>\n </Content>\n </Modal>\n )\n}\n","import React from 'react'\nimport { Modal } from '@components/Basic/Modal'\nimport { Content, ButtonWrapper } from '../ModalChangePlan/styled'\nimport wellDoneImg from '@assets/images/well_done.png'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { useTranslation } from 'react-i18next'\n\ninterface ModalProps {\n isOpen: boolean\n}\n\nexport const ModalUpdatedPlan: React.FC<ModalProps> = ({ isOpen }) => {\n const { t } = useTranslation()\n\n return (\n <Modal\n isOpen={isOpen}\n onCloseModal={() => {\n window.location.href = process.env.REACT_APP_V1_URL || ''\n }}\n isWide\n >\n <Content>\n <h2 style={{ fontSize: '1.3rem', fontWeight: 800 }}>\n {t('billing.pricing.modalDowngradeTitleSuccess')}\n </h2>\n <hr />\n <p>{t('billing.pricing.modalDowngradeTextSuccess')}</p>\n <img\n style={{ marginBottom: '1rem' }}\n src={wellDoneImg}\n alt={'super hero'}\n />\n <ButtonWrapper>\n <Button\n $size={'large'}\n $variant={'primary'}\n onClick={() => {\n window.location.href = process.env.REACT_APP_V1_URL || ''\n }}\n >\n {t('billing.pricing.modalDowngradeCtaSuccess')}\n </Button>\n </ButtonWrapper>\n </Content>\n </Modal>\n )\n}\n","import React from 'react'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport {\n Wrapper,\n PlanType,\n PlanName,\n PriceStyled,\n} from '@features/pricing/PlanInfoBanner/styled'\nimport { ApiFeatures } from 'BackendApi'\nimport ReactTooltip from 'react-tooltip'\nimport { useTranslation } from 'react-i18next'\nimport { getPlanNameToShow } from '@features/pricing/PricingCard'\nimport { InputSelect, InputSelectOption } from '@components/Form/InputSelect'\nimport { IoIosHelpCircleOutline } from 'react-icons/io'\nimport { InputWrapperIcon } from '@features/pricing/PricingCardControllers/styled'\n\ninterface Props {\n plan: ApiFeatures\n optionsMtu?: InputSelectOption[]\n optionsBridge?: InputSelectOption[]\n isCurrentPlan?: boolean\n onPlanSelect?: () => void\n isDisabled?: boolean\n}\n\nexport const PlanInfoBanner: React.FC<Props> = ({\n plan,\n optionsMtu,\n optionsBridge,\n isCurrentPlan,\n onPlanSelect,\n isDisabled,\n}) => {\n const { t } = useTranslation()\n\n const isBusiness = plan?.name?.toLowerCase() === 'business'\n const price = isBusiness ? '999' : '0'\n\n if (!plan) {\n return null\n }\n\n return (\n <Wrapper>\n <div>\n <PlanType>{plan?.serviceType}</PlanType>\n <PlanName>{getPlanNameToShow(plan?.name.toLowerCase())}</PlanName>\n <p>{plan?.description}</p>\n </div>\n {optionsMtu && optionsBridge ? (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n }}\n >\n <InputWrapperIcon>\n <InputSelect\n disabled\n name={plan.name}\n $options={optionsMtu}\n value={optionsMtu[0].value}\n />\n <IoIosHelpCircleOutline\n size={20}\n data-tip={t('billing.pricing.freemiumMtuTooltip')}\n data-for={'freemium-mtu-limit'}\n data-class='tooltip-style'\n />\n <ReactTooltip id={'freemium-mtu-limit'} />\n </InputWrapperIcon>\n <InputWrapperIcon>\n <InputSelect\n disabled\n name={plan.name}\n $options={optionsBridge}\n value={optionsBridge[0].value}\n />\n <IoIosHelpCircleOutline\n size={20}\n data-tip={t('billing.pricing.freemiumBridgeTooltip')}\n data-for={'freemium-bridge-limit'}\n data-class='tooltip-style'\n />\n <ReactTooltip id={'freemium-bridge-limit'} />\n </InputWrapperIcon>\n </div>\n ) : null}\n\n <div>\n <ul>\n {plan?.mainFeatures.map((feature, index) =>\n feature.name ? (\n <li key={index}>\n {feature.description ? (\n <>\n <ReactTooltip\n className={'feature-item-styled'}\n clickable={true}\n place='right'\n effect='solid'\n html={true}\n id={`${plan?.name}_feature_${index}`}\n />\n <span\n className={'feature-item-label-styled'}\n style={{ cursor: 'help' }}\n data-tip={feature.description}\n data-for={`${plan?.name}_feature_${index}`}\n >\n {feature.name}\n </span>\n </>\n ) : (\n <>{feature.name}</>\n )}\n </li>\n ) : null\n )}\n </ul>\n </div>\n <div style={{ textAlign: 'center' }}>\n <PriceStyled>\n <h2>\n <span>$</span>\n {price}\n </h2>\n </PriceStyled>\n {isBusiness ? (\n <p>{t('billing.pricing.businessPriceDescription')}</p>\n ) : (\n <p>{t('billing.pricing.freemiumPriceDescription')}</p>\n )}\n <Button\n onClick={!isBusiness ? onPlanSelect : undefined}\n disabled={isCurrentPlan || isDisabled}\n $fluid\n $size={'large'}\n $variant={'primary'}\n >\n {isBusiness\n ? t('billing.pricing.businessCta')\n : isCurrentPlan\n ? t('billing.pricing.ctaCurrentPlan')\n : t('billing.pricing.ctaChoosePlan')}\n </Button>\n </div>\n </Wrapper>\n )\n}\n","import React from 'react'\nimport {\n FeaturesStyled,\n PlanDescription,\n PlanHeaderLeft,\n PlanHeaderRight,\n PlanName,\n PlanType,\n PriceDescription,\n PriceDiscount,\n PriceStyled,\n PricingCardBox,\n PricingCardHeaderStyled,\n PricingCardTopBarLabel,\n PricingCardTopBarWrapper,\n PricingCardWrapper,\n} from '@features/pricing/PricingCard/styled'\n\nimport ReactTooltip from 'react-tooltip'\nimport { useTranslation } from 'react-i18next'\nimport { ApiMainFeatures, ApiUser } from 'BackendApi'\n\nexport interface PricingCardProps {\n planName: string\n planDescription: string\n price: number\n priceDescription: string\n features: ApiMainFeatures[]\n isYearlyChecked: boolean\n yearlyDiscountPercentage?: string\n isActive?: boolean\n isRecommended?: boolean\n isCurrentPlan?: boolean\n showUndo?: boolean\n remainDays?: number\n onUndoSelect: (planId: string | undefined) => void\n userData: ApiUser\n endOfTermsDate?: string\n deleteAtDate?: string\n}\n\nexport const planNameToShow: Record<string, string> = {\n freemium: 'Free',\n starter: 'Starter',\n pro: 'Pro',\n business: 'Business',\n}\n\nexport const getPlanNameToShow = (planName: string) => {\n return planNameToShow[planName] || planNameToShow\n}\n\nexport const PricingCard: React.FC<PricingCardProps> = ({\n features,\n planName,\n planDescription,\n price,\n priceDescription,\n isActive,\n isRecommended,\n isCurrentPlan,\n isYearlyChecked,\n yearlyDiscountPercentage,\n children,\n remainDays,\n onUndoSelect,\n userData,\n endOfTermsDate,\n deleteAtDate,\n}) => {\n const { t } = useTranslation()\n\n const showUndoPro =\n (endOfTermsDate || deleteAtDate) &&\n (planName === 'PRO' || planName === 'STARTER') &&\n isCurrentPlan\n\n const undoMessage = deleteAtDate\n ? 'billing.pricing.cancellingCardHeader'\n : endOfTermsDate\n ? 'billing.pricing.switchingToFreeCardHeader'\n : 'billing.pricing.switchingToFreeCardHeader' // Providing a default value to ensure non-nullability for TypeScript\n\n const planId = userData?.pricing?.cbPlanId\n\n return (\n <PricingCardWrapper planName={planName.toLocaleLowerCase()}>\n {showUndoPro ? (\n <PricingCardTopBarWrapper>\n <PricingCardTopBarLabel showUndoPro={showUndoPro}>\n <p>\n {t(undoMessage, { remainDays })}\n <span onClick={() => onUndoSelect(planId)}>Undo</span>\n </p>\n </PricingCardTopBarLabel>\n </PricingCardTopBarWrapper>\n ) : isRecommended || isCurrentPlan ? (\n <PricingCardTopBarWrapper>\n <PricingCardTopBarLabel isCurrentPlan={isCurrentPlan}>\n {isCurrentPlan\n ? t('billing.pricing.pricingColumnCurrent')\n : isRecommended\n ? t('billing.pricing.pricingColumnRecommended')\n : null}\n </PricingCardTopBarLabel>\n </PricingCardTopBarWrapper>\n ) : null}\n\n <PricingCardBox isActive={isActive} isRecommended={isRecommended}>\n <PlanType>\n {planName.toLowerCase() !== 'business'\n ? 'self-service'\n : 'managed service'}\n </PlanType>\n\n <PricingCardHeaderStyled>\n <PlanHeaderLeft>\n <PlanName planName={planName.toLocaleLowerCase()}>\n {getPlanNameToShow(planName.toLowerCase())}\n </PlanName>\n <PlanDescription planName={planName.toLocaleLowerCase()}>\n {planDescription}\n </PlanDescription>\n </PlanHeaderLeft>\n <PlanHeaderRight>\n <PriceStyled>\n <span>$</span>\n <h2>\n {isYearlyChecked &&\n yearlyDiscountPercentage &&\n planName.toLocaleLowerCase() !== 'business' &&\n planName.toLocaleLowerCase() !== 'freemium' ? (\n <PriceDiscount isYearlyChecked={isYearlyChecked}>\n {''}- {yearlyDiscountPercentage}%{''}\n </PriceDiscount>\n ) : null}\n\n {price}\n </h2>\n </PriceStyled>\n <PriceDescription>{priceDescription}</PriceDescription>\n </PlanHeaderRight>\n </PricingCardHeaderStyled>\n <div style={{ margin: '1.5rem 0 1rem' }}>{children}</div>\n <FeaturesStyled>\n {features.map((feature, index) =>\n // Clear map result: avoid dot without feature.name label\n feature.name ? (\n <li key={index}>\n {feature.description ? (\n <>\n <ReactTooltip\n className={'feature-item-styled'}\n clickable={true}\n place='top'\n effect='solid'\n html={true}\n id={`${planName}_feature_${index}`}\n />\n <span\n className={'feature-item-label-styled'}\n style={{ cursor: 'help' }}\n data-tip={feature.description}\n data-for={`${planName}_feature_${index}`}\n >\n {feature.name}\n </span>\n </>\n ) : (\n <>{feature.name}</>\n )}\n </li>\n ) : null\n )}\n </FeaturesStyled>\n </PricingCardBox>\n </PricingCardWrapper>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Formik, Form } from 'formik'\nimport { Button as ButtonNbe } from '@components/Basic/ButtonNbe'\nimport {\n FooterStyled,\n SignupFormWrapper,\n SeparatorStyled,\n TitleStyled,\n FormRow,\n SocialProvidersWrapper,\n TermsText,\n ContentWrapper,\n HeaderTop,\n} from './styled'\nimport { FormikInputField } from '@components/Formik/FormikInputField'\nimport {\n initialFormValues,\n initialFormValuesAppsumo,\n validationSchema,\n validationSchemaAppsumo,\n} from '@features/signup/SignupForm/formConfig'\nimport { useHistory, useLocation } from 'react-router-dom'\nimport { appRoutes } from '@app/routes'\nimport { ButtonProvider, SignupProviderName } from '@components/ButtonProvider'\nimport { matchPath } from 'react-router'\nimport { BbuRouteParams, PartnerSignupRouterParam } from 'LeadsBridgeApp'\nimport { useAppDispatch } from '@app/store/hooks'\nimport { sendToast } from '@app/store/actions/ApplicationConfigurationActions'\nimport { Loader } from '@components/Basic/Loader'\nimport { Trans, useTranslation } from 'react-i18next'\nimport {\n getPersistentSignupParams,\n useHideParamsFromString,\n} from '@features/signup/SignupForm/useHideParamsFromString'\nimport { useSignupWithEmail } from '@app/api/signup'\nimport { parseApiError } from '@app/api/utils/error'\nimport { handleSignupWithEmailSuccess } from '@features/signup/SignupForm/signupWithEmailUtils'\nimport { ReCaptcha } from '@components/ReCaptcha'\nimport { identifyUserByUserData, trackEvent } from '@app/dataTracking'\nimport { useFetchIntegrationsMetaForBridgeByUrl } from '@app/api/integrationTools'\nimport { Hub } from '@aws-amplify/core'\nimport {\n AUTH_STATE_CHANGE_EVENT,\n AuthState,\n UI_AUTH_CHANNEL,\n} from '@aws-amplify/ui-components'\nimport { useFastAppSurveyIndustries } from '@app/api/fastAppSurveyIndustries'\nimport { FormikInputSelect } from '@components/Formik/FormikInputSelect'\nimport { FormikInputCheckbox } from '@components/Formik/FormikInputCheckbox'\nimport { sleep } from '@app/utils/helpers'\nimport Tap from '@tapfiliate/tapfiliate-js'\nimport {\n AffiliateIdDataFromCookies,\n getAffiliateIdFromCookies,\n setCookie,\n} from '@app/utils/cookieUtils'\n\nexport interface Props {\n showFacebookButton?: boolean\n showGoogleButton?: boolean\n title?: string\n onSignUp?: () => void\n isAppSumo?: boolean\n showIndustries?: boolean\n showCoupon?: boolean\n header?: React.ReactNode\n testId?: string\n}\n\nexport const SignUpForm: React.FC<Props> = ({\n title,\n showGoogleButton,\n showFacebookButton,\n isAppSumo,\n showIndustries,\n showCoupon,\n header,\n testId,\n}) => {\n const history = useHistory()\n const location = useLocation()\n const dispatch = useAppDispatch()\n const { t } = useTranslation()\n const [isLoading, setIsLoading] = useState(false)\n const getIndustries = useFastAppSurveyIndustries()\n\n // .../bc/lb/facebook-leads-ads/google-sheets/?cc=XXX&cbPlan=YYY&td=15\n useHideParamsFromString()\n const signupParams = getPersistentSignupParams()\n const matchBBuPath = matchPath<BbuRouteParams>(location.pathname, {\n path: appRoutes.signupBbu.path,\n exact: true,\n strict: false,\n })\n\n const matchPartnerPath = matchPath<PartnerSignupRouterParam>(\n location.pathname,\n {\n path: appRoutes.signupPartner.path,\n exact: true,\n strict: false,\n }\n )\n\n const couponCode = matchPartnerPath?.params.couponCode\n\n const currentPlan = isAppSumo\n ? 'appsumo-2022'\n : signupParams.cbPlan || 'freemium'\n\n /* const isFreePlan =\n currentPlan === 'freemium' || currentPlan.includes('starter') */\n\n const updatedAppSumoFormValues = { ...initialFormValuesAppsumo, couponCode }\n\n const bbuSourceSlug = matchBBuPath?.params.source\n const bbuDestinationSlug = matchBBuPath?.params.destination\n const { data: bbuAppsInfo } = useFetchIntegrationsMetaForBridgeByUrl(\n bbuSourceSlug,\n bbuDestinationSlug\n )\n const isValidBbuUrl = Boolean(\n bbuAppsInfo?.source?.id && bbuAppsInfo.destination?.id\n )\n\n const [affiliateData, setAffiliateData] = React.useState<\n AffiliateIdDataFromCookies | undefined\n >({\n tapClickId: undefined,\n tapVisitorId: undefined,\n })\n\n // Check if cookies are already there\n React.useEffect(() => {\n const existingCookieData = getAffiliateIdFromCookies()\n setAffiliateData(existingCookieData)\n }, [])\n\n // Stores click Id and visitor Id in cookies\n React.useEffect(() => {\n // if cookies are already there (and they've been stored in the affiliateData state), exit early\n if (\n getAffiliateIdFromCookies()?.tapClickId &&\n getAffiliateIdFromCookies()?.tapVisitorId\n )\n return\n // If cookies are not present, check if ref is present in query params\n // If it is not, exit early\n if (!signupParams.ref) return\n\n // If cookies aren't present, but we do have the ref code,\n // initialize TapFiliate, then execute Tap.detect\n Tap.init(`${process.env.TAPFILIATE_ACCOUNT_ID}`)\n Tap.detect(\n {\n always_callback: true,\n referral_code: signupParams.ref,\n },\n (response: any, args: { id?: string; vid?: string }) => {\n console.log(\n 'Tap.detect callback response',\n response,\n 'Tap.detect args',\n args\n )\n\n if (response === 'Tracking request failed') {\n console.error('Error in Tap.detect:', response)\n return\n }\n\n const { id: argId, vid: argVid } = args || {}\n\n const id = argId\n const vid = argVid\n\n if (id && vid) {\n // create cookies with tap click id and visitor id values (which I'm sure I don't have already)\n setCookie('tap.id', id)\n setCookie('tap.vid', vid)\n\n // Set affiliate data directly after setting cookies\n setAffiliateData({ tapClickId: id, tapVisitorId: vid })\n }\n }\n )\n }, [signupParams.ref]) // executes this useEffect only when the value of signupParams.ref changes (-> only when we do have a ref code in the signup page url)\n\n const {\n mutate: signupWithEmail,\n isLoading: isDoingSingup,\n error: signupWithEmailApiError,\n data: signupReponse,\n } = useSignupWithEmail()\n\n const onAuthSuccess = async () => {\n await sleep(500)\n\n const firstLoginUrlParam = 'lbfsgn'\n\n // we should already have an user id, so we try to track the signup event with an UID already attached\n const newUserId = signupReponse?.user.userId\n ? `UID-${signupReponse?.user.userId}`\n : undefined\n\n // we wait to have the user identified before sending the track event\n await identifyUserByUserData(signupReponse).catch(() => {\n console.log('not identified - segment not active')\n })\n\n trackEvent({\n eventName: 'SignUp',\n feature: 'Authentication',\n step: 'Signup',\n params: {\n custom: {\n planId: currentPlan,\n mrr: (signupReponse?.pricing?.mrr || 0) / 100,\n channel: isValidBbuUrl ? 'lb' : 'signup',\n sourceId: bbuAppsInfo?.source?.id,\n sourceName: bbuAppsInfo?.source?.name,\n destinationId: bbuAppsInfo?.destination?.id,\n destinationName: bbuAppsInfo?.destination?.name,\n },\n userId: newUserId,\n },\n sendEventToIntercom: true,\n })\n\n if (bbuSourceSlug && bbuDestinationSlug && isValidBbuUrl) {\n // re-render Apps.tsx routing and this time will match private route for Step1 with bbu\n Hub.dispatch(UI_AUTH_CHANNEL, {\n event: AUTH_STATE_CHANGE_EVENT,\n message: AuthState.SignedIn,\n data: null,\n })\n } else if (signupParams.sourceId || signupParams.destinationId) {\n // in case we have sourceId or destinationId in query string, we take user to nbee step1 with source or destination pre-selected\n history.push({\n pathname: appRoutes.nbeeStep1New.makeUrl(),\n search: signupParams.sourceId\n ? `sourceId=${signupParams.sourceId}&${firstLoginUrlParam}=true¤tPlan=${currentPlan}`\n : `destinationId=${signupParams.destinationId}&${firstLoginUrlParam}=true¤tPlan=${currentPlan}`,\n })\n } else {\n // generic signup, we take user NBEE step1 right after updating auth state\n Hub.dispatch(UI_AUTH_CHANNEL, {\n event: AUTH_STATE_CHANGE_EVENT,\n message: AuthState.SignedIn,\n data: null,\n })\n history.push({\n pathname: appRoutes.nbeeStep1New.makeUrl(),\n search: `${firstLoginUrlParam}=true¤tPlan=${currentPlan}`,\n })\n }\n }\n\n const showGenericError = (message: string) => {\n setIsLoading(false)\n dispatch(\n sendToast({\n title: 'Error',\n messages: [message],\n color: 'negative',\n })\n )\n }\n\n useEffect(() => {\n if (signupReponse) {\n handleSignupWithEmailSuccess({\n credentials: signupReponse?.credentials,\n onError: showGenericError,\n }).then(() => {\n onAuthSuccess()\n })\n }\n }, [signupReponse])\n\n // on signupWithEmailError\n useEffect(() => {\n if (signupWithEmailApiError) {\n const parsedError = parseApiError(signupWithEmailApiError)\n showGenericError(parsedError.message)\n trackEvent({\n eventName: 'UnexpectedErrorThrown',\n feature: 'Authentication',\n step: 'Signup',\n params: {\n custom: {\n errorCode: parsedError.code,\n errorDescription: parsedError.message,\n planId: currentPlan,\n },\n },\n sendEventToIntercom: true,\n })\n }\n }, [signupWithEmailApiError])\n\n const signupProviders: {\n name: SignupProviderName\n show?: boolean\n }[] = [\n {\n name: 'Google',\n show: showGoogleButton,\n },\n {\n name: 'Facebook',\n show: showFacebookButton,\n },\n ]\n\n return (\n <SignupFormWrapper data-testid={testId} isAppSumo={isAppSumo}>\n {isLoading && <Loader $active $dimmer />}\n\n <ReCaptcha>\n {({ getCaptchaToken }) => (\n <ContentWrapper isAppSumo={isAppSumo}>\n {header && <HeaderTop>{header}</HeaderTop>}\n {title && <TitleStyled>{title}</TitleStyled>}\n <SocialProvidersWrapper>\n {signupProviders.map(({ show, name }) =>\n show ? (\n <ButtonProvider\n key={name}\n scope={'SignUp'}\n provider={name}\n getCaptchaToken={getCaptchaToken}\n signupParams={signupParams}\n onBeforeAuth={() => {\n setIsLoading(true)\n }}\n onAuthError={showGenericError}\n onAuthSuccess={onAuthSuccess}\n />\n ) : null\n )}\n </SocialProvidersWrapper>\n\n {showFacebookButton || showGoogleButton ? (\n <SeparatorStyled>\n <hr />\n <span>Or</span>\n <hr />\n </SeparatorStyled>\n ) : null}\n\n <Formik\n initialValues={\n isAppSumo ? updatedAppSumoFormValues : initialFormValues\n }\n validationSchema={\n isAppSumo ? validationSchemaAppsumo : validationSchema\n }\n onSubmit={async (values) => {\n setIsLoading(true)\n const recaptchaToken = await getCaptchaToken()\n if (!recaptchaToken) {\n setIsLoading(false)\n return\n }\n console.log(\n 'calling signupWithEmail',\n 'tapVisitorId',\n affiliateData?.tapVisitorId,\n 'tapClickId',\n affiliateData?.tapClickId\n )\n signupWithEmail({\n requestBody: {\n firstName: values.firstName,\n lastName: values.lastName,\n email: values.email,\n referralUri: document.referrer || window.location.origin,\n trialDays: isAppSumo\n ? undefined\n : `${signupParams.trialDays}`,\n cbPlan: currentPlan,\n couponCode:\n values.couponCode || signupParams.couponCode || undefined,\n industry: isAppSumo ? values.industry : '',\n bbuUri: isAppSumo\n ? undefined\n : matchBBuPath?.isExact && isValidBbuUrl\n ? `${window.location.origin}${location.pathname}`\n : undefined,\n recaptchaToken: recaptchaToken || '',\n tapClickId: affiliateData?.tapClickId || undefined,\n tapVisitorId: affiliateData?.tapVisitorId || undefined,\n },\n })\n }}\n >\n {() => {\n return (\n <Form>\n <FormRow>\n <FormikInputField\n name='firstName'\n type='text'\n label='First Name'\n $fluid\n $hasMargin\n placeholder={'John'}\n className={'mb-0'}\n />\n <FormikInputField\n name='lastName'\n type='text'\n label='Last Name'\n $fluid\n $hasMargin\n placeholder={'Appleseed'}\n className={'mb-0'}\n />\n </FormRow>\n\n <FormikInputField\n name='email'\n type='email'\n label='Email'\n $fluid\n $hasMargin\n placeholder={'example@mail.com'}\n className={'mb-0'}\n />\n {isAppSumo && showIndustries ? (\n <FormikInputSelect\n $options={getIndustries.data || []}\n $loading={getIndustries.isLoading}\n disabled={Boolean(getIndustries.error)}\n $optionsLabel={\n getIndustries.error\n ? 'Unable to retrieve industries'\n : 'Please select industry'\n }\n name={'industry'}\n $label={'Industry'}\n $hasMargin\n />\n ) : null}\n\n {isAppSumo && showCoupon ? (\n <FormikInputField\n name='couponCode'\n type='text'\n label={t('auth.signup.couponLabelAppSumo')}\n $fluid\n $hasMargin\n className={'mb-0'}\n />\n ) : null}\n <div style={{ marginTop: '1rem' }}>\n <FormikInputCheckbox name='privacyConsent'>\n <TermsText>\n <Trans\n ns={'all'}\n i18nKey={\n isAppSumo\n ? 'auth.signup.termsAndConditionAppSumo'\n : 'auth.signup.termsAndCondition'\n }\n components={{\n a: <a />,\n }}\n />\n </TermsText>\n </FormikInputCheckbox>\n </div>\n <div style={{ margin: '1.6rem 0 1rem' }}>\n <ButtonNbe\n type={'submit'}\n $variant={'action'}\n disabled={isDoingSingup || isLoading}\n $size={'large'}\n $fluid\n >\n {isAppSumo\n ? t('auth.signup.ctaWithAppsumo')\n : t('auth.signup.ctaViaEmail')}\n </ButtonNbe>\n </div>\n </Form>\n )\n }}\n </Formik>\n\n {isAppSumo || !showFacebookButton || !showGoogleButton ? (\n <SeparatorStyled>\n <hr />\n <span>or</span>\n <hr />\n </SeparatorStyled>\n ) : null}\n <FooterStyled isAppSumo={isAppSumo}>\n <ButtonNbe\n style={{ padding: '0', textDecoration: 'underline' }}\n $variant={'link-secondary'}\n onClick={() => {\n history.push(appRoutes.signin.makeUrl())\n }}\n >\n {t('auth.signup.alreadyAnAccount')}\n </ButtonNbe>\n <ButtonNbe\n style={{ margin: '0' }}\n $variant={'outlined-primary'}\n onClick={() => {\n history.push(appRoutes.signin.makeUrl())\n }}\n >\n {t('auth.signup.signIn')}\n </ButtonNbe>\n </FooterStyled>\n </ContentWrapper>\n )}\n </ReCaptcha>\n </SignupFormWrapper>\n )\n}\n","import React, { ReactNode } from 'react'\nimport styled, { css } from 'styled-components'\n\ninterface LayoutProps {\n leftSlot?: ReactNode\n hideLeftOnMobile?: boolean\n rightSlot: ReactNode\n}\n\nconst SingupLayoutWrapper = styled.div`\n background-color: #41a6dc;\n width: 100%;\n min-height: 100vh;\n padding: 1rem;\n @media (min-width: 980px) {\n padding: 0 1rem;\n }\n`\n\nconst SignupLayoutStyled = styled.div`\n width: 100%;\n min-height: 100vh;\n\n max-width: ${({ theme }) => theme.container.extralarge};\n display: grid;\n align-items: center;\n margin: 0 auto;\n gap: 1rem;\n\n @media (min-width: 980px) {\n grid-template-columns: 1fr 1fr;\n }\n`\n\nconst ContainerStyled = styled.div<{ $hideOnMobile?: boolean }>`\n display: flex;\n justify-content: center;\n\n /* in generic singup left image needs to disappear on mobile, in bbu not */\n ${({ $hideOnMobile }) =>\n $hideOnMobile\n ? css`\n @media (max-width: 768px) {\n display: none;\n }\n `\n : null}\n`\n\nexport const SignupLayout: React.FC<LayoutProps> = ({\n leftSlot,\n rightSlot,\n hideLeftOnMobile,\n}) => {\n return (\n <SingupLayoutWrapper>\n <SignupLayoutStyled>\n <ContainerStyled $hideOnMobile={hideLeftOnMobile}>\n {leftSlot}\n </ContainerStyled>\n <ContainerStyled>{rightSlot}</ContainerStyled>\n </SignupLayoutStyled>\n </SingupLayoutWrapper>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Message, Transition } from 'semantic-ui-react'\nimport { Toast } from 'LeadsBridgeApp'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '@app/index'\nimport styled from 'styled-components'\n\nconst ToastStyled = styled.div`\n position: fixed;\n top: 33px;\n right: 10px;\n z-index: ${({ theme }) => theme.zIndex.overallNotifications};\n .ui.message {\n padding-right: 40px;\n }\n`\n\nconst ToastComponent: React.FC = () => {\n const [visible, setVisible] = useState<boolean>(false)\n const toast: Toast | null = useSelector(\n (state: RootState) => state.application.toast\n )\n\n useEffect(() => {\n if (toast !== null) {\n setVisible(true)\n setTimeout(() => {\n setVisible(false)\n }, 5500)\n }\n }, [toast])\n\n return (\n <ToastStyled>\n <Transition visible={visible} animation='scale' duration={500}>\n <Message\n compact\n className={toast?.color}\n header={toast?.title}\n onDismiss={() => setVisible(false)}\n >\n {toast && toast.message ? (\n <span dangerouslySetInnerHTML={{ __html: toast.message }} />\n ) : null}\n {toast && toast.messages ? (\n <ul>\n {toast.messages.map((message, index) => {\n return (\n <li\n key={index}\n dangerouslySetInnerHTML={{ __html: message }}\n />\n )\n })}\n </ul>\n ) : null}\n </Message>\n </Transition>\n </ToastStyled>\n )\n}\n\nexport default ToastComponent\n","import * as React from 'react'\nimport * as ReactDOM from 'react-dom'\nimport App from './App'\nimport { Router } from 'react-router-dom'\nimport store from './store'\nimport { createBrowserHistory } from 'history'\nimport { Provider } from 'react-redux'\nimport ToastComponent from './components/ToastComponent'\nimport { QueryClient, QueryClientProvider } from 'react-query'\nimport { createServerInit } from './mockapi'\nimport { ReactQueryDevtools } from 'react-query/devtools'\nimport { ThemeProvider } from 'styled-components'\nimport { defaultTheme } from '@app/styles/theme/default'\nimport './i18n'\nimport { AlertComponent } from '@components/Alert'\nimport { ErrorBoundary } from '@sentry/react'\nimport { ErrorPage } from '@components/ErrorBoundary/ErrorPage'\nimport { initSentry } from '@app/utils/sentry'\n\nif (process.env.REACT_USE_MOCK_API === 'true') {\n createServerInit()\n}\n\nconst history = createBrowserHistory()\nexport type RootState = ReturnType<typeof store.getState>\nexport type AppDispatch = typeof store.dispatch\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: 0,\n staleTime: Infinity,\n refetchOnWindowFocus: false,\n },\n },\n})\n\ninitSentry()\n\nReactDOM.render(\n <QueryClientProvider client={queryClient}>\n <ReactQueryDevtools initialIsOpen={false} />\n <Provider store={store}>\n <Router history={history}>\n <ThemeProvider theme={defaultTheme}>\n <ErrorBoundary fallback={() => <ErrorPage />}>\n <App />\n </ErrorBoundary>\n <ToastComponent />\n <AlertComponent />\n </ThemeProvider>\n </Router>\n </Provider>\n </QueryClientProvider>,\n document.getElementById('root')\n)\n","import * as Sentry from '@sentry/react'\n\nexport const initSentry = () => {\n Sentry.init({\n dsn: 'https://acad65fcd1a943a893a7e2dfb763ebf7@o320992.ingest.sentry.io/6172904',\n integrations: [\n Sentry.browserTracingIntegration(),\n Sentry.replayIntegration(),\n ],\n // https://docs.sentry.io/platforms/javascript/guides/react/configuration/sampling/#sampling-transaction-events\n tracesSampleRate: 0.2,\n replaysOnErrorSampleRate: 0.5,\n replaysSessionSampleRate: 0,\n environment: process.env.DEPLOY_ENV,\n release: APP_VERSION,\n // loading Sentry only for production\n enabled: process.env.NODE_ENV === 'production',\n\n denyUrls: [\n /pagead\\/js/i,\n /graph\\.facebook\\.com/i,\n /connect\\.facebook\\.net\\/en_US\\/all\\.js/i,\n /eatdifferent\\.com\\.woopra-ns\\.com/i,\n /static\\.woopra\\.com\\/js\\/woopra\\.js/i,\n /extensions\\//i,\n /^chrome:\\/\\//i,\n /127\\.0\\.0\\.1:4001\\/isrunning/i,\n /webappstoolbarba\\.texthelp\\.com\\//i,\n /metrics\\.itunes\\.apple\\.com\\.edgesuite\\.net\\//i,\n //\n // custom LB here:\n /cdn\\.segment\\.com/i,\n /static\\.woopra\\.com/i,\n /snap\\.licdn\\.com/i,\n\n /**\n * @see https://github.com/fdev/sentry-ignores\n */\n // Specific files\n /\\/js\\/popunder\\.js/,\n\n // Random plugins and extensions.\n /^resource:\\/\\//i,\n /127\\.0\\.0\\.1:4001\\/isrunning/i,\n /bestpriceninja/i,\n /googleapis/i,\n /googlebot/i,\n /googlest/i,\n /itunes\\.apple\\.com\\//i,\n /metrics\\.itunes\\.apple\\.com\\.edgesuite\\.net\\//i,\n /re-markit/i,\n /webappstoolbarba\\.texthelp\\.com\\//i,\n\n // Analytics.\n /doubleclick\\.net/i,\n /hotjar\\./i,\n /netstats\\.space/i,\n /pagead\\/js/i,\n /posthog\\.com/i,\n\n // Chrome extensions.\n /^chrome:\\/\\//i,\n /chrome-extension:/i,\n /extensions\\//i,\n\n // Facebook.\n /connect\\.facebook\\.net\\/en_US\\/all\\.js/i,\n /graph\\.facebook\\.com/i,\n\n // Kaspersky antivirus.\n /kaspersky/i,\n\n // Locally saved copies\n /file:\\/\\//i,\n\n // Proxy servers.\n /nph-proxy\\./i,\n /\\.cloudfront\\..+\\/statistic\\//i,\n\n // Safari extensions.\n /safari-web-extension:/i,\n /safari-extension:/i,\n ],\n\n ignoreErrors: [\n 'top.GLOBALS',\n 'originalCreateNotification',\n 'canvas.contentDocument',\n 'MyApp_RemoveAllHighlights',\n 'http://tt.epicplay.com',\n \"Can't find variable: ZiteReader\",\n 'jigsaw is not defined',\n 'ComboSearch is not defined',\n 'http://loading.retry.widdit.com/',\n 'atomicFindClose',\n 'fb_xd_fragment',\n 'bmi_SafeAddOnload',\n 'EBCallBackMessageReceived',\n 'conduitPage',\n 'Script error.',\n '_avast_submit',\n //\n // custom from LB here...\n 'Pending sign-in attempt already in progress', // internal cognito\n 'consentCookieParser is not defined', // some marketing tracking script injected in page\n 'TypeError: Failed to fetch',\n 'Failed to fetch',\n\n // Build\n\n // Media\n 'AbortError',\n 'Request aborted',\n 'Picture-in-Picture',\n 'webkitExitFullScreen',\n 'NotSupportedError: The operation is not supported', // Safari not compatible video - https://stackoverflow.com/a/47976124\n\n // Network\n 'FetchError',\n\n // Service worker\n 'Registration failed - no active Service Worker',\n\n // - Misc -\n 'ResizeObserver loop limit exceeded',\n\n /**\n * @see https://github.com/fdev/sentry-ignores\n */\n // Random plugins and extensions.\n // http://blog.errorception.com/2012/03/tale-of-unfindable-js-error.html\n 'atomicFindClose',\n \"Can't find variable: ZiteReader\",\n 'canvas.contentDocument',\n 'ComboSearch is not defined',\n 'http://loading.retry.widdit.com/',\n 'http://tt.epicplay.com',\n 'jigsaw is not defined',\n 'miscellaneous_bindings',\n 'MyApp_RemoveAllHighlights',\n 'originalCreateNotification',\n 'top.GLOBALS',\n\n // Generic error code from errors outside the security sandbox.\n 'Script error.',\n\n // Analytics code.\n 'vars.hotjar.com',\n 'doubleclick.net',\n\n // Avast.\n '_avast_',\n\n // Facebook.\n 'fb_xd_fragment',\n\n // Broadcom ASG error.\n 'ICAP Error',\n\n // Bytemobile proxy.\n 'bmi_SafeAddOnload',\n 'EBCallBackMessageReceived',\n\n // Conduit Toolbar.\n 'conduitPage',\n\n // Chrome for iOS bug.\n // https://groups.google.com/a/chromium.org/forum/#!topic/chromium-discuss/7VU0_VvC7mE\n '__gCrWeb',\n\n // Chromium bug.\n // https://bugs.chromium.org/p/chromium/issues/detail?id=97172\n 'ntp is not defined',\n\n // Edge on iOS.\n 'instantSearchSDKJSBridgeClearHighlight',\n\n // Firefox bug.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=783260\n // http://stackoverflow.com/a/13101119\n 'Permission denied to access property \"toString\"',\n\n // Firefox internals.\n '_firefox_',\n\n // Firefox freeing add-on memory.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Dead_object\n \"can't access dead object\",\n\n // Nuance Dragon Web Extension.\n 'plugin.setSuspendState',\n\n // Safari bug.\n // https://bugs.webkit.org/show_bug.cgi?id=119472\n 'promiseReactionJob',\n\n // SafeBrowse extension.\n 'jQSB',\n\n // Commonly ignored errors of unknown origin.\n 'androidInterface',\n 'eshopcomp',\n 'eval at C',\n 'eval at E_c',\n 'frameConnector_isForegroundChanged',\n 'harkedtremblings',\n 'kw__injected',\n 'NPObject',\n 'siteroot',\n 'SymBrowser_',\n 'touchDownX',\n 'uiWebview_',\n 'variable: inf',\n 'Window.dologin',\n ],\n\n // regex should match both https://app.leadsbridge.com and https://staging-app.leadsbridge.com\n allowUrls: [/https?:\\/\\/([a-z0-9-]+[.])?leadsbridge\\.com/],\n })\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport {\n AlertBody,\n AlertBodyContent,\n AlertButtonClose,\n AlertFooter,\n AlertHeader,\n AlertImageWrapper,\n AlertStyled,\n AlertWrapper,\n} from './styled'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '@app/index'\nimport { Alert } from 'LeadsBridgeApp'\nimport { IoCloseOutline } from 'react-icons/io5'\nimport { useTranslation } from 'react-i18next'\nimport { AlertProgressBar } from '@components/Alert/AlertProgressBar/AlertProgressBar'\nimport { Translate } from '@components/Translate'\nimport { Container } from '../Basic/Container'\n\nexport const AlertComponent: React.FC = () => {\n const [visible, setVisible] = useState<boolean>(false)\n const alert: Alert | null = useSelector(\n (state: RootState) => state.application.alert\n )\n const { t } = useTranslation()\n\n useEffect(() => {\n if (alert) {\n setVisible(true)\n }\n }, [alert])\n\n const timerId = useRef<NodeJS.Timeout>()\n useEffect(() => {\n if (alert && alert.dismissableTimer) {\n timerId.current = setTimeout(() => {\n setVisible(false)\n }, alert.dismissableTimer)\n }\n\n return () => {\n if (timerId.current) {\n clearTimeout(timerId.current)\n }\n }\n }, [alert?.dismissableTimer])\n\n if (!alert) return null\n\n return (\n <AlertStyled isVisible={visible}>\n <Container $size={'lg'}>\n <AlertWrapper>\n <AlertHeader>\n {alert.isDismissable ? (\n <AlertButtonClose\n onClick={() => {\n setVisible(false)\n if (alert?.onClose) {\n alert.onClose()\n }\n }}\n >\n <IoCloseOutline /> {t('common.close')}\n </AlertButtonClose>\n ) : null}\n </AlertHeader>\n\n <AlertBody>\n <AlertBodyContent>\n {alert.title ? <h4>{alert.title}</h4> : null}\n <p\n style={{\n maxWidth: 600,\n }}\n >\n {alert.useTranslation ? (\n <Translate\n i18nKey={alert.message}\n values={\n alert.transValue\n ? { maxFields: alert.transValue }\n : undefined\n }\n />\n ) : (\n alert.message\n )}\n </p>\n </AlertBodyContent>\n {alert.image ? (\n <AlertImageWrapper>\n <img src={alert.image} />\n </AlertImageWrapper>\n ) : null}\n </AlertBody>\n\n <AlertFooter>{alert.buttons}</AlertFooter>\n </AlertWrapper>\n {alert.hasProgressBar && alert.dismissableTimer ? (\n <AlertProgressBar timer={alert.dismissableTimer} />\n ) : undefined}\n </Container>\n </AlertStyled>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { EditableIconStatus, EditableTextStyled } from './styled'\nimport { MdEdit, MdSave, MdErrorOutline } from 'react-icons/md'\nimport ReactTooltip from 'react-tooltip'\n\nexport interface TextInputProps {\n onNameChange: (newValue: string) => void\n value: string\n errorMessage?: string\n isEditable?: boolean\n}\n\nexport const EditableText: React.FC<TextInputProps> = ({\n value,\n errorMessage,\n onNameChange,\n ...props\n}) => {\n const [hasEditModeEnabled, setHasEditModeEnabled] = useState<boolean>(true)\n const inputRef = useRef<HTMLInputElement | null>(null)\n\n const iconInputStatus = () => {\n if (hasEditModeEnabled) {\n return <MdEdit />\n } else {\n return <MdSave />\n }\n }\n\n const handleChangeInputStatus = () => {\n if (value) {\n setHasEditModeEnabled(!hasEditModeEnabled)\n }\n }\n\n // set focus on input once visibile\n useEffect(() => {\n if (!hasEditModeEnabled && inputRef.current) {\n inputRef.current.focus()\n }\n }, [hasEditModeEnabled])\n\n return (\n <EditableTextStyled>\n <EditableIconStatus>\n {errorMessage ? (\n <>\n <ReactTooltip\n id='topbar-input'\n place='bottom'\n type='error'\n effect='solid'\n >\n <span>{errorMessage}</span>\n </ReactTooltip>\n <MdErrorOutline\n className={'error'}\n data-tip\n data-for='topbar-input'\n />\n </>\n ) : null}\n </EditableIconStatus>\n <input\n ref={inputRef}\n style={{ width: (value.length + 3) * 8 + 'px' }}\n disabled={hasEditModeEnabled}\n value={value}\n title={value}\n onChange={(e) => onNameChange(e.target.value)}\n maxLength={100}\n />\n\n {props.isEditable ? (\n <span\n className='text-input-icon'\n onClick={() => handleChangeInputStatus()}\n >\n {iconInputStatus()}\n </span>\n ) : (\n <></>\n )}\n </EditableTextStyled>\n )\n}\n","import React from 'react'\nimport { ReactComponent as BackSVG } from '@assets/images/chevron-left.svg'\nimport { TopbarStyled, TopbarWrapper } from './styled'\nimport { EditableText } from '@components/Basic/EditableText'\nimport { Link } from 'react-router-dom'\n\nexport interface TopbarBacklinkProps {\n url: string\n label: string\n}\n\nexport interface TopbarProps {\n defaultValue?: string\n errorMessage?: string\n onNameChange?: (newValue: string) => void // owner : page/layout\n backlink?: TopbarBacklinkProps\n hideOnEmbeddable?: boolean\n variant?: 'light' | 'dark'\n subBar?: React.ReactNode\n}\n\nexport const Topbar: React.FC<TopbarProps> = ({\n defaultValue,\n errorMessage,\n onNameChange,\n backlink,\n children,\n hideOnEmbeddable,\n variant,\n}) => {\n return (\n <TopbarStyled>\n <TopbarWrapper\n hideOnEmbeddable={hideOnEmbeddable}\n variant={variant || 'light'}\n >\n <div>\n {backlink ? (\n <Link to={backlink.url} data-testid='exit_btn'>\n <BackSVG /> {backlink.label}\n </Link>\n ) : (\n ''\n )}\n </div>\n <div>\n <EditableText\n onNameChange={(newValue) => {\n if (onNameChange) {\n onNameChange(newValue)\n }\n }}\n errorMessage={errorMessage}\n value={defaultValue || ''}\n isEditable={Boolean(onNameChange)}\n />\n </div>\n <div>{children}</div>\n </TopbarWrapper>\n </TopbarStyled>\n )\n}\n","import React from 'react'\nimport { StepBarItem } from '@components/StepBar/StepBarItem'\nimport { StepBarContainer } from './styled'\n\nexport type StepBarStep = {\n onStepClick?: (stepIndex: number) => void\n label?: string\n title?: string\n subLabel?: string\n}\n\nexport interface StepBarProps {\n steps: StepBarStep[]\n activeStep: number\n}\n\nexport const StepBar: React.FC<StepBarProps> = ({ steps, activeStep }) => {\n return (\n <StepBarContainer>\n {steps.map((step, index) => {\n return (\n <StepBarItem\n key={index}\n index={index}\n isActive={activeStep === index}\n title={step.title}\n label={step.label}\n subLabel={step.subLabel}\n onStepClick={step.onStepClick}\n />\n )\n })}\n </StepBarContainer>\n )\n}\n","import React, { useEffect } from 'react'\nimport { Topbar, TopbarBacklinkProps } from '@components/Topbar'\nimport {\n PageEditorStyled,\n PageTitle,\n PanelContainer,\n StepBarContainer,\n} from './styled'\nimport { StepBar, StepBarStep } from '@components/StepBar'\nimport { Container } from '@components/Basic/Container'\nimport lbLogo from '@assets/images/logo_lb_extended.svg'\nimport { isInIframe } from '@app/utils/isInFrame'\nimport { Button } from '@app/components/Basic/ButtonNbe'\nimport { FormikProps } from 'formik'\nimport { BridgeFormValues } from 'Nbee'\nimport { helpCenterUrl } from '@app/App'\nimport { useGetUserInfo } from '@app/api/getUserInfo'\nimport ReactTooltip from 'react-tooltip'\nimport { openZendeskChat } from '@app/utils/helpers'\nimport { useTranslation } from 'react-i18next'\nimport { FaLock } from 'react-icons/fa'\nimport { appRoutes } from '@app/routes'\nimport { useHistory } from 'react-router-dom'\nimport { useGetUserModules } from '@app/api/getUserModules'\nimport { useAppSelector } from '@app/store/hooks'\n\ninterface PageEditorProps {\n pageTitle?: string\n backlink?: TopbarBacklinkProps\n hasTopBar?: boolean\n steps?: StepBarStep[]\n activeStep?: number\n infoBar?: React.ReactNode\n topbarValue?: string\n topbarError?: string\n // if callback is not passed, item will not be editable\n onTopbarValueChange?: (newValue: string) => void\n IsTestEnableProp?: boolean\n bridgeIdProp?: string\n formikContext?: FormikProps<BridgeFormValues>\n}\n\nexport const PageEditor: React.FC<PageEditorProps> = ({\n pageTitle,\n backlink,\n hasTopBar,\n activeStep = 0,\n steps,\n topbarValue,\n topbarError,\n onTopbarValueChange,\n infoBar,\n children,\n IsTestEnableProp,\n bridgeIdProp,\n formikContext,\n}) => {\n const isEmbedded = isInIframe()\n\n const { t } = useTranslation()\n const history = useHistory()\n const { zE } = window\n const userAuthState = useAppSelector((state) => state.user.auth)\n const [shouldFetchUserModule, setShouldFetchUserModule] =\n React.useState(false)\n const [showSupportButton, setShowSupportButton] = React.useState(false)\n\n const { data: userModulesResponse } = useGetUserModules(shouldFetchUserModule)\n\n const userModules = userModulesResponse?.modules || []\n const supportUserModule = userModules.find((m) => m.id === 'customer-support')\n\n const requiredLbPlanId = supportUserModule?.minimumPlan\n const customerSupportId = supportUserModule?.id\n const supportIsAvailable = supportUserModule?.enabled !== false\n\n useEffect(() => {\n if (userAuthState) {\n setShouldFetchUserModule(true)\n setShowSupportButton(true)\n }\n }, [userAuthState])\n\n // We use a standard variable let because setState in this case generate too many renders and loop error\n let bridgeId\n let testEnable\n\n // Check if we have the formik context to get bridgeId and testEnable,\n // if not as it is in the step 3 we use props coming from StepCompleted which is not in the formik context\n\n if (formikContext) {\n const { values } = formikContext\n bridgeId = values?.ui?.bridgeId\n testEnable = values?.ui?.testEnabled\n } else {\n testEnable = IsTestEnableProp\n bridgeId = bridgeIdProp\n }\n\n return (\n <PageEditorStyled>\n {hasTopBar ? (\n <>\n <Topbar\n backlink={backlink}\n defaultValue={topbarValue}\n errorMessage={topbarError}\n onNameChange={onTopbarValueChange}\n hideOnEmbeddable\n >\n {bridgeId && testEnable ? (\n <a\n target={'_blank'}\n href={`${process.env.REACT_APP_V1_URL}/leads/table/${bridgeId}?version=2`}\n rel='noreferrer'\n >\n <Button $size={'small'} $variant={'secondary'}>\n Leads table\n </Button>\n </a>\n ) : null}\n {!supportIsAvailable && (\n <ReactTooltip\n id='support-button'\n place='top'\n type='dark'\n textColor='white'\n effect='solid'\n >\n <span>{t('auth.supportTooltip')}</span>\n </ReactTooltip>\n )}\n {showSupportButton ? (\n <span data-tip data-for='support-button'>\n <Button\n onClick={() => {\n if (!supportIsAvailable) {\n history.push(\n `${appRoutes.pricing.makeUrl()}?reason=${customerSupportId}&suggestPlan=${\n requiredLbPlanId || 7\n }`\n )\n } else {\n openZendeskChat(zE)\n }\n }}\n $size={'small'}\n $variant={'secondary'}\n >\n Support {!supportIsAvailable ? <FaLock /> : null}\n </Button>\n </span>\n ) : null}\n\n <a target={'_blank'} href={helpCenterUrl} rel='noreferrer'>\n <Button $size={'small'} $variant={'secondary'}>\n Help center\n </Button>\n </a>\n <img src={lbLogo} width={140} alt={'LeadsBridge'} />\n </Topbar>\n {infoBar}\n </>\n ) : null}\n {/* when content is embedded in iframe we hide stepbar with js */}\n {/* it's not possibilel to rely on mediaqueries since the iframe size is too large */}\n {/* we also display a mini stepbar inside the <Panel> component */}\n {isEmbedded ? null : steps && steps.length ? (\n <StepBarContainer className={'text-center'}>\n <StepBar steps={steps} activeStep={activeStep} />\n </StepBarContainer>\n ) : (\n <div style={{ paddingTop: '3rem' }} />\n )}\n {pageTitle ? (\n <Container>\n <PageTitle data-testid='page_title' className={'text-center'}>\n {pageTitle}\n </PageTitle>\n </Container>\n ) : null}\n <PanelContainer>{children}</PanelContainer>\n </PageEditorStyled>\n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\n\nconst SimplePageWrapper = styled.div`\n background-color: rgba(65, 166, 220, 0.15);\n min-height: 100vh;\n padding: 1rem;\n\n @media (min-width: 980px) {\n padding: 2.5rem;\n }\n`\n\nconst CardWrapper = styled.div`\n background-color: white;\n padding: 2em;\n`\n\nexport const SimplePage: React.FC = ({ children }) => {\n return (\n <SimplePageWrapper>\n <CardWrapper>{children}</CardWrapper>\n </SimplePageWrapper>\n )\n}\n","import React, { useState } from 'react'\nimport styled from 'styled-components'\nimport { FacebookButtonNative } from '@components/ButtonProvider/Facebook/FacebookButtonNative'\nimport { InputField } from '@components/Form/InputField'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { apiAuthClient } from '@app/services/apiAuthClient'\nimport { useAppDispatch } from '@app/store/hooks'\nimport { sendToast } from '@app/store/actions/ApplicationConfigurationActions'\n\nconst Wrapper = styled.div`\n padding: 2rem;\n`\n\nconst TokenOutput = styled.div`\n padding-top: 1rem;\n`\n\nconst Spacer = styled.div`\n margin-bottom: 1rem;\n`\n\nexport const TestFacebookToken: React.VFC = () => {\n const [token, setToken] = useState('')\n const [inputValue, setInputValue] = useState(\n 'pages_manage_ads,pages_manage_metadata,pages_read_engagement,ads_management,email,leads_retrieval,business_management'\n )\n const [scopes, setScopes] = useState('')\n const dispatch = useAppDispatch()\n const [isLoading, setIsLoading] = useState(false)\n\n const validateTokenWithApi = (token: string) => {\n setIsLoading(true)\n apiAuthClient\n .post(`${process.env.REACT_APP_LARAVEL_API}/admin/testFacebookToken`, {\n oauthToken: token,\n })\n .then(() => {\n dispatch(\n sendToast({\n title: 'Success',\n message: 'Request completed',\n color: 'positive',\n })\n )\n })\n .catch(() => {\n setIsLoading(false)\n dispatch(\n sendToast({\n title: 'Error',\n message: 'Request failed',\n color: 'negative',\n })\n )\n })\n }\n\n return (\n <Wrapper>\n <Spacer>\n <InputField\n label={'Scopes'}\n name={''}\n type={'text'}\n disabled={isLoading}\n value={inputValue}\n placeholder={'add scope as comma separated values'}\n onChange={(e) => setInputValue(e.currentTarget.value)}\n />\n <Button\n disabled={!inputValue || isLoading}\n onClick={() => {\n setScopes(inputValue)\n }}\n $variant={'action'}\n >\n Set scopes\n </Button>\n </Spacer>\n\n <Spacer>\n {scopes ? (\n <div style={{ width: 240 }}>\n <FacebookButtonNative\n key={scopes}\n onTokenRetrived={setToken}\n scope={'SignIn'}\n onSdkLoadError={() => {\n alert('error loading FB SDK')\n }}\n customFbAppScopes={scopes}\n />\n </div>\n ) : (\n <div>Add some scopes to see the FB login button</div>\n )}\n </Spacer>\n\n {token ? (\n <Spacer>\n <TokenOutput>\n <InputField\n label={'Auth token'}\n name={''}\n type={'text'}\n readOnly\n disabled\n value={token}\n placeholder={'Auth token will appear here'}\n />\n </TokenOutput>\n <div>\n <Button\n $variant={'primary'}\n disabled={isLoading}\n onClick={() => {\n validateTokenWithApi(token)\n }}\n >\n Validate token\n </Button>\n </div>\n </Spacer>\n ) : null}\n </Wrapper>\n )\n}\n","import React, { Suspense } from 'react'\nimport { Loader } from '@components/Basic/Loader'\n\nconst ComponentLazy = React.lazy(() => import('./Router'))\n\nexport const AdminPages = () => {\n return (\n <Suspense\n fallback={\n <div\n style={{\n position: 'relative',\n height: 200,\n }}\n >\n <Loader $active $dimmer $size={'large'} />\n </div>\n }\n >\n <ComponentLazy />\n </Suspense>\n )\n}\n","import React from 'react'\nimport { ProgressDivStyled } from '@components/Basic/ProgressBar/styled'\n\nexport interface ProgressProps {\n $progress: number\n $theme: 'primary'\n}\n\nexport const ProgressBar: React.VFC<ProgressProps> = ({\n $progress,\n $theme,\n}) => {\n return <ProgressDivStyled $progress={$progress} $theme={$theme} />\n}\n","import React from 'react'\nimport {\n ContainerStyled,\n IconWrapperStyled,\n FastAppSurveyWrapperStyled,\n HeaderStyled,\n LoaderWrapperStyled,\n LogoStyled,\n BrandLogoStyled,\n} from './styled'\nimport { Loader } from '@components/Basic/Loader'\nimport { ProgressBar } from '@components/Basic/ProgressBar'\nimport { Form, FormProps } from '@components/FastAppSurvey/Form'\nimport logo from '@assets/images/logo-lb.png'\nimport { AiOutlineArrowRight } from 'react-icons/ai'\n\nexport interface Props extends Pick<FormProps, 'onSubmitSuccess'> {\n isLoading?: boolean\n loadingText?: string\n step: 0 | 1 | 2\n integrationsData?: {\n source?: {\n name: string\n logo: string\n }\n destination?: {\n name: string\n logo: string\n }\n }\n}\n\nexport const FastAppSurvey: React.FC<Props> = ({\n step,\n isLoading,\n loadingText,\n integrationsData,\n onSubmitSuccess,\n}) => {\n return (\n <ContainerStyled>\n <BrandLogoStyled>\n <img src={logo} alt='' />\n </BrandLogoStyled>\n <HeaderStyled>\n <h2>{`We're setting up your connection`}</h2>\n {integrationsData &&\n integrationsData.source &&\n integrationsData.destination && (\n <IconWrapperStyled>\n <div>\n <LogoStyled\n src={integrationsData.source.logo}\n alt={integrationsData.source.name}\n title={integrationsData.source.name}\n />\n <AiOutlineArrowRight />\n <LogoStyled\n src={integrationsData.destination.logo}\n alt={integrationsData.destination.name}\n title={integrationsData.destination.name}\n />\n </div>\n <ProgressBar\n $progress={step === 0 ? 5 : step === 1 ? 50 : 100}\n $theme={'primary'}\n />\n </IconWrapperStyled>\n )}\n </HeaderStyled>\n <FastAppSurveyWrapperStyled>\n {isLoading ? (\n <LoaderWrapperStyled>\n <Loader $active $size={'large'} $text={loadingText} />\n </LoaderWrapperStyled>\n ) : (\n <Form onSubmitSuccess={onSubmitSuccess} />\n )}\n </FastAppSurveyWrapperStyled>\n </ContainerStyled>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { useHistory, useLocation, useParams } from 'react-router-dom'\nimport {\n validatePersistentBbuData,\n retryButtonPartnerLink,\n userStatusForSurvey,\n} from '@app/pages/BridgeByUrlCallback/utils'\nimport queryString from 'query-string'\nimport { Button } from '@components/Basic/Button'\nimport { useGenericBbuAuth } from '@app/pages/BridgeByUrlCallback/useGenericBbuAuth'\nimport { BbuCallbackRouteParams, PersistentBbuData } from 'LeadsBridgeApp'\nimport { PersistentLocalStorageKeys } from '@app/enums/persistentLocalStorageKeys'\nimport { FastAppSurvey } from '@components/FastAppSurvey'\nimport { endpoints, getApiErrorMessage } from '@app/api/config'\nimport { Message } from '@components/Basic/Message'\nimport { Container } from 'react-grid-system'\nimport { useTranslation } from 'react-i18next'\nimport { apiAuthClient } from '@app/services/apiAuthClient'\nimport { appRoutes } from '@app/routes'\nimport { trackEvent } from '@app/dataTracking'\n\ninterface Props {\n isMountedInLoggedRoute: boolean\n}\n\nexport const BridgeByUrlCallback: React.FC<Props> = ({\n isMountedInLoggedRoute,\n}) => {\n // can user reach this also when logged in?\n const { partnerFullName } = useParams<BbuCallbackRouteParams>()\n const location = useLocation()\n const history = useHistory()\n const persistentBbuData: PersistentBbuData = JSON.parse(\n window.sessionStorage.getItem(\n PersistentLocalStorageKeys.bbuPersistentData\n ) || '{}'\n )\n const { t } = useTranslation()\n\n const authLbCode = queryString.parse(location.search).lb_code as\n | string\n | undefined\n\n // ui states\n const [isLoading, setIsLoading] = useState(true)\n const [progressStep, setProgressStep] = useState<0 | 1 | 2>(0)\n const [loadingText, setLoadingText] = useState(\n 'We are connecting your account'\n )\n const [hasJustCompletedSurvey, setHasJustCompletedSurvey] = useState(false)\n const [genericApiError, setGenericApiError] = useState('')\n\n // before using data from local storage, it's always better to validate them\n const validPersistentBbuData = validatePersistentBbuData(persistentBbuData)\n ? persistentBbuData\n : null\n\n const errorMissingStartingData = !validPersistentBbuData\n ? t('bbu.callback.missingPersitentData')\n : !authLbCode\n ? t('bbu.callback.missingAuthLbCode')\n : null\n\n // when user is not logged in\n const { userStatus, apiError } = useGenericBbuAuth({\n provider: partnerFullName,\n authCode: authLbCode,\n requestUri: validPersistentBbuData?.requestUri,\n bbuData: validPersistentBbuData,\n })\n\n const persistentUserStatus = localStorage.getItem(\n PersistentLocalStorageKeys.bbuPersistentUserStatus\n )\n\n const surveyNeeded =\n userStatusForSurvey.includes(persistentUserStatus || '') ||\n userStatusForSurvey.includes(userStatus || '')\n\n const handleFinalStep = () => {\n // As decided in SB-782 we take the user to nbee step1 instead of calling setupBridge\n // https://leadsbridge.atlassian.net/browse/SB-782\n window.sessionStorage.removeItem(\n PersistentLocalStorageKeys.bbuPersistentData\n )\n try {\n const bbuUrl = new URL(validPersistentBbuData!.requestUri).pathname\n history.push(bbuUrl)\n } catch {\n history.push(appRoutes.nbeeStep1New.makeUrl())\n }\n }\n\n useEffect(() => {\n if (hasJustCompletedSurvey) {\n // if user has just completed survay, surveyNeeded will mutate and we don't want to proceed with this useEffect\n return\n }\n\n if (!isMountedInLoggedRoute) {\n // we want to be sure this component has been mounted in it's final state, to prevent firing api requests twice\n // note that we can't rely on redux, because redux store will be updated before the remount of this component in the signed-in routes\n return\n }\n\n if (surveyNeeded) {\n console.log('User is logged in but survey is needed')\n trackEvent({\n eventName: 'FastSurveyShown',\n feature: 'Authentication',\n step: 'Signup',\n })\n setProgressStep(1)\n setIsLoading(false)\n } else {\n console.log(\n 'User is logged in and already has own email (survey is not needed), so we can call handleOauth (private endpoint) + setupBridge'\n )\n setProgressStep(2)\n setLoadingText('We are connecting your account')\n\n apiAuthClient\n .post(endpoints.handleOauthLoggedUser, {\n provider: partnerFullName,\n authCode: authLbCode,\n requestUri: validPersistentBbuData?.requestUri,\n })\n .then(() => {\n setLoadingText('We are setting up your bridge')\n handleFinalStep()\n })\n .catch((error) => {\n setGenericApiError(\n getApiErrorMessage({\n error,\n })\n )\n })\n }\n }, [isMountedInLoggedRoute, surveyNeeded, hasJustCompletedSurvey])\n\n // SHOW ERROR\n if (errorMissingStartingData || apiError || genericApiError) {\n return (\n <div>\n <Container>\n <Message $header={'Error'} $status={'error'}>\n {errorMissingStartingData && <p>{errorMissingStartingData}</p>}\n {apiError && (\n <div\n dangerouslySetInnerHTML={{\n // error messages from api could arrive as html\n __html: apiError,\n }}\n />\n )}\n {genericApiError && (\n <div\n dangerouslySetInnerHTML={{\n // error messages from api could arrive as html\n __html: genericApiError,\n }}\n />\n )}\n\n {/* api can return a link for the retry inside the error message (as html) */}\n {/* It's not the best solution, but it's the good enough for now */}\n {apiError.includes('<a ') ? null : (\n <Button\n className={'mt-1'}\n $variant={'secondary'}\n onClick={() => {\n if (validPersistentBbuData?.requestUri) {\n // we already validate `requestUri` so it's safe to do build a `new URL`\n history.push(\n new URL(validPersistentBbuData.requestUri).pathname\n )\n return\n }\n\n if (retryButtonPartnerLink[partnerFullName]) {\n window.location.href =\n retryButtonPartnerLink[partnerFullName]\n } else {\n window.location.reload()\n }\n }}\n >\n Retry\n </Button>\n )}\n </Message>\n </Container>\n </div>\n )\n }\n\n return (\n <>\n <FastAppSurvey\n isLoading={isLoading}\n step={progressStep}\n integrationsData={{\n source: validPersistentBbuData?.source,\n destination: validPersistentBbuData?.destination,\n }}\n loadingText={loadingText}\n onSubmitSuccess={() => {\n setHasJustCompletedSurvey(true)\n localStorage.removeItem(\n PersistentLocalStorageKeys.bbuPersistentUserStatus\n )\n setIsLoading(true)\n setProgressStep(2)\n setLoadingText('We are creating your bridge')\n handleFinalStep()\n }}\n />\n </>\n )\n}\n","import React, { Suspense } from 'react'\nimport { Loader } from '@components/Basic/Loader'\n\nconst CheckoutLazy = React.lazy(() => import('./CheckoutPageComponent'))\n\nexport const CheckoutPage = () => {\n return (\n <Suspense\n fallback={\n <div\n style={{\n position: 'relative',\n height: 200,\n }}\n >\n <Loader $active $dimmer $size={'large'} />\n </div>\n }\n >\n <CheckoutLazy />\n </Suspense>\n )\n}\n","import React, { Suspense } from 'react'\nimport { Loader } from '@components/Basic/Loader'\n\nconst ComponentLazy = React.lazy(() => import('./Router'))\n\nexport const GoogleAdsAccountRouter = () => {\n return (\n <Suspense\n fallback={\n <div\n style={{\n position: 'relative',\n height: 200,\n }}\n >\n <Loader $active $dimmer $size={'large'} />\n </div>\n }\n >\n <ComponentLazy />\n </Suspense>\n )\n}\n","import React from 'react'\nimport { Route, Switch } from 'react-router-dom'\nimport { appRoutes } from '@app/routes'\nimport { IncomingDataScreen } from './IncomingDataScreen'\nimport { IncomingDataScreenSave } from './IncomingDataScreenSave'\nimport { IncomingDataScreenFields } from './IncomingDataScreenFields'\n\nexport const IncomingDataRouter: React.FC = () => {\n return (\n <Switch>\n <Route\n exact\n path={appRoutes.incomingDataScreen.path}\n component={IncomingDataScreen}\n />\n <Route\n exact\n path={appRoutes.incomingDataScreenEdit.path}\n component={IncomingDataScreen}\n />\n <Route\n exact\n path={appRoutes.incomingDataScreenFields.path}\n component={IncomingDataScreenFields}\n />\n <Route\n exact\n path={appRoutes.incomingDataScreenSave.path}\n component={IncomingDataScreenSave}\n />\n </Switch>\n )\n}\n","import React from 'react'\nimport { Route, Switch } from 'react-router-dom'\nimport { appRoutes } from '@app/routes'\nimport { IntegrationAuthScreenEdit } from './IntegrationAuthScreenEdit'\nimport { IntegrationAuthScreen } from './IntegrationAuthScreen'\nimport { IntegrationHome } from '@app/pages/Integration/IntegrationHome'\nimport { IntegrationAuthCallback } from './IntegrationAuthCallback'\nimport { IntegrationAuthCallback2 } from './IntegrationAuthCallback2'\n\nexport const IntegrationRouter: React.FC = () => {\n return (\n <Switch>\n <Route\n exact\n path={appRoutes.integrationAuthScreenCallback2.path}\n component={IntegrationAuthCallback2}\n />\n <Route\n exact\n path={appRoutes.integrationAuthScreenCallback.path}\n component={IntegrationAuthCallback}\n />\n <Route\n path={[\n appRoutes.integrationAuthScreenEdit.path,\n appRoutes.integrationAuthScreenEditWithBridgeId.path,\n appRoutes.integrationAuthScreenEditStep2.path,\n ]}\n exact\n component={IntegrationAuthScreenEdit}\n />\n <Route\n path={appRoutes.integrationAuthScreen.path}\n exact\n component={IntegrationAuthScreen}\n />\n <Route component={IntegrationHome} />\n </Switch>\n )\n}\n","import React, { useEffect } from 'react'\nimport { Auth } from 'aws-amplify'\nimport { useHistory } from 'react-router-dom'\nimport queryString from 'query-string'\nimport { sendToast } from '../../store/actions/ApplicationConfigurationActions'\nimport { Loader } from '@components/Basic/Loader'\nimport { useAppDispatch } from '@app/store/hooks'\nimport { clearPersistentData } from '@app/pages/Logout/clearPersistentData'\nimport { forgetUser } from '@app/dataTracking'\nimport { useTranslation } from 'react-i18next'\n\nconst Logout: React.FC = () => {\n const dispatch = useAppDispatch()\n const history = useHistory()\n const search = (window.location.search || '').replace('??', '?') // remove double ?? generate by v1\n const qs = queryString.parse(search)\n const { t } = useTranslation()\n\n // https://leadsbridge.atlassian.net/browse/SB-572\n // In order to logout the user also from V1 we need to load the v1/app/logout url inside an iframe.\n // Strategy is to inject an iframe, prevent infinite injections by checking the presence of `preventRedirect` in query string\n // When this code/component is loaded inside the iframe we detect `preventRedirect` and send a post message to paret\n // Parent (this same component) receives the message and performs a logout in cognito and redirect user to `path` where they was or to `/`\n const isInIframe = qs.preventRedirect || qs.path?.includes('preventRedirect')\n\n // Create the iframe to load v1 logout\n useEffect(() => {\n if (isInIframe) {\n console.log('We are in iframe')\n window.postMessage({ hasV1LoggedOut: true }, '*')\n return\n }\n\n if (document.getElementById('logout-v1-iframe')) {\n // we don't want each re-rendering to create new iframes\n return\n }\n\n // we need to be sure that the iframe url contains preventRedirect so V1 will keep it during redirection\n // and we won't create infinite loop of iframes\n const logoutV1Url = `${process.env.REACT_APP_V1_URL}/logout?preventRedirect=1`\n const iframe = document.createElement('iframe')\n iframe.src = logoutV1Url\n iframe.id = 'logout-v1-iframe'\n iframe.style.position = 'absolute'\n iframe.style.top = '-1000px'\n iframe.style.opacity = '0'\n document.body.appendChild(iframe)\n }, [])\n\n // Generic function to logout the user\n const logoutFromCognitoAndRedirectUser = () => {\n if (isInIframe) {\n return // parent will be in charge, no need to do this in iframe\n }\n // remove cookies and localStorage\n clearPersistentData().then(() => {\n forgetUser() // flush segment user info\n Auth.signOut().then(() => {\n const postLogoutUrl = `${qs.path || '/'}`\n console.log('Logout from Cognito -> Redirect user to -> ', postLogoutUrl)\n history.push(postLogoutUrl)\n })\n })\n }\n\n // We are expecting to receive data as postMessage from parent window\n // Once we have received the message we can proceed with the v2 logout\n const messageReceiverFn = function (event: MessageEvent) {\n if (event.data.hasV1LoggedOut) {\n console.log('Received post message from logout iframe')\n logoutFromCognitoAndRedirectUser()\n }\n }\n useEffect(() => {\n window.addEventListener('message', messageReceiverFn)\n return () => window.removeEventListener('message', messageReceiverFn)\n }, [])\n // in case something goes wrong, we proceed with the logout after few seconds\n useEffect(() => {\n setTimeout(() => {\n console.log('logout timeout')\n logoutFromCognitoAndRedirectUser()\n }, 6000)\n }, [])\n\n // display toast to notify something to user (eg. session is expired)\n useEffect(() => {\n if (qs && qs.message) {\n try {\n const encodedStringAtoB = window.atob(qs.message.toString())\n const JSONParsed = JSON.parse(encodedStringAtoB)\n const alertTitle = JSONParsed.title ?? ''\n const alertMessage = t('auth.logout.toastMessage') ?? ''\n const alertColor = JSONParsed.type ?? 'negative'\n dispatch(\n sendToast({\n title: alertTitle,\n message: alertMessage,\n color: alertColor,\n })\n )\n } catch (e) {}\n }\n }, [])\n\n return (\n <div>\n <Loader $active />\n </div>\n )\n}\n\nexport default Logout\n","import React from 'react'\nimport { Route, Switch } from 'react-router-dom'\nimport { appRoutes, bridgeByUrlPartnersPaths } from '@app/routes'\nimport { Step1Edit } from '@app/pages/Nbee/Step1Edit'\nimport { Step1 } from '@app/pages/Nbee/Step1'\nimport { Step2 } from '@app/pages/Nbee/Step2'\nimport { NbeeHome } from '@app/pages/Nbee/NbeeHome'\nimport { Step3 } from '@app/pages/Nbee/Step3'\nimport { BridgeChooser } from '@app/pages/Nbee/BridgeChooser'\nimport { InfoPage } from '@features/nbee/StepCompleted/InfoPage'\n\nexport const NbeeRouter: React.FC = () => {\n return (\n <Switch>\n <Route exact path={appRoutes.nbeeInfoPage.path} component={InfoPage} />\n <Route\n exact\n path={[\n appRoutes.nbeeBridgeChooserStep1.path,\n appRoutes.nbeeBridgeChooserStep2.path,\n ]}\n component={BridgeChooser}\n />\n <Route exact path={appRoutes.nbeeStep1New.path} component={Step1} />\n <Route\n exact\n path={[\n appRoutes.nbeeAppBbu.path,\n appRoutes.signupBbu.path,\n ...bridgeByUrlPartnersPaths,\n ]}\n component={Step1}\n />\n <Route exact path={appRoutes.nbeeStep1Edit.path} component={Step1Edit} />\n <Route exact path={appRoutes.nbeeStep2.path} component={Step2} />\n <Route exact path={appRoutes.nbeeStep3.path} component={Step3} />\n <Route component={NbeeHome} />\n </Switch>\n )\n}\n","import React, { Suspense } from 'react'\n\nconst PricingLazy = React.lazy(() => import('./PricingPageComponent'))\n\nexport const PricingPage = () => {\n return (\n <Suspense\n fallback={\n <div\n style={{\n position: 'relative',\n height: 200,\n }}\n ></div>\n }\n >\n <PricingLazy />\n </Suspense>\n )\n}\n","import React from 'react'\nimport { SignupLayout } from '@features/signup/SignupLayout'\nimport { Content } from '@features/signup/SignupContent/Content'\nimport { SignUpForm } from '@features/signup/SignupForm'\nimport { useTranslation } from 'react-i18next'\nimport signupGenericImage from '@assets/images/signup-generic.svg'\n\nexport const SignUp: React.FC = () => {\n const { t } = useTranslation()\n\n return (\n <>\n <SignupLayout\n hideLeftOnMobile\n leftSlot={\n <Content\n section={<img src={signupGenericImage} />}\n headerText={t('auth.signup.headline')}\n subText={t('auth.signup.subHeadline')}\n />\n }\n rightSlot={\n <SignUpForm\n title={t('auth.signup.formTitle')}\n showGoogleButton\n showFacebookButton\n />\n }\n />\n </>\n )\n}\n","import React from 'react'\nimport { SignupLayout } from '@features/signup/SignupLayout'\nimport { Content } from '@features/signup/SignupContent/Content'\nimport { SignUpForm } from '@features/signup/SignupForm'\nimport { useTranslation } from 'react-i18next'\nimport signupGenericImage from '@assets/images/signup-generic.svg'\nimport lbLogo from '@assets/images/logo_lb_extended.svg'\nimport heartImg from '@assets/images/heart.svg'\nimport appSumoLogo from '@assets/images/appsumo-logo.svg'\n\nconst appSumoHeader = (\n <>\n <img src={lbLogo} width={140} alt={'LeadsBridge'} />\n <img src={heartImg} style={{ margin: '0 .5rem' }} alt={'heart'} />\n <img src={appSumoLogo} alt={'appSumo'} width={100} height={16} />\n </>\n)\n\nexport const SignUpAppSumo: React.FC = () => {\n const { t } = useTranslation()\n\n return (\n <>\n <SignupLayout\n hideLeftOnMobile\n leftSlot={\n <Content\n section={<img src={signupGenericImage} />}\n headerText={t('auth.signup.headline')}\n subText={t('auth.signup.subHeadline')}\n />\n }\n rightSlot={\n <SignUpForm\n title={t('auth.signup.formTitleAppSumo')}\n isAppSumo\n showIndustries\n showCoupon\n header={appSumoHeader}\n />\n }\n />\n </>\n )\n}\n","import React from 'react'\nimport {\n ContainerStyled,\n ImgBoxStyled,\n ImgWrapperStyled,\n HeaderTextStyled,\n IconWrapperStyled,\n} from './styled'\nimport noDataPng from '@assets/images/no-data.png'\nimport { Loader } from '@components/Basic/Loader'\nimport { AiOutlinePlusCircle } from 'react-icons/ai'\n\ninterface ImgSquareProps {\n logoUri?: string\n name?: string\n isLoading?: boolean\n}\n\nconst ImgSquare = ({ logoUri, name, isLoading }: ImgSquareProps) => (\n <ImgBoxStyled>\n {isLoading ? (\n <Loader $active />\n ) : (\n <>\n <img src={logoUri || noDataPng} alt={name} />\n {name && <p>{name}</p>}\n </>\n )}\n </ImgBoxStyled>\n)\n\ninterface BbuContentProps {\n sourceLogoUri?: string\n sourceName?: string\n destinationLogoUri?: string\n destinationName?: string\n headline?: string\n}\nexport const BbuContent: React.FC<BbuContentProps> = ({\n sourceLogoUri,\n sourceName,\n destinationLogoUri,\n destinationName,\n headline,\n}) => {\n return (\n <ContainerStyled>\n <ImgWrapperStyled>\n <ImgSquare logoUri={sourceLogoUri} name={sourceName} />\n <IconWrapperStyled>\n <span />\n <AiOutlinePlusCircle style={{ margin: '0' }} color='white' />\n <span />\n </IconWrapperStyled>\n <ImgBoxStyled>\n <ImgSquare logoUri={destinationLogoUri} name={destinationName} />\n </ImgBoxStyled>\n </ImgWrapperStyled>\n {headline ? (\n <HeaderTextStyled>\n {headline ||\n `Use LeadsBridge to connect ${sourceName} with ${destinationName}`}\n </HeaderTextStyled>\n ) : null}\n </ContainerStyled>\n )\n}\n","import React from 'react'\nimport { SignupLayout } from '@features/signup/SignupLayout'\nimport { Content } from '@features/signup/SignupContent/Content'\nimport { SignUpForm } from '@features/signup/SignupForm'\nimport { BbuContent } from '@features/signup/BbuContent'\nimport { useTranslation } from 'react-i18next'\nimport { BbuRouteParams } from 'LeadsBridgeApp'\nimport { useParams } from 'react-router-dom'\nimport { useFetchIntegrationsMetaForBridgeByUrl } from '@app/api/integrationTools'\nimport { Loader } from '@components/Basic/Loader'\nimport signupGenericImage from '@assets/images/signup-generic.svg'\n\n// example url for testing:\n// http://localhost:3000/bc/lb/facebook-lead-ads/google-sheets\nexport const SignUpBbu: React.FC = () => {\n const { t } = useTranslation()\n const { source, destination }: BbuRouteParams = useParams()\n\n const { isLoading, data: bbuAppsInfo } =\n useFetchIntegrationsMetaForBridgeByUrl(source, destination)\n\n // prepare content in case of bbu\n const sourceName = bbuAppsInfo?.source?.name\n const sourceLogoUri = bbuAppsInfo?.source.logoSmallUri\n const destinationName = bbuAppsInfo?.destination?.name\n const destinationLogoUri = bbuAppsInfo?.destination.logoSmallUri\n const headline = bbuAppsInfo?.meta?.headline\n const isValidBbuUri = Boolean(sourceName && destinationName)\n\n return (\n <>\n <SignupLayout\n leftSlot={\n <Content\n section={\n isLoading ? (\n <div style={{ position: 'relative' }}>\n <Loader $active $inverted />\n </div>\n ) : isValidBbuUri ? (\n <BbuContent\n sourceName={sourceName}\n sourceLogoUri={sourceLogoUri}\n destinationLogoUri={destinationLogoUri}\n destinationName={destinationName}\n headline={headline}\n />\n ) : (\n // if is not a valid bbuUri, we display the default signup content as fallback\n <Content\n section={<img src={signupGenericImage} />}\n headerText={t('auth.signup.headline')}\n subText={t('auth.signup.subHeadline')}\n />\n )\n }\n />\n }\n rightSlot={\n <SignUpForm\n title={t('auth.signup.formTitle')}\n showGoogleButton\n showFacebookButton\n />\n }\n />\n </>\n )\n}\n","import React, { Suspense } from 'react'\nimport { Loader } from '@components/Basic/Loader'\n\nconst ComponentLazy = React.lazy(\n () => import('./SignupBbuFallbackSurveyComponent')\n)\n\nexport const SignupBbuFallbackSurvey = () => {\n return (\n <Suspense\n fallback={\n <div\n style={{\n position: 'relative',\n height: 200,\n }}\n >\n <Loader $active $dimmer $size={'large'} />\n </div>\n }\n >\n <ComponentLazy />\n </Suspense>\n )\n}\n","import React from 'react'\nimport { SimplePage } from '@app/layouts/SimplePage'\nimport styled from 'styled-components'\nimport superHeroImg from '@assets/images/superhero.svg'\nimport { Button } from '@components/Basic/ButtonNbe'\nimport { useHistory, useLocation } from 'react-router-dom'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '@app/index'\nimport { resetPath } from '@app/store/actions/ApplicationConfigurationActions'\nimport { useAppDispatch } from '@app/store/hooks'\n\nexport const WrapperStyled = styled.div`\n height: 100%;\n margin: 12rem auto;\n text-align: center;\n\n h2 {\n font-size: 1.5rem;\n font-weight: 700;\n color: #273649;\n }\n\n img {\n margin: 2rem 0;\n width: 16rem;\n }\n\n p {\n font-size: 0.875rem;\n font-weight: 700;\n margin: 0;\n }\n\n button {\n margin-top: 2rem;\n width: 15rem;\n }\n`\n\nexport type ThankYouPageState = {\n title: string\n description: string[]\n ctaText: string\n}\n\nexport const ThankYouPage: React.FC = () => {\n const history = useHistory()\n const dispatch = useAppDispatch()\n const { state } = useLocation<ThankYouPageState>()\n const prevPath: string | null = useSelector(\n (state: RootState) => state.application.path\n )\n\n // we set some defaults in case state is missing\n const title = state?.title || 'Thank you'\n const description = state?.description || ['Your request has been processed.']\n const ctaText = state?.ctaText || 'Continue'\n\n return (\n <SimplePage>\n <WrapperStyled>\n <h2>{title}</h2>\n <img src={superHeroImg} alt={'super hero'} />\n {description.map((row, idx) => (\n <p key={idx}>{row}</p>\n ))}\n <Button\n $size={'large'}\n $variant={'action'}\n onClick={() => {\n if (prevPath) {\n history.push(prevPath)\n dispatch(resetPath())\n } else {\n window.location.href = process.env.REACT_APP_V1_URL! || ''\n }\n }}\n >\n {ctaText}\n </Button>\n </WrapperStyled>\n </SimplePage>\n )\n}\n","import { combineReducers } from 'redux'\nimport { ApplicationConfigurationReducer } from './reducers/ApplicationConfigurationReducer'\nimport { FbAppStoreReducer } from './reducers/FbAppStoreReducer'\nimport { UserReducer } from './reducers/UserReducer'\nimport { configureStore } from '@reduxjs/toolkit'\nimport { IntegrationListenerReducer } from './reducers/IntegrationListenerReducer'\n\nconst rootReducer = combineReducers({\n application: ApplicationConfigurationReducer,\n appStore: FbAppStoreReducer,\n user: UserReducer,\n integrationListener: IntegrationListenerReducer,\n})\n\nconst store = configureStore({\n reducer: rootReducer,\n devTools: process.env.NODE_ENV !== 'production',\n middleware: (getDefaultMiddleware) =>\n getDefaultMiddleware({\n serializableCheck: {\n // Ignore these field paths to handle buttons ReactNode in Alert component\n ignoredActionPaths: ['payload.buttons'],\n ignoredPaths: ['application.alert'],\n },\n }),\n})\n\nexport default store\n"],"names":["Button","$variant","children","props","icon","style","marginLeft","disabled","$size","$hasIcon","$loading","$loadingText","$minWidth","hasMinWidth","Boolean","Container","theme","container","large","medium","$marginY","FakeInput","required","text","tooltipProps","place","type","effect","border","borderColor","className","FiltersIcons","handleCopy","handleAdd","handleDelete","isDeleteDisabled","isAddDisabled","isCopyDisabled","isBridgeDisabled","t","id","onClick","size","InputText","variant","input","success","error","default","InputFeedback","$status","Loader","$text","$dimmer","Message","$header","customStyles","content","top","left","right","bottom","margin","width","borderRadius","boxShadow","marginRight","transform","backgroundColor","overlay","zIndex","noPaddingStyles","undefined","minWidth","height","maxHeight","maxWidth","padding","overflow","secondaryCustomStyles","minimizeCustomStyles","expandCustomStyles","position","ResizeWrapper","IconsWrapper","CloseIcon","isTransparent","noPadding","Modal","isOpen","onCloseModal","hideCloseButton","isResizable","isWide","isExpand","setIsExpand","useState","windowWidth","setWindowWidth","window","innerWidth","useEffect","handleResize","addEventListener","removeEventListener","wideCustomStyles","onRequestClose","preventScroll","StateIcon","state","iconSize","icons","color","empty","RefreshButton","font","family","link","TinyTextualButton","rest","ButtonProvider","provider","scope","onBeforeAuth","onAuthSuccess","onAuthError","dataWidth","signupParams","getCaptchaToken","location","matchBBuPath","pathname","path","exact","strict","bbuUri","isExact","origin","isGoogleButtonCustomLoaded","setIsGoogleButtonCustomLoaded","googleButtonToUseForSignup","setGoogleButtonToUseForSignup","sdkFailedToLoad","setSdkFailedToLoad","canUpdateState","useRef","current","handleSdkLoadError","handleExternalProviderAuth","oauthToken","recaptchaToken","tapExistingCookieData","authResponse","referralUri","document","referrer","tapClickId","tapVisitorId","catch","parsedError","message","code","eventName","feature","step","params","custom","errorCode","errorDescription","planId","cbPlan","sendEventToIntercom","userInfo","data","userCredentials","credentials","username","idToken","accessToken","refreshToken","then","r","onTokenRetrived","onSdkLoadError","opacity","onGoogleLegacySdkInitSuccess","onGoogleLegacySdkInitError","providerRender","ConnectedPopupWindow","urlToOpen","widthPx","heightPx","onPopupOpen","onPopupClose","initialData","popupName","popup","isClosedRef","intervalId","dataFromPopup","features","open","currentPopup","focus","close","setInterval","closed","clearInterval","Dropdown","$direction","dropdownButton","$lineSeparatorMenuItem","setIsOpen","closeDropdownHandler","clickAwayRef","ref","p","Checkbox","value","checked","onChange","name","inputProps","InputDomain","$protocolLabel","$domainLabel","InputField","label","slotLeft","slotRight","$hasMargin","defaultLabel","floatingLabel","fieldIsUnavailable","inputRefCallback","inputId","isFocused","setIsFocused","hasValue","setHasValue","inputRef","htmlFor","isFloating","toUpperCase","onFocus","event","onBlur","paddingTop","paddingBottom","marginTop","InputSelect","$label","$options","$optionsLabel","selectId","map","option","key","InputSmartSelect","initialValues","isClearable","onSelect","placeholder","defaultValue","isSearchable","noOptionsMessageText","addNewOptionButton","onInputChange","hasCustomSearch","isLoading","loadOptions","isMulti","isDisabled","menuIsOpen","noIcon","tooltipMessage","addActionClick","extraLabel","secondaryStyles","emailValidation","keyDown","isVerified","isFormulas","upDownIconsStyle","largeUpDownIconsStyle","dataTestId","wrapperEl","selectedSingleValueEl","isLabelTooLong","extraProps","tooltipInternalLabel","tooltipExternalMessage","noDropdownIndicator","DropdownIndicator","IndicatorSeparator","components","Option","SingleValue","Control","Menu","MenuList","ValueContainer","IndicatorsContainer","styles","defaultOptions","selectedValue","options","noOptionsMessage","newValue","filterOption","onKeyDown","InputToggle","$isChecked","$labelLeft","$labelRight","$isDisabled","Label","$disabled","allowsHtml","labelId","L","dangerouslySetInnerHTML","__html","LabelWrapper","DocUrl","LabelWithDocTooltip","docUrl","isRequired","tooltip","href","target","rel","MultiCreatableCustom","mappedField","fieldIndex","onMappingChange","onFormulaSelect","onRedirectToPricing","sourceOptions","picklistOptions","userHasFormulaEnabled","formulaSchema","sourceLogoUri","isCreatable","excludeSelected","selectedOptions","setSelectedOptions","setMenuIsOpen","hasPicklist","picklist","length","defaultActiveTab","hasFormula","activeTab","setActiveTab","filteredSourceOptions","filter","some","selected","defaultValues","mapping","optionsDisabled","sourceLogoComponent","src","alt","handleMappingChange","newOptions","selectedOption","newMapping","mappingType","fieldType","newMappingWithFormula","sourceFieldId","formula","find","m","isNew","isNewFormula","handleTabChange","tabName","SelectComponent","selectRef","MultiValue","MultiValueRemove","e","availableTabs","unshift","currentTabIndex","indexOf","preventDefault","inputValue","slice","openMenuOnClick","onMenuOpen","onMenuClose","hideSelectedOptions","isOptionSelected","isOptionDisabled","isValidNewOption","trim","actionMeta","action","updatedOption","newOption","isFormula","Textarea","forwardRef","displayName","FormikInputSmartSelect","field","meta","helpers","errorMessage","touched","item","setTouched","currentValue","setValue","InputAutoSelectCopy","linkKey","isCopied","setIsCopied","handleCopyLink","select","execCommand","readOnly","PanelPopup","image","onClose","dismissable","useTranslation","isVisible","setIsVisible","timeoutId","setTimeout","clearTimeout","PanelPopupContext","createContext","Panel","head","body","footer","progressBarPercentage","setPopup","bodyPaddingBottom","setBodyPaddingBottom","bodyOuterRef","bodyInnerRef","footerRef","bodyOuterHeight","clientHeight","bodyInnerHeight","footerHasTopSeparator","Provider","sendPopup","extraPadding","ProgressBar","percentage","googleReCaptchaKey","ReCaptcha","getElementById","script","createElement","appendChild","googleScript","querySelector","remove","w","grecaptcha","execute","Translate","i18nKey","values","count","b","strong","a","br","SignupSurvey","bbuData","onSubmit","steps","title","validationSchema","formikHelpers","Fragment","activeStep","hasTopBar","InfoBarComponentLazy","lazy","SuperUserInfoBarWithQuery","userData","user","superUser","email","Suspense","fallback","fullName","firstName","lastName","SuperUserInfoBar","BillingDetails","billingInfo","onEditRequest","companyName","country","zip","phone","displayInfo","address","join","BillingBox","initialFormValues","onValuesChange","isDataEmpty","onStripeSubmit","isAddingNewInfo","setIsAddingNewInfo","countryCode","setCountryCode","noCompany","setNoCompany","validation","setValidation","countries","states","refetch","refetchStates","validateOnChange","validateOnBlur","formikProps","isCountryStates","SyncValuesWithParent","newValues","isValid","setFieldValue","handleValues","FormikInputCheckbox","FormikInputField","twoColumns","FormikInputSelect","Wrapper","hasPadding","CardInfo","CardBoxASideWrapper","CardBoxASideImageWrapper","BoxWrapperWithSideImage","showSecurePaymentLogo","ButtonWrapper","CreditCardBox","isAddingNewCard","setIsAddingNewCard","dispatch","isLoadingUser","refetchUserInfo","userBillingInfo","pricing","cards","creditCard","creditCardOwner","number","expiration","creditCardExpiration","card","mutate","storeCreditCardMutation","errorStoreCreditCard","storeLoadingStateCreditCard","onCreditCardTokenRetrieved","creditCardToken","onSuccess","onCancelRequest","idx","onEditCardRequest","CheckoutFooter","billingCircle","nextBillingDate","amountToPay","buttonLabel","isTrialAvailable","nextInvoiceAmount","isProrated","CheckoutTitleWrapper","isClickable","TitleStyled","CheckoutTitle","AccountActivate","billingData","handlePollingState","history","customerId","localStorage","getItem","push","topbarValue","backlink","url","AccountConnect","AccountCreationDone","AccountCreationFormInner","currenciesData","isLoadingCurrencies","timezonesData","isLoadingTimezones","AccountCreationForm","isSavingApi","enableReinitialize","validateOnMount","PageEditor","IntegrationPanel","integrationLogo","isTosAccepted","panelTitle","panelDescription","btnPrimaryLabel","btnPrimaryLink","isbtnPrimaryAccordion","btnLinkLabel","btnLinkUrl","accordionButtonLabel","accordionButtonUrl","closeTooltipText","handleAction","testIdPrimaryButton","testIdLinkButton","testIdPolicyButton","accordionCheckboxLabel","setOpen","textAlign","cursor","status","BridgeChooserForm","isEmbedded","setInitialData","validate","formikContext","pageTitle","isSubmitting","BridgeChooserRedirector","urlParams","sourceAppId","parseInt","destinationAppId","appCompatibilityCheck","isCheckingAppsCompatibility","obeUri","combination","nbeeUri","compatibility","to","EmailReceipt","bridgeId","emailReceiptUserModule","setValues","errors","isBridgeEnabled","ui","TitleWrapper","IconLockWrapper","moduleReceiptId","userEmail","isAvailableToUser","enabled","minimumPlanRequired","minimumPlan","updateBridgeToPricing","planLabelName","toString","settings","emailReceiptRecipients","emailReceipt","recipients","userDefaultRecipients","userDefaults","active","subject","canShow","isEmailReceiptCompatible","Object","keys","small","handleSubmit","emailReceiptValues","requiredLbPlanId","Text","Image","FieldMappingEmptyState","onResetFilterRequest","isFiltered","flattenErrors","errorObject","entries","reduce","messages","subErrors","FormulaModal","selectedMapping","sourceFieldOptions","index","mappingId","formulaId","modalTitle","fieldName","currentFieldValue","currentFieldMappingWithFormula","currentFieldFormula","currentFieldFormulaParams","formulaTemporaryState","setFormulaTemporaryState","isSubmitButtonDisabled","setIsSubmitButtonDisabled","singleFormulaSchema","isGettingSingleFormulaSchema","formulaName","category","formulaDescription","getParamDescription","paramId","singleFormulaSchemaParams","handleValueChange","updatedFormula","paramIndex","findIndex","getOptionsForSelectDropdown","selectedParam","Array","isArray","v","getDefaultValueForSelect","dropdownOptions","getDefaultValueForCreatableSelect","handleAbort","mappingIndex","newMappings","i","param","toLowerCase","replace","_","num","Number","char","display","wordWrap","maxLength","updatedMapping","HeaderSearch","totalFields","mappedFields","showAllFields","onShowAllFieldsRequest","isReloadingAllBridgeFields","onRefetchBridgeFieldRequest","isInTestScreen","maxFields","welcomeMessageProps","connectedApps","sourceApp","app","destinationApp","defaultTransparentPixel","sourceName","logoUriSmall","destinationName","destinationLogoUri","fieldsMappingValues","fieldsMapping","allAreMapped","every","allAreUnmapped","showFilterButton","HeaderSearchComponent","H","onRefetchFieldRequest","isReadonlyModeEnabled","emptyFilterRule","operator","AddFilterButtonModal","sourceFields","initialFilterRules","onSaveOrDeleteFilterRules","filterUserModules","bridgeType","filtersSchema","isGettingFiltersSchema","allInputsEmpty","setAllInputsEmpty","saveBridgeFilterRules","isSavingBridgeFilterRules","saveBridgeFilterRulesResult","deleteBridgeFilterRules","isDeletingBridgeFilterRules","deleteBridgeFilterRulesResult","deleteBridgeFilterRulesStatus","userHasFiltersEnabled","filterRules","setFilterRules","handleAddFilterRule","newIndex","Math","min","newFilterRules","splice","handleRemoveFilterRule","handleCopyFilterRule","handleFieldChange","selectedField","f","selectedFieldType","prevRules","newRules","handleOperatorChange","getDefaultSelectOption","fieldId","getOperatorsForSelect","schemaEntry","entry","rules","getInputTypeForCondition","rule","operatorRule","sourceFilters","conditions","Trans","ns","filterRule","fields","FilterRuleRow","isDefaultValueNotInSourceAnymore","el","fieldSelectDefaultValue","fieldSelectInitialValues","onFieldChange","operatorSelectDefaultValue","operatorSelectInitialValues","onOperatorChange","inputValueType","onValueChange","onCopyFilterRule","onAddFilterRule","onRemoveFilterRule","isRemoveFilterRuleDisabled","gap","requestBody","handleSubmitSaveFilters","AddFilterButton","allSourceFields","setRules","isModalOpen","toggleIsModalOpen","minimumPlanName","hasFilters","firstRule","firstRuleField","firstRuleCondition","firstRuleValue","otherRulesNumber","hasMoreThanOneRule","hasTwoRules","fontSize","paddingLeft","SendTestLeadFeedback","onBackToEditRequest","onProceedRequest","debugUri","REACT_APP_SUPPORT_URL","SendTestLeadSubForm","fieldsToRender","fieldMappingTestingFieldName","oldField","TestConnectionView","fieldMappingTesting","fieldsToTestResponse","errorGettingFieldsToTest","isLoadingFieldsToTest","isRefetching","isRefetchingFieldsToTest","isLoadingAll","apiError","sourceFieldsToTest","WelcomeMessageForm","bridgeFields","dropdownWrapperRef","textAreaRef","charToOpen","allAvailableCoupons","setAllAvailableCoupons","subjectField","metaSubject","helpersSubject","bodyField","metaBody","bodyHelpers","isCouponActive","couponActiveHelpers","couponsField","couponsHelpers","templateBasedFieldsMapping","subjectError","bodyError","subjectErrorStatus","bodyErrorStatus","coupons","inputSelectPosition","setInputSelectPosition","x","y","showDropdown","setShowDropdown","highlightedIndex","setHighlightedIndex","inputElement","setInputElement","lastFocusedField","setLastFocusedField","isFirstRender","setIsFirstRender","dropdownHeight","setDropdownHeight","textInsideBrackets","setTextInsideBrackets","filteredData","setFilteredData","source","templateFields","isSmsMessage","couponValue","Set","filtered","startsWith","newData","fieldRef","cursorPosition","selectionEnd","indexOfLastOpenBracket","lastIndexOf","newPosition","handleScroll","checkForChar","element","isClosingBracketDeleted","selectionStart","indexOfLastOpenBracketBeforeCursor","substring","handleFieldFocus","handleOnSelect","fieldToUpdate","helpersToUpdate","currentText","newText","newCursorPosition","setSelectionRange","handleInputChange","handleKeyDown","selectedItem","scrollIntoView","behavior","block","resize","outline","contains","items","alignItems","marginBottom","JSON","stringify","onPaste","newCoupons","clipboardData","getData","split","coupon","updatedCoupons","prev","FieldsMappingForm","allBridgeFields","bridgeFilterRulesList","onRefetchBridgeFormValues","availablePermissionChecks","showWelcomeMessage","testEnabled","userModulesResponse","isLoadingUserModules","appId","screenState","setScreenState","setShowAllFields","filterText","setFilterText","testLeadDebugUri","setTestLeadDebugUri","testLeadDebugError","setTestLeadDebugError","destinationFields","destination","isAPILoading","userModules","modules","formulaUserModules","fieldMappingModules","maxFieldsToMap","maxFieldsMapping","isSmsForm","isWelcomeMessageForm","isInFieldMappingForm","isInTestFieldMapping","isInTestFeedback","totalFieldsToMap","totalFieldsMapped","isTestLeadEnabled","infoBar","StatusBarBridge","manualStatus","onTopbarValueChange","newBridgeName","submitForm","FormInner","formulaUserModule","ButtonTestBeforeProceeding","isDisabledFromParent","isSavingFromParent","ButtonSendTestLead","onSendTestLead","IncomingDataFinalStep","onSave","integrationName","onEditIntegrationName","onCancel","isUpdatingIntegration","appName","showedName","textDecoration","IncomingDataInitialStep","appLogoUri","onContinueRequest","integrationListener","listenerType","slug","showName","handleErrorsUpdate","IncomingDataTable","fontWeight","lastValue","LoadingStep","integrationId","setStep","prevState","loadingText","loadingTextTranslation","IncomingDataTableStep","isRecognizingFields","onContinue","isHeaderStuck","onReload","isConfirmingReload","activeBridges","totalBridges","resetConfirmingReload","tableRef","isStuck","setIsStuck","selectAll","setSelectAll","warningRef","isLastStepOfWarning","scrollTo","scrollHeight","justifyContent","newSelectAllState","updatedFields","recognizedFields","selectAllStatus","AppAuthCredentialForm","isOauthUri","skipParams","isNotValidIntegrationErrorMessage","setShowName","submitAction","setSubmitAction","hasError","setHasError","integrationUsage","generateRedirectUri","isIntegrationUsed","oauth","setSubmitting","redirectUri","isLegacy","onError","flex","InfoSection","SubmitButton","isStepName","onSubmitRequest","IntegrationCredentialsContent","Header","Disclaimer","Body","Logo","Title","SubTitle","isFinalStepFromOauthFlow","embeddablePercentage","activeStepIndex","ModalTrialInfo","showSurpriseMessage","planName","NbeeError","statusCode","getDefaultSize","Skeleton","forElement","defaultSizes","computedSizes","getSpecificSize","IntegrationSelector","parentAppId","isTesting","onTestIntegrationRequest","currentId","setCurrentId","refetchIntegrationsByAppId","u","selectedIdState","application","integrationIdField","integrationIdMeta","integrationIdHelpers","selectedIntegrationId","refetchSettings","useTriggerSettingsUpdate","allApps","mutateAsync","saveIntegrationAsync","isSavingIntegration","selectedApp","selectedAppLogoUri","selectedAppAuthType","authType","selectedAppId","o","logoUri","popupDestinationUrl","setPopupDestinationUrl","popupInstace","setPopupInstace","popupIsOpen","integrationDataFromPopup","setIntegrationDataFromPopup","onConnectNewAccountRequest","integrationIdToEdit","newIntegrationId","newIntegrationResponse","integration","popupUrl","isTouched","hasIntegrationApiError","isLoadingApi","authData","setAuthData","Auth","authData_","signInUserSession","jwtToken","token","isIframe","self","gridTemplateColumns","pointerEvents","span","newIntegrationName","IntegrationSettings","isValidIntegration","templateSettings","skipRequestNewSettingsToApi","firstRun","setFirstRun","setFieldTouched","validateForm","settingFieldName","currentSettingsValues","integrationSettingsResponse","retrieveIntegrationSettings","isLoadingIntegrationSettings","retrieveIntegrationSettingsApiError","setFieldsToRender","showPopupError","clearPopupError","usePopupError","showLogo","newSettingsReceived","schemaSettings","newSettingsWithDefaults","integrationSettingsData","setting","refresh","triggerSettingsUpdate","canShowTitle","requiredFields","format","hide","SettingFieldSmartCreatableSelect","fieldSchema","GooglePicker","apiHasError","SettingFieldSmartSelect","SettingFieldInput","SettingFieldToggle","AppConfigurator","canShowIntegrationField","isValidIntegrationResponse","isValidIntegrationApiError","isCheckingValidIntegration","isReCheckingValidIntegration","reCheckValidIntegration","isTestingIntegrationCredentials","result","setIntegrationId","popupErrorFake","response","localTemplateSettings","setLocalTemplateSettings","settingsAreFilled","bothAppsAreSelected","isInteger","appHasSetting","AppSelector","appNotFound","setAppNotFound","step1MatchRoute","isInStep1","inputName","appIdField","appIdMeta","appIdHelpers","isLoadingApps","mostPopular","isLoadingMostPopular","limit","isLoadingConnectedApps","mostPopularAppsOptions","allAppsOptions","useMemo","connectedAppsOptions","selectedAppName","fuzzySearch","isCaseSensitive","shouldSort","findAllMatches","includeMatches","includeScore","threshold","distance","ignoreLocation","sortFn","score","renderKey","Promise","resolve","flattenResults","search","searchAppName","SimpleBridgeBuilderForm","validationErrors","isEmailReceiptValid","sourceHasApiError","hasSettingsApiError","destinationHasApiError","cannotSubmit","topbarError","StatusBar","allowManualClosing","disableBridge","isDisablingBridge","disableBridgeApiError","disableBridgeResponse","newStatus","StepCompleted","bridgeName","isTestEnabledProp","performanceBoosterAvailable","existingPerformanceBoosterAvailable","errorPerformanceBooster","handleCreatePerformanceBoosterAndRedirect","existingPbId","queryClient","useQueryClient","bridgeIdProp","IsTestEnableProp","alignSelf","invalidateQueries","ModalChangePlan","hasSwitched","setHasSwitched","showConfirm","setShowConfirm","userDataRefetch","isUserDataRefetching","endOfTermsDate","Date","getTime","dateNow","remainDays","changePlanMutation","isChangingPlan","trial","previousPlanId","cbPlanId","newPlanId","previousMrr","mrr","newMrr","changePlan","ModalUpdatedPlan","PlanInfoBanner","plan","optionsMtu","optionsBridge","isCurrentPlan","onPlanSelect","isBusiness","price","serviceType","description","flexDirection","mainFeatures","clickable","html","planNameToShow","freemium","starter","pro","business","getPlanNameToShow","PricingCard","planDescription","priceDescription","isActive","isRecommended","isYearlyChecked","yearlyDiscountPercentage","onUndoSelect","deleteAtDate","showUndoPro","undoMessage","toLocaleLowerCase","SignUpForm","showGoogleButton","showFacebookButton","isAppSumo","showIndustries","showCoupon","header","testId","setIsLoading","getIndustries","matchPartnerPath","couponCode","currentPlan","updatedAppSumoFormValues","bbuSourceSlug","bbuDestinationSlug","bbuAppsInfo","isValidBbuUrl","affiliateData","setAffiliateData","existingCookieData","always_callback","referral_code","args","argId","vid","argVid","signupWithEmail","isDoingSingup","signupWithEmailApiError","signupReponse","newUserId","userId","channel","sourceId","destinationId","showGenericError","signupProviders","show","trialDays","industry","SingupLayoutWrapper","SignupLayoutStyled","extralarge","ContainerStyled","$hideOnMobile","SignupLayout","leftSlot","rightSlot","hideLeftOnMobile","ToastStyled","overallNotifications","visible","setVisible","toast","Transition","animation","duration","compact","onDismiss","REACT_USE_MOCK_API","QueryClient","queries","retry","staleTime","Infinity","refetchOnWindowFocus","S","dsn","integrations","tracesSampleRate","replaysOnErrorSampleRate","replaysSessionSampleRate","environment","release","denyUrls","ignoreErrors","allowUrls","QueryClientProvider","client","ReactQueryDevtools","initialIsOpen","store","ErrorPage","App","alert","timerId","dismissableTimer","isDismissable","transValue","buttons","hasProgressBar","AlertProgressBar","timer","EditableText","onNameChange","hasEditModeEnabled","setHasEditModeEnabled","isEditable","Topbar","hideOnEmbeddable","StepBar","StepBarItem","subLabel","onStepClick","zE","userAuthState","auth","shouldFetchUserModule","setShouldFetchUserModule","showSupportButton","setShowSupportButton","supportUserModule","customerSupportId","supportIsAvailable","testEnable","textColor","SimplePageWrapper","CardWrapper","SimplePage","TokenOutput","Spacer","TestFacebookToken","setToken","setInputValue","scopes","setScopes","currentTarget","customFbAppScopes","validateTokenWithApi","ComponentLazy","AdminPages","$progress","$theme","FastAppSurvey","integrationsData","onSubmitSuccess","logo","Form","BridgeByUrlCallback","isMountedInLoggedRoute","partnerFullName","persistentBbuData","parse","sessionStorage","authLbCode","lb_code","progressStep","setProgressStep","setLoadingText","hasJustCompletedSurvey","setHasJustCompletedSurvey","genericApiError","setGenericApiError","validPersistentBbuData","errorMissingStartingData","userStatus","useGenericBbuAuth","authCode","requestUri","persistentUserStatus","surveyNeeded","handleFinalStep","removeItem","bbuUrl","URL","apiAuthClient","includes","reload","CheckoutLazy","CheckoutPage","GoogleAdsAccountRouter","IncomingDataRouter","component","IntegrationRouter","qs","isInIframe","preventRedirect","postMessage","hasV1LoggedOut","iframe","logoutFromCognitoAndRedirectUser","messageReceiverFn","encodedStringAtoB","atob","JSONParsed","alertTitle","alertMessage","alertColor","NbeeRouter","PricingLazy","PricingPage","SignUp","section","headerText","subText","appSumoHeader","SignUpAppSumo","ImgSquare","BbuContent","headline","SignUpBbu","logoSmallUri","isValidBbuUri","Content","SignupBbuFallbackSurvey","WrapperStyled","ThankYouPage","prevPath","ctaText","row","rootReducer","appStore","reducer","devTools","middleware","getDefaultMiddleware","serializableCheck","ignoredActionPaths","ignoredPaths"],"sourceRoot":""}