{"version":3,"file":"static/js/main.f091d966.chunk.js","sources":["components/primitives/PageWidth.primitive.tsx","components/primitives/Button.primitive.js","components/molecules/Header.molecule.js","components/molecules/Footer.molecule.js","classes/RouteFactory.class.js","hooks/useCookie.hook.js","components/pages/VoucherCode.page.js","routes/voucherCode.routes.js","services/PrismicService.js","services/IpApi.service.js","components/molecules/PleaseLogin.molecule.js","components/atoms/UnderlineButton.atom.js","redux/authentication/authentication.reducer.js","redux/voucher/voucherCode.reducer.js","redux/prismic/prismic.actions.js","redux/prismic/prismic.reducer.js","redux/currency/currency.reducer.js","redux/root.store.js","components/atoms/ProgressionButton.atom.js","components/molecules/HeaderBanner.molecule.js","components/atoms/HighlightedHeader.atom.tsx","components/primitives/SVGImage.primitive.js","redux/summary/summarySlice.js","utils/debounce.js","components/providers/MasterTheme.provider.js","components/providers/Network.provider.js","components/organisms/PageNotFound.organism.js","components/organisms/LoadingPage.organism.js","components/organisms/BlockAccess.organism.js","routes/ControllerComponent.routes.js","themes/defaultTheme.js","App.js","hooks/useToken.hook.js","reportWebVitals.js","index.js","services/BaseApi.service.js","redux/authentication/authentication.actions.ts","redux/currency/currency.actions.js","classes/ImagePath.class.js","redux/voucher/voucherFlow.actions.js","hooks/usePrismic.hook.js"],"sourceRoot":"","sourcesContent":["import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport clsx from \"clsx\";\r\nimport { Theme } from \"types/theme.types\";\r\n\r\ninterface PageWidthProps {\r\n children: React.ReactNode;\r\n isTwoColumn?: boolean;\r\n className?: string;\r\n}\r\n\r\nconst usePageWidthStyle = makeStyles((theme: Theme) => ({\r\n root: {\r\n margin: \"3rem auto\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n width: \"100%\",\r\n padding: \"0 18.5px\",\r\n margin: \"1.5rem auto\",\r\n },\r\n },\r\n twoColumn: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"flex-start\",\r\n maxWidth: 1200,\r\n [theme.breakpoints.down(\"sm\")]: {\r\n display: \"block\", // Stack columns on small screens\r\n },\r\n },\r\n column: {\r\n flexBasis: \"50%\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n display: \"block\",\r\n },\r\n },\r\n singleColumn: {\r\n width: 380,\r\n minWidth: 170,\r\n [theme.breakpoints.down(\"sm\")]: {\r\n display: \"block\",\r\n },\r\n },\r\n}));\r\n\r\nconst PageWidth: React.FC = ({ children, isTwoColumn = false, className }) => {\r\n const classes = usePageWidthStyle();\r\n const childrenArray = React.Children.toArray(children);\r\n const useTwoColumns = isTwoColumn && childrenArray.length > 1;\r\n\r\n return (\r\n \r\n {useTwoColumns ? (\r\n <>\r\n
{childrenArray[0]}
\r\n
\r\n {childrenArray.length > 1 ? childrenArray[1] : null}\r\n
\r\n \r\n ) : (\r\n children\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default PageWidth;\r\n","import styled from \"styled-components\";\r\nimport { Button as MaterialButton } from \"@material-ui/core\";\r\nimport { withTheme } from \"@material-ui/core/styles\";\r\n\r\nconst Button = withTheme(styled(MaterialButton)`\r\n border: 0;\r\n padding: 0;\r\n margin: 0;\r\n background: transparent;\r\n color: inherit;\r\n cursor: pointer;\r\n transition: transform 0.2s;\r\n position: relative;\r\n text-transform: inherit;\r\n border-radius: 0px;\r\n display: ${({ display }) => (display === \"block\" ? \"flex-block\" : \"flex\")};\r\n\r\n &:disabled {\r\n cursor: not-allowed;\r\n }\r\n\r\n &:active {\r\n transform: translateY(2px);\r\n }\r\n\r\n * {\r\n font-family: inherit;\r\n pointer-events: all;\r\n }\r\n`);\r\n\r\nexport default Button;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Grid } from \"@material-ui/core\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { ReactSVG } from \"react-svg\";\r\nimport { Link } from \"react-router-dom\";\r\nimport usePrismic from \"hooks/usePrismic.hook\";\r\n\r\nconst useHeaderStyles = makeStyles((theme) => ({\r\n appHeader: {\r\n color: theme.colours.header.text,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"26px 20px .5rem\",\r\n [theme.breakpoints.down(\"xs\")]: {\r\n padding: \"1.5rem 21px 0\",\r\n justifyContent: \"flex-start\",\r\n },\r\n },\r\n logoWrapper: {\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n textAlign: \"center\",\r\n\r\n },\r\n}));\r\nconst HeaderLogo = ({ link }) => {\r\n const classes = useHeaderStyles();\r\n\r\n let LinkElement;\r\n let linkProps = {};\r\n\r\n if (!link) {\r\n LinkElement = Link;\r\n linkProps.to = \"/\";\r\n } else if (link.url) {\r\n LinkElement = \"a\";\r\n linkProps.href = link.url;\r\n if (link.target) {\r\n linkProps.target = link.target;\r\n }\r\n }\r\n\r\n return (\r\n
\r\n {LinkElement && (\r\n \r\n \r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default function Header() {\r\n const classes = useHeaderStyles();\r\n\r\n const [pageContent, setPageContent] = useState();\r\n const { fetchPrismicData, pageData } = usePrismic();\r\n\r\n useEffect(() => {\r\n fetchPrismicData(\"vouchers_portal_header\");\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (pageData && pageData.data) {\r\n setPageContent(pageData.data);\r\n }\r\n }, [pageData]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Grid } from \"@material-ui/core\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { ReactSVG } from \"react-svg\";\r\nimport { Link } from \"react-router-dom\";\r\nimport clsx from \"clsx\";\r\nimport usePrismic from \"hooks/usePrismic.hook\";\r\nimport { RichText } from \"prismic-reactjs\";\r\n\r\n/**Footer Logo */\r\nconst useFooterLogoStyles = makeStyles((theme) => ({\r\n logoHolder: {\r\n [theme.breakpoints.down(\"sm\")]: {\r\n textAlign: \"left\",\r\n marginBottom: 30,\r\n marginTop: 50\r\n },\r\n },\r\n logo: {\r\n display: \"inline-block\",\r\n width: 94,\r\n height: 70,\r\n \"& svg\": {\r\n maxHeight: 70,\r\n maxWidth: 94,\r\n },\r\n },\r\n}));\r\n\r\nconst FooterLogo = ({ link }) => {\r\n const classes = useFooterLogoStyles();\r\n\r\n let LinkElement;\r\n let linkProps = {};\r\n\r\n if (!link) {\r\n LinkElement = Link;\r\n linkProps.to = \"/\";\r\n } else if (link.url) {\r\n LinkElement = \"a\";\r\n linkProps.href = link.url;\r\n if (link.target) {\r\n linkProps.target = link.target;\r\n }\r\n }\r\n\r\n return (\r\n
\r\n {LinkElement && (\r\n \r\n \r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\n/** Footer */\r\nconst useFooterStyles = makeStyles((theme) => ({\r\n footerWrapper: {\r\n background: theme.colours.nearlyBlack,\r\n color: theme.colours.white,\r\n padding: \"min(57px, 4%) min(130px, 9%)\",\r\n alignItems: \"center\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n justifyContent: \"center\",\r\n alignItems: \"flex-start\",\r\n padding: \"21.5px 16px 20px 16px\",\r\n },\r\n },\r\n footerCenter: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n alignItems: \"flex-end\",\r\n },\r\n },\r\n footerMenu: {\r\n display: \"flex\",\r\n listStyle: \"none\",\r\n paddingLeft: 0,\r\n [theme.breakpoints.down(\"sm\")]: {\r\n flexFlow: \"column\",\r\n alignItems: \"flex-end\",\r\n },\r\n \"& li\": {\r\n [theme.breakpoints.down(\"sm\")]: {\r\n lineHeight: 1.1,\r\n },\r\n },\r\n },\r\n footerSticky: {\r\n bottom: 0,\r\n zIndex: -1,\r\n position: \"absolute\",\r\n },\r\n separator: {\r\n padding: \"0 min(0.4vw, 10px)\",\r\n [theme.breakpoints.down(\"md\")]: {\r\n padding: \"0 min(0.25vw, 10px)\",\r\n },\r\n [theme.breakpoints.down(\"sm\")]: {\r\n display: \"none\",\r\n },\r\n },\r\n info: {\r\n fontFamily: \"OratorStd\",\r\n fontSize: 16,\r\n fontWeight: \"normal\",\r\n fontStretch: \"normal\",\r\n fontStyle: \"normal\",\r\n lineHeight: \"normal\",\r\n letterSpacing: \"normal\",\r\n color: theme.colours.white,\r\n textTransform: \"lowercase\",\r\n \"& p\": {\r\n margin: 0,\r\n },\r\n },\r\n link: {\r\n fontFamily: \"BebasNeue\",\r\n fontSize: 16,\r\n fontWeight: \"normal\",\r\n fontStretch: \"normal\",\r\n fontStyle: \"normal\",\r\n lineHeight: \"normal\",\r\n letterSpacing: 1,\r\n color: theme.colours.white,\r\n display: \"flex\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n fontSize: 22,\r\n lineHeight: 1.15,\r\n textAlign: \"right\",\r\n },\r\n \"& p\": {\r\n margin: 0,\r\n },\r\n },\r\n socialIconsWrapper: {\r\n display: \"flex\",\r\n flexFlow: \"row\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n marginBottom: 0,\r\n [theme.breakpoints.down(\"sm\")]: {\r\n justifyContent: \"space-between\",\r\n },\r\n },\r\n socialLinks: {\r\n marginRight: 20,\r\n \"&:last-child\": {\r\n marginRight: 0,\r\n },\r\n },\r\n socialIcons: {\r\n height: 20,\r\n display: \"inline-block\",\r\n \"& svg\": {\r\n maxHeight: 20,\r\n },\r\n [theme.breakpoints.down(\"sm\")]: {\r\n height: 24,\r\n \"& svg\": {\r\n maxHeight: 24,\r\n },\r\n },\r\n },\r\n}));\r\n\r\nexport default function Footer(props) {\r\n const [pageContent, setPageContent] = useState();\r\n\r\n const classes = useFooterStyles();\r\n\r\n const { fetchPrismicData, pageData } = usePrismic();\r\n\r\n useEffect(() => {\r\n fetchPrismicData(\"vouchers_portal_footer\");\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (pageData && pageData.data) {\r\n setPageContent(pageData.data);\r\n }\r\n }, [pageData]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n
\r\n {pageContent && RichText.render(pageContent?.footer_links_title)}\r\n
\r\n
    \r\n {pageContent &&\r\n pageContent?.footer_links?.map((item, index) => (\r\n
  • \r\n \r\n {RichText.render(item?.link)}\r\n {index !== pageContent?.footer_links.length - 1 && (\r\n |\r\n )}\r\n \r\n
  • \r\n ))}\r\n
\r\n
\r\n \r\n
\r\n {pageContent &&\r\n pageContent?.social_icons?.map((item, index) => (\r\n \r\n \r\n \r\n ))}\r\n
\r\n
\r\n \r\n );\r\n}\r\n","export default class RouteFactory {\r\n constructor({ path, component, title, page }) {\r\n this.path = path;\r\n this.Component = component;\r\n this.title = title;\r\n this.Page = page;\r\n }\r\n}","import { useEffect } from \"react\";\r\nimport { useCookies } from \"react-cookie\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport { unwrapResult } from \"@reduxjs/toolkit\";\r\nimport authenticationActions from \"redux/authentication/authentication.actions\";\r\n\r\nexport const useCookie = () => {\r\n const [cookies] = useCookies([\"tsol_oauth\"]);\r\n const dispatch = useDispatch();\r\n\r\n const getTokenFromCookie = async () => {\r\n let accessToken, refreshToken;\r\n\r\n if (\r\n cookies?.tsol_oauth &&\r\n cookies.tsol_oauth?.accessToken &&\r\n cookies.tsol_oauth?.refreshToken &&\r\n cookies.tsol_oauth?.expiryDate * 1000 > Date.now() && // convert to ms\r\n !localStorage.getItem(\"accessToken\") &&\r\n !localStorage.getItem(\"refreshToken\")\r\n ) {\r\n // get access token from cookie\r\n accessToken = cookies.tsol_oauth.accessToken;\r\n // get refresh token from cookie\r\n refreshToken = cookies.tsol_oauth.refreshToken;\r\n }\r\n\r\n // if we have both accessToken and refreshToken we make the API call to get new tokens\r\n if (refreshToken && accessToken) {\r\n // construct payload\r\n const payload = {\r\n clientId: process.env.REACT_APP_AUTH_CLIENT_ID,\r\n clientSecret: process.env.REACT_APP_AUTH_CLIENT_SECRET,\r\n grant_type: \"refresh_token\",\r\n refresh_token: refreshToken,\r\n };\r\n\r\n dispatch(authenticationActions.loginUserFromCookie(payload))\r\n .then(unwrapResult)\r\n .then((originalPromiseResult) => {\r\n const { accessToken, refreshToken } = originalPromiseResult;\r\n localStorage.setItem(\"accessToken\", accessToken);\r\n localStorage.setItem(\"refreshToken\", refreshToken);\r\n localStorage.setItem(\"tsol_voucher_user_isAuthenticated\", true);\r\n\r\n dispatch(authenticationActions.getUserDetails())\r\n .then(unwrapResult)\r\n .then((originalPromiseResult) => {\r\n const { email } = originalPromiseResult;\r\n localStorage.setItem(\"tsol_voucher_user_email\", email);\r\n });\r\n })\r\n .catch((rejectedValueOrSerializedError) => {\r\n console.log(\"There was an error during login\");\r\n });\r\n }\r\n };\r\n\r\n // Logout when cookie expires\r\n useEffect(() => {\r\n if (!cookies.tsol_oauth) {\r\n // toast.error();\r\n localStorage.removeItem(\"tsol_voucher_user_isAuthenticated\");\r\n localStorage.removeItem(\"accessToken\");\r\n localStorage.removeItem(\"refreshToken\");\r\n localStorage.removeItem(\"tsol_voucher_user_email\");\r\n }\r\n }, [cookies]);\r\n\r\n // Reuse the token refresh logic\r\n useEffect(() => {\r\n getTokenFromCookie();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n};\r\n","import React from \"react\";\r\nimport Heading from \"components/molecules/Header.molecule\";\r\nimport Footer from \"components/molecules/Footer.molecule\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { useCookies } from \"react-cookie\";\r\nimport { useCookie } from \"hooks/useCookie.hook\";\r\n\r\nconst useVoucherCodePageStyles = makeStyles((theme) => ({\r\n root: {\r\n backgroundColor: theme.colours.white,\r\n },\r\n container: {\r\n fontFamily: \"Scala\",\r\n margin: \"0 0 110px\",\r\n backgroundColor: theme.colours.white,\r\n },\r\n}));\r\n\r\nexport default function VoucherCodePage({ children }) {\r\n const classes = useVoucherCodePageStyles();\r\n const [cookies] = useCookies([\"tsol_oauth\"]);\r\n\r\n useCookie(cookies);\r\n\r\n return (\r\n
\r\n \r\n
{children}
\r\n
\r\n
\r\n );\r\n}\r\n","import React from \"react\";\r\nimport RouteFactory from \"@classes/RouteFactory.class\";\r\nimport VoucherCodePage from \"@components/pages/VoucherCode.page\";\r\n\r\nconst LandingPage = React.lazy(() =>\r\n import(\"@organisms/LandingPage.organism.tsx\")\r\n);\r\nconst CreateAccount = React.lazy(() =>\r\n import(\"@organisms/CreateAccount.organism.tsx\")\r\n);\r\nconst LoginPage = React.lazy(() =>\r\n import(\"@organisms/LoginPage.organism.tsx\")\r\n);\r\nconst RecoverPassword = React.lazy(() =>\r\n import(\"@organisms/RecoverPassword.organism\")\r\n);\r\nconst EnterVoucherCode = React.lazy(() =>\r\n import(\"@organisms/EnterVoucherCode.organism\")\r\n);\r\nconst OrderSummary = React.lazy(() =>\r\n import(\"@organisms/OrderSummary.organism\")\r\n);\r\nconst ConfirmationPage = React.lazy(() =>\r\n import(\"@organisms/ConfirmationPage.organism\")\r\n);\r\nconst RedirectingPage = React.lazy(() =>\r\n import(\"@organisms/RedirectingPage.organism\")\r\n);\r\nconst TaxRestrictionPage = React.lazy(() =>\r\n import(\"@organisms/TaxRestriction.organism\")\r\n);\r\n\r\nconst paths = {\r\n landingPage: new RouteFactory({\r\n path: \"/\",\r\n component: LandingPage,\r\n title: \"THE LANDING PAGE\",\r\n page: VoucherCodePage,\r\n }),\r\n createAccount: new RouteFactory({\r\n path: \"/create-account\",\r\n component: CreateAccount,\r\n title: \"THE CA PAGE\",\r\n page: VoucherCodePage,\r\n }),\r\n loginToAccount: new RouteFactory({\r\n path: \"/login\",\r\n component: LoginPage,\r\n title: \"THE LOGIN PAGE\",\r\n page: VoucherCodePage,\r\n }),\r\n recoverPassword: new RouteFactory({\r\n path: \"/recover-password\",\r\n component: RecoverPassword,\r\n title: \"THE RECOVER PASSWORD PAGE\",\r\n page: VoucherCodePage,\r\n }),\r\n enterVoucherCode: new RouteFactory({\r\n path: \"/use-voucher\",\r\n component: EnterVoucherCode,\r\n title: \"THE ENTER VOUCHER PAGE\",\r\n page: VoucherCodePage,\r\n }),\r\n orderSummary: new RouteFactory({\r\n path: \"/order-summary\",\r\n component: OrderSummary,\r\n title: \"THE ORDER SUMMARY PAGE\",\r\n page: VoucherCodePage,\r\n }),\r\n confirmation: new RouteFactory({\r\n path: \"/confirmation\",\r\n component: ConfirmationPage,\r\n title: \"THE CONFIRMATION PAGE\",\r\n page: VoucherCodePage,\r\n }),\r\n redirecting: new RouteFactory({\r\n path: \"/redirecting\",\r\n component: RedirectingPage,\r\n title: \"THE REDIRECT PAGE\",\r\n page: VoucherCodePage,\r\n }),\r\n taxRestriction: new RouteFactory({\r\n path: \"/tax-restriction\",\r\n component: TaxRestrictionPage,\r\n title: \"Tax Restriction\",\r\n page: TaxRestrictionPage,\r\n }),\r\n};\r\n\r\nexport default paths;\r\n","import ky from \"ky\";\r\n\r\nconst API_ROOT = process.env.REACT_APP_HYD_API;\r\nconst api = ky.create({ prefixUrl: API_ROOT });\r\n\r\n// API Services:\r\nexport default class PrismicService {\r\n static async getPageBySlug(pageSlug) {\r\n return await api.get(`vouchers/contents/${pageSlug}`).json();\r\n }\r\n}\r\n","import ky from \"ky\";\r\nconst API_ROOT = process.env.REACT_APP_IP_API;\r\nconst api = ky.create({\r\n prefixUrl: API_ROOT,\r\n});\r\n\r\n// API Services:\r\nexport default class IpApi {\r\n static async fetchUserLocation() {\r\n const API_KEY = process.env.REACT_APP_IP_API_KEY;\r\n const data = await api.get(`json/?key=${API_KEY}`).json();\r\n return data;\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { Typography } from \"@material-ui/core\";\r\nimport UnderlineButton from \"components/atoms/UnderlineButton.atom\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\n\r\nconst usePleaseLoginStyles = makeStyles((theme) => ({\r\n root: {\r\n fontSize: 18,\r\n fontWeight: \"normal\",\r\n fontStretch: \"normal\",\r\n fonStyle: \"normal\",\r\n lineHeight: 1.56,\r\n letterSpacing: \"normal\",\r\n color: theme.colours.black,\r\n fontFamily: \"Scala\",\r\n },\r\n link: {\r\n display: \"inline-flex !important\",\r\n textAlign: \"left\",\r\n width: \"auto\",\r\n justifyContent: \"flex-start\",\r\n minWidth: \"auto\",\r\n fontSize: \"inherit\",\r\n \"& span:nth-child(2)\": {\r\n display: \"none\",\r\n },\r\n },\r\n}));\r\n\r\nconst PleaseLogin = () => {\r\n const classes = usePleaseLoginStyles();\r\n return (\r\n \r\n Please{\" \"}\r\n \r\n sign up\r\n {\" \"}\r\n or\r\n \r\n {\" \"}\r\n sign in\r\n {\" \"}\r\n first\r\n \r\n );\r\n};\r\n\r\nexport default PleaseLogin;\r\n","import React from \"react\";\r\nimport Button from \"components/primitives/Button.primitive\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport clsx from \"clsx\";\r\n\r\nconst useUnderlineButtonStyles = makeStyles((theme) => ({\r\n root: {\r\n textDecoration: \"underline\",\r\n fontFamily: \"BebasNeue\",\r\n fontSize: 16,\r\n fontWeight: \"normal\",\r\n fontStretch: \"normal\",\r\n fontStyle: \"normal\",\r\n lineHeight: 1.43,\r\n letterSpacing: \"normal\",\r\n textAlign: \"right\",\r\n color: theme.colours.veryDarkGray,\r\n\r\n \"&.accent\": {\r\n backgroundColor: theme.colours.vividYellow,\r\n \"&:hover\": {\r\n backgroundColor: theme.colours.vividYellow,\r\n },\r\n },\r\n\r\n \"&:hover\": {\r\n background: \"none\",\r\n textDecoration: \"underline\",\r\n },\r\n\r\n \"& pre\": {\r\n margin: 0,\r\n },\r\n \"& p\": {\r\n margin: 0,\r\n },\r\n },\r\n}));\r\n\r\nexport default function UnderlineButton({ children, className, ...props }) {\r\n const classes = useUnderlineButtonStyles();\r\n return (\r\n \r\n );\r\n}\r\n","import { handleActions } from \"redux-actions\";\r\nimport produce from \"immer\";\r\nimport authenticationActions from \"redux/authentication/authentication.actions\";\r\n\r\nconst INITIAL_STATE = {\r\n working: false,\r\n isAuthenticated: false,\r\n email: \"\",\r\n userDetails: {},\r\n};\r\n\r\nconst reducer = handleActions(\r\n {\r\n [authenticationActions.loginUser.pending]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = true;\r\n }),\r\n [authenticationActions.loginUser.fulfilled]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = false;\r\n draft.isAuthenticated = true;\r\n draft.email = action.payload.email;\r\n }),\r\n [authenticationActions.loginUser.rejected]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = false;\r\n }),\r\n [authenticationActions.registerUser.pending]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = true;\r\n }),\r\n [authenticationActions.loginUserFromCookie.fulfilled]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = false;\r\n draft.isAuthenticated = true;\r\n draft.email = action.payload.email;\r\n }),\r\n [authenticationActions.loginUserFromCookie.rejected]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = false;\r\n }),\r\n [authenticationActions.loginUserFromCookie.pending]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = true;\r\n }),\r\n [authenticationActions.registerUser.fulfilled]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = false;\r\n draft.isAuthenticated = true;\r\n draft.email = action.payload.email;\r\n }),\r\n [authenticationActions.registerUser.rejected]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = false;\r\n }),\r\n [authenticationActions.getUserDetails.fulfilled]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.userDetails = action.payload;\r\n }),\r\n [authenticationActions.logout]: () => INITIAL_STATE,\r\n },\r\n INITIAL_STATE\r\n);\r\n\r\nexport default reducer;\r\n","import { handleActions } from \"redux-actions\";\r\nimport produce from \"immer\";\r\nimport voucherFlowActions from \"redux/voucher/voucherFlow.actions\";\r\n\r\nconst INITIAL_STATE = {\r\n working: false,\r\n voucherId: null,\r\n voucherCodeDetails: {\r\n currency: null,\r\n discountAmount: null,\r\n discountLimit: null,\r\n discountType: null,\r\n initialPrice: null,\r\n valid: null,\r\n finalPrice: 15000,\r\n lifetime: false,\r\n },\r\n voucherPreviewDetails: {},\r\n voucherCodeErrors: null,\r\n};\r\n\r\nconst reducer = handleActions(\r\n {\r\n [voucherFlowActions.setVoucherCode]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.voucherId = action.payload;\r\n }),\r\n [voucherFlowActions.testVoucherCode.pending]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = true;\r\n }),\r\n [voucherFlowActions.testVoucherCode.fulfilled]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = false;\r\n const {\r\n currency,\r\n discountAmount,\r\n discountLimit,\r\n discountType,\r\n initialPrice,\r\n valid,\r\n finalPrice,\r\n lifetime,\r\n trialDays\r\n } = action.payload;\r\n draft.voucherCodeDetails = {\r\n currency,\r\n discountAmount,\r\n discountLimit,\r\n discountType,\r\n initialPrice,\r\n valid,\r\n finalPrice,\r\n lifetime,\r\n trialDays\r\n };\r\n }),\r\n [voucherFlowActions.testVoucherCode.rejected]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = false;\r\n draft.voucherCodeErrors = action.payload;\r\n }),\r\n [voucherFlowActions.testVoucherCodePreview.fulfilled]: (state, action) =>\r\n produce(state, (draft) => {\r\n const voucherId = action.meta.arg.voucherId;\r\n if (!draft.voucherPreviewDetails) {\r\n draft.voucherPreviewDetails = {};\r\n }\r\n draft.voucherPreviewDetails[voucherId] = action.payload;\r\n }),\r\n },\r\n INITIAL_STATE\r\n);\r\n\r\nexport default reducer;","import { createAsyncThunk } from \"@reduxjs/toolkit\";\r\nimport PrismicService from \"services/PrismicService\";\r\n\r\nlet prismicActions = {};\r\n\r\nprismicActions.fetchPageBySlug = createAsyncThunk(\r\n \"FETCH_PRISMIC_PAGE_BY_SLUG\",\r\n async (pageSlug) => {\r\n return await PrismicService.getPageBySlug(pageSlug);\r\n }\r\n);\r\n\r\nexport default prismicActions;\r\n","import { handleActions } from \"redux-actions\";\r\nimport produce from \"immer\";\r\nimport prismicActions from \"redux/prismic/prismic.actions\";\r\n\r\nconst INITIAL_STATE = {\r\n working: false,\r\n pageData: {},\r\n};\r\n\r\nconst reducer = handleActions(\r\n {\r\n [prismicActions.fetchPageBySlug.pending]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = true;\r\n }),\r\n\r\n [prismicActions.fetchPageBySlug.fulfilled]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = false;\r\n draft.pageData = action.payload;\r\n }),\r\n [prismicActions.fetchPageBySlug.rejected]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = false;\r\n }),\r\n },\r\n INITIAL_STATE\r\n);\r\n\r\nexport default reducer;\r\n","import { handleActions } from \"redux-actions\";\r\nimport produce from \"immer\";\r\nimport currencyActions from \"./currency.actions\";\r\nimport { getParamByISO } from \"iso-country-currency\";\r\n\r\nconst INITIAL_STATE = {\r\n working: false,\r\n currencies: [],\r\n currencyErrors: null,\r\n localCurrency: null,\r\n};\r\n\r\nconst reducer = handleActions(\r\n {\r\n [currencyActions.fetchCurrencies.pending]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = true;\r\n }),\r\n [currencyActions.fetchCurrencies.fulfilled]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = false;\r\n draft.currencies = action.payload;\r\n }),\r\n [currencyActions.fetchCurrencies.rejected]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = false;\r\n draft.currencyErrors = action.payload;\r\n }),\r\n\r\n [currencyActions.getUserLocalCurrency.pending]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = true;\r\n }),\r\n [currencyActions.getUserLocalCurrency.fulfilled]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = false;\r\n draft.countryCode = action.payload.countryCode;\r\n draft.localCurrency = getParamByISO(\r\n action.payload.countryCode,\r\n \"currency\"\r\n );\r\n }),\r\n [currencyActions.getUserLocalCurrency.rejected]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.working = false;\r\n draft.localCurrency = action.payload;\r\n }),\r\n \r\n // Handle the setCurrency action\r\n [currencyActions.setCurrency]: (state, action) =>\r\n produce(state, (draft) => {\r\n draft.localCurrency = action.payload;\r\n }),\r\n },\r\n INITIAL_STATE\r\n);\r\n\r\nexport default reducer;\r\n","import { configureStore } from \"@reduxjs/toolkit\";\r\nimport storage from \"redux-persist/lib/storage\";\r\nimport { combineReducers } from \"redux\";\r\nimport { persistReducer } from \"redux-persist\";\r\nimport authenticationReducer from \"redux/authentication/authentication.reducer\";\r\nimport voucherCodeReducer from \"redux/voucher/voucherCode.reducer\";\r\nimport prismicReducer from \"redux/prismic/prismic.reducer\";\r\nimport currencyReducer from \"redux/currency/currency.reducer\";\r\nimport summarySlice from \"redux/summary/summarySlice\";\r\nimport thunk from \"redux-thunk\";\r\n\r\nconst reducers = combineReducers({\r\n authentication: authenticationReducer,\r\n voucherCode: voucherCodeReducer,\r\n prismic: prismicReducer,\r\n currency: currencyReducer,\r\n summary: summarySlice,\r\n});\r\n\r\nconst persistConfig = {\r\n key: \"root\",\r\n storage,\r\n};\r\n\r\nconst persistedReducer = persistReducer(persistConfig, reducers);\r\nexport default configureStore({\r\n reducer: persistedReducer,\r\n middleware: [thunk],\r\n});\r\n","import React from \"react\";\r\nimport ImagePath, { images } from \"classes/ImagePath.class\";\r\nimport Button from \"components/primitives/Button.primitive\";\r\nimport SVG from \"components/primitives/SVGImage.primitive\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport clsx from \"clsx\";\r\n\r\nconst useProgressionButtonStyle = makeStyles((theme) => ({\r\n root: {\r\n backgroundColor: `${theme.colours.buttons.progression.secondary.background} !important`,\r\n color: `${theme.colours.buttons.progression.secondary.color} !important`,\r\n textTransform: \"uppercase\",\r\n padding: \"14px 15px 11px 21px !important\",\r\n width: \"auto\",\r\n justifyContent: \"space-between\",\r\n minWidth: 180,\r\n fontFamily: \"BebasNeue\",\r\n fontSize: 18,\r\n letterSpacing: 0.56,\r\n boxShadow: \"none\",\r\n [theme.breakpoints.down(\"xs\")]: {\r\n letterSpacing: 0.56,\r\n padding: \"7px 7px 5.5px 10.5px !important\",\r\n },\r\n \"& p\": {\r\n margin: 0,\r\n },\r\n \"& pre\": {\r\n margin: 0,\r\n },\r\n },\r\n primary: {\r\n backgroundColor: `${theme.colours.buttons.progression.primary.background} !important`,\r\n color: `${theme.colours.buttons.progression.primary.color} !important`,\r\n },\r\n full: {\r\n width: \"100%\",\r\n },\r\n wrap: {\r\n \"& pre\": {\r\n whiteSpace: \"normal\",\r\n },\r\n },\r\n alignLeft: {\r\n textAlign: \"left\",\r\n \"& pre\": {\r\n textAlign: \"left\",\r\n },\r\n },\r\n arrow: {\r\n width: 30,\r\n height: 10,\r\n background: theme.colours.buttons.progression.secondary.color,\r\n },\r\n arrowPrimary: {\r\n background: theme.colours.buttons.progression.primary.color,\r\n },\r\n}));\r\n\r\nexport default function ProgressionButton({\r\n children,\r\n className,\r\n showIcon = true,\r\n ...props\r\n}) {\r\n const classes = useProgressionButtonStyle();\r\n return (\r\n \r\n {children}\r\n {showIcon && (\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport ImagePath, { images } from \"classes/ImagePath.class\";\r\n\r\nconst useHeaderBannerStyles = makeStyles((theme) => ({\r\n root: {\r\n width: \"100%\",\r\n height: 300,\r\n marginBottom: 80,\r\n backgroundRepeat: \"no-repeat\",\r\n backgroundPosition: \"center center\",\r\n backgroundSize: \"cover\",\r\n backgroundImage: (props) => `url(${props.desktopImageUrl})`,\r\n [theme.breakpoints.down(\"xs\")]: {\r\n height: 321,\r\n marginBottom: 60,\r\n backgroundImage: (props) => `url(${props.mobileImageUrl})`,\r\n },\r\n },\r\n}));\r\n\r\nexport default function HeaderBanner({\r\n desktopImageUrl = ImagePath.returnImage(images.headerBanner.backupDesktop),\r\n mobileImageUrl = ImagePath.returnImage(images.headerBanner.backupMobile),\r\n}) {\r\n const classes = useHeaderBannerStyles({ desktopImageUrl, mobileImageUrl });\r\n\r\n return
;\r\n}\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport clsx from \"clsx\";\r\nimport { Theme } from \"types/theme.types\";\r\n\r\ninterface HighlightedHeaderProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nconst useHighlightedHeaderStyles = makeStyles((theme: Theme) => ({\r\n root: {\r\n fontFamily: \"BebasNeue\",\r\n fontSize: 48,\r\n fontWeight: \"normal\",\r\n fontStretch: \"normal\",\r\n fontStyle: \"normal\",\r\n lineHeight: 1.04,\r\n letterSpacing: \"normal\",\r\n color: theme.colours.black,\r\n [theme.breakpoints.down(\"xs\")]: {\r\n fontSize: 36,\r\n lineHeight: \"normal\",\r\n maxWidth: \"380px\",\r\n },\r\n \"& span\": {\r\n backgroundColor: theme.colours.vividYellow,\r\n padding: \"0 5px\",\r\n },\r\n \"& strong\": {\r\n backgroundColor: theme.colours.vividYellow,\r\n padding: \"0 5px\",\r\n },\r\n \"& p\": {\r\n marginBottom: \"20px\",\r\n marginTop: \"0\",\r\n },\r\n },\r\n}));\r\n\r\nconst HighlightedHeader: React.FC = ({ children, className }) => {\r\n const classes = useHighlightedHeaderStyles();\r\n return
{children}
;\r\n};\r\n\r\nexport default HighlightedHeader; ","import styled from 'styled-components';\r\n\r\nconst SVG = styled.i`\r\n -webkit-mask: url(${({ path }) => path}) no-repeat 50% 50%;\r\n mask: url(${({ path }) => path}) no-repeat 50% 50%;\r\n mask-size: 100% 100%;\r\n display: block;\r\n`;\r\n\r\nexport default SVG;","import { createSlice } from '@reduxjs/toolkit'\r\n\r\nexport const summarySlice = createSlice({\r\n name: 'summary',\r\n initialState: {\r\n street: '',\r\n city: '',\r\n postalCode: '',\r\n country: '',\r\n },\r\n reducers: {\r\n saveStreet: (state, action) => {\r\n state.street = action.payload.street;\r\n },\r\n saveCity: (state, action) => {\r\n state.city = action.payload.city;\r\n },\r\n savePostalCode: (state, action) => {\r\n state.postalCode = action.payload.postalCode;\r\n },\r\n saveCountry: (state, action) => {\r\n state.country = action.payload.country;\r\n },\r\n },\r\n})\r\n\r\n\r\nexport const { saveStreet, saveCity, savePostalCode, saveCountry } = summarySlice.actions;\r\n\r\nexport default summarySlice.reducer;\r\n","function debounce(func, delay) {\r\n let timeout;\r\n return function(...args) {\r\n const later = () => {\r\n clearTimeout(timeout);\r\n func(...args);\r\n };\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, delay);\r\n };\r\n}\r\nexport default debounce;","import { ThemeProvider as StyledProvider } from 'styled-components';\r\nimport { ThemeProvider as MaterialProvider } from \"@material-ui/styles\";\r\nimport CssBaseline from \"@material-ui/core/CssBaseline\";\r\n\r\nexport default function MasterTheme({ theme, children }) {\r\n return (\r\n \r\n \r\n \r\n {children}\r\n \r\n \r\n )\r\n}","import React from \"react\";\r\nimport styled from \"styled-components\";\r\nimport { withTheme } from \"@material-ui/styles\";\r\n\r\nconst IS_ONLINE = \"online\";\r\nconst IS_OFFLINE = \"offline\";\r\n\r\nconst Banner = withTheme(styled.div`\r\n padding: 10px;\r\n position: fixed;\r\n top: 0;\r\n right: 0;\r\n background: ${({ theme }) => theme.palette.background.grey};\r\n color: ${({ theme }) => theme.palette.text.grey};\r\n z-index: 6;\r\n`);\r\n\r\nexport default function NetworkGate({ children }) {\r\n const [isOnline, setIsOnline] = React.useState(true);\r\n\r\n React.useEffect(() => {\r\n window.addEventListener(IS_ONLINE, () => {\r\n setIsOnline(true);\r\n });\r\n window.addEventListener(IS_OFFLINE, () => {\r\n setIsOnline(false);\r\n });\r\n }, [setIsOnline]);\r\n\r\n if (isOnline) {\r\n return children;\r\n } else {\r\n return (\r\n
\r\n OFFLINE MESSAGE\r\n
{children}
\r\n
\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport Heading from \"components/molecules/Header.molecule\";\r\nimport Footer from \"components/molecules/Footer.molecule\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport HighlightedHeader from \"components/atoms/HighlightedHeader.atom\";\r\nimport HeaderBanner from \"components/molecules/HeaderBanner.molecule\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport ProgressionButton from \"components/atoms/ProgressionButton.atom\";\r\nimport { Link } from \"react-router-dom\";\r\nimport voucherCodeLinks from \"routes/voucherCode.routes\";\r\nimport PageWidth from \"components/primitives/PageWidth.primitive\";\r\n\r\nconst usePageNotFoundStyles = makeStyles((theme) => ({\r\n container: {\r\n fontFamily: \"Scala\",\r\n margin: \"0 0 110px\",\r\n },\r\n content: {\r\n fontFamily: \"Scala\",\r\n fontSize: 14,\r\n fontWeight: \"normal\",\r\n fontStretch: \"normal\",\r\n fontStyle: \"normal\",\r\n lineHeight: 1.43,\r\n letterSpacing: \"normal\",\r\n color: theme.colours.black,\r\n margin: \"15px 0 25px 0\",\r\n [theme.breakpoints.down(\"xs\")]: {\r\n fontSize: 18,\r\n lineHeight: 1.56,\r\n },\r\n },\r\n}));\r\nconst PageNotFound = () => {\r\n const classes = usePageNotFoundStyles();\r\n\r\n return (\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n Sorry, it seems you were trying to access a page that doesn’t exist.\r\n \r\n \r\n Either check the spelling of the URL you were trying to access or go\r\n back to the homepage.\r\n \r\n \r\n go to homepage\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default PageNotFound;\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport PageWidth from \"@primitives/PageWidth.primitive\";\r\n\r\nconst useLoadingPageStyles = makeStyles((theme) => ({\r\n container: {\r\n fontFamily: \"Scala\",\r\n margin: \"0 0 110px\",\r\n },\r\n pageHeight: {\r\n minHeight: \"60vh\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\"\r\n },\r\n content: {\r\n fontFamily: \"Scala\",\r\n fontSize: 14,\r\n fontWeight: \"normal\",\r\n fontStretch: \"normal\",\r\n fontStyle: \"normal\",\r\n lineHeight: 1.43,\r\n letterSpacing: \"normal\",\r\n color: theme.colours.black,\r\n margin: \"15px 0 25px 0\",\r\n textAlign: \"center\",\r\n [theme.breakpoints.down(\"xs\")]: {\r\n fontSize: 18,\r\n lineHeight: 1.56,\r\n },\r\n },\r\n}));\r\n\r\nconst LoadingPage = () => {\r\n const classes = useLoadingPageStyles();\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n \r\n Loading...\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default LoadingPage;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Redirect } from \"react-router-dom\";\r\nimport IpApi from \"services/IpApi.service\";\r\n\r\nconst BlockAccess = () => {\r\n const [countryName, setCountryName] = useState();\r\n const blockedCountries = [\"Brazil\", \"China\", \"India\", \"Russia\", \"South Africa\"];\r\n\r\n useEffect(() => {\r\n if(!countryName) {\r\n async function getUserCountry() {\r\n const data = await IpApi.fetchUserLocation();\r\n setCountryName(data.country);\r\n return data;\r\n }\r\n\r\n getUserCountry();\r\n }\r\n },[countryName]);\r\n\r\n return (\r\n <>\r\n {countryName && blockedCountries.includes(countryName) && }\r\n \r\n )\r\n};\r\n\r\nexport default BlockAccess;\r\n","import React from \"react\";\r\nimport { Switch, Route, useHistory } from \"react-router-dom\";\r\nimport voucherCodeRoutes from \"./voucherCode.routes\";\r\nimport PageNotFound from \"components/organisms/PageNotFound.organism\";\r\nimport LoadingPage from \"components/organisms/LoadingPage.organism\";\r\nimport BlockAccess from \"components/organisms/BlockAccess.organism\";\r\nimport TagManager from 'react-gtm-module';\r\nimport debounce from \"utils/debounce\";\r\n\r\nconst paths = { \r\n ...voucherCodeRoutes,\r\n};\r\n\r\nexport default function Routes() {\r\n const history = useHistory();\r\n\r\n React.useEffect(() => {\r\n const sendPageViewEvent = () => {\r\n // Ensure localStorage is available\r\n if (typeof localStorage !== \"undefined\" && localStorage.getItem(\"tsol_voucher_gtm_prevent_event\") !== 'true') {\r\n // Check if TagManager is initialized\r\n if (typeof TagManager !== \"undefined\") {\r\n TagManager.dataLayer({\r\n dataLayer: {\r\n event: 'newPageLoaded',\r\n page: history.location.pathname,\r\n }\r\n });\r\n } else {\r\n console.error(\"TagManager is not initialized\");\r\n }\r\n // Reset the flag after sending the pageview event or if it's not set\r\n localStorage.setItem(\"tsol_voucher_gtm_prevent_event\", 'false');\r\n }\r\n };\r\n\r\n // Wrap sendPageViewEvent with debounce\r\n const debouncedSendPageViewEvent = debounce(sendPageViewEvent, 1000);\r\n\r\n // Call once on component mount to ensure a pageview is sent\r\n debouncedSendPageViewEvent();\r\n\r\n // Listen for history changes with the debounced function\r\n const unlisten = history.listen(() => {\r\n debouncedSendPageViewEvent();\r\n });\r\n\r\n // Cleanup listener on component unmount\r\n return () => unlisten();\r\n }, [history]);\r\n\r\n return (\r\n }>\r\n \r\n \r\n {paths &&\r\n Object.values(paths).map((route) => (\r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n } />\r\n \r\n \r\n );\r\n}\r\n","import { createMuiTheme } from '@material-ui/core/styles'\r\n\r\nexport default createMuiTheme({\r\n colours: {\r\n white: \"#FFFFFF\",\r\n black: \"#000000\",\r\n vividYellow: \"#ffe802\",\r\n nearlyBlack: \"#1c1c1c\",\r\n veryDarkGray: \"#323232\",\r\n darkShadeOfGray: \"#373737\",\r\n veryLightGray: \"#dddddd\",\r\n lightGray: \"#c8c8c8\",\r\n red: \"#ff0000\",\r\n tundora: \"#4c4c4c\",\r\n header: {\r\n background: \"#fcd122\",\r\n text: \"#FFFFFF\",\r\n },\r\n footer: {\r\n background: \"#1c1c1c\",\r\n text: \"#FFFFFF\",\r\n },\r\n buttons: {\r\n progression: {\r\n primary: {\r\n background: \"#ffe802\",\r\n color: \"#000000\",\r\n },\r\n secondary: {\r\n background: \"#323232\",\r\n color: \"#FFFFFF\",\r\n },\r\n },\r\n },\r\n },\r\n});\r\n","import React from \"react\";\r\nimport { BrowserRouter as Router } from \"react-router-dom\";\r\nimport { Provider } from \"react-redux\";\r\nimport MasterThemeProvider from \"@providers/MasterTheme.provider\";\r\nimport NetworkProvider from \"@providers/Network.provider\";\r\nimport Routes from \"routes/ControllerComponent.routes\";\r\nimport defaultTheme from \"@themes/defaultTheme\";\r\nimport rootStore from \"@redux/root.store\";\r\nimport { PersistGate } from \"redux-persist/integration/react\";\r\nimport { persistStore } from \"redux-persist\";\r\nimport { ToastContainer } from \"react-toastify\";\r\nimport \"react-toastify/dist/ReactToastify.min.css\";\r\nimport { useToken } from \"@hooks/useToken.hook\";\r\nimport { GoogleOAuthProvider } from \"@react-oauth/google\";\r\nimport \"./App.css\";\r\n\r\nlet persistor = persistStore(rootStore);\r\nfunction App() {\r\n /* Handle the theme object [theme, setTheme] */\r\n const [theme] = React.useState(defaultTheme);\r\n\r\n const GOOGLE_CLIENT_ID = process.env.REACT_APP_GOOGLE_CLIENT_ID;\r\n\r\n //hook to update access & refresh token based on existing token\r\n useToken();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {/* Handles routing (\"react-router-dom\") */}\r\n \r\n {/* Handle both StyledComponents and Material theme objects */}\r\n \r\n {/* Handle any network interruptions */}\r\n {/* Display the current route */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default App;\r\n","import React, { useEffect } from \"react\";\r\nimport BaseApi from \"services/BaseApi.service\";\r\nimport { toast } from \"react-toastify\";\r\nimport PleaseLogin from \"components/molecules/PleaseLogin.molecule\";\r\nimport { useCookies } from \"react-cookie\";\r\n\r\nexport const useToken = () => {\r\n const [cookies] = useCookies([\"tsol_oauth\"]);\r\n\r\n // call token API.\r\n const getUpdateRefreshToken = async () => {\r\n // get access token from localStorage.\r\n const accessToken = localStorage.getItem(\"accessToken\");\r\n // get refresh token from localStorage.\r\n const refreshToken = localStorage.getItem(\"refreshToken\");\r\n\r\n // if we have both accessToken and refreshToken we make the API call to get new tokens\r\n if (refreshToken && accessToken) {\r\n if (!cookies.tsol_oauth) {\r\n // show links to login/sign up\r\n toast.error();\r\n // since API failed\r\n localStorage.removeItem(\"tsol_voucher_user_isAuthenticated\");\r\n localStorage.removeItem(\"accessToken\");\r\n localStorage.removeItem(\"refreshToken\");\r\n localStorage.removeItem(\"tsol_voucher_user_email\");\r\n return;\r\n }\r\n // construct payload.\r\n const payload = {\r\n clientId: process.env.REACT_APP_AUTH_CLIENT_ID,\r\n clientSecret: process.env.REACT_APP_AUTH_CLIENT_SECRET,\r\n grant_type: \"refresh_token\",\r\n refresh_token: refreshToken,\r\n };\r\n\r\n // actual API call\r\n try {\r\n const response = await BaseApi.getRefreshToken(payload);\r\n // when we get response set new refresh/access token and isAuthenticated to true\r\n localStorage.setItem(\"accessToken\", response.accessToken);\r\n localStorage.setItem(\"refreshToken\", response.refreshToken);\r\n localStorage.setItem(\"tsol_voucher_user_isAuthenticated\", true);\r\n } catch (e) {\r\n // show links to login/sign up\r\n toast.error();\r\n // since API failed\r\n localStorage.removeItem(\"tsol_voucher_user_isAuthenticated\");\r\n localStorage.removeItem(\"accessToken\");\r\n localStorage.removeItem(\"refreshToken\");\r\n localStorage.removeItem(\"tsol_voucher_user_email\");\r\n }\r\n }\r\n };\r\n\r\n // make call every 9 mins as refresh token is valid for 10mins\r\n useEffect(() => {\r\n const intervalId = setInterval(getUpdateRefreshToken, 540000);\r\n\r\n return () => clearInterval(intervalId); // Unmount function, clears interval to prevent memory leaks.\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n};\r\n","const reportWebVitals = onPerfEntry => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport \"./index.css\";\r\nimport \"./fonts.css\";\r\nimport App from \"./App\";\r\nimport reportWebVitals from \"./reportWebVitals\";\r\nimport { CookiesProvider } from \"react-cookie\";\r\nimport * as Sentry from \"@sentry/react\";\r\n\r\nimport TagManager from \"react-gtm-module\";\r\n\r\n// Initialize Sentry\r\nSentry.init({\r\n dsn: process.env.REACT_APP_SENTRY_DSN,\r\n integrations: [\r\n Sentry.browserTracingIntegration(),\r\n Sentry.replayIntegration(),\r\n ],\r\n // Tracing\r\n tracesSampleRate: 0.5,\r\n tracePropagationTargets: [\r\n \"localhost\", \r\n /^https:\\/\\/stg-voucher\\.theschooloflife\\.com/,\r\n /^https:\\/\\/voucher\\.theschooloflife\\.com/,\r\n /^https:\\/\\/qa-schooloflife-voucher\\.mobilefiveapp\\.com/\r\n ],\r\n replaysSessionSampleRate: 0.1,\r\n replaysOnErrorSampleRate: 1.0,\r\n});\r\n\r\nconst tagManagerArgs = {\r\n gtmId: process.env.REACT_APP_GTM_ID,\r\n};\r\n\r\nTagManager.initialize(tagManagerArgs); \r\n\r\nTagManager.dataLayer({\r\n dataLayer: {\r\n 'event': 'windowLoaded',\r\n },\r\n});\r\nconsole.log('TagManager initialized');\r\n\r\nlocalStorage.setItem(\"tsol_voucher_gtm_prevent_event\", 'true');\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById(\"root\")\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n","import ky from \"ky\";\r\n\r\nconst API_ROOT = process.env.REACT_APP_HYD_API;\r\nconst CLIENT_ID = process.env.REACT_APP_AUTH_CLIENT_ID;\r\nconst CLIENT_SECRET = process.env.REACT_APP_AUTH_CLIENT_SECRET;\r\n\r\nconst api = ky.create({\r\n prefixUrl: API_ROOT,\r\n timeout: 60000,\r\n});\r\n\r\nconst getAccessToken = () => localStorage.getItem(\"accessToken\");\r\n\r\nconst authorizedHeader = () => ({\r\n Authorization: `Bearer ${getAccessToken()}`,\r\n});\r\n\r\n// Update marketing preferences on register\r\nconst updateMarketingPreferences = (payload) => {\r\n if (payload.action === \"registration\") {\r\n api\r\n .patch(\"users\", {\r\n headers: {\r\n Authorization: `Bearer ${payload.accessToken}`,\r\n },\r\n json: { marketing: true },\r\n })\r\n .json();\r\n }\r\n};\r\n\r\n// API Services:\r\nexport default class BaseApi {\r\n static async getPaymentMethods(channel) {\r\n const response = await api\r\n .get(`vouchers/payments/methods?channel=${channel}`)\r\n .json();\r\n \r\n // Retrieve the user's email address from local storage.\r\n const userEmail = localStorage.getItem(\"tsol_voucher_user_email\");\r\n\r\n // Determine the domain of the user's email.\r\n const domain = userEmail.split('@')[1]; // Split the email string to get the domain part.\r\n\r\n // Filter the payment methods based on the user's email domain.\r\n const paymentMethods = response.paymentMethods.filter(({ type }) => {\r\n if (domain === \"hyd.agency\" || domain === \"theschooloflife.com\") {\r\n // If the domain is 'hyd.agency', include these payment methods.\r\n return [\"applepay\", \"googlepay\", \"paypal\", \"scheme\"].includes(type);\r\n } else {\r\n // For all other domains, include these payment methods.\r\n return [\"applepay\", \"scheme\"].includes(type);\r\n }\r\n });\r\n\r\n // Return the filtered payment methods.\r\n return { paymentMethods };\r\n }\r\n\r\n static async testVoucherCode({ voucherId }) {\r\n if (!voucherId) throw new Error(\"No voucher code provided\");\r\n return api.get(`vouchers/${voucherId}`).json();\r\n }\r\n\r\n static async getRedeem(code) {\r\n await api\r\n .post(\"vouchers/redeem\", {\r\n headers: authorizedHeader(),\r\n json: { code },\r\n })\r\n .json();\r\n return true;\r\n }\r\n\r\n static async validateMerchant(validationUrl) {\r\n return api\r\n .post(\"vouchers/payments/apple-pay-session\", {\r\n headers: authorizedHeader(),\r\n json: { validationUrl },\r\n })\r\n .json();\r\n }\r\n\r\n static async loginUser(payload) {\r\n Object.assign(payload, {\r\n clientId: CLIENT_ID,\r\n clientSecret: CLIENT_SECRET,\r\n grantType: \"password\",\r\n username: payload.email,\r\n });\r\n const response = await api.post(\"oauth2/token\", { json: payload }).json();\r\n response.email = payload.email;\r\n return response;\r\n }\r\n\r\n static async loginUserGoogle(payload) {\r\n Object.assign(payload, {\r\n clientId: CLIENT_ID,\r\n grantType: \"google\",\r\n token: payload.access_token,\r\n });\r\n const response = api.post(\"users/connect/google\", { \r\n json: payload, \r\n // headers: {\r\n // 'X-APP-PLATFORM': 'VP'\r\n // }\r\n }).json();\r\n\r\n response.then(updateMarketingPreferences);\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Log user in\r\n *\r\n * This comment pertains to the handling of missing first and last names in user accounts.\r\n *\r\n * Context:\r\n * - When the Apple account has been previously used for TSoL registration.\r\n *\r\n * Cause:\r\n * - Apple Sign-In does not return first and last name fields on subsequent sign-ins.\r\n * - These details are only provided during the initial sign-in with Apple.\r\n *\r\n * Relevant Documentation:\r\n * - Apple Sign-In REST API: https://developer.apple.com/documentation/signinwithapplerestapi/authenticating_users_with_sign_in_with_apple\r\n * - Apple Sign-In JS: https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js\r\n * - Developer Forum Thread: https://developer.apple.com/forums/thread/121496\r\n *\r\n * @todo Maybe change the signup flow in BE and/or not allow account creation on BE if first and last name are missing?\r\n */\r\n\r\n static async loginUserApple(payload) {\r\n Object.assign(payload, {\r\n clientId: CLIENT_ID,\r\n grantType: \"apple\",\r\n token: payload.authorization.id_token,\r\n firstName: payload?.user?.name?.firstName,\r\n lastName: payload?.user?.name?.lastName,\r\n email: payload?.user?.email,\r\n });\r\n const response = await api.post(\"users/connect/apple\", { \r\n json: payload, \r\n // headers: {\r\n // 'X-APP-PLATFORM': 'VP'\r\n // }\r\n }).json();\r\n\r\n await updateMarketingPreferences(response);\r\n\r\n return response;\r\n }\r\n static async getRefreshToken(payload) {\r\n return api.post(\"oauth2/token\", { json: payload }).json();\r\n }\r\n\r\n static async redeemVoucher(payload) {\r\n return api\r\n .post(\"vouchers/redeem\", {\r\n json: payload,\r\n headers: authorizedHeader(),\r\n })\r\n .json();\r\n }\r\n\r\n static async registerUser(payload) {\r\n payload.clientId = CLIENT_ID;\r\n const response = await api.post(\"users\", { \r\n json: payload, \r\n // headers: {\r\n // 'X-APP-PLATFORM': 'VP'\r\n // }\r\n }).json();\r\n response.email = payload.email;\r\n return response;\r\n }\r\n\r\n static async getUserDetails() {\r\n return api.get(\"users\", { headers: authorizedHeader() }).json();\r\n }\r\n\r\n static async getUCurrencies() {\r\n return api\r\n .get(\"vouchers/payments/currencies\", { headers: authorizedHeader() })\r\n .json();\r\n }\r\n\r\n static async resetPassword({ email }) {\r\n await api.post(\"users/password/reset\", { json: { email } }).json();\r\n return true;\r\n }\r\n\r\n static async check3DAuthDetails({ reference, redirectResult }) {\r\n return api\r\n .get(\r\n `vouchers/payments/details/${reference}?redirectResult=${redirectResult}`\r\n )\r\n .json();\r\n } \r\n static async postDetails(data,reference ) {\r\n const response = api.post(`vouchers/payments/details/${reference}`, {\r\n headers: authorizedHeader(),\r\n json: data,\r\n }).json();\r\n \r\n return response;\r\n \r\n }\r\n\r\n static async trackPageView(pageViewData) {\r\n try {\r\n return await api.post('vp/events/page-view', {\r\n headers: authorizedHeader(),\r\n json: pageViewData\r\n }).json();\r\n } catch (error) {\r\n console.error('Failed to track page view:', error);\r\n throw error;\r\n }\r\n }\r\n}\r\n","import { createAsyncThunk, createAction } from \"@reduxjs/toolkit\";\r\nimport BaseApi from \"services/BaseApi.service\";\r\nimport { VoucherPayload } from \"types/voucher.types\";\r\n\r\nexport interface RegisterUserPayload {\r\n email: string;\r\n password: string;\r\n firstName: string;\r\n lastName: string;\r\n}\r\n\r\nexport interface LoginUserPayload {\r\n email: string;\r\n password: string;\r\n}\r\n\r\nexport interface GoogleLoginPayload {\r\n access_token: string;\r\n}\r\n\r\nexport interface AppleLoginPayload {\r\n authorization: {\r\n code: string;\r\n id_token: string;\r\n };\r\n}\r\n\r\nexport interface CookieLoginPayload {\r\n refreshToken: string;\r\n}\r\n\r\ninterface ApiError {\r\n response: {\r\n json(): Promise<{\r\n message: string;\r\n details?: Array<{\r\n message: string;\r\n }>;\r\n }>;\r\n };\r\n}\r\n\r\nconst authenticationActions = {\r\n loginUser: createAsyncThunk(\r\n \"LOGIN_USER\",\r\n async (formObject: LoginUserPayload) => {\r\n return await BaseApi.loginUser(formObject);\r\n }\r\n ),\r\n\r\n loginUserFromCookie: createAsyncThunk(\r\n \"LOGIN_USER_FROM_COOKIE\",\r\n async (payload: CookieLoginPayload) => {\r\n return await BaseApi.getRefreshToken(payload);\r\n }\r\n ),\r\n\r\n loginUserFromGoogle: createAsyncThunk(\r\n \"LOGIN_USER_FROM_GOOGLE\",\r\n async (payload: GoogleLoginPayload) => {\r\n return await BaseApi.loginUserGoogle(payload);\r\n }\r\n ),\r\n\r\n loginUserFromApple: createAsyncThunk(\r\n \"LOGIN_USER_FROM_APPLE\",\r\n async (payload: AppleLoginPayload) => {\r\n return await BaseApi.loginUserApple(payload);\r\n }\r\n ),\r\n\r\n registerUser: createAsyncThunk(\r\n \"REGISTER_USER\",\r\n async (formObject: RegisterUserPayload, { rejectWithValue }) => {\r\n try {\r\n return await BaseApi.registerUser(formObject);\r\n } catch (err) {\r\n const error = err as ApiError;\r\n const data = await error.response.json();\r\n const includesDetailMessage = data.details?.[0]?.message;\r\n let errorResponse = data.message;\r\n\r\n if (includesDetailMessage && data.details) {\r\n const errorMsg = data.details.reduce((acc: string, item: { message: string }) => {\r\n acc += `${item.message}. `;\r\n return acc;\r\n }, \"\");\r\n\r\n errorResponse = errorMsg;\r\n }\r\n return rejectWithValue(errorResponse);\r\n }\r\n }\r\n ),\r\n\r\n resetPassword: createAsyncThunk(\r\n \"RESET_PASSWORD\",\r\n async (formObject: { email: string }) => {\r\n return await BaseApi.resetPassword(formObject);\r\n }\r\n ),\r\n\r\n getUserDetails: createAsyncThunk(\r\n \"GET_USER_DETAILS\",\r\n async () => {\r\n return await BaseApi.getUserDetails();\r\n }\r\n ),\r\n\r\n redeemVoucherCode: createAsyncThunk(\r\n \"REDEEM_VOUCHER_CODE\",\r\n async (payload: VoucherPayload) => {\r\n return await BaseApi.redeemVoucher(payload);\r\n }\r\n ),\r\n\r\n logout: createAction(\"LOGOUT_USER\", () => {\r\n // Clear all authentication data\r\n localStorage.removeItem(\"tsol_voucher_user_isAuthenticated\");\r\n localStorage.removeItem(\"accessToken\");\r\n localStorage.removeItem(\"refreshToken\");\r\n localStorage.removeItem(\"tsol_voucher_user_email\");\r\n \r\n return { payload: null };\r\n }),\r\n};\r\n\r\nexport default authenticationActions; ","import { createAsyncThunk, createAction } from \"@reduxjs/toolkit\";\r\nimport BaseApi from \"services/BaseApi.service\";\r\nimport IpApi from \"services/IpApi.service\";\r\n\r\nlet currencyActions = {};\r\n\r\ncurrencyActions.fetchCurrencies = createAsyncThunk(\r\n \"FETCH_CURRENCIES\",\r\n async () => {\r\n return await BaseApi.getUCurrencies();\r\n }\r\n);\r\n\r\ncurrencyActions.getUserLocalCurrency = createAsyncThunk(\r\n \"GET_USER_LOCAL_CURRENCY\",\r\n async () => {\r\n return await IpApi.fetchUserLocation();\r\n }\r\n);\r\n\r\n// Define the setCurrency action\r\ncurrencyActions.setCurrency = createAction(\"SET_CURRENCY\");\r\n\r\nexport const { fetchCurrencies, getUserLocalCurrency, setCurrency } = currencyActions;\r\n\r\nexport default currencyActions;\r\n","const BASE = \"/assets/\";\r\n\r\nexport const images = {\r\n logo: \"logo-white.svg\",\r\n app: {\r\n ios: \"app/ios.svg\",\r\n android: \"app/android.svg\",\r\n },\r\n icons: {\r\n rightArrow: \"icons/arrow-right.svg\",\r\n tick: \"icons/tick.svg\",\r\n hiddeneye: \"icons/hiddeneye.svg\",\r\n },\r\n headerBanner: {\r\n background: \"heading/background-coursetile-lightblue.svg\",\r\n phone1: \"heading/phone1.png\",\r\n phone2: \"heading/phone2.png\",\r\n phone3: \"heading/phone3.png\",\r\n backupDesktop: \"heading/hero-picture-desktop-backup.jpg\",\r\n backupMobile: \"heading/hero-picture-mobile-backup.jpg\",\r\n },\r\n};\r\n\r\nexport default class ImagePath {\r\n static returnImage(path) {\r\n return BASE + path;\r\n }\r\n}\r\n","import { createAsyncThunk } from \"@reduxjs/toolkit\";\r\nimport { createActions } from \"redux-actions\";\r\nimport BaseApi from \"services/BaseApi.service\";\r\n\r\nlet voucherFlowActions = createActions({\r\n SET_VOUCHER_CODE: (code) => code,\r\n});\r\n\r\nvoucherFlowActions.testVoucherCode = createAsyncThunk(\r\n \"TEST_VOUCHER_CODE\",\r\n async (voucherId) => {\r\n return await BaseApi.testVoucherCode(voucherId);\r\n }\r\n);\r\n\r\nvoucherFlowActions.testVoucherCodePreview = createAsyncThunk(\r\n \"TEST_VOUCHER_CODE_PREVIEW\",\r\n async (voucherId) => {\r\n return await BaseApi.testVoucherCode(voucherId);\r\n }\r\n);\r\n\r\nexport const { setVoucherCode, testVoucherCode, testVoucherCodePreview } = voucherFlowActions;\r\n\r\n\r\nexport default voucherFlowActions;\r\n","import { useState, useEffect, useRef } from \"react\";\r\nimport PrismicService from \"services/PrismicService\";\r\nimport { toast } from \"react-toastify\";\r\n\r\nexport default function usePrismic() {\r\n const [pageData, setPageData] = useState();\r\n const [working, setWorking] = useState(true);\r\n const isMounted = useRef(true);\r\n\r\n useEffect(() => {\r\n return () => {\r\n isMounted.current = false;\r\n };\r\n }, []);\r\n\r\n const fetchPrismicData = async (pageSlug) => {\r\n setWorking(true);\r\n try {\r\n const response = await PrismicService.getPageBySlug(pageSlug);\r\n if (isMounted.current) {\r\n setWorking(false);\r\n setPageData(response);\r\n }\r\n } catch (e) {\r\n if (isMounted.current) {\r\n setPageData();\r\n setWorking(false);\r\n toast.error(`There was an error getting data for ${pageSlug}`);\r\n }\r\n }\r\n };\r\n\r\n return { fetchPrismicData, pageData, working };\r\n}\r\n"],"names":["usePageWidthStyle","makeStyles","theme","root","margin","breakpoints","down","width","padding","twoColumn","display","flexDirection","justifyContent","alignItems","maxWidth","column","flexBasis","singleColumn","minWidth","PageWidth","_ref","children","isTwoColumn","className","classes","childrenArray","React","Children","toArray","useTwoColumns","length","_jsx","clsx","_jsxs","_Fragment","Button","withTheme","styled","MaterialButton","useHeaderStyles","appHeader","color","colours","header","text","logoWrapper","textAlign","HeaderLogo","link","LinkElement","linkProps","url","href","target","Link","to","logoHolder","ReactSVG","logo","src","wrapper","Header","pageContent","setPageContent","useState","fetchPrismicData","pageData","usePrismic","useEffect","data","Grid","container","component","item","xs","header_logo_link","useFooterLogoStyles","marginBottom","marginTop","height","maxHeight","FooterLogo","useFooterStyles","footerWrapper","background","nearlyBlack","white","footerCenter","footerMenu","listStyle","paddingLeft","flexFlow","lineHeight","footerSticky","bottom","zIndex","position","separator","info","fontFamily","fontSize","fontWeight","fontStretch","fontStyle","letterSpacing","textTransform","socialIconsWrapper","socialLinks","marginRight","socialIcons","Footer","props","_pageContent$footer_l","_pageContent$social_i","sticky","md","footerLogo","footer_logo_link","RichText","render","footer_links_title","footer_links","map","index","link_address","rel","social_icons","_item$social_link","social_link","social_icon","RouteFactory","constructor","path","title","page","this","Component","Page","useCookie","cookies","useCookies","dispatch","useDispatch","tsol_oauth","localStorage","removeItem","async","_cookies$tsol_oauth","_cookies$tsol_oauth2","_cookies$tsol_oauth3","accessToken","refreshToken","expiryDate","Date","now","getItem","payload","clientId","process","clientSecret","grant_type","refresh_token","authenticationActions","loginUserFromCookie","then","unwrapResult","originalPromiseResult","setItem","getUserDetails","email","catch","rejectedValueOrSerializedError","console","log","getTokenFromCookie","useVoucherCodePageStyles","backgroundColor","VoucherCodePage","Heading","LandingPage","lazy","CreateAccount","LoginPage","RecoverPassword","EnterVoucherCode","OrderSummary","ConfirmationPage","RedirectingPage","TaxRestrictionPage","paths","landingPage","createAccount","loginToAccount","recoverPassword","enterVoucherCode","orderSummary","confirmation","redirecting","taxRestriction","api","ky","create","prefixUrl","PrismicService","getPageBySlug","pageSlug","get","json","IpApi","fetchUserLocation","usePleaseLoginStyles","fonStyle","black","PleaseLogin","Typography","UnderlineButton","useUnderlineButtonStyles","textDecoration","veryDarkGray","vividYellow","INITIAL_STATE","working","isAuthenticated","userDetails","reducer","handleActions","loginUser","pending","state","action","produce","draft","fulfilled","rejected","registerUser","logout","voucherFlowActions","setVoucherCode","voucherId","testVoucherCode","currency","discountAmount","discountLimit","discountType","initialPrice","valid","finalPrice","lifetime","trialDays","voucherCodeDetails","voucherCodeErrors","testVoucherCodePreview","meta","arg","voucherPreviewDetails","prismicActions","fetchPageBySlug","createAsyncThunk","currencyActions","fetchCurrencies","currencies","currencyErrors","getUserLocalCurrency","countryCode","localCurrency","getParamByISO","setCurrency","reducers","combineReducers","authentication","authenticationReducer","voucherCode","voucherCodeReducer","prismic","prismicReducer","currencyReducer","summary","summarySlice","persistConfig","key","storage","persistedReducer","persistReducer","configureStore","middleware","thunk","useProgressionButtonStyle","buttons","progression","secondary","boxShadow","primary","full","wrap","whiteSpace","alignLeft","arrow","arrowPrimary","ProgressionButton","showIcon","variant","fullWidth","SVG","ImagePath","returnImage","images","icons","rightArrow","useHeaderBannerStyles","backgroundRepeat","backgroundPosition","backgroundSize","backgroundImage","desktopImageUrl","mobileImageUrl","HeaderBanner","headerBanner","backupDesktop","backupMobile","useHighlightedHeaderStyles","HighlightedHeader","i","_ref2","createSlice","name","initialState","street","city","postalCode","country","saveStreet","saveCity","savePostalCode","saveCountry","actions","debounce","func","delay","timeout","_len","arguments","args","Array","_key","clearTimeout","setTimeout","later","MasterTheme","MaterialProvider","StyledProvider","CssBaseline","Banner","div","palette","grey","NetworkGate","_ref3","isOnline","setIsOnline","window","addEventListener","usePageNotFoundStyles","content","PageNotFound","voucherCodeLinks","useLoadingPageStyles","pageHeight","minHeight","LoadingPage","BlockAccess","countryName","setCountryName","getUserCountry","includes","Redirect","voucherCodeRoutes","Routes","history","useHistory","debouncedSendPageViewEvent","sendPageViewEvent","TagManager","dataLayer","event","location","pathname","error","unlisten","listen","Suspense","fallback","Switch","Object","values","route","Route","exact","createMuiTheme","darkShadeOfGray","veryLightGray","lightGray","red","tundora","footer","persistor","persistStore","rootStore","App","defaultTheme","useToken","getUpdateRefreshToken","toast","response","BaseApi","getRefreshToken","e","intervalId","setInterval","clearInterval","Provider","store","GoogleOAuthProvider","PersistGate","loading","Router","MasterThemeProvider","NetworkProvider","ToastContainer","autoClose","hideProgressBar","newestOnTop","closeOnClick","rtl","pauseOnFocusLoss","draggable","pauseOnHover","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","Sentry","dsn","integrations","tracesSampleRate","tracePropagationTargets","replaysSessionSampleRate","replaysOnErrorSampleRate","initialize","gtmId","ReactDOM","StrictMode","CookiesProvider","defaultSetOptions","document","getElementById","CLIENT_ID","authorizedHeader","Authorization","updateMarketingPreferences","patch","headers","marketing","getPaymentMethods","channel","domain","split","paymentMethods","filter","type","Error","getRedeem","code","post","validateMerchant","validationUrl","assign","grantType","username","loginUserGoogle","token","access_token","loginUserApple","_payload$user","_payload$user$name","_payload$user2","_payload$user2$name","_payload$user3","authorization","id_token","firstName","user","lastName","redeemVoucher","getUCurrencies","resetPassword","check3DAuthDetails","_ref4","reference","redirectResult","postDetails","trackPageView","pageViewData","formObject","loginUserFromGoogle","loginUserFromApple","rejectWithValue","err","_data$details","_data$details$","includesDetailMessage","details","message","errorResponse","reduce","acc","redeemVoucherCode","createAction","app","ios","android","tick","hiddeneye","phone1","phone2","phone3","createActions","SET_VOUCHER_CODE","setPageData","setWorking","isMounted","useRef","current"],"mappings":"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","debug_id":"de33fccf-ee82-5ca9-8041-2d8d0a3a4929"}