{"version":3,"sources":["store/hostData/index.ts","components/Header.tsx","utils/platform.ts","components/Platform.tsx","components/GDPRText.tsx","store/form/index.ts","store/form/plugin.ts","components/Footer.tsx","components/Intent.tsx","components/TextfieldWithError.tsx","components/TextfieldWithLabel.tsx","store/captcha/index.ts","components/Recaptcha.tsx","utils/openingHours.ts","components/TestdriveRequestForm.tsx","components/SwapCarForm.tsx","data/validation.ts","components/Form.tsx","components/Tracking.tsx","components/CannedMessages.tsx","components/CannedForm.tsx","components/ListingPreview.tsx","components/SubmittingSpinner.tsx","components/ErrorOverlay.tsx","App.tsx","services/api.ts","data/mapper.ts","serviceWorker.ts","store/root-reducer.ts","store/index.ts","store/utils.ts","index.tsx"],"names":["setHostData","createStandardAction","reducer","createReducer","source","defaultUserInfo","firstName","lastName","email","phoneNumber","seller","name","encryptedSellerEmail","sellerId","carData","listingUrl","mileage","price","variant","vehicleMake","vehicleModel","vehicleYear","image","syiId","globalId","adSourceTenant","openingHours","mondayOpen","mondayClose","tuesdayOpen","tuesdayClose","wednesdayOpen","wednesdayClose","thursdayOpen","thursdayClose","fridayOpen","fridayClose","saturdayOpen","saturdayClose","sundayOpen","sundayClose","mondayAppointmentOnly","tuesdayAppointmentOnly","wednesdayAppointmentOnly","thursdayAppointmentOnly","fridayAppointmentOnly","saturdayAppointmentOnly","sundayAppointmentOnly","handleAction","_","action","payload","Header","sellerName","onCancel","isShownOnScaledVIP","window","parent","location","className","onClick","userAgent","navigator","getOS","test","isAndroid","isQA","document","host","toUpperCase","indexOf","PlatformContext","React","createContext","undefined","PlatformProvider","children","platform","isApp","platformTools","isIOS","isDBA","isBilbasen","Provider","value","GDPRText","policyUrl","context","useContext","Error","usePlatform","href","target","rel","formReducer","plugin","contact","state","type","actionTypes","CHANGE","meta","form","field","values","intents","testdriveData","time","Footer","connect","disableSend","captcha","completed","submitting","sendButtonText","dispatch","onSubmit","submit","formName","disabled","style","width","IntentToggle","input","label","id","checked","Intent","rest","Field","component","TextfieldWithError","touched","error","TextfieldWithLabel","htmlFor","captchaComplete","token","Recaptcha","siteKey","onLoad","onComplete","invisible","useEffect","captchaOnload","innerWidth","grecaptcha","execute","captchaCallback","script","createElement","src","async","defer","body","appendChild","loadCaptchaScript","getResponse","length","data-sitekey","data-size","data-badge","data-callback","dayName","monthName","defaultOpeningHours","open","close","isOpenOnDate","date","getDay","isOpen","closeMinutes","getHours","getMinutes","parseOpeningHours","parsedOpeningHours","Date","every","x","isNaN","getDateString","getDate","getMonth","SelectWithError","selector","formValueSelector","TestdriveRequestForm","selectedDate","hostData","FormSection","normalize","parseInt","startDate","now","dateSlots","openingHoursParsed","push","offset","setHours","setDate","getDateSlots","map","key","getTime","timeslots","dateOpeningHours","next","hour","Math","max","getTimeSlots","timeslot","SwapCarForm","placeholder","maxLength","val","required","submitValidation","formData","Object","keys","filter","s","SubmissionError","_error","validate","errors","user","validateContactDetails","swapcar","swapcarData","validateSwapcar","testdrive","validateTestdrive","licenseplate","trim","replace","validateEmail","callme","ReduxedForm","reduxForm","enableReinitialize","onChange","props","clearSubmitErrors","onCaptchaComplete","showCaptcha","rows","pattern","minLength","process","Form","initialValues","userRequestedATestDrive","financeoffer","financeDetails","financeOffer","TrackingContext","TrackingProvider","track","cannedMessages","text","CannedMessage","selected","CannedMessages","message","setMessage","change","useTracking","addToMessage","cm","category","createInitialMessage","CannedForm","ListingPreview","car","backgroundImage","SubmittingSpinner","ErrorOverlay","onRetry","console","log","marginBottom","isSubmitting","captchaToken","onDataChange","data","onSubmitted","onTrack","useState","setError","handleSubmit","trackCannedMessages","sleepPromise","Promise","resolve","setTimeout","submitPromise","fetch","headers","Accept","method","JSON","stringify","then","response","ok","status","statusText","emailData","askQuestion","includecar","offer","preselectedFinanceOffer","testDrive","bookATestDriveDate","bookATestDriveTime","sellerData","isInNativeApp","videoDetails","userRequestedVideo","generelVideoOfCar","interior","engineCompartment","damages","other","otherText","mapToSubmitData","all","handleError","_dispatch","submitError","handleTrack","handleSuccess","dataForPlatform","pulseFormData","toString","syiIdSdrn","pulseTrackingEvent","pulseEmailDealerEvent","askquestion","mapToCloseMessage","trackingData","used","join","toLowerCase","onSubmitSuccess","onSubmitFail","Boolean","hostname","match","combineReducers","captchaReducer","hostDataReducer","enhancers","composeEnhancers","compose","applyMiddleware","store","createStore","rootReducer","serviceWorker","ready","registration","unregister","postMessage","renderApp","ReactDOM","render","getElementById","isEmbedded","addEventListener","origin","TestData"],"mappings":"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","file":"static/js/main.4d03ec80.chunk.js","sourcesContent":["import { createStandardAction, createReducer } from 'typesafe-actions';\r\n\r\nexport const setHostData = createStandardAction('SET_HOST_DATA')<\r\n Reply.HostData\r\n>();\r\n\r\nconst initialState: Reply.HostData = {\r\n source: 'direct',\r\n defaultUserInfo: {\r\n firstName: '',\r\n lastName: '',\r\n email: '',\r\n phoneNumber: ''\r\n },\r\n seller: {\r\n name: '',\r\n encryptedSellerEmail: '',\r\n sellerId: ''\r\n },\r\n carData: {\r\n listingUrl: '',\r\n mileage: 0,\r\n price: 0,\r\n source: '',\r\n variant: '',\r\n vehicleMake: '',\r\n vehicleModel: '',\r\n vehicleYear: '',\r\n image: '',\r\n syiId: '',\r\n globalId: '',\r\n adSourceTenant: '',\r\n openingHours: {\r\n mondayOpen: \"0001-01-01T00:00:00\",\r\n mondayClose: \"0001-01-01T00:00:00\",\r\n tuesdayOpen: \"0001-01-01T00:00:00\",\r\n tuesdayClose: \"0001-01-01T00:00:00\",\r\n wednesdayOpen: \"0001-01-01T00:00:00\",\r\n wednesdayClose: \"0001-01-01T00:00:00\",\r\n thursdayOpen: \"0001-01-01T00:00:00\",\r\n thursdayClose: \"0001-01-01T00:00:00\",\r\n fridayOpen: \"0001-01-01T00:00:000\",\r\n fridayClose: \"0001-01-01T00:00:00\",\r\n saturdayOpen: \"0001-01-01T00:00:00\",\r\n saturdayClose: \"0001-01-01T00:00:00\",\r\n sundayOpen: \"0001-01-01T00:00:00\",\r\n sundayClose: \"0001-01-01T00:00:00\",\r\n mondayAppointmentOnly: false,\r\n tuesdayAppointmentOnly: false,\r\n wednesdayAppointmentOnly: false,\r\n thursdayAppointmentOnly: false, \r\n fridayAppointmentOnly: false,\r\n saturdayAppointmentOnly: false,\r\n sundayAppointmentOnly: false\r\n }\r\n }\r\n};\r\n\r\nexport const reducer = createReducer(initialState).handleAction(\r\n setHostData,\r\n (_, action) => action.payload\r\n);\r\n","import React from 'react';\r\n\r\ninterface IProps {\r\n sellerName?: string;\r\n onCancel: () => void;\r\n}\r\n\r\nexport const Header: React.FC = ({ sellerName, onCancel }) => {\r\n const isShownOnScaledVIP =\r\n window.parent?.location !== window.parent?.parent?.location; // the new scaled BB VIP wraps/embeds the whole Lead Qual in an extra iframe, amounting to 2 iframes to display Lead Qual...\r\n return (\r\n
\r\n

\r\n {sellerName ? `Skriv til ${sellerName}` : 'Skriv besked'}\r\n {!isShownOnScaledVIP && (\r\n
\r\n ×\r\n
\r\n )}\r\n

\r\n
\r\n );\r\n};\r\n","const userAgent = window.navigator.userAgent;\r\n\r\ntype OS = 'ios' | 'android' | 'other';\r\n\r\nexport const getOS = (): OS => {\r\n if (/iPhone|iPad/i.test(userAgent)) {\r\n return 'ios';\r\n }\r\n\r\n if (/Android/i.test(userAgent)) {\r\n return 'android';\r\n }\r\n\r\n return 'other';\r\n};\r\n\r\nexport const isAndroid = () => getOS() === 'android';\r\n\r\nexport const isIOS = () => getOS() === 'ios';\r\n\r\nexport const isQA = () =>\r\n document.location.host.toUpperCase().indexOf('QA') >= 0;\r\n","import React from 'react';\r\nimport { isAndroid, isIOS, isQA } from '../utils/platform';\r\n\r\ninterface IPlatform {\r\n isAndroid: boolean;\r\n isIOS: boolean;\r\n isQA: boolean;\r\n isDBA: boolean;\r\n isBilbasen: boolean;\r\n isApp: boolean;\r\n platform: Platform;\r\n}\r\n\r\ninterface IProps {\r\n platform: string;\r\n isApp: boolean;\r\n}\r\n\r\nconst PlatformContext = React.createContext(undefined);\r\n\r\nexport const PlatformProvider: React.FC = ({\r\n children,\r\n platform,\r\n isApp\r\n}) => {\r\n const platformTools = {\r\n platform: platform as Platform,\r\n isAndroid: isAndroid(),\r\n isIOS: isIOS(),\r\n isQA: isQA(),\r\n isDBA: platform === 'dba',\r\n isBilbasen: platform === 'bilbasen',\r\n isApp\r\n };\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport const usePlatform = () => {\r\n const context = React.useContext(PlatformContext);\r\n if (context === undefined) {\r\n throw new Error('usePlatform must be used within a PlatformProvider');\r\n }\r\n return context;\r\n};\r\n","import React from 'react';\r\nimport { usePlatform } from './Platform';\r\n\r\nexport const GDPRText: React.FC = () => {\r\n const { isDBA } = usePlatform();\r\n\r\n const policyUrl = isDBA\r\n ? 'https://info.dba.dk/vilkaar/v5/persondatapolitik'\r\n : 'https://www.bilbasen.dk/persondatapolitik';\r\n\r\n return (\r\n
\r\n Når du trykker på \"Send\", accepterer du, at vi overfører dine\r\n personoplysninger til sælger af bilen. Læs om behandlingen af dine\r\n personoplysninger i vores{' '}\r\n \r\n persondatapolitik\r\n \r\n .\r\n
\r\n );\r\n};\r\n","import { reducer as formReducer } from 'redux-form';\r\nimport { contactPlugin } from './plugin';\r\n\r\nexport const name = 'contact';\r\n\r\nexport const reducer = formReducer.plugin({\r\n contact: contactPlugin\r\n});\r\n\r\nexport interface ContactFormState {\r\n user?: Reply.UserData;\r\n intents?: any;\r\n}\r\n","import { actionTypes } from 'redux-form';\r\nimport { Reducer } from 'redux';\r\nimport { name } from './index';\r\n\r\n/**\r\n * Plugin to reset the testdrive time selection dropdown, when the date is changed (and new time options are presented)\r\n */\r\nexport const contactPlugin: Reducer = (state, action) => {\r\n switch (action.type) {\r\n case actionTypes.CHANGE: {\r\n if (\r\n action.meta.form === name &&\r\n action.meta.field === 'intents.testdriveData.date'\r\n ) {\r\n return {\r\n ...state,\r\n values: {\r\n ...state.values,\r\n intents: {\r\n ...state.values.intents,\r\n testdriveData: state.values.intents.testdriveData\r\n ? { ...state.values.intents.testdriveData, time: undefined }\r\n : undefined\r\n }\r\n }\r\n };\r\n }\r\n return state;\r\n }\r\n default:\r\n return state;\r\n }\r\n};\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { Dispatch } from 'redux';\r\nimport { submit } from 'redux-form';\r\nimport { ActionType, RootState } from 'typesafe-actions';\r\nimport { GDPRText } from './GDPRText';\r\nimport { name as formName } from '../store/form';\r\n\r\ninterface IProps {\r\n onSubmit: () => void;\r\n disableSend: boolean;\r\n sendButtonText: string;\r\n}\r\n\r\nexport const FooterView: React.FC = ({\r\n onSubmit,\r\n disableSend,\r\n sendButtonText\r\n}) => {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n {sendButtonText}\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: RootState) => ({\r\n disableSend: !state.captcha.completed || !!state.form.contact.submitting,\r\n sendButtonText: state.captcha.completed ? 'Send' : 'Afventer captcha...'\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch: Dispatch>) => ({\r\n onSubmit: () => dispatch(submit(formName))\r\n});\r\n\r\nexport const Footer = connect(mapStateToProps, mapDispatchToProps)(FooterView);\r\n","import React from 'react';\r\nimport { Field, WrappedFieldProps } from 'redux-form';\r\n\r\ninterface IIntentToggleProps extends WrappedFieldProps {\r\n label: string;\r\n}\r\n\r\nconst IntentToggle: React.FC = ({\r\n input,\r\n children,\r\n label\r\n}) => {\r\n return (\r\n
\r\n \r\n {input.value && children &&
{children}
}\r\n
\r\n );\r\n};\r\n\r\ninterface IProps {\r\n name: string;\r\n label: string;\r\n}\r\n\r\nexport const Intent: React.FC = ({ name, children, ...rest }) => (\r\n \r\n {children}\r\n \r\n);\r\n","import React from 'react';\r\nimport { WrappedFieldProps } from 'redux-form';\r\n\r\nexport const TextfieldWithError: React.FC = ({\r\n input,\r\n meta,\r\n ...rest\r\n}) => (\r\n <>\r\n \r\n {meta.touched && meta.error &&

{meta.error}

}\r\n \r\n);\r\n","import React from 'react';\r\nimport { WrappedFieldProps } from 'redux-form';\r\nimport { TextfieldWithError } from './TextfieldWithError';\r\n\r\ninterface IProps extends WrappedFieldProps {\r\n label: string;\r\n}\r\n\r\nexport const TextfieldWithLabel: React.FC = ({\r\n input,\r\n label,\r\n ...rest\r\n}) => (\r\n <>\r\n \r\n \r\n \r\n);\r\n","import { createStandardAction, createReducer } from 'typesafe-actions';\r\n\r\nexport const captchaComplete = createStandardAction('CAPTCHA_COMPLETE')<\r\n string\r\n>();\r\n\r\nconst initialState = {\r\n completed: false,\r\n token: ''\r\n};\r\n\r\nexport const reducer = createReducer(initialState).handleAction(\r\n captchaComplete,\r\n (_, action) => ({ completed: true, token: action.payload })\r\n);\r\n","import React, { useEffect } from 'react';\r\nimport './Recaptcha.css';\r\n\r\ndeclare global {\r\n interface Window {\r\n grecaptcha?: {\r\n execute: () => void;\r\n getResponse: () => string;\r\n };\r\n captchaOnload: () => void;\r\n captchaCallback: (token: string) => void;\r\n }\r\n}\r\n\r\ninterface IProps {\r\n siteKey: string;\r\n onLoad?: () => void;\r\n onComplete: (token: string) => void;\r\n invisible?: boolean;\r\n}\r\n\r\nconst loadCaptchaScript = () => {\r\n if (window.grecaptcha) {\r\n return;\r\n }\r\n\r\n const script = document.createElement('script');\r\n script.src = 'https://www.google.com/recaptcha/api.js?onload=captchaOnload';\r\n script.async = true;\r\n script.defer = true;\r\n document.body.appendChild(script);\r\n};\r\n\r\nexport const Recaptcha: React.FC = ({\r\n siteKey,\r\n onLoad,\r\n onComplete,\r\n invisible = true\r\n}) => {\r\n useEffect(() => {\r\n // Register callbacks\r\n window.captchaOnload = () => {\r\n (window as any).innerWidth = 512; // Safari 12 iframe hack - see https://github.com/google/recaptcha/issues/312\r\n onLoad && onLoad();\r\n invisible && window.grecaptcha!.execute();\r\n };\r\n\r\n window.captchaCallback = (token: string) => {\r\n onComplete && onComplete(token);\r\n };\r\n\r\n // Load Google Captcha script\r\n loadCaptchaScript();\r\n }, [onLoad, onComplete, invisible]);\r\n\r\n const token = window.grecaptcha ? window.grecaptcha.getResponse() : '';\r\n if (token.length > 0) {\r\n onComplete(token);\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {invisible && (\r\n
\r\n This site is protected by reCAPTCHA and the Google{' '}\r\n Privacy Policy and{' '}\r\n Terms of Service{' '}\r\n apply.\r\n
\r\n )}\r\n \r\n );\r\n};\r\n","/**\r\n * Date.toLocaleString() is not supported in Android WebView, so we have to do this conversion manually\r\n */\r\n\r\nconst AVAILABLE_FUTURE_DAYS_TO_BOOK = 14;\r\n\r\ntype OpeningHour = { open: number; close: number };\r\n\r\nconst dayName = [\r\n 'Søndag',\r\n 'Mandag',\r\n 'Tirsdag',\r\n 'Onsdag',\r\n 'Torsdag',\r\n 'Fredag',\r\n 'Lørdag',\r\n];\r\n\r\nconst monthName = [\r\n 'januar',\r\n 'februar',\r\n 'marts',\r\n 'april',\r\n 'maj',\r\n 'juni',\r\n 'juli',\r\n 'august',\r\n 'september',\r\n 'oktober',\r\n 'november',\r\n 'december',\r\n];\r\n\r\nconst defaultOpeningHours = [\r\n { open: 9, close: 17 }, // Sunday\r\n { open: 9, close: 17 }, // Monday\r\n { open: 9, close: 17 }, // Tuesday\r\n { open: 9, close: 17 }, // Wednesday\r\n { open: 9, close: 17 }, // Thursday\r\n { open: 9, close: 17 }, // Friday\r\n { open: 9, close: 17 }, // Saturday\r\n];\r\n\r\nconst isOpenOnDate = (openingHours: OpeningHour[], date: Date) =>\r\n openingHours[date.getDay()].close - openingHours[date.getDay()].open > 0;\r\n\r\nconst isOpen = (openingHours: OpeningHour[], date: Date) => {\r\n if (isOpenOnDate(openingHours, date)) {\r\n const closeMinutes = openingHours[date.getDay()]!.close * 60;\r\n const nowMinutes = date.getHours() * 60 + date.getMinutes();\r\n\r\n return nowMinutes < closeMinutes;\r\n } else {\r\n return false;\r\n }\r\n};\r\n\r\nconst parseOpeningHours = (openingHours: Reply.OpeningHours): OpeningHour[] => {\r\n if (openingHours) {\r\n if (\r\n openingHours.sundayAppointmentOnly &&\r\n openingHours.mondayAppointmentOnly &&\r\n openingHours.tuesdayAppointmentOnly &&\r\n openingHours.wednesdayAppointmentOnly &&\r\n openingHours.thursdayAppointmentOnly &&\r\n openingHours.fridayAppointmentOnly &&\r\n openingHours.saturdayAppointmentOnly\r\n ) {\r\n return defaultOpeningHours;\r\n }\r\n\r\n let parsedOpeningHours = [\r\n {\r\n open: new Date(openingHours.sundayOpen).getHours(),\r\n close: new Date(openingHours.sundayClose).getHours(),\r\n },\r\n {\r\n open: new Date(openingHours.mondayOpen).getHours(),\r\n close: new Date(openingHours.mondayClose).getHours(),\r\n },\r\n {\r\n open: new Date(openingHours.tuesdayOpen).getHours(),\r\n close: new Date(openingHours.tuesdayClose).getHours(),\r\n },\r\n {\r\n open: new Date(openingHours.wednesdayOpen).getHours(),\r\n close: new Date(openingHours.wednesdayClose).getHours(),\r\n },\r\n {\r\n open: new Date(openingHours.thursdayOpen).getHours(),\r\n close: new Date(openingHours.thursdayClose).getHours(),\r\n },\r\n {\r\n open: new Date(openingHours.fridayOpen).getHours(),\r\n close: new Date(openingHours.fridayClose).getHours(),\r\n },\r\n {\r\n open: new Date(openingHours.saturdayOpen).getHours(),\r\n close: new Date(openingHours.saturdayClose).getHours(),\r\n },\r\n ];\r\n\r\n if (parsedOpeningHours.every((x) => !isNaN(x.open) && !isNaN(x.close))) {\r\n return parsedOpeningHours;\r\n }\r\n }\r\n\r\n return defaultOpeningHours;\r\n};\r\n\r\nexport const getDateString = (date: Date) =>\r\n `${dayName[date.getDay()]} d. ${date.getDate()}. ${\r\n monthName[date.getMonth()]\r\n }`;\r\n\r\nexport const getDateSlots = (\r\n openingHours: Reply.OpeningHours,\r\n startDate: Date = new Date(Date.now())\r\n) => {\r\n const dateSlots: Date[] = [];\r\n const openingHoursParsed = parseOpeningHours(openingHours);\r\n\r\n if (isOpen(openingHoursParsed, startDate)) {\r\n dateSlots.push(startDate);\r\n }\r\n\r\n for (\r\n let offset = 1;\r\n dateSlots.length < AVAILABLE_FUTURE_DAYS_TO_BOOK;\r\n offset++\r\n ) {\r\n const date = new Date(startDate);\r\n date.setHours(0, 0, 0, 0);\r\n date.setDate(startDate.getDate() + offset);\r\n\r\n if (isOpenOnDate(openingHoursParsed, date)) {\r\n dateSlots.push(date);\r\n }\r\n }\r\n\r\n return dateSlots;\r\n};\r\n\r\nexport const getTimeSlots = (date: Date, openingHours: Reply.OpeningHours) => {\r\n const timeslots: string[] = [];\r\n const openingHoursParsed = parseOpeningHours(openingHours);\r\n const dateOpeningHours = openingHoursParsed[date.getDay()]!;\r\n\r\n // Not likely to happen, as we should only suggest dates that have timeslots\r\n if (dateOpeningHours === null) {\r\n return [];\r\n }\r\n\r\n const next = new Date(date.getTime() + 30 * 60000);\r\n\r\n for (\r\n let hour = Math.max(dateOpeningHours.open, next.getHours() + 1);\r\n hour < dateOpeningHours.close;\r\n hour++\r\n ) {\r\n timeslots.push(`kl. ${hour} - ${hour + 1}`);\r\n }\r\n\r\n return timeslots;\r\n};\r\n","import React from 'react';\r\nimport {\r\n FormSection,\r\n Field,\r\n formValueSelector,\r\n WrappedFieldProps\r\n} from 'redux-form';\r\nimport {\r\n getDateSlots,\r\n getTimeSlots,\r\n getDateString\r\n} from '../utils/openingHours';\r\nimport { RootState } from 'typesafe-actions';\r\nimport { connect } from 'react-redux';\r\nimport { name as formName } from '../store/form';\r\n\r\n/**\r\n * Calculate opening hours for all days\r\n *\r\n * Get current day\r\n * Get opening hours for current day\r\n * If current time is less than an hour before closing time, allow current date\r\n *\r\n * If current date is picked, filter away all options in the past and within the next 30 minutes\r\n * If not, show all available times slots for the picked day\r\n */\r\n\r\ninterface IProps {\r\n selectedDate: number;\r\n openingHours: Reply.OpeningHours;\r\n}\r\n\r\nconst SelectWithError: React.FC = ({\r\n input,\r\n meta,\r\n children,\r\n ...rest\r\n}) => (\r\n <>\r\n \r\n {meta.touched && meta.error &&

{meta.error}

}\r\n \r\n);\r\n\r\nconst TestdriveRequestFormView: React.FC = ({ selectedDate, openingHours }) => (\r\n \r\n

Hvilket tidsrum passer dig bedst?

\r\n
\r\n parseInt(value, 10)}\r\n >\r\n \r\n {getDateSlots(openingHours).map(date => (\r\n \r\n ))}\r\n \r\n {/* Lock time input if no date is selected */}\r\n \r\n \r\n {selectedDate &&\r\n getTimeSlots(new Date(selectedDate), openingHours).map(timeslot => (\r\n \r\n ))}\r\n \r\n
\r\n

\r\n Bemærk: Dette er kun en forespørgsel.
\r\n Forhandleren tager kontakt til dig snarest.\r\n

\r\n
\r\n);\r\n\r\nconst selector = formValueSelector(formName);\r\n\r\nconst mapStateToProps = (state: RootState) => ({\r\n selectedDate: selector(state, 'intents.testdriveData.date'),\r\n openingHours: state.hostData.carData.openingHours\r\n});\r\n\r\nconst mapDispatchToProps = () => ({});\r\n\r\nexport const TestdriveRequestForm = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(TestdriveRequestFormView);\r\n","import React from 'react';\r\nimport { FormSection, Field } from 'redux-form';\r\nimport { TextfieldWithError } from './TextfieldWithError';\r\n\r\nexport const SwapCarForm: React.FC = () => (\r\n \r\n val.toUpperCase()}\r\n required\r\n />\r\n \r\n \r\n);\r\n","import { ContactFormState } from '../store/form';\r\nimport { SubmissionError } from 'redux-form';\r\n\r\nconst getSelectedIntents = (intents: any) =>\r\n Object.keys(intents)\r\n .filter(s => !!intents[s]) // only truthy values\r\n .filter(s => s !== 'testdriveData' && s !== 'swapcarData'); // disregard associated data\r\n\r\nconst validateEmail = (email: string) =>\r\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/.test(\r\n email\r\n );\r\n\r\nexport const submitValidation = (formData: ContactFormState) => {\r\n if (!formData.intents || getSelectedIntents(formData.intents).length === 0) {\r\n throw new SubmissionError({\r\n _error:\r\n 'Vælg hvad du gerne vil kontakte forhandleren vedrørende eller skriv en besked.'\r\n });\r\n }\r\n};\r\n\r\nexport const validate = (values: ContactFormState) => {\r\n const errors: any = {};\r\n\r\n if (!values.user) {\r\n errors['_error'] = 'Du skal udfylde dine kontaktinformationer';\r\n } else {\r\n errors.user = validateContactDetails(values);\r\n }\r\n\r\n if (values.intents) {\r\n errors.intents = {};\r\n const { intents } = values;\r\n\r\n if (intents.swapcar) {\r\n errors.intents.swapcarData = validateSwapcar(values);\r\n }\r\n\r\n if (intents.testdrive) {\r\n errors.intents.testdriveData = validateTestdrive(values);\r\n }\r\n }\r\n\r\n return errors;\r\n};\r\n\r\nconst validateSwapcar = (values: ContactFormState) => {\r\n const errors: any = {};\r\n\r\n const { swapcarData } = values.intents;\r\n\r\n if (!swapcarData || !swapcarData.licenseplate) {\r\n errors.licenseplate = 'Nummerpladen skal udfyldes';\r\n }\r\n\r\n if (!swapcarData || !swapcarData.mileage) {\r\n errors.mileage = 'Kørte kilometer skal udfyldes';\r\n }\r\n\r\n if (swapcarData && swapcarData.mileage) {\r\n const mileage = swapcarData.mileage\r\n .trim()\r\n .replace('.', '')\r\n .replace(',', '');\r\n\r\n if (isNaN(mileage) || parseInt(mileage, 10) < 0) {\r\n errors.mileage = 'Kørte kilometer skal angives som et positivt tal';\r\n }\r\n }\r\n\r\n return errors;\r\n};\r\n\r\nconst validateTestdrive = (values: ContactFormState) => {\r\n const errors: any = {};\r\n\r\n const { testdriveData } = values.intents;\r\n\r\n if (!testdriveData || !testdriveData.date) {\r\n errors.date = 'Du skal vælge en dato';\r\n }\r\n\r\n if (!testdriveData || !testdriveData.time) {\r\n errors.time = 'Du skal vælge et tidspunkt';\r\n }\r\n\r\n return errors;\r\n};\r\n\r\nconst validateContactDetails = (values: ContactFormState) => {\r\n const errors: any = {};\r\n\r\n const { firstName, email, phoneNumber } = values.user!;\r\n\r\n if (!firstName) {\r\n errors.firstName = 'Fornavn er påkrævet';\r\n }\r\n\r\n if (!email) {\r\n errors.email = 'E-mail adresse er påkrævet';\r\n }\r\n\r\n if (email && !validateEmail(email)) {\r\n errors.email = 'E-mail adressen er ikke valid.';\r\n }\r\n\r\n if (\r\n phoneNumber &&\r\n !/[0-9\\s()+.#]{8,20}/.test(phoneNumber.trim().replace(/\\s/, ''))\r\n ) {\r\n errors.phoneNumber =\r\n 'Dit telefonnummer skal være mellem 8 or 20 karakterer, og må kun bestå af tal, (, ), ., + og #';\r\n }\r\n\r\n if (values.intents && values.intents.callme && !phoneNumber) {\r\n errors.phoneNumber =\r\n 'Du skal indtaste telefonnummer, når du vil ringes op.';\r\n }\r\n\r\n return errors;\r\n};\r\n","import React, { Dispatch } from 'react';\r\nimport {\r\n reduxForm,\r\n InjectedFormProps,\r\n Field,\r\n FormSection,\r\n clearSubmitErrors\r\n} from 'redux-form';\r\nimport { connect } from 'react-redux';\r\nimport { Intent } from './Intent';\r\nimport { TextfieldWithLabel } from './TextfieldWithLabel';\r\nimport { RootState, RootAction } from 'typesafe-actions';\r\nimport { captchaComplete } from '../store/captcha';\r\nimport { Recaptcha } from './Recaptcha';\r\nimport { TestdriveRequestForm } from './TestdriveRequestForm';\r\nimport { SwapCarForm } from './SwapCarForm';\r\nimport { ContactFormState, name as formName } from '../store/form';\r\nimport { validate } from '../data/validation';\r\nimport { isQA } from '../utils/platform';\r\n\r\ninterface IProps {\r\n onCaptchaComplete: (token: string) => void;\r\n showCaptcha: boolean;\r\n}\r\n\r\nexport const FormView: React.FC> = ({\r\n onCaptchaComplete,\r\n error,\r\n showCaptcha = true\r\n}) => {\r\n if (!showCaptcha) {\r\n onCaptchaComplete('NO_CAPTCHA_SHOWN');\r\n }\r\n\r\n return (\r\n
\r\n \r\n

Jeg vil gerne:

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n {error &&

{error}

}\r\n
\r\n\r\n \r\n

Min kontaktinformation

\r\n\r\n \r\n \r\n \r\n \r\n\r\n {showCaptcha && (\r\n \r\n )}\r\n
\r\n
\r\n );\r\n};\r\n\r\nconst ReduxedForm = reduxForm({\r\n form: formName,\r\n enableReinitialize: true,\r\n validate: validate,\r\n onChange: (_, dispatch, props) =>\r\n !!props.error && dispatch(clearSubmitErrors(formName)) // clearing submit error manually, as change events seem to not clear submit errors (maybe because the error is general and not associated with a field)\r\n})(FormView);\r\n\r\nconst mapStateToProps = (state: RootState) => ({\r\n initialValues: {\r\n user: state.hostData.defaultUserInfo,\r\n intents: {\r\n testdrive: !!state.hostData.userRequestedATestDrive,\r\n financeoffer:\r\n state.hostData.financeDetails &&\r\n state.hostData.financeDetails.financeOffer\r\n }\r\n }\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch: Dispatch) => ({\r\n onCaptchaComplete: (token: string) => dispatch(captchaComplete(token))\r\n});\r\n\r\nexport const Form = connect(mapStateToProps, mapDispatchToProps)(ReduxedForm);\r\n","import React from 'react';\r\n\r\ninterface IProps {\r\n track: TrackingFunction;\r\n}\r\n\r\nexport interface TrackingData {\r\n category: string;\r\n action: string;\r\n label?: string;\r\n}\r\n\r\ntype TrackingFunction = (trackingData: TrackingData) => void;\r\n\r\nconst TrackingContext = React.createContext(\r\n undefined\r\n);\r\n\r\nexport const TrackingProvider: React.FC = ({ children, track }) => (\r\n {children}\r\n);\r\n\r\nexport const useTracking = () => {\r\n const context = React.useContext(TrackingContext);\r\n if (context === undefined) {\r\n throw new Error('useTracking must be used within a TrackingProvider');\r\n }\r\n return context;\r\n};\r\n","import React from 'react';\r\nimport { RootState, ActionType } from 'typesafe-actions';\r\nimport { change, formValueSelector } from 'redux-form';\r\nimport { connect } from 'react-redux';\r\nimport { Dispatch } from 'redux';\r\nimport { name as formName } from '../store/form';\r\nimport { useTracking } from './Tracking';\r\n\r\ntype CannedMessage = {\r\n id: string;\r\n text: string;\r\n};\r\n\r\nexport const cannedMessages: CannedMessage[] = [\r\n { id: 'SwapCar', text: 'Tager I bil i bytte?' },\r\n { id: 'Testdrive', text: 'Kan jeg prøvekøre bilen?' },\r\n { id: 'NegotiablePrice', text: 'Er prisen til forhandling?' },\r\n { id: 'CallMe', text: 'Kan I ringe mig op?' },\r\n { id: 'FinanceOffer', text: 'Kan I hjælpe med et finansieringstilbud?' }\r\n];\r\n\r\nconst selector = formValueSelector(formName);\r\n\r\nconst CannedMessage: React.FC<{\r\n text: string;\r\n selected: boolean;\r\n onClick: () => void;\r\n}> = ({ text, selected, onClick }) => {\r\n return (\r\n \r\n {text}\r\n \r\n );\r\n};\r\n\r\ninterface IProps {\r\n message?: string;\r\n setMessage: (text: string) => void;\r\n}\r\n\r\nexport const CannedMessagesView: React.FC = ({\r\n message,\r\n setMessage\r\n}) => {\r\n const track = useTracking();\r\n\r\n const addToMessage = (cm: CannedMessage) => () => {\r\n if (message && message.indexOf(cm.text) >= 0) {\r\n setMessage(message.replace(`\\r\\n${cm.text}`, '').replace(cm.text, ''));\r\n track({\r\n category: 'ListingReply',\r\n action: 'RepliesCannedMessageRemoved',\r\n label: cm.id\r\n });\r\n } else {\r\n setMessage(`${message || ''}\\r\\n${cm.text}`.trim());\r\n track({\r\n category: 'ListingReply',\r\n action: 'RepliesCannedMessageAdded',\r\n label: cm.id\r\n });\r\n }\r\n };\r\n\r\n const messageContains = (text: string) =>\r\n !!message && message.indexOf(text) >= 0;\r\n\r\n return (\r\n
\r\n

Start samtalen med et spørgsmål

\r\n {cannedMessages.map(cm => (\r\n \r\n ))}\r\n
\r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: RootState) => ({\r\n message: selector(state, 'intents.message')\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch: Dispatch>) => ({\r\n setMessage: (text: string) =>\r\n dispatch(change(formName, 'intents.message', text))\r\n});\r\n\r\nexport const CannedMessages = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(CannedMessagesView);\r\n","import React, { Dispatch } from 'react';\r\nimport {\r\n reduxForm,\r\n InjectedFormProps,\r\n Field,\r\n FormSection,\r\n clearSubmitErrors\r\n} from 'redux-form';\r\nimport { connect } from 'react-redux';\r\nimport { TextfieldWithLabel } from './TextfieldWithLabel';\r\nimport { RootState, RootAction } from 'typesafe-actions';\r\nimport { captchaComplete } from '../store/captcha';\r\nimport { Recaptcha } from './Recaptcha';\r\nimport { ContactFormState, name as formName } from '../store/form';\r\nimport { validate } from '../data/validation';\r\nimport { isQA } from '../utils/platform';\r\nimport { CannedMessages } from './CannedMessages';\r\n\r\ninterface IProps {\r\n onCaptchaComplete: (token: string) => void;\r\n showCaptcha: boolean;\r\n}\r\n\r\nexport const CannedFormView: React.FC> = ({\r\n onCaptchaComplete,\r\n error,\r\n showCaptcha = true\r\n}) => {\r\n if (!showCaptcha) {\r\n onCaptchaComplete('NO_CAPTCHA_SHOWN');\r\n }\r\n\r\n return (\r\n
\r\n \r\n

Min kontaktinformation

\r\n\r\n \r\n \r\n \r\n \r\n\r\n {showCaptcha && (\r\n \r\n )}\r\n
\r\n\r\n \r\n \r\n \r\n {error &&

{error}

}\r\n \r\n \r\n );\r\n};\r\n\r\nconst ReduxedForm = reduxForm({\r\n form: formName,\r\n enableReinitialize: true,\r\n validate: validate,\r\n onChange: (_, dispatch, props) =>\r\n !!props.error && dispatch(clearSubmitErrors(formName)) // clearing submit error manually, as change events seem to not clear submit errors (maybe because the error is general and not associated with a field)\r\n})(CannedFormView);\r\n\r\nconst createInitialMessage = (state: RootState) => {\r\n let message = '';\r\n\r\n if (state.hostData.userRequestedATestDrive) {\r\n message += 'Kan jeg prøvekøre bilen?\\r\\n';\r\n }\r\n\r\n if (\r\n state.hostData.financeDetails &&\r\n state.hostData.financeDetails.financeOffer\r\n ) {\r\n message += 'Kan I hjælpe med et finansieringstilbud?\\r\\n';\r\n }\r\n\r\n return message;\r\n};\r\n\r\nconst mapStateToProps = (state: RootState) => ({\r\n initialValues: {\r\n user: state.hostData.defaultUserInfo,\r\n intents: {\r\n message: createInitialMessage(state)\r\n }\r\n }\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch: Dispatch) => ({\r\n onCaptchaComplete: (token: string) => dispatch(captchaComplete(token))\r\n});\r\n\r\nexport const CannedForm = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(ReduxedForm);\r\n","import React from 'react';\r\nimport './ListingPreview.css';\r\n\r\ninterface IProps {\r\n car: Reply.CarData;\r\n}\r\n\r\nexport const ListingPreview: React.FC = ({ car }) =>\r\n car.image && car.image.length > 0 ? (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

\r\n {car.vehicleMake} {car.vehicleModel}\r\n

\r\n

{car.variant}

\r\n
\r\n \r\n ) : null;\r\n","import React from 'react';\r\n\r\nexport const SubmittingSpinner: React.FC = () => (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n);\r\n","import React from 'react';\r\nimport { ActionType } from 'typesafe-actions';\r\nimport { submit } from 'redux-form';\r\nimport { connect } from 'react-redux';\r\nimport { name as formName } from '../store/form';\r\nimport { Dispatch } from 'redux';\r\n\r\ninterface IProps {\r\n onRetry: () => void;\r\n onCancel: () => void;\r\n error?: Error;\r\n}\r\n\r\nconst ErrorOverlayView: React.FC = ({ onRetry, onCancel, error }) => {\r\n console.log(error);\r\n\r\n return (\r\n
\r\n
\r\n

Øv, der opstod et problem...

\r\n

Vi kunne ikke sende din besked.

\r\n
\r\n \r\n \r\n
\r\n {error &&
{error.message}
}\r\n
\r\n
\r\n );\r\n};\r\n\r\nconst mapStateToProps = () => ({});\r\n\r\nconst mapDispatchToProps = (dispatch: Dispatch>) => ({\r\n onRetry: () => dispatch(submit(formName))\r\n});\r\n\r\nexport const ErrorOverlay = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(ErrorOverlayView);\r\n","import React, { useEffect, useState } from 'react';\r\nimport { Dispatch } from 'redux';\r\nimport { connect } from 'react-redux';\r\nimport { RootAction, RootState } from 'typesafe-actions';\r\nimport { setHostData } from './store/hostData';\r\nimport { Header } from './components/Header';\r\nimport { Footer } from './components/Footer';\r\nimport { Form } from './components/Form';\r\nimport { CannedForm } from './components/CannedForm';\r\nimport { ListingPreview } from './components/ListingPreview';\r\nimport { ContactFormState } from './store/form';\r\nimport { mapToCloseMessage, mapToSubmitData } from './data/mapper';\r\nimport { SubmittingSpinner } from './components/SubmittingSpinner';\r\nimport { submitValidation } from './data/validation';\r\nimport { submit } from './services/api';\r\nimport { ErrorOverlay } from './components/ErrorOverlay';\r\nimport { isAndroid } from './utils/platform';\r\nimport { PlatformProvider } from './components/Platform';\r\nimport { TrackingProvider, TrackingData } from './components/Tracking';\r\nimport { cannedMessages } from './components/CannedMessages';\r\n\r\ninterface IProps {\r\n data: Reply.HostData;\r\n isSubmitting: boolean;\r\n captchaToken: string;\r\n onSubmitted: (data: Reply.CloseMessageData) => void;\r\n onCancel: (data: Reply.CancelMessageData) => void;\r\n onTrack: (data: Reply.TrackMessageData) => void;\r\n onDataChange: (data: Reply.HostData) => void;\r\n}\r\n\r\nconst App: React.FC = ({\r\n isSubmitting,\r\n onSubmitted,\r\n onCancel,\r\n data,\r\n onDataChange,\r\n onTrack,\r\n captchaToken,\r\n}) => {\r\n useEffect(() => {\r\n // Set initial data for form via Redux action\r\n onDataChange(data);\r\n }, [data, onDataChange]);\r\n const [error, setError] = useState(undefined);\r\n\r\n const handleSubmit = (formData: ContactFormState) => {\r\n setError(undefined);\r\n submitValidation(formData);\r\n\r\n trackCannedMessages(formData.intents.message);\r\n\r\n const sleepPromise = new Promise((resolve) =>\r\n setTimeout(() => {\r\n resolve();\r\n }, 1000)\r\n );\r\n\r\n const dataToSubmit = mapToSubmitData(data, formData, captchaToken);\r\n const submitPromise = submit(dataToSubmit);\r\n\r\n // Need to return the form data after completing the promises, so that it is passed to onSubmitSuccess\r\n return Promise.all([submitPromise, sleepPromise]).then(() => formData);\r\n };\r\n\r\n const handleError = (errors: any, _dispatch: unknown, submitError: Error) => {\r\n // Only display full error modal, if we have connection errors - validation errors will be displayed in form\r\n\r\n if (!!submitError && typeof errors === 'undefined') {\r\n handleTrack({\r\n category: 'ListingReply',\r\n action: 'Error',\r\n label: submitError.message,\r\n });\r\n setError(submitError);\r\n }\r\n };\r\n\r\n const handleSuccess = (values: ContactFormState) => {\r\n const dataForPlatform = mapToCloseMessage(data, values);\r\n onSubmitted(dataForPlatform);\r\n };\r\n\r\n const handleCancel = () => {\r\n onCancel({ action: 'cancel' });\r\n };\r\n\r\n const handleCloseError = () => {\r\n setError(undefined);\r\n };\r\n\r\n const handleTrack = (trackingData: TrackingData) => {\r\n onTrack({ action: 'track', data: trackingData });\r\n };\r\n\r\n const trackCannedMessages = (message: string | undefined) => {\r\n if (!message || message.length <= 10) {\r\n return;\r\n }\r\n\r\n const used = cannedMessages\r\n .filter((cm) => message.indexOf(cm.text) >= 0)\r\n .map((cm) => cm.id)\r\n .join(', ');\r\n\r\n handleTrack({\r\n category: 'ListingReply',\r\n action: 'RepliesCannedMessageSubmit',\r\n label: used,\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n {isAndroid() && }\r\n {data.variant && data.variant === 'Canned' ? (\r\n \r\n ) : (\r\n \r\n )}\r\n