{"version":3,"sources":["config.js","helpers/api.js","components/elements/Web/ContactForm.js","helpers/decode.js","components/elements/Social/GoogleLoginButton.js","components/elements/Students/LoginModal.js","components/elements/Web/SuburbDropDown.js","components/elements/Web/LoginLogout.js","components/elements/Web/NewsletterForm.js","components/elements/Web/DKTDownloadForm.js","Wrapper.js","App.js","index.js","helpers/history.js","components/elements/Spinner.js"],"names":["process","REACT_APP_ENVIRONMENT","REACT_APP_ENVIRONMENT_SHORT","REACT_APP_SHORT_NAME","REACT_APP_MEDIUM_NAME","REACT_APP_MEDIUM_NAME_WITH_PREFIX","REACT_APP_LONG_NAME","REACT_APP_LONG_NAME_WITH_PREFIX","REACT_APP_SITE_URL","REACT_APP_PUBLIC_SITE_URL","REACT_APP_DOMAIN","REACT_APP_API_URL","REACT_APP_GA_TRACKING_KEY","REACT_APP_FACEBOOK_APP_ID","REACT_APP_GOOGLE_CLIENT_ID","REACT_APP_IPSI_SERVER","REACT_APP_IPSI_CONFIG_ID","REACT_APP_IPSI_USERNAME","REACT_APP_IPSI_SECKEY","showCompetition","apiRoot","siteUrl","publicSiteUrl","siteDomain","facebookAppId","googleClientId","googleAnalyticsTrackingKey","drivingSchoolShortName","drivingSchoolMediumName","drivingSchoolMediumNameWithPrefix","drivingSchoolLongName","drivingSchoolLongNameWithPrefix","environment","environmentShort","maximumBookingsPerTransaction","products","singleLesson","threeLesson","fourLesson","fiveLesson","sixLesson","eightLesson","tenLesson","twelveLesson","twentyFiveLesson","fortyLesson","sdcModOne","sdcModTwo","agedAssessment","voucherNumberOfLessonsByProductID","4","8","9","17","22","voucherLessonQuantityToProductID","1","2","3","5","6","10","25","bookingTypes","lesson","test","aged","k2d","cert4","IPSI_server","IPSI_configId","IPSI_userName","IPSI_secKey","processingFees","paypal","afterpay","zip","cookies","Cookies","retryAttempts","isAuthToken","get","config","request","method","resource","a","options","request_uid","Date","now","Math","random","makeRequest","fetch","headers","Accept","Authorization","then","result","ok","json","status","toString","substr","text","bodyText","statusText","catch","error","API","post","patch","put","delete","mapUrlParams","paramsObject","Object","keys","map","key","join","ContactFormClass","state","saving","submitButtonDisabled","validateForm","props","form","validateFields","err","values","setState","goNextField","e","preventDefault","inputs","document","querySelectorAll","lastElement","i","length","target","activeElement","blur","removeAttribute","setAttribute","focus","submitForm","user","id","student_id","api","body","JSON","stringify","data","success","Modal","className","title","content","icon","closable","keyboard","getFieldDecorator","this","ContactFormToRender","Item","label","rules","required","message","whitespace","max","initialValue","first_name","last_name","maxLength","size","onKeyDown","enterKeyHint","placeholder","onKeyUp","style","marginTop","disabled","type","email","getValueFromEvent","isNaN","Number","value","getFieldValue","min","mobile_phone","TextArea","rows","autoSize","borderRadius","padding","fontSize","fontWeight","border","color","width","htmlType","onClick","loading","embed","ReactDOM","createPortal","getElementById","React","Component","ContactForm","Form","create","name","withRouter","base64UrlDecode","str","output","replace","console","log","Error","decodeURIComponent","atob","_m","c","code","charCodeAt","toUpperCase","base64Decode","decode","token","header","pos","parse","split","GoogleLoginButton","multipleUsersModalVisible","multipleUsers","singleUserModalVisible","singleUser","noUserModalVisible","connecting","savingStudent","googleProfile","googleAuth","modalToggle","modal_name","createNewGoogleStudent","given_name","family_name","google_user_id","sub","source","res","showErrorMessage","set","access_token","path","domain","setAppStateValue","sendPageviewToGoogleAnalytics","sendEventToGoogleTagManager","event","window","location","hostname","smartlook","startStudentTimeStampChecker","setTimeout","loginModalCallback","loginModalToggle","selectUser","record","context","google_auth_id_token","errorMessage","loginSocialMediaUser","successfulGoogleConnection","credentialResponse","credential","checkStudentExistsGoogle","getData","exists","students","okButtonProps","onOk","Fragment","clientId","logo_alignment","onSuccess","onError","useOneTap","Spinner","visible","onCancel","footer","showHeader","columns","render","faUserCheck","rowKey","dataSource","pagination","onRow","rowIndex","suburbLookupTimeout","currentSuburb","Login","signUpButtonDisabled","logInButtonDisabled","showReferralCodeInput","checkingReferralCode","referralCodeValid","checkingSocialLogin","toggleSocialLoginCheck","loginModalTab","submitLogin","fieldsToValidate","checkReferralCode","previouslyAssignedDT","shell_student","assignedDriverTrainer","prelim","student","driver_trainer_id","display_name","driver_trainer","headshot","website_headshot","website_photo","website_bio","transmissionType","vehicle_transmission","modified","address","street_number","street_name","suburb","suburb_full_details","post_code","states","suburb_id","suburb_name","completed_lessons","parseInt","has_future_lessons","referring_student_name","available","parseFloat","credits","remaining","using","owing","mod1","sdc_remaining","mod2","licence_number","hours","driving_experience","dob","hadSDC","referral_code","hide_cash","hide_cash_on_website","completedLesson","futureLessons","addCustomBanner","studentReferralCode","verifyReferralCode","addReferralCodeToExistingAccount","dtClash","clearReservations","studentClash","checkStudentClashes","clashingBookings","cloneBookings","bookings","forEach","booking_id","booking","updateBookingsDuration","href","rel","forgot_email","site","checkStudentExists","register_email","register_first_name","register_last_name","register_mobile_phone","password","register_password","confirm","pickup_address_id","address_id","pickup_suburb","pickup_address_suburb_id","pickup_address_street_number","pickup_address_street_name","driverReferralCode","driver_referral_code","shell","changeTab","activeKey","validateSignUpForm","validateLogInForm","referralCode","user_id","isSignUp","referringStudentName","referrer","storeEncryptedState","wrapClassName","closeIcon","fixedWidth","faTimes","height","loginModalVisible","destroyOnClose","top","display","xs","span","offset","sm","md","lg","xl","fallback","renderLoader","tabPosition","onChange","TabPane","tab","marginBottom","margin","textAlign","autoFocus","readOnly","connectedWithFacebook","connectedWithGoogle","onBlur","Password","showIcon","position","right","validateForgotForm","forgotButtonDisabled","src","alt","faStar","LoginModal","LoginLogout","newGoogleUser","newFacebookUser","lineHeight","element","SuburbDropDown","suburbs","autoCompleteDisabled","searchedSuburbName","renderCounter","componentDidUpdate","prevProps","pickup_address_suburb_manual_string","disableAutoComplete","elementsToDisable","handleSuburbSearch","suburbLookup","callback","clearTimeout","search","d","r","push","pickupSuburbSelection","option","params","children","submitSearch","history","Option","notFoundContent","backfill","filterOption","onSearch","onSelect","onFocus","defaultValue","faMapMarkerAlt","NewsletterFormClass","drawerVisible","drawerHasBeenClosed","componentDidMount","applyExitIntentTrigger","exitIntentCallback","modalTimeoutId","onMouseleave","clientY","showModal","onMouseenter","documentElement","removeEventListener","addEventListener","NewsletterFormToRender","placement","onClose","NewsletterForm","DKTDownloadFormClass","formHasBeenSubmitted","DKTDownloadFormToRender","flexDirection","inputReadOnly","format","popupStyle","zIndex","showToday","disabledDate","current","moment","DKTDownloadForm","Base","lazy","reload","Wrapper","base","loginOut","mobileLoginOut","suburbDropDown","contactForm","newsletterForm","dktDownloadForm","App","AppVersion","cart","paidCart","bookingsSDC","confirmedBookings","confirmedBookingsSDC","processingCart","findAvailability","totalCartBookingDuration","facebookUserId","googleUserId","googleUserAuthId","pickupAddressChosen","pickupAddressString","pickup_address_suburb_name","pickup_address_state","pickup_address_postcode","pickupAddressManualFields","displayDropoffAddress","dropoffAddressChosen","dropoffAddressString","dropoff_address_id","dropoff_address_suburb_id","dropoff_address_suburb_manual_string","dropoff_address_street_number","dropoff_address_street_name","dropoff_address_suburb_name","dropoff_address_state","dropoff_address_postcode","dropoffAddressManualFields","contactModalVisible","dtModalVisible","userDrawerVisible","existingUser","firstPurchase","payByCash","paidByCash","prepaidData","timestamps","expiring_notice","expired_modal_visible","shortest_reservation","sdc_full_modal_visible","voucher","package","qty","sdc","who","how","personalise","occasion","cartGV","paidCartGV","showBanners","banners","studentTimeStampCheckerIntervalVar","reservationCheckIntervalVar","prevState","userData","lzStringCompress","page","ReactGA","pageview","dataLayer","checkReservationExpiry","reduce","acc","elem","module","sdc_full","expiredBookings","bookingObject","originalCount","entries","newCount","go","urgentCheck","some","el","renewReservations","shortest","setInterval","studentTimeStampQuery","stopStudentTimeStampChecker","clearInterval","updated","clearCart","updated_type","prepaidAvailable","bookingHours","countBookingHours","prepaidUsing","stillOwing","prepaidRemaining","duration","contactModalToggle","replaceObject","itemKey","cloneState","addToCart","product_id","quantity","price","discountCode","lessonPackageProducts","includes","lessonPackageProductId","showExistingUserModal","same_dt","contentToShow","restartWithPrelimLoginModal","restartWithLoginModal","clearEverythingAndStartWithLoginModal","previouslyEnteredEmail","previousShellState","remove","basicStateReset","scrollTo","custom_class","link","clearCustomBanner","showPrepaidError","redirect","url","bookings_sdc","unavailable","checkCartClashes","bookingsToCheck","check_booking_id","check_booking_data","against_booking_id","against_booking_data","start_time","replaceAll","end_time","formatter","Intl","NumberFormat","currency","decryptedStateData","lzStringDecompress","initialize","pathname","destroyAll","Sentry","dsn","createBrowserHistory","hidden","indicator"],"mappings":"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","file":"static/js/main.98c3c26d.chunk.js","sourcesContent":["const {\n REACT_APP_ENVIRONMENT,\n REACT_APP_ENVIRONMENT_SHORT,\n REACT_APP_SHORT_NAME,\n REACT_APP_MEDIUM_NAME,\n REACT_APP_MEDIUM_NAME_WITH_PREFIX,\n REACT_APP_LONG_NAME,\n REACT_APP_LONG_NAME_WITH_PREFIX,\n REACT_APP_SITE_URL,\n REACT_APP_PUBLIC_SITE_URL,\n REACT_APP_DOMAIN,\n REACT_APP_API_URL,\n REACT_APP_GA_TRACKING_KEY,\n REACT_APP_FACEBOOK_APP_ID,\n REACT_APP_GOOGLE_CLIENT_ID,\n REACT_APP_IPSI_SERVER,\n REACT_APP_IPSI_CONFIG_ID,\n REACT_APP_IPSI_USERNAME,\n REACT_APP_IPSI_SECKEY,\n} = process.env;\n\n/* eslint import/no-anonymous-default-export: [2, {\"allowObject\": true}] */\nexport default {\n showCompetition: false, //@todo: Set to true when Competition active.\n\n apiRoot: REACT_APP_API_URL,\n siteUrl: REACT_APP_SITE_URL,\n publicSiteUrl: REACT_APP_PUBLIC_SITE_URL,\n siteDomain: REACT_APP_DOMAIN,\n facebookAppId: REACT_APP_FACEBOOK_APP_ID,\n googleClientId: REACT_APP_GOOGLE_CLIENT_ID,\n googleAnalyticsTrackingKey: REACT_APP_GA_TRACKING_KEY,\n drivingSchoolShortName: REACT_APP_SHORT_NAME,\n drivingSchoolMediumName: REACT_APP_MEDIUM_NAME,\n drivingSchoolMediumNameWithPrefix: REACT_APP_MEDIUM_NAME_WITH_PREFIX,\n drivingSchoolLongName: REACT_APP_LONG_NAME,\n drivingSchoolLongNameWithPrefix: REACT_APP_LONG_NAME_WITH_PREFIX,\n environment: REACT_APP_ENVIRONMENT,\n environmentShort: REACT_APP_ENVIRONMENT_SHORT,\n maximumBookingsPerTransaction: 10,\n products: {\n singleLesson: 4,\n threeLesson: 22,\n fourLesson: 23,\n fiveLesson: 24,\n sixLesson: 8,\n eightLesson: 25,\n tenLesson: 9,\n twelveLesson: 26,\n twentyFiveLesson: 17,\n fortyLesson: 27,\n sdcModOne: 10,\n sdcModTwo: 11,\n agedAssessment: 18,\n },\n voucherNumberOfLessonsByProductID: {\n 4: 1,\n 8: 6,\n 9: 10,\n 17: 25,\n 22: 3,\n },\n voucherLessonQuantityToProductID: {\n 1: 4,\n 2: 4,\n 3: 4,\n 4: 4,\n 5: 4,\n 6: 8,\n 10: 9,\n 25: 17,\n },\n bookingTypes: {\n lesson: 1,\n test: 2,\n aged: 3,\n k2d: 4,\n cert4: 5,\n },\n\n IPSI_server: REACT_APP_IPSI_SERVER,\n IPSI_configId: REACT_APP_IPSI_CONFIG_ID,\n IPSI_userName: REACT_APP_IPSI_USERNAME,\n IPSI_secKey: REACT_APP_IPSI_SECKEY,\n\n processingFees: {\n paypal: 2.6,\n afterpay: 6,\n zip: 5,\n },\n};\n","import \"whatwg-fetch\";\nimport config from \"../config\";\nimport Cookies from \"universal-cookie\";\n\nconst cookies = new Cookies();\n\nlet retryAttempts = [];\nlet maxRetries = 5;\n\nconst isAuthToken = () => {\n return cookies.get(config.environmentShort + \"AT\") !== null;\n};\n\nconst request =\n (method) =>\n async (resource, options = {}) => {\n let request_uid = Date.now() + \"_\" + Math.random();\n retryAttempts[request_uid] = 1;\n return await makeRequest(method, request_uid, resource, options);\n };\n\nconst makeRequest = async (method, request_uid, resource, options = {}) => {\n const { apiRoot } = config;\n\n if (!resource || !apiRoot) return null;\n return await fetch(`${apiRoot}/${resource}`, {\n method,\n headers: isAuthToken()\n ? {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization:\n \"Bearer \" + cookies.get(config.environmentShort + \"AT\"),\n }\n : {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n ...options,\n })\n .then((result) => {\n if (result.ok) {\n return result.json();\n } else if (\n result.status.toString().substr(0, 1) === \"5\" &&\n retryAttempts[request_uid] < maxRetries\n ) {\n // Retry on a errors in the 500-599 range\n retryAttempts[request_uid]++;\n return makeRequest(method, request_uid, resource, options);\n } else {\n return result.text().then((bodyText) => {\n if (bodyText === \"\" && result.statusText !== \"\") {\n return (\n '{\"status\":\"NOK\",\"result\":{\"error\":\"' +\n result.statusText +\n '\"}}'\n );\n }\n return (\n '{\"status\":\"NOK\",\"result\":{\"error\":\"' + bodyText + '\"}}'\n );\n });\n }\n })\n .catch((error) => {\n return '{\"status\":\"NOK\",\"result\":{\"error\":\"Unknown Error\"}}';\n });\n};\n\nconst mapUrlParams = (paramsObject) => {\n return Object.keys(paramsObject)\n .map((key) => key + \"=\" + paramsObject[key])\n .join(\"&\");\n};\n\nconst API = {\n get: request(\"GET\"),\n post: request(\"POST\"),\n patch: request(\"PATCH\"),\n put: request(\"PUT\"),\n delete: request(\"DELETE\"),\n mapUrlParams,\n};\n\nexport default API;\n","import React from \"react\";\nimport { withRouter } from \"react-router\";\nimport ReactDOM from \"react-dom\";\n\n//Ant Design Elements\nimport Button from \"antd/lib/button\";\nimport Form from \"antd/lib/form\";\nimport Input from \"antd/lib/input\";\nimport Modal from \"antd/lib/modal\";\n\nimport api from \"../../../helpers/api\";\n\nclass ContactFormClass extends React.Component {\n state = {\n saving: false,\n submitButtonDisabled: true,\n };\n\n validateForm = () => {\n this.props.form.validateFields((err, values) => {\n if (!err) {\n // No Errors : Disabled = False\n this.setState({\n submitButtonDisabled: false,\n });\n } else {\n // Errors : Disabled = True\n this.setState({\n submitButtonDisabled: true,\n });\n }\n });\n };\n\n goNextField = (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n var inputs = document.querySelectorAll(\n \"#contact_form input, #contact_form textarea\"\n );\n\n var lastElement = true;\n for (var i = 0; i < inputs.length; i++) {\n if (inputs[i] === e.target && !!inputs[i + 1]) {\n lastElement = false;\n document.activeElement.blur();\n document.activeElement.removeAttribute(\"autofocus\");\n\n inputs[i + 1].setAttribute(\"autofocus\", \"autofocus\");\n inputs[i + 1].focus();\n }\n }\n if (lastElement) {\n this.submitForm();\n }\n }\n };\n\n submitForm = () => {\n this.props.form.validateFields((err, values) => {\n if (err) {\n return false;\n }\n\n this.setState(\n {\n saving: true,\n },\n () => {\n if (!!this.props.user.id) {\n values.student_id = this.props.user.id;\n }\n api.post(\"contact\", {\n body: JSON.stringify(values),\n })\n .then((data) => {\n if (\n typeof data.result === \"object\" &&\n data.result.success\n ) {\n Modal.success({\n className: \"unavailable-survey\",\n title: \"Thank you for your message\",\n content: (\n

\n If required, we will get back to you\n as soon as we can.\n

\n ),\n icon: false,\n closable: false,\n keyboard: false,\n });\n } else {\n Modal.error({\n className: \"unavailable-survey\",\n title: \"Error!\",\n content:\n \"Sorry, an error occurred. Please try again!\",\n icon: false,\n closable: false,\n keyboard: false,\n });\n }\n this.setState({\n saving: false,\n });\n })\n .catch((error) => {\n Modal.error({\n className: \"unavailable-survey\",\n title: \"Error!\",\n content:\n \"Sorry, an error occurred. Please try again!\",\n icon: false,\n closable: false,\n keyboard: false,\n });\n this.setState({\n saving: false,\n });\n });\n }\n );\n });\n };\n\n render() {\n const { getFieldDecorator } = this.props.form;\n\n let ContactFormToRender = (\n <>\n
\n \n {getFieldDecorator(\"name\", {\n rules: [\n {\n required: true,\n message: \"Enter your name.\",\n whitespace: true,\n },\n {\n max: 60,\n message:\n \"Name cannot be more than 60 characters.\",\n },\n ],\n initialValue: !!this.props.user.id\n ? this.props.user.first_name +\n \" \" +\n this.props.user.last_name\n : \"\",\n })(\n \n )}\n \n\n \n {getFieldDecorator(\"email\", {\n rules: [\n {\n required: true,\n type: \"email\",\n message: \"Enter a valid Email.\",\n whitespace: true,\n },\n {\n max: 60,\n message:\n \"Email cannot be more than 60 characters.\",\n },\n ],\n initialValue: !!this.props.user.id\n ? this.props.user.email\n : \"\",\n })(\n \n )}\n \n\n \n {getFieldDecorator(\"mobile_phone\", {\n getValueFromEvent: (\n e: React.FormEvent\n ) => {\n if (isNaN(Number(e.target.value))) {\n return this.props.form.getFieldValue(\n \"mobile_phone\"\n );\n } else {\n return e.target.value;\n }\n },\n rules: [\n {\n required: true,\n message: \"Enter your Mobile Number.\",\n whitespace: true,\n },\n {\n min: 10,\n message:\n \"Mobile Number must be 10 characters.\",\n },\n ],\n initialValue: !!this.props.user.id\n ? this.props.user.mobile_phone\n : \"\",\n })(\n \n )}\n \n\n \n {getFieldDecorator(\"subject\", {\n rules: [\n {\n required:\n this.props.form.getFieldValue(\n \"message\"\n ) === \"\" ||\n typeof this.props.form.getFieldValue(\n \"message\"\n ) === \"undefined\",\n message: \"Enter a subject.\",\n whitespace: true,\n },\n {\n max: 100,\n message:\n \"Subject cannot be more than 100 characters.\",\n },\n ],\n })(\n \n )}\n \n\n \n {getFieldDecorator(\"message\", {\n rules: [\n {\n required:\n this.props.form.getFieldValue(\n \"subject\"\n ) === \"\" ||\n typeof this.props.form.getFieldValue(\n \"subject\"\n ) === \"undefined\",\n message: \"Enter a message.\",\n whitespace: true,\n },\n ],\n })(\n \n )}\n \n\n \n this.submitForm()}\n disabled={\n this.state.submitButtonDisabled ||\n this.state.saving\n }\n loading={this.state.saving}\n >\n Send\n \n \n
\n \n );\n\n if (this.props.embed) {\n return ReactDOM.createPortal(\n ContactFormToRender,\n document.getElementById(\"react-contact-form\")\n );\n }\n\n return ContactFormToRender;\n }\n}\n\nconst ContactForm = Form.create({ name: \"contact_form\" })(ContactFormClass);\nexport default withRouter(ContactForm);\n","const base64Decode = (str) => {\n return decodeURIComponent(\n atob(str).replace(/(.)/g, (_m, c) => {\n let code = c.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n })\n );\n};\n\nconst base64UrlDecode = (str) => {\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n console.log(\"no good here\");\n throw new Error(\"Illegal Base64URL string!\");\n }\n\n try {\n return base64Decode(output);\n } catch (err) {\n return atob(output);\n }\n};\n\nconst decode = (token, { header = false } = {}) => {\n const pos = header === true ? 0 : 1;\n try {\n return JSON.parse(base64UrlDecode(token.split(\".\")[pos]));\n } catch (err) {\n return {};\n }\n};\n\nexport default decode;\n","import React from \"react\";\n\n//Ant Design Elements\nimport Button from \"antd/lib/button\";\nimport Modal from \"antd/lib/modal\";\nimport Table from \"antd/lib/table\";\n\nimport config from \"../../../config\";\nimport api from \"../../../helpers/api\";\nimport decode from \"../../../helpers/decode\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faUserCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport Spinner from \"../../elements/Spinner\";\n\nimport { GoogleOAuthProvider } from \"@react-oauth/google\";\nimport { GoogleLogin } from \"@react-oauth/google\";\n\nclass GoogleLoginButton extends React.Component {\n state = {\n multipleUsersModalVisible: false,\n multipleUsers: {},\n singleUserModalVisible: false,\n singleUser: {},\n noUserModalVisible: false,\n loading: false,\n connecting: false,\n savingStudent: false,\n };\n\n googleProfile = null;\n googleAuth = null;\n\n modalToggle = (modal_name) => {\n this.setState({\n [modal_name + \"ModalVisible\"]:\n !this.state[modal_name + \"ModalVisible\"],\n });\n };\n\n /**\n * Create a new Student account with returned details from Google.\n * The Student Refresh script will then populate everything else we need.\n */\n createNewGoogleStudent = () => {\n let values = {};\n values.email = this.googleProfile.email;\n values.first_name = this.googleProfile.given_name;\n values.last_name = this.googleProfile.family_name;\n values.google_user_id = this.googleProfile.sub;\n values.source = \"app\";\n\n return api\n .post(\"students/save/google\", {\n body: JSON.stringify(values),\n })\n .then((res) => {\n //Convert to JSON in case we've received a string response\n if (typeof res === \"string\") {\n res = JSON.parse(res);\n }\n //Check for an error response (status of \"NOK\")\n if (res.status === \"NOK\" || res.result.success === false) {\n this.setState({\n showErrorMessage: true,\n loading: false,\n });\n } else {\n // Save the access token\n this.props.cookies.set(\n config.environmentShort + \"AT\",\n res.result.access_token,\n { path: \"/\", domain: config.siteDomain }\n );\n // Update state\n this.props.setAppStateValue(\"user\", {\n id: res.result.student_id,\n });\n this.props.sendPageviewToGoogleAnalytics(\n \"/virtual/bookings-new/user-details/login\"\n ); //First ping to signal login\n this.props.sendEventToGoogleTagManager({\n event: \"user-signup-google\",\n });\n // Smartlook - Track User Registration with Google\n if (\n window.location.hostname === \"app.ltrent.com.au\" &&\n typeof smartlook !== \"undefined\" &&\n typeof smartlook === \"function\"\n ) {\n /*global smartlook*/ // This line prevents the below throwing an error when not on production\n smartlook(\"track\", \"user\", {\n type: \"registration-google\",\n });\n }\n\n this.props.setAppStateValue(\n \"googleUserId\",\n values.google_user_id,\n false,\n () => {\n this.props.setAppStateValue(\n \"connectedWithGoogle\",\n true\n );\n }\n );\n\n // Start Student TimeStamp Polling\n this.props.startStudentTimeStampChecker();\n\n window.setTimeout(() => {\n if (\n typeof this.props.loginModalCallback === \"function\"\n ) {\n // If we have a callback, call it\n this.props.loginModalCallback();\n } else {\n // Otherwise, just close the modal.\n this.props.loginModalToggle();\n }\n }, 1000);\n }\n })\n .catch((error) => {\n this.setState({\n showErrorMessage: true,\n loading: false,\n });\n });\n };\n\n // Selecting a User from found Google Users list\n selectUser = async (record) => {\n if (this.props.context === \"Log In\") {\n await this.setState({ connecting: true }, async () => {\n // Connect the User to this Google Login, then login as the user\n await api\n .post(\"students/connectGoogle\", {\n body: JSON.stringify({\n student_id: record.id,\n email: this.googleProfile.email,\n google_user_id: this.googleProfile.sub,\n google_auth_id_token: this.googleAuth,\n }),\n })\n .then((res) => {\n //Convert to JSON in case we've received a string response\n if (typeof res === \"string\") {\n res = JSON.parse(res);\n }\n //Check for an error response (status of \"NOK\")\n if (\n res.status === \"NOK\" ||\n res.result.success === false\n ) {\n this.setState({\n showErrorMessage: true,\n errorMessage: res.result.error,\n });\n } else {\n this.props.loginSocialMediaUser(\n res,\n \"google\",\n () => {\n if (\n typeof this.props.loginModalCallback ===\n \"function\"\n ) {\n this.props.loginModalCallback();\n }\n }\n );\n }\n });\n });\n } else {\n // If they're trying to register, reset their status and then log them in.\n await this.setState({ connecting: true }, async () => {\n // Connect the User to this Google Login, then login as the user\n await api\n .post(\"students/connectGoogle\", {\n body: JSON.stringify({\n student_id: record.id,\n email: this.googleProfile.email,\n google_user_id: this.googleProfile.sub,\n google_auth_id_token: this.googleAuth,\n }),\n })\n .then((res) => {\n //Convert to JSON in case we've received a string response\n if (typeof res === \"string\") {\n res = JSON.parse(res);\n }\n //Check for an error response (status of \"NOK\")\n if (\n res.status === \"NOK\" ||\n res.result.success === false\n ) {\n this.setState({\n showErrorMessage: true,\n errorMessage: res.result.error,\n });\n } else {\n // Log them in and Reload the window\n this.props.loginSocialMediaUser(\n res,\n \"google\",\n () => {\n if (\n typeof this.props.loginModalCallback ===\n \"function\"\n ) {\n this.props.loginModalCallback();\n }\n }\n );\n }\n });\n });\n }\n };\n\n successfulGoogleConnection = async (credentialResponse) => {\n //set state, determine login or register and call func below.\n await this.setState(\n {\n loading: true,\n },\n async () => {\n this.googleProfile = decode(credentialResponse.credential);\n this.googleAuth = credentialResponse;\n await this.checkStudentExistsGoogle(\n this.googleProfile,\n this.googleAuth\n );\n }\n );\n };\n\n checkStudentExistsGoogle = async (googleProfile, googleAuth) => {\n //API Request\n await api\n .post(\"students/checkStudentExists\", {\n body: JSON.stringify({\n email: googleProfile.email,\n // + (config.environment === 'production' ? '' : Math.random().toString(36).replace(/[^a-z]+/g, ''))\n google_user_id: googleProfile.sub,\n google_auth_id_token: googleAuth,\n getData: true,\n }),\n })\n .then((data) => {\n if (data.result.access_token) {\n // User already Connected with Google.\n // Log them straight in and process our cart if needed.\n this.props.loginSocialMediaUser(data, \"google\", () => {\n if (\n typeof this.props.loginModalCallback === \"function\"\n ) {\n this.props.loginModalCallback();\n }\n });\n } else if (data.result.exists) {\n if (\n data.result.students.length === 1 &&\n data.result.students[0].google_user_id !==\n googleProfile.sub\n ) {\n // Email Exists and is NOT attached to Google ID\n this.setState(\n {\n loading: false,\n singleUser: data.result.students[0],\n },\n () => {\n this.modalToggle(\"singleUser\");\n }\n );\n } else if (data.result.students.length > 1) {\n // Multiple Students found with that email\n this.setState(\n {\n loading: false,\n multipleUsers: data.result.students,\n },\n () => {\n this.modalToggle(\"multipleUsers\");\n }\n );\n } else {\n // Email exists, but no unconnected students\n Modal.error({\n title: \"Unable to connect to Google Account.\",\n content: (\n \n Sorry - we were unable to connect your\n Google account to a student profile.\n
\n Please try again later, or contact us if you\n require assistance.\n
\n ),\n icon: false,\n closable: false,\n keyboard: false,\n okButtonProps: {\n type: \"primary\",\n },\n onOk: () => {\n this.setState({\n loading: false,\n });\n },\n });\n }\n } else {\n if (this.props.context === \"Log In\") {\n // Neither Google ID or Email Exist\n this.setState(\n {\n loading: false,\n },\n () => {\n this.modalToggle(\"noUser\");\n }\n );\n } else {\n // Create New Google Student\n this.createNewGoogleStudent();\n }\n }\n });\n };\n\n render() {\n return (\n \n \n {\n this.successfulGoogleConnection(credentialResponse);\n }}\n onError={() => {\n // Do Nothing\n }}\n useOneTap\n />\n \n {this.state.loading && }\n SELECT ACCOUNT}\n visible={this.state.multipleUsersModalVisible}\n onCancel={() => this.modalToggle(\"multipleUsers\")}\n footer={null}\n >\n

\n We have found multiple student accounts with that email\n address.\n
\n Unfortunately we can only link ONE to your Google\n account.\n
\n Please select an account from the list below.\n

\n\n {\n return (\n record.first_name +\n \" \" +\n record.last_name\n );\n },\n },\n {\n title: \"Action\",\n key: \"action\",\n width: 15,\n render: (text, record) => {\n return (\n \n );\n },\n },\n ]}\n rowKey={(record) => record.id}\n dataSource={this.state.multipleUsers}\n pagination={false}\n onRow={(record, rowIndex) => {\n return {\n onClick: (event) => this.selectUser(record),\n };\n }}\n />\n\n

\n If you believe this to be an error, or the students\n listed above are the same person, please contact the\n office so that we can assist you.\n

\n\n this.modalToggle(\"multipleUsers\")}\n >\n Cancel\n \n \n Connect Account?}\n visible={this.state.singleUserModalVisible}\n onCancel={() => this.modalToggle(\"singleUser\")}\n footer={null}\n >\n

\n Your Google Account is not linked to a Student record.\n
\n However, your email address exists in our system.\n
\n
\n Would you like to link this Google account to student{\" \"}\n \n \"{this.state.singleUser.first_name}{\" \"}\n {this.state.singleUser.last_name}\"\n \n ?\n

\n\n this.selectUser(this.state.singleUser)}\n >\n Yes\n \n this.modalToggle(\"singleUser\")}\n >\n Cancel\n \n \n Been here before?}\n visible={this.state.noUserModalVisible}\n onCancel={() => this.modalToggle(\"noUser\")}\n footer={null}\n >\n

\n Your Google Account is not linked to a Student record,\n and we don't have your email address in our system.\n
\n
\n Would you like to register a new account?\n
\n
\n If you believe this to be an error, please contact the\n office so that we can assist you.\n

\n\n {\n // Create New Google Student\n this.createNewGoogleStudent();\n }}\n >\n Yes\n \n this.modalToggle(\"noUser\")}\n >\n Cancel\n \n \n
\n );\n }\n}\n\nexport default GoogleLoginButton;\n","import React, { Suspense } from \"react\";\nimport { withRouter } from \"react-router\";\n\n//Ant Design Elements\nimport Alert from \"antd/lib/alert\";\nimport Button from \"antd/lib/button\";\nimport Col from \"antd/lib/col\";\nimport Form from \"antd/lib/form\";\nimport Input from \"antd/lib/input\";\nimport Modal from \"antd/lib/modal\";\nimport Row from \"antd/lib/row\";\nimport Tabs from \"antd/lib/tabs\";\n\nimport api from \"../../../helpers/api\";\nimport config from \"../../../config\";\n\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faStar, faTimes } from \"@fortawesome/free-solid-svg-icons\";\n\nimport GoogleLoginButton from \"../../elements/Social/GoogleLoginButton\";\nimport Spinner from \"../../elements/Spinner\";\n\nimport(\"../../../styles/LoginModal.css\" /* webpackChunkName: \"LoginModal\" */);\n\nclass Login extends React.Component {\n state = {\n loading: false,\n showErrorMessage: false,\n errorMessage: null,\n signUpButtonDisabled: true,\n logInButtonDisabled: true,\n showReferralCodeInput: false,\n checkingReferralCode: false,\n referralCodeValid: null,\n checkingSocialLogin: false,\n };\n\n toggleSocialLoginCheck = () => {\n this.setState({\n checkingSocialLogin: !this.state.checkingSocialLogin,\n });\n };\n\n goNextField = (e) => {\n if (e.key === \"Enter\") {\n var inputs = null;\n if (this.props.loginModalTab === \"login\") {\n inputs = document.querySelectorAll(\"#login_form input\");\n } else {\n inputs = document.querySelectorAll(\"#register_form input\");\n }\n\n var lastElement = true;\n for (var i = 0; i < inputs.length; i++) {\n if (inputs[i] === e.target && !!inputs[i + 1]) {\n lastElement = false;\n document.activeElement.blur();\n document.activeElement.removeAttribute(\"autofocus\");\n\n inputs[i + 1].setAttribute(\"autofocus\", \"autofocus\");\n inputs[i + 1].focus();\n }\n }\n if (lastElement) {\n this.submitLogin();\n }\n }\n };\n\n submitLogin = () => {\n let fieldsToValidate = null;\n if (this.props.loginModalTab === \"login\") {\n fieldsToValidate = [\"email\", \"password\"];\n } else if (this.props.loginModalTab === \"forgot\") {\n fieldsToValidate = [\"forgot_email\"];\n } else {\n fieldsToValidate = [\n \"register_first_name\",\n \"register_last_name\",\n \"register_mobile_phone\",\n \"register_email\",\n \"register_password\",\n ];\n }\n this.props.form.validateFields(\n fieldsToValidate,\n async (err, values) => {\n if (\n err ||\n this.state.referralCodeValid === false ||\n !this.checkReferralCode()\n ) {\n return false;\n }\n\n // Login\n if (this.props.loginModalTab === \"login\") {\n this.setState(\n {\n loading: true,\n },\n async () => {\n return api\n .post(\"students/login\", {\n body: JSON.stringify(values),\n })\n .then(async (res) => {\n //Convert to JSON in case we've received a string response\n if (typeof res === \"string\") {\n res = JSON.parse(res);\n }\n //Check for an error response (status of \"NOK\")\n if (\n res.status === \"NOK\" ||\n res.result.success === false\n ) {\n this.setState({\n showErrorMessage: true,\n errorMessage: res.result.error,\n loading: false,\n });\n } else {\n let previouslyAssignedDT = null;\n if (this.props.shell_student) {\n previouslyAssignedDT = !!this.props\n .assignedDriverTrainer\n ? this.props\n .assignedDriverTrainer.id\n : null;\n }\n this.props.sendPageviewToGoogleAnalytics(\n \"/virtual/bookings-new/user-details/login\"\n );\n this.props.sendEventToGoogleTagManager({\n event: \"user-login\",\n });\n // Smartlook - Track User Login\n if (\n window.location.hostname ===\n \"app.ltrent.com.au\" &&\n typeof smartlook !== \"undefined\" &&\n typeof smartlook === \"function\"\n ) {\n // eslint-disable-next-line\n /*global smartlook*/ // This line prevents the below throwing an error when not on production\n smartlook(\"track\", \"user\", {\n type: \"login\",\n });\n }\n\n // Set all of our App Level properties\n // If this is not a prelim flagged user, set the DT\n if (\n !this.props.prelim &&\n !this.props.shell_student\n ) {\n this.props.setAppStateValue(\n \"assignedDriverTrainer\",\n {\n id: res.result.user.student\n .driver_trainer_id,\n display_name:\n res.result.user.student\n ?.driver_trainer ===\n null\n ? null\n : res.result.user\n .student\n ?.driver_trainer\n ?.display_name,\n headshot:\n typeof res.result.user\n .student\n ?.driver_trainer\n ?.website_headshot !==\n \"undefined\" &&\n res.result.user.student\n ?.driver_trainer\n ?.website_headshot !==\n null &&\n res.result.user.student\n ?.driver_trainer\n ?.website_headshot !==\n \"\"\n ? res.result.user\n .student\n ?.driver_trainer\n ?.website_headshot\n : typeof res.result\n .user.student\n ?.driver_trainer\n ?.website_photo !==\n \"undefined\" &&\n res.result.user\n .student\n ?.driver_trainer\n ?.website_photo !==\n null &&\n res.result.user\n .student\n ?.driver_trainer\n ?.website_photo !==\n \"\"\n ? res.result.user\n .student\n ?.driver_trainer\n ?.website_photo\n : process.env\n .REACT_APP_SITE_URL +\n \"/img/default-headshot.webp\", // @todo: remove this fallback to using website_photo when we remove that field in favour of headshots\n website_bio:\n res.result.user.student\n ?.driver_trainer ===\n null\n ? null\n : res.result.user\n .student\n ?.driver_trainer\n ?.website_bio,\n transmissionType:\n res.result.user.student\n ?.driver_trainer ===\n null\n ? \"A\"\n : res.result.user\n .student\n ?.driver_trainer\n ?.vehicle_transmission,\n },\n true\n );\n }\n\n this.props.setAppStateValue(\n \"timestamps\",\n {\n user: res.result.user.modified,\n student:\n res.result.user.student\n .modified,\n },\n true\n );\n if (\n typeof res.result.user.address !==\n \"undefined\" &&\n res.result.user.address !== null\n ) {\n this.props.setAppStateValue(\n \"pickupAddressString\",\n res.result.user.address\n .street_number +\n \" \" +\n res.result.user.address\n .street_name +\n \", \" +\n res.result.user.address\n .suburb\n .suburb_full_details\n );\n this.props.setAppStateValue(\n \"pickup_address_id\",\n res.result.user.address.id\n );\n this.props.setAppStateValue(\n \"pickup_address_postcode\",\n res.result.user.address.suburb\n .post_code\n );\n this.props.setAppStateValue(\n \"pickup_address_state\",\n res.result.user.address.suburb\n .states.name\n );\n this.props.setAppStateValue(\n \"pickup_address_street_name\",\n res.result.user.address\n .street_name\n );\n this.props.setAppStateValue(\n \"pickup_address_street_number\",\n res.result.user.address\n .street_number\n );\n this.props.setAppStateValue(\n \"pickup_address_suburb_id\",\n res.result.user.address\n .suburb_id\n );\n this.props.setAppStateValue(\n \"pickup_address_suburb_name\",\n res.result.user.address.suburb\n .suburb_name\n );\n }\n this.props.setAppStateValue(\n \"transmissionType\",\n res.result.user.student\n ?.driver_trainer === null\n ? \"A\"\n : res.result.user.student\n ?.driver_trainer\n ?.vehicle_transmission\n );\n this.props.setAppStateValue(\n \"existingUser\",\n true\n );\n this.props.setAppStateValue(\n \"completedLesson\",\n typeof res.result.user\n .completed_lessons ===\n \"undefined\" ||\n res.result.user\n .completed_lessons ===\n null ||\n parseInt(\n res.result.user\n .completed_lessons\n ) === 0\n ? false\n : true\n );\n this.props.setAppStateValue(\n \"futureLessons\",\n typeof res.result.user\n .has_future_lessons ===\n \"undefined\" ||\n res.result.user\n .has_future_lessons === null\n ? false\n : res.result.user\n .has_future_lessons\n );\n this.props.setAppStateValue(\n \"referringStudentName\",\n (typeof res.result.user.referring_student_name === \"undefined\" || res.result.user.referring_student_name === null)\n ? \"\"\n : res.result.user.referring_student_name\n );\n\n this.props.cookies.set(\n config.environmentShort + \"AT\",\n res.result.access_token,\n {\n path: \"/\",\n domain: config.siteDomain,\n }\n );\n this.props.setAppStateValue(\n \"prepaidData\",\n {\n available: parseFloat(\n res.result.user?.credits\n ?.remaining\n ),\n using: 0,\n remaining: 0,\n owing: 0,\n mod1: !!res.result.user.credits\n ?.sdc_remaining\n ? parseInt(\n res.result.user\n .credits\n .sdc_remaining[10]\n )\n : 0,\n mod2: !!res.result.user.credits\n ?.sdc_remaining\n ? parseInt(\n res.result.user\n .credits\n .sdc_remaining[11]\n )\n : 0,\n },\n true\n );\n this.props.setAppStateValue(\n \"user\",\n {\n id: res.result.user.id,\n email: res.result.user.email,\n mobile_phone:\n res.result.user\n .mobile_phone,\n first_name:\n res.result.user.first_name,\n last_name:\n res.result.user.last_name,\n licence_number:\n res.result.user.student\n .licence_number,\n hours: res.result.user.student\n .driving_experience,\n dob: res.result.user.dob,\n hadSDC: res.result.user.hadSDC,\n referral_code:\n res.result.user\n .referral_code,\n hide_cash:\n res.result.user.student\n .hide_cash_on_website,\n },\n false,\n async () => {\n this.props.setAppStateValue(\n \"pickupAddressChosen\",\n typeof res.result.user\n .address ===\n \"undefined\" &&\n res.result.user\n .address !== null\n ? false\n : true\n );\n\n if (\n this.props\n .completedLesson ||\n this.props.futureLessons\n ) {\n if (\n config.showCompetition\n ) {\n this.props.addCustomBanner(\n \"referral\",\n 'Refer a friend. Win a car! - Ltrent is giving away a brand new MG3. Learn More',\n \"\"\n );\n }\n } else if (\n res.result.user\n .referring_student_name\n ) {\n this.props.addCustomBanner(\n \"referral\",\n \"You have been referred by \" +\n res.result.user\n .referring_student_name +\n \". Complete your booking for a $20 discount on your next lesson!\",\n \"\"\n );\n } else if (\n this.props\n .studentReferralCode &&\n this.props\n .studentReferralCode !==\n this.props?.user\n ?.referral_code\n ) {\n this.verifyReferralCode(\n this.props\n .studentReferralCode,\n false\n );\n\n this.addReferralCodeToExistingAccount(\n this.props\n .studentReferralCode,\n res.result.user.id\n );\n }\n\n // Clear Cart if Assigned DT Clash:\n let dtClash = false;\n // Check for NO Assigned DT.. that's actually okay, but we'll need to assign THIS DT\n if (\n this.props.shell_student &&\n res.result.user.student\n .driver_trainer_id ===\n null\n ) {\n // Assign the selected DT to the Student\n api.post(\n \"students/assignDT\",\n {\n body: JSON.stringify(\n {\n student_id:\n res\n .result\n .user\n .id,\n driver_trainer_id:\n previouslyAssignedDT,\n }\n ),\n }\n ).catch((error) => {\n console.log(error);\n });\n }\n // Check for Assigned DT != Current DT.. Clear Cart and Alert User\n else if (\n this.props.shell_student &&\n previouslyAssignedDT !==\n null &&\n parseInt(\n previouslyAssignedDT\n ) !==\n parseInt(\n res.result.user\n .student\n .driver_trainer_id\n )\n ) {\n // Set dtClash = true to throw error later\n dtClash = true;\n this.props.clearReservations();\n this.props.setAppStateValue(\n \"cart\",\n {},\n true\n );\n this.props.setAppStateValue(\n \"bookings\",\n {},\n true\n );\n this.props.setAppStateValue(\n \"bookingsSDC\",\n {},\n true\n );\n // Force the Assigned DT to the Student's Assigned DT\n this.props.setAppStateValue(\n \"assignedDriverTrainer\",\n {\n id: res.result.user\n .student\n .driver_trainer_id,\n display_name:\n res.result.user\n .student\n ?.driver_trainer ===\n null\n ? null\n : res.result\n .user\n .student\n ?.driver_trainer\n ?.display_name,\n headshot:\n typeof res\n .result.user\n .student\n ?.driver_trainer\n ?.website_headshot !==\n \"undefined\" &&\n res.result.user\n .student\n ?.driver_trainer\n ?.website_headshot !==\n null &&\n res.result.user\n .student\n ?.driver_trainer\n ?.website_headshot !==\n \"\"\n ? res.result\n .user\n .student\n ?.driver_trainer\n ?.website_headshot\n : typeof res\n .result\n .user\n .student\n ?.driver_trainer\n ?.website_photo !==\n \"undefined\" &&\n res.result\n .user\n .student\n ?.driver_trainer\n ?.website_photo !==\n null &&\n res.result\n .user\n .student\n ?.driver_trainer\n ?.website_photo !==\n \"\"\n ? res.result\n .user\n .student\n ?.driver_trainer\n ?.website_photo\n : process\n .env\n .REACT_APP_SITE_URL +\n \"/img/default-headshot.webp\", // @todo: remove this fallback to using website_photo when we remove that field in favour of headshots\n website_bio:\n res.result.user\n .student\n ?.driver_trainer ===\n null\n ? null\n : res.result\n .user\n .student\n ?.driver_trainer\n ?.website_bio,\n transmissionType:\n res.result.user\n .student\n ?.driver_trainer ===\n null\n ? \"A\"\n : res.result\n .user\n .student\n ?.driver_trainer\n ?.vehicle_transmission,\n },\n true\n );\n }\n\n // Check for Student Clashes (is logged in Student busy at any of the Reserved times?)\n let studentClash = false;\n if (\n !dtClash &&\n this.props.shell_student\n ) {\n let clashingBookings =\n await this.props.checkStudentClashes(\n res.result.user.id\n );\n if (\n clashingBookings.length >\n 0\n ) {\n // Cancel any Unavailable ones, remove from Bookings object\n let cloneBookings = {\n ...this.props\n .bookings,\n };\n\n // Loop through and Cancel any Reservations that Clash\n Object.values(\n clashingBookings\n ).forEach(\n (booking_id) => {\n if (\n !!cloneBookings[\n booking_id\n ]\n ) {\n // Remove from Bookings object\n delete cloneBookings[\n booking_id\n ];\n // Send Cancel Reservation API Request - We don't need to wait for a response - just assume it's ok\n api.post(\n \"bookings/cancelReservation\",\n {\n body: JSON.stringify(\n {\n booking:\n booking_id,\n student: true,\n }\n ),\n }\n ).then(\n () => {\n this.props.sendEventToGoogleTagManager(\n {\n event: \"cart-removal-driving-lesson\",\n }\n );\n }\n );\n }\n }\n );\n // Update State\n this.props.updateBookingsDuration();\n this.props.setAppStateValue(\n \"bookings\",\n cloneBookings,\n true\n );\n\n // Alert Student\n studentClash = true;\n }\n }\n\n // Clear Shell Student status, we're now logged in.\n this.props.setAppStateValue(\n \"shell_student\",\n false\n );\n\n // Hide Login Modal\n this.props.setAppStateValue(\n \"loginModalVisible\",\n false\n );\n\n // Start Student TimeStamp Polling\n this.props.startStudentTimeStampChecker();\n\n // Finish Up - Either show an Error, or process the supplied Callback\n if (\n !studentClash &&\n !dtClash &&\n typeof this.props\n .loginModalCallback ===\n \"function\"\n ) {\n this.props.loginModalCallback();\n } else if (dtClash) {\n Modal.error({\n icon: false,\n title: false,\n content: (\n <>\n

\n Welcome\n back!\n

\n

\n Sorry, the\n reservation(s)\n you had did\n not match\n your\n Assigned\n Driver\n Trainer.\n

\n

\n Please try\n again. The\n available\n times shown\n will now be\n those of\n your Driver\n Trainer.\n

\n

\n If you are\n having\n trouble\n booking,\n please{\" \"}\n \n contact\n our\n office\n \n .\n

\n \n ),\n });\n } else if (studentClash) {\n Modal.error({\n icon: false,\n title: false,\n content: (\n <>\n

\n Welcome\n back!\n

\n

\n Sorry, some\n of the\n Reservations\n you had in\n your Cart\n clashed with\n other\n Bookings in\n your\n account.\n

\n

\n Please try\n again. The\n times shown\n will now be\n those where\n both you and\n your Driver\n Trainer are\n available.\n

\n

\n If you are\n having\n trouble\n booking,\n please{\" \"}\n \n contact\n our\n office\n \n .\n

\n \n ),\n });\n }\n }\n );\n }\n })\n .catch((error) => {\n this.setState({\n loading: false,\n showErrorMessage: true,\n errorMessage:\n \"Error logging in. Please try again.\",\n });\n });\n }\n );\n } else if (this.props.loginModalTab === \"forgot\") {\n // Forgot Password - Sends Reset Email\n this.setState(\n {\n loading: true,\n showErrorMessage: false,\n errorMessage: null,\n },\n () => {\n return api\n .post(\"students/reset-password\", {\n body: JSON.stringify({\n email: values.forgot_email,\n site: \"APP\",\n }),\n })\n .then((res) => {\n //Convert to JSON in case we've received a string response\n if (typeof res === \"string\") {\n res = JSON.parse(res);\n }\n //Check for an error response (status of \"NOK\")\n if (\n res.status === \"NOK\" ||\n res.result.success === false\n ) {\n this.setState({\n showErrorMessage: true,\n errorMessage: res.result.error,\n loading: false,\n });\n } else {\n this.props.sendEventToGoogleTagManager({\n event: \"user-forgot-password\",\n });\n Modal.success({\n title: false,\n content: (\n
\n

{res.result.message}

\n
\n ),\n closable: false,\n keyboard: false,\n onOk: () => {\n this.setState(\n {\n showErrorMessage: false,\n errorMessage: null,\n loading: false,\n },\n () => {\n // Close the Login Modal.\n this.props.loginModalToggle();\n }\n );\n },\n });\n }\n });\n }\n );\n } else {\n if (this.state.referralCodeValid === false) {\n return false;\n }\n\n // Sign Up - Check existing student first\n this.setState(\n {\n loading: true,\n },\n () => {\n // Check for Existing Student\n this.props.checkStudentExists(\n () => {\n // Rename variables:\n values.email = values.register_email;\n values.first_name =\n values.register_first_name;\n values.last_name =\n values.register_last_name;\n values.mobile_phone =\n values.register_mobile_phone;\n values.password = values.register_password;\n values.confirm = values.register_password;\n\n // Send the address from their first booking, and their assigned driver_trainer_id\n if (this.props.pickup_address_id !== null) {\n values.address_id =\n this.props.pickup_address_id;\n } else {\n values.pickup_suburb =\n this.props.pickup_address_suburb_id;\n values.pickup_address_street_number =\n this.props.pickup_address_street_number;\n values.pickup_address_street_name =\n this.props.pickup_address_street_name;\n }\n\n if (this.props.studentReferralCode) {\n values.referral_code =\n this.props.studentReferralCode;\n }\n\n if (this.props.driverReferralCode) {\n values.driver_referral_code =\n this.props.driverReferralCode;\n }\n\n values.source = \"app\";\n\n // Shell ?\n values.shell = this.props.shell_student;\n values.student_id = this.props.shell_student\n ? this.props.user.id\n : null;\n\n return api\n .post(\"students/save\", {\n body: JSON.stringify(values),\n })\n .then((res) => {\n //Convert to JSON in case we've received a string response\n if (typeof res === \"string\") {\n res = JSON.parse(res);\n }\n //Check for an error response (status of \"NOK\")\n if (\n res.status === \"NOK\" ||\n res.result.success === false\n ) {\n this.setState({\n showErrorMessage: true,\n loading: false,\n });\n } else {\n if (!this.props.shell_student) {\n // Save the access token\n this.props.cookies.set(\n config.environmentShort +\n \"AT\",\n res.result.access_token,\n {\n path: \"/\",\n domain: config.siteDomain,\n }\n );\n // Update state\n this.props.setAppStateValue(\n \"user\",\n {\n id: res.result\n .student_id,\n }\n );\n } else {\n // Update state\n this.props.setAppStateValue(\n \"user\",\n {\n email: res.result\n .user.email,\n }\n );\n this.props.setAppStateValue(\n \"user\",\n {\n first_name:\n res.result.user\n .first_name,\n }\n );\n this.props.setAppStateValue(\n \"user\",\n {\n last_name:\n res.result.user\n .last_name,\n }\n );\n this.props.setAppStateValue(\n \"user\",\n {\n mobile_phone:\n res.result.user\n .mobile_phone,\n }\n );\n }\n this.props.sendPageviewToGoogleAnalytics(\n \"/virtual/bookings-new/user-details/login\"\n ); //First ping to signal login\n this.props.sendEventToGoogleTagManager(\n {\n event: \"user-signup\",\n }\n );\n // Smartlook - Track User Registration\n if (\n window.location.hostname ===\n \"app.ltrent.com.au\" &&\n typeof smartlook !==\n \"undefined\" &&\n typeof smartlook ===\n \"function\"\n ) {\n // eslint-disable-next-line\n /*global smartlook*/ // This line prevents the below throwing an error when not on production\n smartlook(\"track\", \"user\", {\n type: \"registration\",\n });\n }\n // Call the callback function if one exists\n if (\n typeof this.props\n .loginModalCallback ===\n \"function\"\n ) {\n this.props.loginModalCallback();\n }\n // Start Student TimeStamp Polling\n this.props.startStudentTimeStampChecker();\n }\n })\n .catch((error) => {\n this.setState({\n showErrorMessage: true,\n loading: false,\n });\n });\n },\n values.register_email,\n values.register_mobile_phone\n );\n }\n );\n }\n }\n );\n };\n\n changeTab = (activeKey) => {\n this.setState(\n {\n showErrorMessage: false,\n errorMessage: null,\n },\n () => {\n this.props.setAppStateValue(\"loginModalTab\", activeKey);\n }\n );\n };\n\n validateSignUpForm = () => {\n if (\n // All Fields Required:\n document.getElementById(\"login_form_register_first_name\") !==\n null &&\n document.getElementById(\"login_form_register_first_name\").value !==\n \"\" &&\n document.getElementById(\"login_form_register_last_name\") !== null &&\n document.getElementById(\"login_form_register_last_name\").value !==\n \"\" &&\n document.getElementById(\"login_form_register_mobile_phone\") !==\n null &&\n document.getElementById(\"login_form_register_mobile_phone\")\n .value !== \"\" &&\n document.getElementById(\"login_form_register_email\") !== null &&\n document.getElementById(\"login_form_register_email\").value !== \"\" &&\n document.getElementById(\"login_form_register_password\") !== null &&\n document.getElementById(\"login_form_register_password\").value !== \"\"\n ) {\n let fieldsToValidate = [\n \"register_first_name\",\n \"register_last_name\",\n \"register_mobile_phone\",\n \"register_email\",\n \"register_password\",\n ];\n this.props.form.validateFields(fieldsToValidate, (err, values) => {\n if (!err && this.state.referralCodeValid !== false) {\n // No Errors : Disabled = False\n this.setState({\n signUpButtonDisabled: false,\n });\n } else {\n // Errors : Disabled = True\n this.setState({\n signUpButtonDisabled: true,\n });\n }\n });\n } else {\n // Fields Empty : Disabled = True\n this.setState({\n signUpButtonDisabled: true,\n });\n }\n };\n\n validateLogInForm = () => {\n if (\n // All Fields Required:\n document.getElementById(\"login_form_email\") !== null &&\n document.getElementById(\"login_form_email\").value !== \"\" &&\n document.getElementById(\"login_form_password\") !== null &&\n document.getElementById(\"login_form_password\").value !== \"\"\n ) {\n let fieldsToValidate = [\"email\", \"password\"];\n this.props.form.validateFields(fieldsToValidate, (err, values) => {\n if (!err) {\n // No Errors : Disabled = False\n this.setState({\n logInButtonDisabled: false,\n });\n } else {\n // Errors : Disabled = True\n this.setState({\n logInButtonDisabled: true,\n });\n }\n });\n } else {\n // Fields Empty : Disabled = True\n this.setState({\n logInButtonDisabled: true,\n });\n }\n };\n\n addReferralCodeToExistingAccount = async (referralCode, user_id) => {\n return api\n .post(\"students/update/details\", {\n body: JSON.stringify({\n referral_code: referralCode,\n source: \"app\",\n id: user_id,\n }),\n })\n .then((res) => {\n //Convert to JSON in case we've received a string response\n if (typeof res === \"string\") {\n res = JSON.parse(res);\n }\n\n return true;\n })\n .catch((error) => {\n return false;\n });\n };\n\n verifyReferralCode = (referralCode, isSignUp = false) => {\n api.post(\"students/verifyReferralCode\", {\n body: JSON.stringify({\n referral_code: referralCode,\n }),\n })\n .then((res) => {\n //Convert to JSON in case we've received a string response\n if (typeof res === \"string\") {\n res = JSON.parse(res);\n }\n\n let referringStudentName =\n res.result.referrer.first_name +\n \" \" +\n res.result.referrer.last_name;\n\n this.props.setAppStateValue(\n \"studentReferralCode\",\n referralCode\n );\n this.props.setAppStateValue(\n \"referringStudentName\",\n referringStudentName,\n true,\n () => {\n this.props.storeEncryptedState();\n }\n );\n\n this.props.addCustomBanner(\n \"referral\",\n \"You have been referred by \" +\n referringStudentName +\n \". Complete your booking for a $20 discount on your next lesson!\",\n \"\"\n );\n\n if (isSignUp) {\n this.setState(\n {\n checkingReferralCode: false,\n referralCodeValid: true,\n showReferralCodeInput: false,\n },\n () => this.validateSignUpForm()\n );\n }\n\n return true;\n })\n .catch((error) => {\n this.props.setAppStateValue(\"referringStudentName\", \"\");\n\n this.setState({\n checkingReferralCode: false,\n referralCodeValid: false,\n });\n\n return false;\n });\n };\n\n checkReferralCode = () => {\n if (\n document.getElementById(\"login_form_referral_code\") &&\n document.getElementById(\"login_form_referral_code\").value !== \"\"\n ) {\n this.setState({\n checkingReferralCode: true,\n referralCodeValid: null,\n signUpButtonDisabled: true,\n });\n\n let referralCode = document.getElementById(\n \"login_form_referral_code\"\n ).value;\n\n this.verifyReferralCode(referralCode, true);\n } else {\n this.setState({ referralCodeValid: null }, () =>\n this.validateSignUpForm()\n );\n return true;\n }\n };\n\n render() {\n const { getFieldDecorator } = this.props.form;\n\n return (\n \n }\n className=\"login-modal\"\n title={false}\n visible={this.props.loginModalVisible}\n onCancel={() => this.props.loginModalToggle()}\n footer={null}\n width={null}\n destroyOnClose\n style={{ top: 50 }}\n >\n \n \n {this.state.checkingSocialLogin ? (\n \n \n \n ) : null}\n\n \n \n \n Register Your Student Details\n

\n
\n \n {this.props.shell_student ? (\n <>\n You're only 1 step away from\n confirming your booking!\n \n ) : (\n <>\n Please complete this short\n registration form to be paired\n with your personal driving\n instructor.\n \n )}\n

\n \n Existing Student?{\" \"}\n \n this.changeTab(\"login\")\n }\n >\n Log In\n \n

\n\n
\n\n
\n \n {getFieldDecorator(\n \"register_first_name\",\n {\n rules: [\n {\n required: true,\n message:\n \"Enter your First Name.\",\n whitespace: true,\n },\n {\n max: 30,\n message:\n \"First Name cannot be more than 30 characters.\",\n },\n ],\n }\n )(\n \n )}\n \n \n {getFieldDecorator(\n \"register_last_name\",\n {\n rules: [\n {\n required: true,\n message:\n \"Enter your Last Name.\",\n whitespace: true,\n },\n {\n max: 30,\n message:\n \"Last Name cannot be more than 30 characters.\",\n },\n ],\n }\n )(\n \n )}\n \n
\n \n {getFieldDecorator(\n \"register_mobile_phone\",\n {\n getValueFromEvent: (\n e: React.FormEvent\n ) => {\n if (\n isNaN(\n Number(\n e.target.value\n )\n )\n ) {\n return this.props.form.getFieldValue(\n \"register_mobile_phone\"\n );\n } else {\n return e.target.value;\n }\n },\n rules: [\n {\n required: true,\n message:\n \"Enter your Mobile Number.\",\n whitespace: true,\n },\n {\n min: 10,\n message:\n \"Mobile Number must be 10 characters.\",\n },\n ],\n }\n )(\n \n )}\n \n\n \n {getFieldDecorator(\"register_email\", {\n rules: [\n {\n required: true,\n type: \"email\",\n message:\n \"Enter a valid Email.\",\n whitespace: true,\n },\n {\n max: 60,\n message:\n \"Email cannot be more than 60 characters.\",\n },\n ],\n })(\n \n )}\n \n \n {getFieldDecorator(\n \"register_password\",\n {\n rules: [\n {\n required: true,\n message:\n \"Password must be at least 6 characters.\",\n whitespace: true,\n },\n {\n min: 6,\n message:\n \"Password must be at least 6 characters.\",\n },\n ],\n }\n )(\n \n )}\n \n\n {this.props.studentReferralCode &&\n this.props.referringStudentName && (\n \n \n You have been referred by{\" \"}\n {\n this.props\n .referringStudentName\n }\n \n
\n \n Receive a $20 discount\n voucher after you complete\n your first lesson.\n \n
\n )}\n\n {!(\n this.props.studentReferralCode &&\n this.props.referringStudentName\n ) &&\n !this.state.showReferralCodeInput && (\n \n \n this.setState({\n showReferralCodeInput: true,\n })\n }\n >\n Have a referral code?\n \n \n )}\n\n {this.state.showReferralCodeInput && (\n \n {getFieldDecorator(\n \"referral_code\",\n {}\n )(\n \n )}\n {this.state\n .checkingReferralCode && (\n \n {\" \"}\n Checking Referral Code...\n \n )}\n {this.state.referralCodeValid ===\n false && (\n \n )}\n \n )}\n\n {this.state.showErrorMessage && (\n
\n \n
\n )}\n\n this.submitLogin()}\n disabled={\n this.state.signUpButtonDisabled\n }\n >\n Proceed\n \n\n
or
\n\n
\n \n
\n \n \n\n \n \n Log In\n

\n
\n \n Don't have an account?{\" \"}\n \n this.changeTab(\"register\")\n }\n >\n Sign Up\n \n

\n\n
\n\n \n {getFieldDecorator(\"email\", {\n rules: [\n {\n required: true,\n type: \"email\",\n message:\n \"Enter a valid Email.\",\n whitespace: true,\n },\n {\n max: 60,\n message:\n \"Email cannot be more than 60 characters.\",\n },\n ],\n })(\n \n )}\n \n \n {getFieldDecorator(\"password\", {\n rules: [\n {\n required: true,\n message:\n \"Password must be at least 6 characters.\",\n whitespace: true,\n },\n {\n min: 6,\n message:\n \"Password must be at least 6 characters.\",\n },\n ],\n })(\n \n )}\n \n \n this.changeTab(\"forgot\")\n }\n >\n Forgotten Your Password?\n \n

\n
\n\n
\n\n {this.state.showErrorMessage && (\n
\n \n
\n )}\n\n this.submitLogin()}\n disabled={\n this.state.logInButtonDisabled\n }\n >\n Log In\n \n\n
or
\n\n
\n \n
\n \n
\n\n \n \n Forget Your Password?\n

\n \n No worries, it happens!\n

\n \n Please enter your email address below and\n we'll send you a link to reset your\n password.\n

\n
\n \n {getFieldDecorator(\"forgot_email\", {\n rules: [\n {\n required: true,\n type: \"email\",\n message:\n \"Enter a valid Email.\",\n whitespace: true,\n },\n {\n max: 60,\n message:\n \"Email cannot be more than 60 characters.\",\n },\n ],\n })(\n \n )}\n \n\n {this.state.showErrorMessage && (\n
\n \n
\n )}\n\n this.submitLogin()}\n disabled={\n this.state.forgotButtonDisabled\n }\n style={{ marginTop: \"25px\" }}\n >\n Reset Password\n \n \n
\n \n \n {!this.props.shell_student && (\n \n \n
\n

\n \"I had Rob Barilla at{\" \"}\n {config.drivingSchoolMediumName} and it was\n a great and fulfilling experience! The\n lessons were organised, enjoyable and\n helpful. Thanks to Rob for helping get my\n red P's\"\n

\n
\n

- Gemma

\n

\n \n \n \n \n \n

\n
\n
\n \n )}\n
\n \n );\n }\n}\n\nconst LoginModal = Form.create({ name: \"login_form\" })(Login);\n\nexport default withRouter(LoginModal);\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\n\n//Ant Design Elements\nimport AutoComplete from \"antd/lib/auto-complete\";\nimport Button from \"antd/lib/button\";\nimport Col from \"antd/lib/col\";\nimport Row from \"antd/lib/row\";\n\nimport config from \"../../../config\";\nimport api from \"../../../helpers/api\";\nimport history from \"../../../helpers/history\";\n\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faMapMarkerAlt } from \"@fortawesome/free-solid-svg-icons\";\n\nlet suburbLookupTimeout;\nlet currentSuburb;\n\nclass SuburbDropDown extends React.Component {\n state = {\n suburbs: [],\n autoCompleteDisabled: false,\n searchedSuburbName: null,\n renderCounter: 0,\n };\n\n componentDidUpdate = (prevProps) => {\n if (\n prevProps.pickup_address_suburb_manual_string !==\n this.props.pickup_address_suburb_manual_string\n ) {\n // Force Re-Render to pickup a parent state change\n this.setState({ renderCounter: this.state.renderCounter + 1 });\n }\n };\n\n disableAutoComplete = () => {\n if (!this.state.autoCompleteDisabled) {\n const elementsToDisable = document.querySelectorAll(\n \".zero-autocomplete, .ant-select-search__field\"\n );\n\n for (let i = 0; i < elementsToDisable.length; i++) {\n elementsToDisable[i].setAttribute(\n \"autocomplete\",\n \"any-arbitrary-text\"\n );\n }\n this.setState({ autoCompleteDisabled: true });\n }\n };\n\n handleSuburbSearch = (value) => {\n this.suburbLookup(value, (suburbs) => this.setState({ suburbs }));\n };\n\n suburbLookup = (value, callback) => {\n if (suburbLookupTimeout) {\n clearTimeout(suburbLookupTimeout);\n suburbLookupTimeout = null;\n }\n currentSuburb = value;\n\n function debouncedLookup() {\n api.post(\"suburbs/search\", {\n body: JSON.stringify({\n search: value,\n }),\n }).then((d) => {\n if (currentSuburb === value) {\n const data = [];\n if (\n typeof d.result !== \"undefined\" &&\n typeof d.result.suburbs !== \"undefined\"\n ) {\n d.result.suburbs.forEach((r) => {\n data.push({\n value: r.id,\n text: r.suburb_name,\n });\n });\n }\n callback(data);\n }\n });\n }\n suburbLookupTimeout = setTimeout(debouncedLookup, 300);\n };\n\n pickupSuburbSelection = (suburb_id, option) => {\n let params = {\n suburb_id: suburb_id,\n };\n this.props.setAppStateValue(\"pickupAddressManualFields\", false);\n api.post(\"webBookings/suburbById\", {\n body: JSON.stringify(params),\n }).then((data) => {\n if (typeof data.result === \"object\" && data.result.suburb) {\n this.props.setAppStateValue(\n \"pickup_address_suburb_id\",\n data.result.suburb.id,\n true,\n () => {\n this.props.setAppStateValue(\n \"pickup_address_suburb_name\",\n data.result.suburb.suburb_name,\n true,\n () => {\n this.props.setAppStateValue(\n \"pickup_address_suburb_manual_string\",\n option.props.children\n );\n this.props.setAppStateValue(\n \"pickup_address_state\",\n data.result.suburb.states.name\n );\n this.props.setAppStateValue(\n \"pickup_address_postcode\",\n data.result.suburb.post_code\n );\n this.props.setAppStateValue(\n \"pickupAddressManualFields\",\n true\n );\n }\n );\n }\n );\n }\n });\n };\n\n submitSearch = () => {\n if (document.getElementById(\"root\") !== null) {\n history.push(\n \"/book/lesson/?suburb=\" +\n this.props.pickup_address_suburb_id +\n \"&vehicle_type=\" +\n this.props.transmissionType\n );\n } else {\n window.top.location.href =\n config.siteUrl +\n \"/book/lesson/?suburb=\" +\n this.props.pickup_address_suburb_id +\n \"&vehicle_type=\" +\n this.props.transmissionType;\n }\n };\n\n render() {\n const suburbs = this.state.suburbs.map((d) => (\n {d.text}\n ));\n return ReactDOM.createPortal(\n \n \n \n {\" \"}\n Search Suburb\n \n }\n >\n {suburbs}\n \n \n \n this.submitSearch()}\n disabled={\n this.props.pickup_address_suburb_manual_string ===\n null\n }\n >\n Search Times\n \n \n ,\n document.getElementById(this.props.element)\n );\n }\n}\n\nexport default SuburbDropDown;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport config from \"../../../config\";\nimport LoginModal from \"../../elements/Students/LoginModal\";\n\nclass LoginLogout extends React.Component {\n render() {\n return ReactDOM.createPortal(\n \n {((!this.props.user.id &&\n this.props.newGoogleUser === null &&\n this.props.newFacebookUser === null) ||\n this.props.shell_student) && (\n
\n this.props.loginModalToggle(\"login\")}\n >\n Log In\n \n
\n )}\n {!(\n (!this.props.user.id &&\n this.props.newGoogleUser === null &&\n this.props.newFacebookUser === null) ||\n this.props.shell_student\n ) && (\n \n My Profile\n \n )}\n {(!this.props.user.id || this.props.shell_student) &&\n this.props.loginModalVisible && (\n \n )}\n
,\n document.getElementById(this.props.element)\n );\n }\n}\n\nexport default LoginLogout;\n","import React from \"react\";\nimport { withRouter } from \"react-router\";\nimport ReactDOM from \"react-dom\";\n\n//Ant Design Elements\nimport Button from \"antd/lib/button\";\nimport Drawer from \"antd/lib/drawer\";\nimport Form from \"antd/lib/form\";\nimport Input from \"antd/lib/input\";\nimport Modal from \"antd/lib/modal\";\n\nimport api from \"../../../helpers/api\";\nimport config from \"../../../config\";\n\nclass NewsletterFormClass extends React.Component {\n state = {\n saving: false,\n submitButtonDisabled: true,\n drawerVisible: false,\n // Once set to True, the Drawer cannot be re-opened (stops it being annoying)\n drawerHasBeenClosed: false,\n };\n\n componentDidMount = () => {\n // After 5 minutes on a page, open the Drawer\n setTimeout(() => {\n this.setState({\n drawerVisible: true,\n });\n }, 300000);\n\n // Start the Exit Intent Trigger to show Modal when pointer exits the top of the window\n this.applyExitIntentTrigger(() =>\n this.setState({\n drawerVisible: true,\n })\n );\n };\n\n /**\n * This function was copied from EmailOctopus' newsletter subscription modal\n */\n applyExitIntentTrigger = (exitIntentCallback) => {\n // How close to the top of the screen (in pixels) the mouse should move to,\n // before we trigger the modal.\n const sensitivity = 20;\n\n // How long before we activate the exit intent logic in ms.\n // We may want the page to have been loaded for a certain amount of time\n // before showing any modals.\n const timer = 3_000;\n\n // The delay between the mouse leaving the screen and the modal being\n // shown. If the mouse re-enters the screen during the delay, the display\n // of the modal is cancelled.\n const MODAL_DISPLAY_DELAY = 500;\n\n // The timeout ID for the current (if any) setTimeout call to show the\n // modal. Can be used to cancel the display of the modal.\n let modalTimeoutId = null;\n\n setTimeout(attachEventListeners, timer);\n\n function attachEventListeners() {\n document.documentElement.addEventListener(\n \"mouseleave\",\n onMouseleave\n );\n\n document.documentElement.addEventListener(\n \"mouseenter\",\n onMouseenter\n );\n }\n\n /**\n * If the mouse leaves the screen via the top of the screen (as if the user\n * is getting ready to close the current tab), we queue the display of the\n * modal after the `MODAL_DISPLAY_DELAY`.\n */\n function onMouseleave(event) {\n if (event.clientY > sensitivity) {\n return;\n }\n\n modalTimeoutId = setTimeout(showModal, MODAL_DISPLAY_DELAY);\n }\n\n /**\n * Cancel the display of the modal, if the mouse moves back into the\n * screen sooner than `MODAL_DISPLAY_DELAY`.\n */\n function onMouseenter() {\n if (modalTimeoutId) {\n clearTimeout(modalTimeoutId);\n modalTimeoutId = null;\n }\n }\n\n function showModal() {\n exitIntentCallback();\n\n removeEventListeners();\n }\n\n function removeEventListeners() {\n document.documentElement.removeEventListener(\n \"mouseleave\",\n onMouseleave\n );\n\n document.documentElement.removeEventListener(\n \"mouseenter\",\n onMouseenter\n );\n }\n };\n\n validateForm = () => {\n this.props.form.validateFields((err, values) => {\n if (!err) {\n // No Errors : Disabled = False\n this.setState({\n submitButtonDisabled: false,\n });\n } else {\n // Errors : Disabled = True\n this.setState({\n submitButtonDisabled: true,\n });\n }\n });\n };\n\n goNextField = (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n let inputs = document.querySelectorAll(\n \"#newsletter_form input, #newsletter_form textarea\"\n );\n\n let lastElement = true;\n for (let i = 0; i < inputs.length; i++) {\n if (inputs[i] === e.target && !!inputs[i + 1]) {\n lastElement = false;\n document.activeElement.blur();\n document.activeElement.removeAttribute(\"autofocus\");\n\n inputs[i + 1].setAttribute(\"autofocus\", \"autofocus\");\n inputs[i + 1].focus();\n }\n }\n if (lastElement) {\n this.submitForm();\n }\n }\n };\n\n submitForm = () => {\n this.props.form.validateFields((err, values) => {\n if (err) {\n return false;\n }\n\n this.setState(\n {\n saving: true,\n },\n () => {\n if (!!this.props.user.id) {\n values.student_id = this.props.user.id;\n }\n api.post(\"newsletter\", {\n body: JSON.stringify(values),\n })\n .then((data) => {\n if (\n typeof data.result === \"object\" &&\n data.result.success\n ) {\n Modal.success({\n className: \"unavailable-survey\",\n title: \"Thank You. You're now subscribed.\",\n content: (\n

\n Make sure to check your email\n regularly for your exclusive\n content.\n

\n ),\n icon: false,\n closable: false,\n keyboard: false,\n onOk: () => {\n this.setState({\n drawerVisible: false,\n drawerHasBeenClosed: true,\n });\n },\n });\n } else {\n Modal.error({\n className: \"unavailable-survey\",\n title: \"Error!\",\n content:\n \"Sorry, an error occurred. Please try again!\",\n icon: false,\n closable: false,\n keyboard: false,\n });\n }\n this.setState({\n saving: false,\n });\n })\n .catch((error) => {\n Modal.error({\n className: \"unavailable-survey\",\n title: \"Error!\",\n content:\n \"Sorry, an error occurred. Please try again!\",\n icon: false,\n closable: false,\n keyboard: false,\n });\n this.setState({\n saving: false,\n });\n });\n }\n );\n });\n };\n\n render() {\n const { getFieldDecorator } = this.props.form;\n\n let NewsletterFormToRender = (\n <>\n {\n this.setState({\n drawerVisible: false,\n drawerHasBeenClosed: true,\n });\n }}\n visible={\n this.state.drawerVisible &&\n !this.state.drawerHasBeenClosed\n }\n className=\"newsletter-drawer\"\n >\n
\n \n \n

\n \n Get your FREE guide on best locations to\n learn to drive and more! Sign up to our newsletter.\n

\n\n \n {getFieldDecorator(\"email\", {\n rules: [\n {\n required: true,\n type: \"email\",\n message: \"Enter a valid Email.\",\n whitespace: true,\n },\n {\n max: 60,\n message:\n \"Email cannot be more than 60 characters.\",\n },\n ],\n initialValue: !!this.props.user.id\n ? this.props.user.email\n : \"\",\n })(\n \n )}\n \n\n \n this.submitForm()}\n disabled={\n this.state.submitButtonDisabled ||\n this.state.saving\n }\n loading={this.state.saving}\n style={{\n width: \"100%\",\n marginTop: \"1em\",\n }}\n >\n Subscribe\n \n \n \n \n \n );\n\n if (this.props.embed) {\n return ReactDOM.createPortal(\n NewsletterFormToRender,\n document.getElementById(\"react-newsletter-form\")\n );\n }\n\n return NewsletterFormToRender;\n }\n}\n\nconst NewsletterForm = Form.create({ name: \"newsletter_form\" })(\n NewsletterFormClass\n);\nexport default withRouter(NewsletterForm);\n","import React from \"react\";\nimport moment from \"moment\";\nimport { withRouter } from \"react-router\";\nimport ReactDOM from \"react-dom\";\n\n//Ant Design Elements\nimport Button from \"antd/lib/button\";\nimport Col from \"antd/lib/col\";\nimport DatePicker from \"antd/lib/date-picker\";\nimport Form from \"antd/lib/form\";\nimport Input from \"antd/lib/input\";\nimport Modal from \"antd/lib/modal\";\nimport Row from \"antd/lib/row\";\n\nimport api from \"../../../helpers/api\";\n\nclass DKTDownloadFormClass extends React.Component {\n state = {\n saving: false,\n submitButtonDisabled: true,\n formHasBeenSubmitted: false,\n };\n\n validateForm = () => {\n this.props.form.validateFields((err, values) => {\n if (!err) {\n // No Errors : Disabled = False\n this.setState({\n submitButtonDisabled: false,\n });\n } else {\n // Errors : Disabled = True\n this.setState({\n submitButtonDisabled: true,\n });\n }\n });\n };\n\n goNextField = (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n var inputs = document.querySelectorAll(\n \"#dkt_download_form input, #dkt_download_form textarea\"\n );\n\n var lastElement = true;\n for (var i = 0; i < inputs.length; i++) {\n if (inputs[i] === e.target && !!inputs[i + 1]) {\n lastElement = false;\n document.activeElement.blur();\n document.activeElement.removeAttribute(\"autofocus\");\n\n inputs[i + 1].setAttribute(\"autofocus\", \"autofocus\");\n inputs[i + 1].focus();\n }\n }\n if (lastElement) {\n this.submitForm();\n }\n }\n };\n\n submitForm = () => {\n this.props.form.validateFields((err, values) => {\n if (err) {\n return false;\n }\n\n this.setState(\n {\n saving: true,\n },\n () => {\n if (!!this.props.user.id) {\n values.student_id = this.props.user.id;\n }\n api.post(\"dktdownload\", {\n body: JSON.stringify(values),\n })\n .then((data) => {\n if (\n typeof data.result === \"object\" &&\n data.result.success\n ) {\n this.setState({\n formHasBeenSubmitted: true,\n });\n } else {\n Modal.error({\n className: \"unavailable-survey\",\n title: \"Error!\",\n content:\n \"Sorry, an error occurred. Please try again!\",\n icon: false,\n closable: false,\n keyboard: false,\n });\n }\n this.setState({\n saving: false,\n });\n })\n .catch((error) => {\n Modal.error({\n className: \"unavailable-survey\",\n title: \"Error!\",\n content:\n \"Sorry, an error occurred. Please try again!\",\n icon: false,\n closable: false,\n keyboard: false,\n });\n this.setState({\n saving: false,\n });\n });\n }\n );\n });\n };\n\n render() {\n const { getFieldDecorator } = this.props.form;\n const dateFormatList = [\"DD/MM/YYYY\", \"DD/MM/YY\"];\n\n let DKTDownloadFormToRender = (\n <>\n
\n \n \n {this.state.formHasBeenSubmitted ? (\n <>\n

Thank You

\n

\n You will receive an email shortly with\n instant access to the Driver Knowledge\n Test Guide.\n

\n \n ) : (\n <>\n \n {getFieldDecorator(\"name\", {\n rules: [\n {\n required: true,\n message: \"Enter your name.\",\n whitespace: true,\n },\n {\n max: 60,\n message:\n \"Name cannot be more than 60 characters.\",\n },\n ],\n initialValue: !!this.props.user.id\n ? this.props.user.first_name +\n \" \" +\n this.props.user.last_name\n : \"\",\n })(\n \n )}\n \n\n \n {getFieldDecorator(\"email\", {\n rules: [\n {\n required: true,\n type: \"email\",\n message:\n \"Enter a valid Email.\",\n whitespace: true,\n },\n {\n max: 60,\n message:\n \"Email cannot be more than 60 characters.\",\n },\n ],\n initialValue: !!this.props.user.id\n ? this.props.user.email\n : \"\",\n })(\n \n )}\n \n\n \n {getFieldDecorator(\"date\", {\n rules: [\n {\n type: \"object\",\n required: true,\n message:\n \"Enter your DKT Date.\",\n whitespace: true,\n },\n ],\n })(\n {\n // Future dates only\n return current < moment();\n }}\n size=\"large\"\n style={{ width: \"100%\" }}\n onBlur={this.validateForm}\n placeholder=\"Date of DKT\"\n />\n )}\n \n\n \n this.submitForm()}\n disabled={\n this.state\n .submitButtonDisabled ||\n this.state.saving\n }\n loading={this.state.saving}\n id=\"DKTDownloadButton\"\n >\n Download\n \n \n \n )}\n \n \n \n \n
\n
\n \n );\n\n if (this.props.embed) {\n return ReactDOM.createPortal(\n DKTDownloadFormToRender,\n document.getElementById(\"react-dkt-download-form\")\n );\n }\n\n return DKTDownloadFormToRender;\n }\n}\n\nconst DKTDownloadForm = Form.create({ name: \"dkt_download_form\" })(\n DKTDownloadFormClass\n);\nexport default withRouter(DKTDownloadForm);\n","import React, { lazy, Suspense } from \"react\";\nimport LoginLogout from \"./components/elements/Web/LoginLogout\";\nimport SuburbDropDown from \"./components/elements/Web/SuburbDropDown\";\nimport ContactForm from \"./components/elements/Web/ContactForm\";\nimport NewsletterForm from \"./components/elements/Web/NewsletterForm\";\nimport DKTDownloadForm from \"./components/elements/Web/DKTDownloadForm\";\n\nconst Base = lazy(() =>\n import(\"./Base\" /* webpackChunkName: \"Base\" */).catch((e) =>\n window.location.reload()\n )\n);\n\nclass Wrapper extends React.Component {\n render() {\n let base =\n document.getElementById(\"root\") !== null ? (\n \n \n \n ) : null;\n let loginOut =\n document.getElementById(\"header-login-button-holder\") !== null ? (\n \n \n \n ) : null;\n let mobileLoginOut =\n document.getElementById(\"mobile-header-login-button-holder\") !==\n null ? (\n \n \n \n ) : null;\n let suburbDropDown =\n document.getElementById(\"react-suburb-dropdown\") !== null ? (\n \n \n \n ) : null;\n let contactForm =\n document.getElementById(\"react-contact-form\") !== null ? (\n \n \n \n ) : null;\n let newsletterForm =\n document.getElementById(\"react-newsletter-form\") !== null ? (\n \n \n \n ) : null;\n let dktDownloadForm =\n document.getElementById(\"react-dkt-download-form\") !== null ? (\n \n \n \n ) : null;\n\n return (\n \n {base}\n {loginOut}\n {mobileLoginOut}\n {suburbDropDown}\n {contactForm}\n {newsletterForm}\n {dktDownloadForm}\n \n );\n }\n}\n\nexport default Wrapper;\n","import React from \"react\";\nimport { Router } from \"react-router-dom\";\n\n//Ant Design Elements\nimport Modal from \"antd/lib/modal\";\n\nimport history from \"./helpers/history\";\nimport api from \"./helpers/api\";\nimport config from \"./config\";\nimport ReactGA from \"react-ga\";\nimport Cookies from \"universal-cookie\";\nimport { compressToBase64 as lzStringCompress } from \"lz-string\";\nimport { decompressFromBase64 as lzStringDecompress } from \"lz-string\";\n\nimport Wrapper from \"./Wrapper\";\n\nimport \"antd/dist/antd.css\";\nimport(\"./styles/App.css\" /* webpackChunkName: \"App\" */);\n\nconst cookies = new Cookies();\n\nclass App extends React.Component {\n // NOTE: If you change the items defined in the App state, it is best practice\n // to also increment the AppVersion number defined here.\n // When pulling a stored state from a users' cookie, we check against their\n // version. If missing or less than current, we force them to reload.\n state = {\n /**************************/\n /**/ /**/\n /**/ AppVersion: 1.2 /**/,\n /**/ /**/\n /**************************/\n\n user: {},\n cart: {},\n paidCart: {},\n bookings: {},\n bookingsSDC: {},\n confirmedBookings: {},\n confirmedBookingsSDC: {},\n processingCart: false,\n assignedDriverTrainer: null,\n transmissionType: \"A\",\n findAvailability: false,\n totalCartBookingDuration: 0,\n // Facebook\n connectedWithFacebook: false,\n facebookUserId: null,\n // Google\n connectedWithGoogle: false,\n googleUserId: null,\n googleUserAuthId: null,\n // Pickup Address\n pickupAddressChosen: false,\n pickupAddressString: \"\",\n pickup_address_id: null,\n pickup_address_suburb_id: null,\n pickup_address_suburb_manual_string: null,\n pickup_address_street_number: null,\n pickup_address_street_name: null,\n pickup_address_suburb_name: null,\n pickup_address_state: null,\n pickup_address_postcode: null,\n pickupAddressManualFields: false,\n // Dropoff Address\n displayDropoffAddress: false,\n dropoffAddressChosen: false,\n dropoffAddressString: \"\",\n dropoff_address_id: null,\n dropoff_address_suburb_id: null,\n dropoff_address_suburb_manual_string: null,\n dropoff_address_street_number: null,\n dropoff_address_street_name: null,\n dropoff_address_suburb_name: null,\n dropoff_address_state: null,\n dropoff_address_postcode: null,\n dropoffAddressManualFields: false,\n loginModalVisible: false,\n loginModalTab: \"register\",\n loginModalCallback: null,\n contactModalVisible: false,\n dtModalVisible: false,\n userDrawerVisible: false,\n // Existing User:\n existingUser: false,\n completedLesson: false,\n futureLessons: false,\n firstPurchase: false,\n payByCash: false,\n paidByCash: false,\n prepaidData: {\n available: 0,\n using: 0,\n remaining: 0,\n owing: 0,\n mod1: 0,\n mod2: 0,\n },\n // Temporary User Data:\n newGoogleUser: null,\n newFacebookUser: null,\n // Data Validation (database records 'modified' values):\n timestamps: {\n user: null,\n student: null,\n },\n prelim: false,\n\n // Reservation Info\n expiring_notice: null,\n expired_modal_visible: false,\n shortest_reservation: 30,\n sdc_full_modal_visible: false,\n shell_student: false,\n\n // Voucher Objects\n voucher: {\n package: null,\n hours: 0,\n qty: 1,\n sdc: false,\n form: {\n // Who are we sending it to?\n who: \"to\",\n // Delivery Method:\n how: \"email\",\n // Personalisation:\n personalise: true,\n occasion: \"None\",\n message: null,\n },\n },\n cartGV: {},\n paidCartGV: {},\n driverReferralCode: null,\n studentReferralCode: null,\n referringStudentName: null,\n\n showBanners: false,\n banners: {},\n };\n\n studentTimeStampCheckerIntervalVar = null;\n\n reservationCheckIntervalVar = null;\n\n // Before anything else happens, check cookie for our state object\n constructor(props) {\n super(props);\n\n /**\n * Load the User State from their previously stored Cookie\n */\n if (\n typeof cookies.get(config.environmentShort + \"BS\") !== \"undefined\"\n ) {\n // Decrypt the stored state and store it in the App state.\n var decryptedStateData = JSON.parse(\n lzStringDecompress(cookies.get(config.environmentShort + \"BS\"))\n );\n\n // Check for a stored AppVersion. If out of date, force refresh.\n if (\n typeof decryptedStateData.AppVersion === \"undefined\" ||\n decryptedStateData.AppVersion !== this.state.AppVersion\n ) {\n console.log(\n \"Sorry! There has been an update to our software, and you will need to log in again.\"\n );\n // Outdated or non-existant Version. Force refresh.\n cookies.remove(config.environmentShort + \"AT\", {\n path: \"/\",\n domain: config.siteDomain,\n });\n cookies.remove(config.environmentShort + \"BS\", {\n path: \"/\",\n domain: config.siteDomain,\n });\n // Reload to start over\n window.setTimeout(() => {\n history.go(0);\n }, 1);\n } else {\n // Current Version - set to state and continue to load.\n if (!decryptedStateData.shell_student) {\n decryptedStateData.loginModalVisible = false;\n }\n this.state = decryptedStateData;\n }\n }\n\n // If we have a user, start polling for updates from database\n if (!!this.state.user.id) {\n this.startStudentTimeStampChecker();\n }\n\n ReactGA.initialize(config.googleAnalyticsTrackingKey);\n }\n\n componentDidUpdate = (prevProps, prevState) => {\n // Send User Data to SmartLook on Production, if it's changed.\n if (\n prevState.user !== this.state.user &&\n window.location.hostname === \"app.ltrent.com.au\" &&\n typeof smartlook !== \"undefined\" &&\n typeof smartlook === \"function\"\n ) {\n let userData = { ...this.state.user };\n userData[\"name\"] = userData.first_name + \" \" + userData.last_name;\n // eslint-disable-next-line\n /*global smartlook*/ // This line prevents the below throwing an error when not on production\n smartlook(\"identify\", this.state.user?.id, userData);\n }\n };\n\n // Encrypt the state data and store it in cookie\n storeEncryptedState = (callback) => {\n cookies.set(\n config.environmentShort + \"BS\",\n lzStringCompress(JSON.stringify(this.state)),\n { path: \"/\", domain: config.siteDomain }\n );\n\n if (typeof callback === \"function\") {\n callback();\n }\n };\n\n sendPageviewToGoogleAnalytics = (page) => {\n ReactGA.pageview(page);\n };\n\n /**\n * @object data Data Object to Send\n */\n sendEventToGoogleTagManager = (data) => {\n // Send to GTM\n if (typeof window.dataLayer !== \"undefined\") {\n window.dataLayer.push(data);\n }\n\n // Send to our own API for Analytics purposes\n api.post(\"analytics\", {\n body: JSON.stringify({\n data: data,\n }),\n });\n };\n\n async componentDidMount() {\n //Send initial page view to analytics:\n this.sendPageviewToGoogleAnalytics(\n window.location.pathname + window.location.search\n );\n\n // Check for Expired Reservations every 30 seconds.\n if (this.reservationCheckIntervalVar === null) {\n this.reservationCheckIntervalVar = setInterval(() => {\n this.checkReservationExpiry();\n }, 30000);\n // Uncomment the line below, and comment the above line to temporarily keep renewing reservations every 2 minutes to prevent timeouts while developing...\n // @todo: ensure that the above is uncommented and the below is commented prior to go live!!!\n // this.reservationCheckIntervalVar = setInterval(this.renewReservations, 120000);\n }\n this.checkReservationExpiry();\n\n // TDS-910 Add Christmas Voucher Banner:\n // await this.addCustomBanner('christmas', \"🎄 🎅 Christmas Special - 3x driving lessons for $279 (SAVE $30!). Buy a Gift Voucher now. 🎄 🎅\", 'christmas', '/buy/voucher?occasion=xmas');\n this.clearCustomBanner(\"christmas\");\n }\n\n componentWillUnmount() {\n clearInterval(this.studentTimeStampCheckerIntervalVar);\n\n clearInterval(this.reservationCheckIntervalVar);\n Modal.destroyAll();\n }\n\n checkReservationExpiry = () => {\n //Only check if we have at least one booking, and we're not currently processing the cart\n if (\n (Object.keys(this.state.bookings).length > 0 ||\n Object.keys(this.state.bookingsSDC).length > 0) &&\n !this.state.processingCart\n ) {\n //API Request\n api.post(\"bookings/checkReservations\", {\n body: JSON.stringify({\n bookings: Object.keys(this.state.bookings),\n bookingsSDC: Object.values(this.state.bookingsSDC).reduce(\n (acc, elem) => {\n acc[elem.module] = elem.id;\n return acc;\n },\n {}\n ),\n }),\n })\n .then((data) => {\n // If an SDC Full notice is received, alert user and remove SDC Bookings from Cart\n if (\n typeof data.result !== \"undefined\" &&\n typeof data.result.sdc_full !== \"undefined\" &&\n data.result.sdc_full\n ) {\n if (!this.state.sdc_full_modal_visible) {\n this.setState(\n {\n sdc_full_modal_visible: true,\n },\n () => {\n Modal.error({\n title: \"Safer Drivers Course Full\",\n content: (\n
\n

\n Sorry, the SDC course you\n were attempting to book is\n now full.\n

\n
\n ),\n onOk: async () => {\n this.setAppStateValue(\n \"bookingsSDC\",\n {},\n true,\n () => {\n this.sendEventToGoogleTagManager(\n {\n event: \"cart-removal-sdc\",\n }\n );\n\n // Remove from Cart\n let cart = {\n ...this.state.cart,\n };\n delete cart[10];\n delete cart[11];\n // Update the State\n this.setAppStateValue(\n \"cart\",\n cart,\n true,\n () => {\n this.storeEncryptedState();\n this.setState(\n {\n sdc_full_modal_visible: false,\n },\n () => {\n window.location.href =\n \"/book/course/\";\n }\n );\n }\n );\n }\n );\n },\n });\n }\n );\n }\n }\n\n if (\n typeof data.result !== \"undefined\" &&\n typeof data.result.expiredBookings !== \"undefined\" &&\n data.result.expiredBookings\n ) {\n if (!this.state.expired_modal_visible) {\n this.setState(\n {\n expired_modal_visible: true,\n },\n () => {\n Modal.error({\n title: \"Expired Reservations\",\n content: (\n
\n

\n Sorry, one or more of the\n bookings you were making has\n timed out.\n

\n
\n ),\n onOk: async () => {\n let bookingObject = {\n ...this.state.bookings,\n };\n let originalCount =\n Object.keys(\n bookingObject\n ).length;\n // Loop through the returned object and remove any expired ones from the bookingObject\n for (const [\n key,\n value,\n ] of Object.entries(\n data.result.bookings\n )) {\n if (\n value.status === \"expired\"\n ) {\n delete bookingObject[key];\n // Send Cancel Reservation API Request - We don't need to wait for a response - just assume it's ok\n await api.post(\n \"bookings/cancelReservation\",\n {\n body: JSON.stringify(\n {\n booking:\n key,\n student: true,\n }\n ),\n }\n );\n this.sendEventToGoogleTagManager(\n {\n event: \"cart-removal-driving-lesson\",\n }\n );\n }\n }\n let newCount =\n Object.keys(\n bookingObject\n ).length;\n if (newCount < originalCount) {\n // Set into State\n this.setAppStateValue(\n \"prepaidData\",\n {\n available: parseFloat(\n this.state\n .prepaidData\n .available\n ),\n using: 0,\n remaining: parseFloat(\n this.state\n .prepaidData\n .available\n ),\n owing: 0,\n mod1: parseInt(\n this.state\n .prepaidData\n .mod1\n ),\n mod2: parseInt(\n this.state\n .prepaidData\n .mod2\n ),\n }\n );\n }\n // Set it back into state\n this.setAppStateValue(\n \"expiring_notice\",\n null,\n true,\n () => {\n this.setAppStateValue(\n \"bookings\",\n newCount === 0\n ? {}\n : bookingObject,\n true,\n () => {\n // If it's a new user and they have no bookings, remove the DT so they can see all of them again\n if (\n Object.keys(\n bookingObject\n ).length ===\n 0 &&\n !this.state\n .existingUser &&\n !this.state\n .shell_student\n ) {\n this.setAppStateValue(\n \"assignedDriverTrainer\",\n null,\n true\n );\n }\n this.setState(\n {\n expired_modal_visible: false,\n },\n () => {\n // Reload screen here with slight delay to remove 'maximum bookings' warnings or reset an empty cart\n if (\n (originalCount >=\n config.maximumBookingsPerTransaction &&\n newCount <\n originalCount) ||\n newCount ===\n 0\n ) {\n this.storeEncryptedState(\n () => {\n window.setTimeout(\n () => {\n history.go(\n 0\n );\n },\n 1\n );\n }\n );\n } else {\n this.storeEncryptedState();\n }\n }\n );\n }\n );\n }\n );\n },\n });\n }\n );\n }\n } else {\n // Loop through each booking and flag as close to expiring if it is.\n // URGENT flag (less than 2 minutes)\n if (\n typeof data.result !== \"undefined\" &&\n typeof data.result.bookings !== \"undefined\"\n ) {\n let urgentCheck = Object.entries(\n data.result.bookings\n ).some((el) => {\n return el[1].remaining <= 2;\n });\n for (const [, value] of Object.entries(\n data.result.bookings\n )) {\n if (\n value.status === \"reserved\" &&\n value.remaining < 5\n ) {\n this.setState({\n expiring_notice: (\n \n You have booking reservations\n which are about to expire.{\" \"}\n {\n this.renewReservations();\n }}\n >\n Renew?\n \n \n ),\n });\n break;\n }\n }\n }\n this.setState({\n shortest_reservation: data.result?.shortest,\n });\n }\n })\n .then(() => {\n this.updateBookingsDuration();\n });\n }\n };\n\n renewReservations = () => {\n //API Request\n if (Object.keys(this.state.bookings).length > 0) {\n api.post(\"bookings/extendReservations\", {\n body: JSON.stringify({\n bookings: Object.keys(this.state.bookings),\n }),\n }).then(() => {\n this.setState(\n {\n expiring_notice: null,\n },\n () => {\n this.checkReservationExpiry();\n }\n );\n });\n }\n };\n\n startStudentTimeStampChecker = () => {\n if (this.studentTimeStampCheckerIntervalVar === null) {\n this.studentTimeStampCheckerIntervalVar = setInterval(() => {\n this.studentTimeStampQuery();\n }, 120000);\n // Do it once immediately as well, so we don't have to wait until the first interval passes.\n this.studentTimeStampQuery();\n }\n };\n\n stopStudentTimeStampChecker = () => {\n if (this.studentTimeStampCheckerIntervalVar !== null) {\n clearInterval(this.studentTimeStampCheckerIntervalVar);\n this.studentTimeStampCheckerIntervalVar = null;\n }\n };\n\n studentTimeStampQuery = () => {\n if (typeof this.state.user.id !== \"undefined\") {\n api.post(\"students/refresh\", {\n body: JSON.stringify({\n student_id: this.state.user.id,\n timestamps: this.state.timestamps,\n }),\n }).then((res) => {\n if (\n typeof res.result !== \"undefined\" &&\n typeof res.result.updated !== \"undefined\" &&\n res.result.updated\n ) {\n // Set all of our App Level properties\n cookies.set(\n config.environmentShort + \"AT\",\n res.result.access_token,\n { path: \"/\", domain: config.siteDomain }\n );\n // if Driver Trainer ID has changed, we need to clear their cart\n let clearCart = false;\n\n // User Specific Updates\n if (\n res.result.updated_type === \"both\" ||\n res.result.updated_type === \"user\"\n ) {\n this.setState(\n {\n pickupAddressString:\n typeof res.result.user.address ===\n \"undefined\"\n ? this.state.pickupAddressString\n : res.result.user.address\n .street_number +\n \" \" +\n res.result.user.address.street_name +\n \", \" +\n res.result.user.address.suburb\n .suburb_full_details,\n pickup_address_id:\n typeof res.result.user.address ===\n \"undefined\"\n ? this.state.pickup_address_id\n : res.result.user.address.id,\n pickup_address_postcode:\n typeof res.result.user.address ===\n \"undefined\"\n ? this.state.pickup_address_postcode\n : res.result.user.address.suburb\n .post_code,\n pickup_address_state:\n typeof res.result.user.address ===\n \"undefined\"\n ? this.state.pickup_address_state\n : res.result.user.address.suburb.states\n .name,\n pickup_address_street_name:\n typeof res.result.user.address ===\n \"undefined\"\n ? this.state.pickup_address_street_name\n : res.result.user.address.street_name,\n pickup_address_street_number:\n typeof res.result.user.address ===\n \"undefined\"\n ? this.state\n .pickup_address_street_number\n : res.result.user.address.street_number,\n pickup_address_suburb_id:\n typeof res.result.user.address ===\n \"undefined\"\n ? this.state.pickup_address_suburb_id\n : res.result.user.address.suburb_id,\n pickup_address_suburb_name:\n typeof res.result.user.address ===\n \"undefined\"\n ? this.state.pickup_address_suburb_name\n : res.result.user.address.suburb\n .suburb_name,\n completedLesson:\n typeof res.result.user.completed_lessons ===\n \"undefined\" ||\n res.result.user.completed_lessons ===\n null ||\n parseInt(\n res.result.user.completed_lessons\n ) === 0\n ? false\n : true,\n futureLessons:\n typeof res.result.user\n .has_future_lessons === \"undefined\" ||\n res.result.user.has_future_lessons === null\n ? false\n : res.result.user.has_future_lessons,\n user: {\n id: res.result.user.id,\n email: res.result.user.email,\n mobile_phone: res.result.user.mobile_phone,\n first_name: res.result.user.first_name,\n last_name: res.result.user.last_name,\n licence_number:\n res.result.user.student.licence_number,\n hours: res.result.user.student\n .driving_experience,\n dob: res.result.user.dob,\n hadSDC: res.result.user.hadSDC,\n referral_code:\n res.result.user.referral_code,\n hide_cash:\n res.result.user.student\n .hide_cash_on_website,\n },\n },\n () => {\n let prepaidAvailable = parseFloat(\n res.result.user.credits.remaining\n );\n let bookingHours = this.countBookingHours();\n let prepaidUsing = 0;\n let stillOwing = bookingHours;\n if (prepaidAvailable < bookingHours) {\n prepaidUsing = prepaidAvailable;\n stillOwing =\n bookingHours - prepaidAvailable;\n } else {\n prepaidUsing = bookingHours;\n stillOwing = 0;\n }\n let prepaidRemaining =\n prepaidAvailable - prepaidUsing;\n\n // Set into State\n this.setState({\n prepaidData: {\n available: prepaidAvailable,\n using: prepaidUsing,\n remaining: prepaidRemaining,\n owing: stillOwing,\n mod1: !!res.result.user.credits\n ?.sdc_remaining\n ? parseInt(\n res.result.user.credits\n ?.sdc_remaining[10]\n )\n : 0,\n mod2: !!res.result.user.credits\n ?.sdc_remaining\n ? parseInt(\n res.result.user.credits\n ?.sdc_remaining[11]\n )\n : 0,\n },\n });\n }\n );\n }\n // Student Specific Updates\n if (\n res.result.updated_type === \"both\" ||\n res.result.updated_type === \"student\"\n ) {\n if (\n this.state.assignedDriverTrainer !== null &&\n !!this.state.assignedDriverTrainer.id &&\n this.state.assignedDriverTrainer.id !== null &&\n parseInt(this.state.assignedDriverTrainer.id) !==\n parseInt(\n res.result.user.student.driver_trainer_id\n ) &&\n this.state.completedLesson\n ) {\n clearCart = true;\n }\n this.setState({\n assignedDriverTrainer: {\n id:\n res.result.user.student\n .driver_trainer_id === null\n ? this.state.completedLesson\n ? null\n : this.state\n .assignedDriverTrainer !==\n null\n ? this.state.assignedDriverTrainer\n .id\n : null\n : res.result.user.student\n .driver_trainer_id,\n display_name:\n res.result.user.student.driver_trainer ===\n null\n ? this.state.completedLesson\n ? null\n : this.state\n .assignedDriverTrainer !==\n null\n ? this.state.assignedDriverTrainer\n .display_name\n : null\n : res.result.user.student.driver_trainer\n .display_name,\n headshot:\n res.result.user.student.driver_trainer ===\n null\n ? this.state.completedLesson\n ? null\n : this.state\n .assignedDriverTrainer !==\n null\n ? this.state.assignedDriverTrainer\n .headshot\n : null\n : typeof res.result.user.student\n ?.driver_trainer\n ?.website_headshot !==\n \"undefined\" &&\n res.result.user.student.driver_trainer\n ?.website_headshot !== null &&\n res.result.user.student.driver_trainer\n ?.website_headshot !== \"\"\n ? res.result.user.student.driver_trainer\n ?.website_headshot\n : typeof res.result.user.student\n .driver_trainer?.website_photo !==\n \"undefined\" &&\n res.result.user.student.driver_trainer\n ?.website_photo !== null &&\n res.result.user.student.driver_trainer\n ?.website_photo !== \"\"\n ? res.result.user.student.driver_trainer\n ?.website_photo\n : process.env.REACT_APP_SITE_URL +\n \"/img/default-headshot.webp\", // @todo: remove this fallback to using website_photo when we remove that field in favour of headshots\n website_bio:\n res.result.user.student.driver_trainer ===\n null\n ? this.state.completedLesson\n ? null\n : this.state\n .assignedDriverTrainer !==\n null\n ? this.state.assignedDriverTrainer\n .website_bio\n : null\n : res.result.user.student.driver_trainer\n .website_bio,\n transmissionType:\n res.result.user.student.driver_trainer ===\n null\n ? this.state.completedLesson\n ? null\n : this.state\n .assignedDriverTrainer !==\n null\n ? this.state.assignedDriverTrainer\n .transmissionType\n : \"A\"\n : res.result.user.student.driver_trainer\n .vehicle_transmission,\n },\n transmissionType:\n res.result.user.student.driver_trainer === null\n ? this.state.completedLesson\n ? null\n : this.state.assignedDriverTrainer !==\n null\n ? this.state.assignedDriverTrainer\n .transmissionType\n : \"A\"\n : res.result.user.student.driver_trainer\n .vehicle_transmission,\n });\n }\n // Generic Updates\n this.setState({\n pickupAddressChosen:\n typeof res.result.user.address === \"undefined\"\n ? false\n : true,\n timestamps: {\n user: res.result.user.modified,\n student: res.result.user.student.modified,\n },\n });\n if (clearCart) {\n this.setState(\n {\n cart: {},\n bookings: {},\n bookingsSDC: {},\n },\n () => {\n this.sendEventToGoogleTagManager({\n event: \"cart-cleared\",\n });\n this.storeEncryptedState();\n history.push(\"/\");\n }\n );\n }\n this.storeEncryptedState();\n }\n });\n }\n };\n\n countBookingHours = () => {\n let hours = 0;\n Object.values(this.state.bookings).forEach((value) => {\n hours += value.duration;\n });\n return hours;\n };\n\n loginModalToggle = (tab, callback) => {\n this.setState(\n {\n // Open on the required tab\n loginModalTab:\n typeof tab === \"undefined\" || tab === null\n ? \"register\"\n : tab,\n // Show/Hide based on current state.\n loginModalVisible: !this.state.loginModalVisible,\n },\n () => {\n if (this.state.loginModalVisible) {\n // Store the login Modal Callback function in the state so we can call it after logging in.\n this.setState({\n loginModalCallback: callback,\n });\n } else {\n // Clear the login Modal Callback state\n this.setState({\n loginModalCallback: null,\n });\n }\n }\n );\n };\n\n contactModalToggle = () => {\n this.setState({\n // Show/Hide based on current state.\n contactModalVisible: !this.state.contactModalVisible,\n });\n };\n\n setAppStateValue = async (key, value, replaceObject = false, callback) => {\n //If value is an object, loop through it, assigning children\n if (typeof value === \"object\" && !replaceObject) {\n let cloneState = { ...this.state[key] };\n for (var itemKey in value) {\n cloneState[itemKey] = value[itemKey];\n }\n this.setState(\n {\n [key]: cloneState,\n },\n () => {\n this.storeEncryptedState();\n }\n );\n }\n //Assume we were passed a simple string and assign it.\n else {\n this.setState(\n {\n [key]: value,\n },\n () => {\n this.storeEncryptedState();\n }\n );\n }\n if (typeof callback === \"function\") {\n callback();\n }\n };\n\n addToCart = (product_id, quantity, name, price, discountCode = false) => {\n // Copy our existing State Cart object\n let cart = { ...this.state.cart };\n\n // Add this Selection to our Cart\n cart[product_id] = {\n quantity: quantity,\n name: name,\n price: price,\n discountCode: discountCode,\n };\n\n // If it's a Lesson Package, Remove all other Lesson Packages\n let lessonPackageProducts = [\n config.products.singleLesson,\n config.products.threeLesson,\n config.products.fourLesson,\n config.products.fiveLesson,\n config.products.sixLesson,\n config.products.eightLesson,\n config.products.tenLesson,\n config.products.twelveLesson,\n config.products.twentyFiveLesson,\n config.products.fortyLesson,\n ];\n if (lessonPackageProducts.includes(product_id)) {\n lessonPackageProducts.forEach((lessonPackageProductId) => {\n if (\n !!cart[lessonPackageProductId] &&\n lessonPackageProductId !== product_id\n ) {\n delete cart[lessonPackageProductId];\n }\n });\n }\n\n // Update the State\n this.setState(\n {\n cart: cart,\n },\n () => {\n this.storeEncryptedState();\n }\n );\n };\n\n showExistingUserModal = (prelim, same_dt) => {\n let contentToShow = prelim ? (\n \n

Welcome back!

\n

\n Your email address is already registered on our system,\n please log in before continuing.\n

\n

\n If you are having trouble booking, please{\" \"}\n \n contact our office\n \n .\n

\n
\n ) : (\n \n

Welcome back!

\n

\n A student account already exists with your email address or\n phone number.\n

\n

\n To ensure that we re-connect you to your previous driver\n trainer, and that your personalised experience is\n guaranteed, please log in before continuing.\n

\n

\n If you are having trouble booking, please{\" \"}\n \n contact our office\n \n .\n

\n
\n );\n Modal.error({\n icon: false,\n title: false,\n content: contentToShow,\n onOk: prelim\n ? this.restartWithPrelimLoginModal\n : same_dt\n ? this.restartWithLoginModal\n : this.clearEverythingAndStartWithLoginModal,\n });\n };\n\n clearEverythingAndStartWithLoginModal = () => {\n let previouslyEnteredEmail = { ...this.state.user.email };\n let previousShellState = { ...this.state }.shell_student;\n // If a Shell Student, remove the \"Logged in\" student info\n if (this.state.shell_student) {\n cookies.remove(config.environmentShort + \"AT\", {\n path: \"/\",\n domain: config.siteDomain,\n });\n cookies.remove(config.environmentShort + \"BS\", {\n path: \"/\",\n domain: config.siteDomain,\n });\n this.stopStudentTimeStampChecker();\n\n // On production end the smartlook session and start a new one\n if (\n window.location.hostname === \"app.ltrent.com.au\" &&\n typeof smartlook !== \"undefined\" &&\n typeof smartlook === \"function\"\n ) {\n // eslint-disable-next-line\n /*global smartlook*/ // This line prevents the below throwing an error when not on production\n smartlook(\"anonymize\");\n }\n }\n // Empty cart / bookings\n this.basicStateReset(() => {\n // Reload window with updated state\n this.setState(\n {\n loginModalVisible: true,\n loginModalTab: \"login\",\n user: {\n email: previouslyEnteredEmail,\n },\n shell_student: previousShellState,\n },\n () => {\n window.scrollTo(0, 0);\n this.storeEncryptedState(() => {\n window.setTimeout(() => {\n window.location.reload();\n }, 1);\n });\n }\n );\n });\n };\n\n restartWithPrelimLoginModal = () => {\n // Reload window with updated state\n this.setState(\n {\n loginModalVisible: true,\n loginModalTab: \"login\",\n prelim: true,\n },\n () => {\n window.scrollTo(0, 0);\n this.storeEncryptedState(() => {\n window.setTimeout(() => {\n window.location.reload();\n }, 1);\n });\n }\n );\n };\n\n restartWithLoginModal = () => {\n // Reload window with updated state\n this.setState(\n {\n loginModalVisible: true,\n loginModalTab: \"login\",\n },\n () => {\n window.scrollTo(0, 0);\n this.storeEncryptedState(() => {\n window.setTimeout(() => {\n window.location.reload();\n }, 1);\n });\n }\n );\n };\n\n clearReservations = () => {\n if (Object.keys(this.state.bookings).length > 0) {\n api.post(\"bookings/clearReservations\", {\n body: JSON.stringify({\n bookings: Object.keys(this.state.bookings),\n }),\n }).then(() => {\n this.updateBookingsDuration();\n });\n }\n };\n\n addCustomBanner = async (type, content, custom_class, link) => {\n let banners = { ...this.state.banners };\n\n banners[type] = {\n content: content,\n custom_class: custom_class,\n link: link,\n };\n\n // Update the State\n this.setState({\n banners: banners,\n showBanners: true,\n });\n };\n\n clearCustomBanner = (type) => {\n let banners = { ...this.state.banners };\n\n //Clear specified banner type (if it exists)\n if (banners[type]) {\n delete banners[type];\n }\n\n // Update the State\n this.setState({\n banners: banners,\n });\n };\n\n basicStateReset = (callback) => {\n // If there was anything in the bookings object, send a request to clear reservations\n this.clearReservations();\n\n this.setState(\n {\n user: {},\n cart: {},\n bookings: {},\n bookingsSDC: {},\n confirmedBookings: {},\n confirmedBookingsSDC: {},\n assignedDriverTrainer: null,\n processingCart: false,\n transmissionType: \"A\",\n findAvailability: false,\n // Facebook\n connectedWithFacebook: false,\n facebookUserId: null,\n // Google\n connectedWithGoogle: false,\n googleUserId: null,\n googleUserAuthId: null,\n // Pickup Address\n pickupAddressChosen: false,\n pickupAddressString: \"\",\n pickup_address_id: null,\n pickup_address_suburb_id: null,\n pickup_address_street_number: null,\n pickup_address_street_name: null,\n pickup_address_suburb_name: null,\n pickup_address_state: null,\n pickup_address_postcode: null,\n // Dropoff Address\n displayDropoffAddress: false,\n dropoffAddressChosen: false,\n dropoffAddressString: \"\",\n dropoff_address_id: null,\n dropoff_address_suburb_id: null,\n dropoff_address_street_number: null,\n dropoff_address_street_name: null,\n dropoff_address_suburb_name: null,\n dropoff_address_state: null,\n dropoff_address_postcode: null,\n loginModalVisible: false,\n showPrepaidError: false,\n timestamps: {\n user: null,\n student: null,\n },\n prepaidData: {\n available: 0,\n using: 0,\n remaining: 0,\n owing: 0,\n mod1: 0,\n mod2: 0,\n },\n },\n callback\n );\n };\n\n redirect = (url) => {\n history.push(url);\n };\n\n checkStudentExists = (callback, email, mobile_phone) => {\n let data = {};\n if (\n !this.state.shell_student &&\n typeof this.state.user.email !== \"undefined\" &&\n this.state.user.email !== null\n ) {\n data[\"email\"] = this.state.user.email;\n } else if (email !== null) {\n data[\"email\"] = email;\n }\n if (\n !this.state.shell_student &&\n typeof this.state.user.mobile_phone !== \"undefined\" &&\n this.state.user.mobile_phone !== null\n ) {\n data[\"mobile_phone\"] = this.state.user.mobile_phone;\n } else if (mobile_phone !== null) {\n data[\"mobile_phone\"] = mobile_phone;\n }\n if (Object.keys(data).length === 0) {\n return null;\n }\n\n //API Request\n api.post(\"students/checkStudentExists\", {\n body: JSON.stringify(data),\n }).then((data) => {\n if (data.result.exists) {\n let prelim = false;\n if (data.result.prelim) {\n prelim = true;\n }\n\n let same_dt = false;\n if (\n typeof data.result.driver_trainer_id !== \"undefined\" &&\n this.state.assignedDriverTrainer !== null &&\n parseInt(data.result.driver_trainer_id) ===\n parseInt(this.state.assignedDriverTrainer.id)\n ) {\n same_dt = true;\n }\n\n this.showExistingUserModal(prelim, same_dt);\n this.storeEncryptedState();\n } else {\n this.storeEncryptedState();\n if (typeof callback === \"function\") {\n callback();\n }\n }\n });\n };\n\n // Check Reserved Bookings against logged in Students' existing Bookings\n checkStudentClashes = async (student_id) => {\n return await api\n .post(\"students/clashes\", {\n body: JSON.stringify({\n student_id: student_id,\n bookings: this.state.bookings,\n bookings_sdc: this.state.bookingsSDC,\n }),\n })\n .then((res) => {\n //Convert to JSON in case we've received a string response\n if (typeof res === \"string\") {\n res = JSON.parse(res);\n }\n //Check for an error response (status of \"NOK\")\n if (res.status === \"NOK\" || res.result.success === false) {\n this.setState({\n showErrorMessage: true,\n errorMessage: res.result.error,\n loading: false,\n });\n } else {\n return res.result.unavailable;\n }\n // Return an empty array, just in case.\n return [];\n })\n .catch((error) => {\n console.log(error);\n });\n };\n\n // Make sure that no Bookings or BookingsSDC items in State clash with each other\n checkCartClashes = async (bookingsToCheck) => {\n let clashingBookings = [];\n\n // Convert to checkable format and loop\n Object.entries(bookingsToCheck).forEach(\n ([check_booking_id, check_booking_data]) => {\n // Check against Bookings\n Object.entries(this.state.bookings).forEach(\n ([against_booking_id, against_booking_data]) => {\n if (check_booking_id === against_booking_id) {\n return;\n }\n // Check if check_booking_data.start_time BETWEEN against_booking_data.start_time AND against_booking_data.end_time\n if (\n check_booking_data.start_time.replaceAll(\" \", \"T\") >\n against_booking_data.start_time.replaceAll(\n \" \",\n \"T\"\n ) &&\n check_booking_data.start_time.replaceAll(\" \", \"T\") <\n against_booking_data.end_time.replaceAll(\n \" \",\n \"T\"\n )\n ) {\n clashingBookings.push(check_booking_id);\n return;\n }\n // Check if check_booking_data.end_time BETWEEN against_booking_data.start_time AND against_booking_data.end_time\n if (\n check_booking_data.end_time.replaceAll(\" \", \"T\") >\n against_booking_data.start_time.replaceAll(\n \" \",\n \"T\"\n ) &&\n check_booking_data.end_time.replaceAll(\" \", \"T\") <\n against_booking_data.end_time.replaceAll(\n \" \",\n \"T\"\n )\n ) {\n clashingBookings.push(check_booking_id);\n return;\n }\n // Check if against_booking_data.start_time BETWEEN check_booking_data.start_time AND check_booking_data.end_time\n if (\n against_booking_data.start_time.replaceAll(\n \" \",\n \"T\"\n ) >\n check_booking_data.start_time.replaceAll(\n \" \",\n \"T\"\n ) &&\n against_booking_data.start_time.replaceAll(\n \" \",\n \"T\"\n ) < check_booking_data.end_time.replaceAll(\" \", \"T\")\n ) {\n clashingBookings.push(check_booking_id);\n return;\n }\n // Check if against_booking_data.end_time BETWEEN check_booking_data.start_time AND check_booking_data.end_time\n if (\n against_booking_data.end_time.replaceAll(\" \", \"T\") >\n check_booking_data.start_time.replaceAll(\n \" \",\n \"T\"\n ) &&\n against_booking_data.end_time.replaceAll(\" \", \"T\") <\n check_booking_data.end_time.replaceAll(\" \", \"T\")\n ) {\n clashingBookings.push(check_booking_id);\n return;\n }\n }\n );\n // Check against BookingsSDC\n Object.entries(this.state.bookingsSDC).forEach(\n ([against_booking_id, against_booking_data]) => {\n if (check_booking_id === against_booking_id) {\n return;\n }\n // Check if check_booking_data.start_time BETWEEN against_booking_data.start_time AND against_booking_data.end_time\n if (\n check_booking_data.start_time.replaceAll(\" \", \"T\") >\n against_booking_data.start_time.replaceAll(\n \" \",\n \"T\"\n ) &&\n check_booking_data.start_time.replaceAll(\" \", \"T\") <\n against_booking_data.end_time.replaceAll(\n \" \",\n \"T\"\n )\n ) {\n clashingBookings.push(check_booking_id);\n return;\n }\n // Check if check_booking_data.end_time BETWEEN against_booking_data.start_time AND against_booking_data.end_time\n if (\n check_booking_data.end_time.replaceAll(\" \", \"T\") >\n against_booking_data.start_time.replaceAll(\n \" \",\n \"T\"\n ) &&\n check_booking_data.end_time.replaceAll(\" \", \"T\") <\n against_booking_data.end_time.replaceAll(\n \" \",\n \"T\"\n )\n ) {\n clashingBookings.push(check_booking_id);\n return;\n }\n // Check if against_booking_data.start_time BETWEEN check_booking_data.start_time AND check_booking_data.end_time\n if (\n against_booking_data.start_time.replaceAll(\n \" \",\n \"T\"\n ) >\n check_booking_data.start_time.replaceAll(\n \" \",\n \"T\"\n ) &&\n against_booking_data.start_time.replaceAll(\n \" \",\n \"T\"\n ) < check_booking_data.end_time.replaceAll(\" \", \"T\")\n ) {\n clashingBookings.push(check_booking_id);\n return;\n }\n // Check if against_booking_data.end_time BETWEEN check_booking_data.start_time AND check_booking_data.end_time\n if (\n against_booking_data.end_time.replaceAll(\" \", \"T\") >\n check_booking_data.start_time.replaceAll(\n \" \",\n \"T\"\n ) &&\n against_booking_data.end_time.replaceAll(\" \", \"T\") <\n check_booking_data.end_time.replaceAll(\" \", \"T\")\n ) {\n clashingBookings.push(check_booking_id);\n return;\n }\n }\n );\n }\n );\n\n //Return Clashing Bookings from Supplied\n return clashingBookings;\n };\n\n loginSocialMediaUser = async (res, source, callback) => {\n let previouslyAssignedDT = null;\n if (this.state.shell_student) {\n previouslyAssignedDT = this.state.assignedDriverTrainer.id;\n }\n\n this.sendPageviewToGoogleAnalytics(\n \"/virtual/bookings-new/user-details/login\"\n );\n if (source === \"facebook\") {\n this.sendEventToGoogleTagManager({\n event: \"user-login-facebook\",\n });\n // Smartlook - Track User Login with Facebook\n if (\n window.location.hostname === \"app.ltrent.com.au\" &&\n typeof smartlook !== \"undefined\" &&\n typeof smartlook === \"function\"\n ) {\n // eslint-disable-next-line\n /*global smartlook*/ // This line prevents the below throwing an error when not on production\n smartlook(\"track\", \"user\", {\n type: \"login-facebook\",\n });\n }\n } else if (source === \"google\") {\n this.sendEventToGoogleTagManager({\n event: \"user-login-google\",\n });\n // Smartlook - Track User Login with Google\n if (\n window.location.hostname === \"app.ltrent.com.au\" &&\n typeof smartlook !== \"undefined\" &&\n typeof smartlook === \"function\"\n ) {\n // eslint-disable-next-line\n /*global smartlook*/ // This line prevents the below throwing an error when not on production\n smartlook(\"track\", \"user\", {\n type: \"login-google\",\n });\n }\n }\n\n // Set all of our App Level properties\n if (!this.state.shell_student) {\n this.setAppStateValue(\n \"assignedDriverTrainer\",\n {\n id: res.result.user.student.driver_trainer_id,\n display_name:\n res.result.user.student.driver_trainer === null\n ? null\n : res.result.user.student.driver_trainer\n .display_name,\n headshot:\n res.result.user.student?.driver_trainer === null\n ? null\n : typeof res.result.user.student?.driver_trainer\n ?.website_headshot !== \"undefined\" &&\n res.result.user.student?.driver_trainer\n ?.website_headshot !== null &&\n res.result.user.student?.driver_trainer\n ?.website_headshot !== \"\"\n ? res.result.user.student?.driver_trainer\n ?.website_headshot\n : typeof res.result.user.student?.driver_trainer\n ?.website_photo !== \"undefined\" &&\n res.result.user.student?.driver_trainer\n ?.website_photo !== null &&\n res.result.user.student?.driver_trainer\n ?.website_photo !== \"\"\n ? res.result.user.student?.driver_trainer\n ?.website_photo\n : process.env.REACT_APP_SITE_URL +\n \"/img/default-headshot.webp\", // @todo: remove this fallback to using website_photo when we remove that field in favour of headshots\n website_bio:\n res.result.user.student.driver_trainer === null\n ? null\n : res.result.user.student.driver_trainer\n .website_bio,\n transmissionType:\n res.result.user.student.driver_trainer === null\n ? \"A\"\n : res.result.user.student.driver_trainer\n .vehicle_transmission,\n },\n true\n );\n }\n this.setAppStateValue(\n \"timestamps\",\n {\n user: res.result.user.modified,\n student: res.result.user.student.modified,\n },\n true\n );\n if (typeof res.result.user.address !== \"undefined\") {\n this.setAppStateValue(\n \"pickupAddressString\",\n res.result.user.address.street_number +\n \" \" +\n res.result.user.address.street_name +\n \", \" +\n res.result.user.address.suburb.suburb_full_details\n );\n this.setAppStateValue(\n \"pickup_address_id\",\n res.result.user.address.id\n );\n this.setAppStateValue(\n \"pickup_address_postcode\",\n res.result.user.address.suburb.post_code\n );\n this.setAppStateValue(\n \"pickup_address_state\",\n res.result.user.address.suburb.states.name\n );\n this.setAppStateValue(\n \"pickup_address_street_name\",\n res.result.user.address.street_name\n );\n this.setAppStateValue(\n \"pickup_address_street_number\",\n res.result.user.address.street_number\n );\n this.setAppStateValue(\n \"pickup_address_suburb_id\",\n res.result.user.address.suburb_id\n );\n this.setAppStateValue(\n \"pickup_address_suburb_name\",\n res.result.user.address.suburb.suburb_name\n );\n }\n this.setAppStateValue(\n \"transmissionType\",\n res.result.user.student.driver_trainer === null\n ? \"A\"\n : res.result.user.student.driver_trainer.vehicle_transmission\n );\n this.setAppStateValue(\"existingUser\", true);\n this.setAppStateValue(\n \"completedLesson\",\n typeof res.result.user.completed_lessons === \"undefined\" ||\n res.result.user.completed_lessons === null ||\n parseInt(res.result.user.completed_lessons) === 0\n ? false\n : true\n );\n this.setAppStateValue(\n \"futureLessons\",\n typeof res.result.user.has_future_lessons === \"undefined\" ||\n res.result.user.has_future_lessons === null\n ? false\n : res.result.user.has_future_lessons\n );\n this.setAppStateValue(\"loginModalVisible\", false);\n\n cookies.set(config.environmentShort + \"AT\", res.result.access_token, {\n path: \"/\",\n domain: config.siteDomain,\n });\n this.setAppStateValue(\n \"prepaidData\",\n {\n available: parseFloat(res.result.user.credits.remaining),\n using: 0,\n remaining: 0,\n owing: 0,\n mod1: !!res.result.user.credits?.sdc_remaining\n ? parseInt(res.result.user.credits?.sdc_remaining[10])\n : 0,\n mod2: !!res.result.user.credits?.sdc_remaining\n ? parseInt(res.result.user.credits?.sdc_remaining[11])\n : 0,\n },\n true\n );\n\n this.setAppStateValue(\n \"user\",\n {\n id: res.result.user.id,\n email: res.result.user.email,\n mobile_phone: res.result.user.mobile_phone,\n first_name: res.result.user.first_name,\n last_name: res.result.user.last_name,\n licence_number: res.result.user.student.licence_number,\n hours: res.result.user.student.driving_experience,\n dob: res.result.user.dob,\n hadSDC: res.result.user.hadSDC,\n referral_code: res.result.user.referral_code,\n hide_cash: res.result.user.student.hide_cash_on_website,\n },\n true,\n async () => {\n this.setAppStateValue(\n \"pickupAddressChosen\",\n typeof res.result.user.address === \"undefined\"\n ? false\n : true\n );\n\n // Clear Cart if Assigned DT Clash:\n let dtClash = false;\n // Check for NO Assigned DT.. that's actually okay, but we'll need to assign THIS DT\n if (\n this.state.shell_student &&\n res.result.user.student.driver_trainer_id === null\n ) {\n // Assign the selected DT to the Student\n api.post(\"students/assignDT\", {\n body: JSON.stringify({\n student_id: res.result.user.id,\n driver_trainer_id: previouslyAssignedDT,\n }),\n }).catch((error) => {\n console.log(error);\n });\n }\n // Check for Assigned DT != Current DT.. Clear Cart and Alert User\n else if (\n this.state.shell_student &&\n parseInt(previouslyAssignedDT) !==\n parseInt(res.result.user.student.driver_trainer_id)\n ) {\n // Set dtClash = true to throw error later\n dtClash = true;\n this.clearReservations();\n this.setAppStateValue(\"cart\", {}, true);\n this.setAppStateValue(\"bookings\", {}, true);\n this.setAppStateValue(\"bookingsSDC\", {}, true);\n // Force the Assigned DT to the Student's Assigned DT\n this.setAppStateValue(\n \"assignedDriverTrainer\",\n {\n id: res.result.user.student.driver_trainer_id,\n display_name:\n res.result.user.student?.driver_trainer === null\n ? null\n : res.result.user.student?.driver_trainer\n ?.display_name,\n headshot:\n typeof res.result.user.student?.driver_trainer\n ?.website_headshot !== \"undefined\" &&\n res.result.user.student?.driver_trainer\n ?.website_headshot !== null &&\n res.result.user.student?.driver_trainer\n ?.website_headshot !== \"\"\n ? res.result.user.student?.driver_trainer\n ?.website_headshot\n : typeof res.result.user.student\n ?.driver_trainer?.website_photo !==\n \"undefined\" &&\n res.result.user.student?.driver_trainer\n ?.website_photo !== null &&\n res.result.user.student?.driver_trainer\n ?.website_photo !== \"\"\n ? res.result.user.student?.driver_trainer\n ?.website_photo\n : process.env.REACT_APP_SITE_URL +\n \"/img/default-headshot.webp\", // @todo: remove this fallback to using website_photo when we remove that field in favour of headshots\n website_bio:\n res.result.user.student?.driver_trainer === null\n ? null\n : res.result.user.student?.driver_trainer\n ?.website_bio,\n transmissionType:\n res.result.user.student?.driver_trainer === null\n ? \"A\"\n : res.result.user.student?.driver_trainer\n ?.vehicle_transmission,\n },\n true\n );\n }\n\n // Check for Student Clashes (is logged in Student busy at any of the Reserved times?)\n let studentClash = false;\n if (!dtClash && this.state.shell_student) {\n let clashingBookings = await this.checkStudentClashes(\n res.result.user.id\n );\n if (clashingBookings.length > 0) {\n // Cancel any Unavailable ones, remove from Bookings object\n let cloneBookings = { ...this.state.bookings };\n\n // Loop through and Cancel any Reservations that Clash\n Object.values(clashingBookings).forEach(\n (booking_id) => {\n if (!!cloneBookings[booking_id]) {\n // Remove from Bookings object\n delete cloneBookings[booking_id];\n // Send Cancel Reservation API Request - We don't need to wait for a response - just assume it's ok\n api.post(\"bookings/cancelReservation\", {\n body: JSON.stringify({\n booking: booking_id,\n student: true,\n }),\n }).then(() => {\n this.sendEventToGoogleTagManager({\n event: \"cart-removal-driving-lesson\",\n });\n });\n }\n }\n );\n // Update State\n this.updateBookingsDuration();\n this.setAppStateValue(\"bookings\", cloneBookings, true);\n\n // Alert Student\n studentClash = true;\n }\n }\n\n // Clear Shell Student status, we're now logged in.\n this.setAppStateValue(\"shell_student\", false);\n\n // Hide Login Modal\n this.setAppStateValue(\"loginModalVisible\", false);\n\n // Start Student TimeStamp Polling\n this.startStudentTimeStampChecker();\n\n // Finish Up - Either show an Error, or process the supplied Callback\n if (\n !studentClash &&\n !dtClash &&\n typeof callback === \"function\"\n ) {\n callback();\n } else if (dtClash) {\n Modal.error({\n icon: false,\n title: false,\n content: (\n <>\n

Welcome back!

\n

\n Sorry, the reservation(s) you had did not\n match your Assigned Driver Trainer.\n

\n

\n Please try again. The available times shown\n will now be those of your Driver Trainer.\n

\n

\n If you are having trouble booking, please{\" \"}\n \n contact our office\n \n .\n

\n \n ),\n });\n } else if (studentClash) {\n Modal.error({\n icon: false,\n title: false,\n content: (\n <>\n

Welcome back!

\n

\n Sorry, some of the Reservations you had in\n your Cart clashed with other Bookings in\n your account.\n

\n

\n Please try again. The times shown will now\n be those where both you and your Driver\n Trainer are available.\n

\n

\n If you are having trouble booking, please{\" \"}\n \n contact our office\n \n .\n

\n \n ),\n });\n }\n }\n );\n };\n\n formatter = new Intl.NumberFormat(\"en-AU\", {\n style: \"currency\",\n currency: \"AUD\",\n });\n\n updateBookingsDuration = () => {\n // Sum our Durations\n let duration = 0;\n Object.keys(this.state.bookings).forEach((key) => {\n duration = duration + this.state.bookings[key].duration;\n });\n\n this.setState({\n totalCartBookingDuration: duration,\n });\n };\n\n renderLoader = () =>
;\n\n render() {\n let content = (\n \n \n \n );\n\n return
{content}
;\n }\n}\n\nexport default App;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport App from \"./App\";\nimport config from \"./config\";\nimport * as Sentry from \"@sentry/react\";\n\nif (config.environment === \"production\") {\n Sentry.init({\n dsn: \"https://6cc06a27464449ce871a44c988699afa@sentry.twopicode.com/73\",\n });\n}\n\nif (document.getElementById(\"react-main\") !== null) {\n ReactDOM.render(, document.getElementById(\"react-main\"));\n}\n","import { createBrowserHistory } from \"history\";\nexport default createBrowserHistory();\n","import React from \"react\";\n\n//Ant Design Elements\nimport Spin from \"antd/lib/spin\";\n\nimport(\"../../styles/Spinner.css\" /* webpackChunkName: \"Spinner\" */);\n\nclass Spinner extends React.Component {\n render() {\n return (\n \n \n }\n />\n \n );\n }\n}\n\nexport default Spinner;\n"],"sourceRoot":""}