{"version":3,"sources":["endpoints.config.ts","helpers/auth.ts","api.ts","reducers/auth.ts","reducers/misc.ts","reducers/subscribe.ts","reducers/rootReducer.ts","appConstants.ts","images/Img_Dashboard_PE.jpg","images/Img_Dashboard_Music.jpg","helpers/getImage.ts","images/Icon_Warning.png","components/errorMessage/ErrorMessage.tsx","components/private/Private.tsx","helpers/hasPageAccess.ts","helpers/cache.ts","hooks/useFetchContentAndCache.ts","images/Icon_Social_01.png","components/shared/Footer.tsx","images/Icon_Social_02.png","hooks/useOnClickOutside.tsx","components/headerDropdownMenu/HeaderDropdownMenu.tsx","components/spinner/Spinner.tsx","helpers/blockCopyandPaste.ts","components/popupsAndPanels/PopoutMenu.tsx","hooks/useLockBody.tsx","images/Icon_Dropdown_01.png","images/Logo.png","baseApi.ts","components/headerDropdownMenu/headerDropdownMenuApi.ts","components/headerDropdownMenu/useGetDropdownLinks.ts","components/shared/Header.tsx","images/Icon_Pagination_Dropdown.png","images/Icon_Menu.png","pages/dashboard/dashboardApi.ts","components/shared/Page.tsx","components/freeTrialBanner/FreeTrialBanner.tsx","pages/subscriptions/models.ts","pages/upgradeSubscription/models.ts","api/subscriptionsApi.ts","pages/dashboard/Dashboard.tsx","pages/newSubscription/models.tsx","utils/formating.tsx","components/choosePackageForm/SubscriptionDurationOptions.tsx","components/choosePackageForm/PackageCard.tsx","pages/subscribeFreeTrial/models.ts","api/addFreeTrialApi.ts","api/freeTrialSubscriptionApi.ts","api/newSubscriptionApi.ts","pages/subscribe/models.ts","api/subscribeApi.ts","hooks/useFetchPackages.ts","components/formComponents/FormGeneralError.tsx","helpers/priceCalculations.ts","components/choosePackageForm/ChoosePackageForm.tsx","components/formHeader/FormHeader.tsx","components/formComponents/ErrorM.tsx","components/formComponents/FormStripeCardField.tsx","components/formComponents/Input.tsx","components/formComponents/FormTextField.tsx","hooks/useToast.ts","components/paymentDetailsForm/PaymentDetailsForm.tsx","components/paymentTypeForm/PaymentTypeForm.tsx","components/confirmationBox/ConfirmationBox.tsx","pages/newSubscription/NewSubscription.tsx","components/pageHero/PageHero.tsx","pages/profile/models.ts","components/popupsAndPanels/PopoutMenuFooter.tsx","components/popupsAndPanels/PopoutMenuHeader.tsx","images/Icon_Cross_02.png","components/popupsAndPanels/PopupAndPanels.tsx","api/profileAPI.ts","pages/profile/UpdateProfileForm.tsx","images/Icon_Profile_01.png","images/Img_Profile.png","hooks/useFetchProfiledetails.ts","pages/profile/Profile.tsx","components/infoTable/rightMenu.tsx","components/infoTable/tableFilters.tsx","components/infoTable/listTableFilter.tsx","components/infoTable/listTableHelpers.ts","components/infoTable/listTable.tsx","images/Icon_Clear_Filter.png","images/Icon_Filter.png","images/Icon_Action.png","images/Icon_Pagination_01.png","images/Icon_Pagination_02.png","components/infoTable/listPagination.tsx","images/Icon_Pagination_03.png","images/Icon_Pagination_04.png","components/infoTable/infoTableApi.ts","pages/manageUsers/models.ts","api/usersApi.ts","components/formComponents/helpers.ts","components/formComponents/FormBooleanField.tsx","components/tooltip/Tooltip.tsx","images/Icon_Tooltip.png","pages/dashboard/useGetDashboardList.ts","pages/manageUsers/AddUser.tsx","images/Icon_No_Results.png","helpers/FileUploadPanel/DropzoneCSVOnly.tsx","pages/manageUsers/BulkUpload.tsx","components/infoTable/infoTable.tsx","pages/manageUsers/hooks/useFetchUserDetails.ts","pages/manageUsers/ViewUser.tsx","pages/manageUsers/UpdateUser.tsx","pages/manageUsers/DeleteUsers.tsx","pages/manageUsers/ManageUsersMenuOptions.tsx","pages/manageUsers/hooks/useFetchUserAccesspermissions.ts","pages/manageUsers/AccessPermission.tsx","pages/manageUsers/ManageUsersDropdownOptions.tsx","pages/manageUsers/ManageUsers.tsx","pages/manageSchool/models.ts","api/schoolApi.ts","images/Icon_Upload.png","helpers/FileUploadPanel/Dropzone.tsx","helpers/FileUploadPanel/FileUploadPanel.tsx","pages/manageSchool/UpdateSchoolForm.tsx","pages/manageSchool/UpdateSchool.tsx","images/Icon_Warning_01.png","pages/manageSchool/UpdateArchiveDateForm.tsx","pages/manageSchool/ArchiveInstantly.tsx","pages/manageSchool/UpdateArchiveDate.tsx","hooks/useFetchSchoolDetails.ts","images/Wonde_Logo.png","images/Progress_Indicator.gif","pages/wondeIntegration/models.tsx","api/wondeApi.ts","pages/wondeIntegration/WondeLink.tsx","images/Blue_Tick.png","pages/wondeIntegration/wIFeatures/PreviouslyMatchedRecords.tsx","pages/wondeIntegration/wISteps/WIStep1.tsx","pages/wondeIntegration/wISteps/WIStep2.tsx","images/DandD_Icon.png","pages/wondeIntegration/wIPopups/CreateRecordsPopup.tsx","pages/wondeIntegration/wISteps/WIStep3.tsx","pages/wondeIntegration/wIPopups/DeleteRecordsPopup.tsx","pages/wondeIntegration/wISteps/WIStep4.tsx","pages/wondeIntegration/wIPopups/UnableToSyncDataPopup.tsx","pages/wondeIntegration/SimpleTableSyncError.tsx","pages/wondeIntegration/WondeYearSink.tsx","pages/wondeIntegration/WondeIntegration.tsx","pages/manageSchool/ManageSchool.tsx","images/Icon_ManageSchool_01.png","images/Icon_ManageSchool_02.png","helpers/downloadFile.ts","pages/invoices/models.ts","api/invoicesApi.ts","helpers/openFile.ts","pages/invoices/InvoicesMenuOptions.tsx","pages/invoices/InvoiceDropdownOptions.tsx","pages/invoices/Invoices.tsx","utils/form.ts","components/formComponents/FormCheckBoxField.tsx","components/signInForm/SignInForm.tsx","hooks/useDefaultRoute.ts","pages/SignIn.tsx","components/forgottenPasswordForm/ForgottenPasswordForm.tsx","components/forgottenPasswordForm/forgottenPasswordApi.ts","pages/ForgottenPassword.tsx","components/resetPasswordForm/ResetPasswordForm.tsx","components/resetPasswordForm/resetPasswordApi.ts","pages/ResetPassword.tsx","components/profileDetailsForm/ProfileDetailsForm.tsx","hooks/useFetchSchoolInfo.ts","utils/regex.tsx","components/schoolDetailsForm/SchoolDetailsForm.tsx","pages/subscribe/Subscribe.tsx","pages/subscriptions/UpgradeSubscriptionsForm.tsx","pages/subscriptions/UpgradeSubscriptions.tsx","hooks/useFetchUpgradeSubscriptionsList.ts","pages/subscriptions/RenewSubscriptionsForm.tsx","hooks/useFetchRenewalSubscription.ts","pages/subscriptions/Subscriptions.tsx","components/toast/Toast.tsx","images/Paid_Stamp.jpg","pages/invoices/InvoicePage.tsx","pages/upgradeSubscription/UpgradeFreeSubscriptions.tsx","components/chooseFreeTrialPackageForm/FreeTrialPackageCard.tsx","components/chooseFreeTrialPackageForm/ChooseFreeTrialPackage.tsx","images/Icon_Complete.png","pages/subscribeFreeTrial/SubscribeFreeTrial.tsx","components/setPasswordForm.tsx/setPasswordApi.ts","components/setPasswordForm.tsx/SetPasswordForm.tsx","pages/SetPassword.tsx","pages/NotFound.tsx","components/errorBoundary/ErrorBoundary.tsx","components/errorFallback/ErrorFallback.tsx","pages/addFreeTrial/models.ts","pages/addFreeTrial/AddFreeTrial.tsx","images/Icon_Cross_01.png","images/Icon_Minus_01.png","components/shared/ToggleSwitch.tsx","components/shared/CookieSettingsPopup.tsx","components/shared/CookieBanner.tsx","App.tsx","index.tsx"],"names":["baseUrl","domain","BASE_URL","DOMAIN","endpoints","auth","login","concat","authLogin","refreshAccessToken","createPassword","user","public","navigation","headerLinks","footerLinks","subscription","getSubscriptions","getSubscriptionsWithPromocode","validateSchoolInfo","createsSchoolUser","createsSchoolUserFreeTrial","subscribeByInvoice","subscribeByCard","updateAfter3DSecure","getSubscriptionsFreeTrial","subscribeFreeTrial","forgottenPassword","requestPasswordReset","resetPassword","dashboard","list","availablePages","autoLoginToken","restartTrial","subscriptions","upgradeSubscriptionsList","packages","addsubscriptionswithpromocode","checkpromocode","subscribebyinvoice","updatAfter3DSecure","upgradeByCard","upgradeByInvoice","updatAfter3DSecureUpgrade","getSchoolInfo","updateSchoolInfo","getSchoolUsers","updateSchoolUserAccess","getRenewalSubscriptions","renewByInvoice","renewByCard","updateAfter3DSecureRenew","profile","profileDetails","updateemailpreferences","updateprofile","manageUsers","addUser","updateuser","updateaccesspermissions","viewuser","deleteuser","downloadUserTemplateCSV","downloadUserListCSV","uploadUserListCSV","invoices","viewInvoice","downloadInvoice","manageschool","getSchoolDetails","updateSchoolDetails","updateArchivingDate","archiveNow","subscribe","subscriptionContent","wondeIntegration","checkLinkStatus","getSchoolLinkList","requestAccess","syncData","compareAcademicYears","syncMatchedData","classStep1List","classStep1NameMatch","classStep2ManualMatchList","classStep2ManualMatch","classStep3List","classStep3UnmatchedWondeClasses","classStep4List","classStep4UnmatchedClassesDelete","pupilStep1List","pupilStep1NameMatch","pupilStep2ManualMatchList","pupilStep2ManualMatch","pupilStep3List","pupilStep3UnmatchedWondeClasses","pupilStep4List","pupilStep4UnmatchedClassesDelete","prevMatchedRecordsClass","prevMatchedRecordsPupil","saveTokenResource","resource","window","localStorage","setItem","tokenExpires","toString","accessToken","refreshToken","refreshTokenExpires","profileInitials","scopes","JSON","stringify","loadTokenResource","tokenExpiry","getItem","refreshExpiry","Error","Date","refreshExpiryDate","isPast","_error","clear","cookies","Cookies","setAuthCookie","data","expiresIn","details","addSeconds","parseInt","set","expires","clearAuthCookie","remove","signOut","signOutCreator","refreshEndpoint","instance","axios","create","baseURL","reqHandler","constructor","isFetchingToken","pendingRequests","addToQueue","callback","this","push","onTokenFetched","token","forEach","cb","clearQueue","interceptors","request","use","store","dispatch","setUserInitials","authHeader","Authorization","headers","err","response","fulfilled","rejected","_rejected$response","status","Promise","reject","async","errorResponse","awaitingNewToken","resolve","config","post","errors","length","refreshTokenExpiresIn","sameSite","secure","error","createUseTable","createUseFetch","isResponseOkay","r","initialState","authStatus","appVisible","message","SIGN_OUT","SIGN_IN","SIGN_IN_OKAY","SIGN_IN_ERROR","AUTO_SIGN_IN","SHOW_APP","CHECK_SIGNED_IN","SET_USER_INITIALS","makeRequest","from","api","saveResponse","checkResponse","signInOkay","signInError","parseApiErrorMessageCode","code","authEpic","combineEpics","action$","pipe","ofType","switchMap","attempt","url","payload","method","tap","res","map","catchError","_err$response","_err$response2","errorMessage","messageCode","of","error_description","error_uri","_err$response3","_err$response4","action","check","signOutMarker","ignoreElements","showApp","type","arguments","undefined","selectAuthStatus","app","selectSignedIn","createSelector","selectAuthMessage","selectAppVisible","selectUserInitials","accessibilityMode","acceptCookies","mobileMenuOpen","toastStatus","open","selectedPackages","validPromoCode","blogIds","caseStudiesIds","subscriptionPrice","price","vat","total","vatRate","discount","discountType","poNumber","FinanceEmail","updateUsersList","schoolDetails","registrationToken","GeneralAction","PricingAction","BlogAction","CaseStudyAction","SubscribeAction","ManageUsersAction","clearPackageForm","CLEAR_SELECTED_PACKAGE","updateSelectedPackages","SELECT_PACKAGES","setValidPromoCode","SET_VALID_PROMO_CODE","clearPoNumber","CLEAR_PO_NUMBER","setUpdateUsersList","SET_UPDATE_USERS_LIST","setRegistrationToken","SET_REGISTRATION_TOKEN","toogleToast","TOGGLE_TOAST","selectAccessibilityMode","misc","selectSelectedPackages","selectValidPromoCode","selectPoNumber","selectFinanceEmail","selectUpdateUsersList","selectPrice","selectShoolDetails","selectRegistrationToken","selectToastStatus","preTaxPrice","totalPrice","SubscribeActionType","rootReducer","combineReducers","state","produce","draft","SET_TOTAL_PRICE","TOGGLE_MOBILE_MENU","ACCEPT_COOKIES","TOGGLE_ACCESSIBILITY_MODE","SET_PO_NUMBER","SET_FINANCE_EMAIL","CLEAR_FINANCE_EMAIL","SET_BLOG_IDS","SET_CASE_STUDIES_IDS","SET_PRICE","SET_SCHOOL_DETAILS","CLEAR_SCHOOL_DETAILS","rootEpic","publicbaseUrl","stripeKey","PUBLIC_SITE_URL","STRIPE_KEY","AppPath","SubscriptionTypes","PaymentTypes","ERROR_MESSAGE","NOT_FOUND_PAGE","PASSWORD_REGEX","PASSWORD_MATCH_POLICY_ERROR_MESSAGE","getSubjectImage","subject","musicImage","peImage","ErrorMessage","_ref","_jsx","className","children","_jsxs","src","WarningIcon","alt","Private","useSelector","_Fragment","Redirect","noThrow","to","hasPageAccess","pathName","stringifyScopes","parse","path","split","replaceAll","find","s","addExpiryDate","content","expiryInHours","expiryDate","hoursFromNow","currentTime","setHours","getHours","toISOString","createExpiryDate","getItemFromLocalStorage","item","contentAsString","parsedContent","isFuture","useFetchContentAndCache","resourceKey","cachedContent","setCachedContent","useState","AxiosInstance","then","contentWithExpiry","dataToCache","storeInLocalStorage","console","Footer","useDispatch","footerItems","cookieBannerSetting","get","href","target","rel","navigationLinks","index","name","onClick","toggleAccessibilityMode","getYear","useOnClickOutside","callOnEsc","ref","useRef","useEffect","handleClick","e","current","contains","buttons","handleEsc","keyCode","document","addEventListener","removeEventListener","HeaderDropdownMenu","initials","linkListData","isOpen","setIsOpen","bind","toggleIsOpen","oldVal","displayName","Link","toLowerCase","handleSignOut","Spinner","size","color","ThreeBounce","copyEvent","event","_event$clipboardData","clipboardData","setData","preventDefault","stopPropagation","BlockCopyandPaste","eleList","querySelectorAll","avoidEleEvents","value","wholeSection","eleListEventAdd","eleListEventRemove","removeWholeSectionEvents","i","j","addEle","k","nodeName","indexOf","removeEle","n","parentNode","closest","l","m","PopoutMenu","isPopup","handleClose","position","width","minWidth","mobileMenu","loading","zIndexVal","noChildren","setNoChildren","openCloseState","setOpenCloseState","openCloseTime","_safariStr","navigator","userAgent","_safari","is_iOS","match","body","style","overflowY","setTimeout","toggle","useLayoutEffect","disableBodyScroll","clearAllBodyScrollLocks","useLockBody","styleObj","zIndex","BaseApi","isResponseSuccessful","successResponse","formErrors","DropdownLinksApi","_DropdownLinksApi","getDropdownLinks","result","HeaderLinkWithChildElements","_ref2","_item$childElements","prevIsOpen","onMouseLeave","childElements","HeaderSubLinkWithChildElements","bAbsoluteURL","_ref3","_item$childElements2","onMouseEnter","id","Header","menuItems","isSignedIn","userInitials","burgerMenuIsOpen","setBurgerMenuIsOpen","useGetDropdownLinks","dropdownLinksInfo","setDropdownLinksInfo","setProfileInitials","useCallback","listAvailablePages","initialsToUse","headerItems","Logo","hasChildElements","React","Fragment","SUBSCRIBE","handleBurgerMenuOpen","handleBurgerMenuClose","childItem","subChildItem","UNKNOWN_ERROR_MESSAGE","DashboardApi","_DashboardApi","getDashboardList","getAutoLoginToken","packageID","account_package_id","Page","isPublic","isNotFound","redirectPath","redirectParams","autoLogin","setToken","showPleaseWait","setShowPleaseWait","location","useLocation","pathname","queryParams","queryString","search","getFetchAutoLoginToken","redirectURL","newRedirectURL","replace","area","DASHBOARD","FreeTrialBanner","daysLeft","isFreeTrialValid","upgradeSubscriptions","dashboardListInfo","trialTxtList","setTrialTxtList","list_info","txtList","trialRemainingDays","getPackageTrialTxtList","SubscriptionsParser","parseGetSubscriptionList","fromDate","format","toDate","renewalDate","createEmptyUpgradePackages","paymentType","PAY_BY_CARD","package","cardholderName","card","validDiscount","createEmptyRenewPackages","SubOption","subDuration","buildUpgradeByInvoicePayload","values","_values$package","promoCode","packageIDs","packageId","expectedGrossAmount","buildUpgradeByCardPayload","_values$package2","nameOnCard","cardEndDigits","last4","exp_month","exp_year","stripeToken","buildRenewByInvoicePayload","buildRenewByCardPayload","buildRenewAfter3DSecurePayload","tid","stripePaymentIntentID","payment_intent","paymentIntent","parseError","UpgradeFreeSubscriptionStep","UpgradeSubscriptionParser","buildSchoolDetailsPayload","addressLine2","addressLine3","county","buildSchoolUserAccess","selectedUsers","p","idsToGrantAccess","getPageHeaderInfo","step","CHOOSE_PACKAGE","title","nextStep","SCHOOL_DETAILS","PAYMENT_TYPE","PAYMENT_DETAILS","CONFIRMATION","UNKOWN_ERROR_MESSAGE","SubscriptionsApi","_SubscriptionsApi","getSubscriptionsList","parsedList","listSubscriptions","getUpgradeSubscriptionsList","updateAfter3DSecureUpgrade","schoolUsers","getRenewalSubscription","renewAfter3DSecureUpgrade","Dashboard","_isFreeTrialValid$tri","setLoading","updateToken","setUpdateToken","updateList","setUpdateList","setDashboardListInfo","accessInfo","setAccessInfo","setError","allLessonsOnTrial","setAllLessonsOnTrial","notOneLessonTrialExpired","setNotOneLessonTrialExpired","setIsFreeTrialValid","isFreeTrialExpired","setIsFreeTrialExpired","oneTrialOneActive","setOneTrialOneActive","getDashboardListInfo","listSubjects","bCanAddFreeTrial","bCanAddSubscription","fetchSubscriptionsList","isFreeTrial","allLessonsOnTrialCheck","oneLessonTrialExpired","prevLessonExpired","expiredFlag","bExpired","notOneLessonTrialExpiredCheck","isFreeTrialValidCheck","isFreeTrialExpiredCheck","oneLessonExpiredArr","oneLessonActiveArr","oneLessonExpiredFunc","arr","some","v","oneLessonActiveFunc","oneLessonExpired","oneLessonActive","navigate","UPGRADE_SUBSCRIPTION","isTodayOrBeforeExpiryDate","date","parsedDate","parseISO","isBeforeDate","isBefore","isTodayDate","isToday","handleNewSubscription","NEW_SUBSCRIPTION","handleNewFreeTrial","NEW_FREE_TRIAL","spinnerHTML","dashboardHTML","sub","canGetFreeTrial","canSubscribe","newWindow","opener","redirectToSubjectSite","link","disabled","restartLessonTrial","accountPackageID","SUBSCRIPTIONS","NewSubscriptionStep","NewSubscriptionParser","createEmptyPaymentType","financeEmail","byCard","byInvoice","buildArchiveNowPayload","buildUpdateAfter3DSecurePayload","formatNumber","number","parseFloat","Number","toFixed","formatPrice","SubscriptionDurationOptions","duration","toggleSubscriptionDuration","subjectInfo","checkPackageAvailable","isAvailableForSchool","PackageCard","_subjectInfo$subscrip2","selectPackage","ageGroup","isChecked","setIsChecked","packageDuration","setPackageDuration","packageCardSelected","setFirstPackageHighlight","_subjectInfo$subscrip","firstPackageAvailable","packagePrice","isPackagedAvailable","isPackageAvailable","togglePackageCard","prevState","selectedPackage","FreeTrialSubscriptionParser","buildSubmitFreeTrialPackagesPayload","AddFreeTrialApi","_AddFreeTrialApi","getPackages","submitFreeTrialPackages","FreeTrialSubscriptionApi","_FreeTrialSubscriptionApi","NewSubscriptionApi","_NewSubscriptionApi","checkPromoCode","SubscriptionStep","SubscribeParser","createEmptySchoolDetails","schoolInfo","_schoolInfo$phoneNumb","_schoolInfo$addressLi","_schoolInfo$addressLi2","_schoolInfo$addressLi3","_schoolInfo$townCity","_schoolInfo$county","_schoolInfo$country","_schoolInfo$postcodeZ","schoolname","schoolName","phoneNumber","addressLine1","townCity","country","postcodeZipcode","createEmptySchoolUser","firstName","lastName","emailAddress","password","confirmPassword","schoolOfficeFirstName","schoolOfficeLastName","schoolOfficeEmailAddress","bAcceptedTermsAndConditions","createEmptySchoolUserFreeTrial","buildSchoolUserDetailsPayload","buildSchoolUserDetailsPayloadFreeTrial","buildSubscribeByCardPayload","PROFILE_DETAILS","SubscribeApi","_SubscribeApi","createSchoolUser","createSchoolUserFreeTrial","useFetchPackages","setPackages","setVatRate","amountOff","setAmountOff","setFinanceEmail","SUBSCRIBE_FREE_TRIAL","generalPackages","FormGeneralError","getVATAndPriceWithVAT","priceWithVAT","ChoosePackageForm","onSubmit","decode","allPackages","setAllPackages","amountOffDiscount","setAmountOffDiscount","setPromoCode","priceInfo","setPriceInfo","appliedDiscountType","freeTrialPackages","subjects","flat","filter","paramPackage","calculatePrice","packageList","filteredPackageList","reduce","prev","cur","VATValue","multiPackageDiscountedTotalPriceWithoutVat","multiPurchaseDiscount","multiPackageDiscountedTotalPriceWithVat","multiPackageVATValue","multiPackageDiscount","percentageOffDiscountedTotalPriceWithoutVat","promoCodeDiscount","percentageOffDiscountedTotalPriceWithVat","percentageOffVATValue","percentageOffDiscount","accumulatedDiscounts","amountOffDiscountedTotalPriceWithoutVat","amountOffDiscountedTotalPriceWithVAT","amountOffDiscountValue","amountOffVATValue","discountedTotalPriceWithVAT","discountedVATValue","discountValue","finalDiscountTotalPriceWithVAT","finalDiscountedVATValue","finalDiscountValue","finalPrice","finalVATValue","finalDiscount","finalDiscountType","applyPromoCode","allUpdatedPackages","updatedSelectedPackages","updateSelectedPackagesWithDiscount","packageGroup","description","onChange","placeholder","onContinue","minHeight","display","justifyContent","alignItems","FormHeader","activeStep","numOfSteps","ErrorM","props","msg","FormStripeCardField","field","label","required","labelPosition","Field","form","CardElement","val","setErrors","card_details","Input","meta","useField","showError","touched","rows","maxLength","readOnly","FormTextField","hint","optionalTag","visible","useToast","windowGlobal","PaymentDetailsFormWithStripe","injectStripe","stripe","useNavigate","handleToast","validationSchema","Yup","setSubmitting","clientSecret","handleCardAction","updateAfte3DSecure","handleFormSubmition","formikHelpers","createStripeToken","createToken","Formik","initialValues","cardNumber","cvv","_ref4","isSubmitting","Form","PaymentDetailsForm","Elements","PaymentTypeForm","email","handleSubmitForm","enableReinitialize","setFieldValue","checked","htmlFor","ConfirmationBox","buttonText","buttonOnClick","INVOICE_SUCCESS_MESSAGE","NewSubscription","setActiveSet","typeOfPayment","PageHero","image","ProfileParser","createEmptyProfileDetails","newPassword","confirmNewPassword","PopoutMenuFooter","handlePrimaryButtonClick","handleSecondaryButtonClick","primaryButtonText","secondaryButtonText","primaryBtnColor","btnColour","PopoutMenuHeader","PopupOrPanel","hdrTitle","primaryBtnTxt","secondaryBtnTxt","givenClass","noFooter","handlePrimaryBtn","handleSecondaryBtn","handCLoseFunc","primaryBtnFunc","secondaryBtnFunc","ProfileApi","_ProfileApi","getProfileDetails","updateEmailPreferences","updateProfileDetails","min","max","matches","oneOf","UpdateProfileForm","updateIsOpen","handleMenuClose","setProfileDetails","_result$data$lastName","slice","toUpperCase","handleSubmit","submitForm","useFetchProfileDetails","fetchProfileDetails","Profile","_profileDetails$first","_profileDetails$lastN","_profileDetails$first2","_profileDetails$lastN2","_profileDetails$email","setUpdateIsOpen","profileHeroImage","bEmailAlerts","emailAlertValue","newState","RightMenu","checkboxList","setIsPanelClosed","childrenWithProps","Children","child","isValidElement","cloneElement","filterOptList","TableFilters","listData","filterOpts","setFilterOpts","formikContext","useFormikContext","columns","column","columnKey","bFilterable","labelValue","Select","isSearchable","options","newArray","newVal","Object","assign","onKeyUp","DateTimeRangeField","helpers","startDate","setStartDate","endDate","setEndDate","newValues","DatePicker","placeholderText","selected","formattedDate","operator","setValue","dateFormat","popperModifiers","hide","enabled","minDate","ListTableFilter","listUrl","loadInfoTableList","panelOpen","togglePanelOpen","filterValueList","fieldsFiltered","endpointString","property","param","listTableUrlParamObj","assignCheck","currentId","sortCol","infoListData","sortBy","currentSortCol","substr","currentSortBy","substring","lastIndexOf","newSortBy","sortCheck","ListTable","firstColWidth","firstColWidthSm","dropdrownMenuOptions","isPanelClosed","allowSelectAll","filterTable","noResultsMessage","hideSideMenu","getSelectedOpts","rowHighlight","hideChkboxCol","rowClassname","listDataOriginal","dataColumns","dataColumnKeys","dataItems","allCheckedIds","tableToFilter","col","sort","col1","col2","orderNumber","lcKeyNames","keys","key","tableDataValues","firstColWidthDetails","isDesktopOrLaptop","lgColWidth","smColWidth","firstColWidthDetect","useMediaQuery","query","setCheckboxList","selectedRowName","setSelectedRowName","openFiltersPopup","setFiltersPopup","openDropdownMenu","setDropdownMenu","sortByCol","setSortByCol","itemOptions","itemId","getSelectedIdsFunc","ids_list","optList","getOpts","sortByVal","sortVal","setCheckedIds","allChkChecked","toggleSelectAll","bSortable","maxWidth","rowName","ids","toggleCurrentChkBox","itemIndex","colIndex","itemVal","reverse","join","checkItemValType","filters","cursor","visibility","ListPagination","pageNumber","pageSize","resultsCount","totalPages","ddValArr","itemNumStart","itemNumEnd","previousBtnsInactive","nextBtnsInactive","pageSizeViaDropdown","goToPageViaInput","goToFirstPage","goToPreviousPage","goToNextPage","goToLastPage","Math","ceil","itemNumCounter","keynum","which","isNaN","tablePaginationValues","Pagination1","Pagination2","defaultValue","InfoTableApi","_InfoTableApi","getInfoTableList","newParams","urlWithParams","paramArr","URLSearchParams","setUpListEndpoint","UsersParser","createEmptyUser","bMainAccountHolder","bGetSet4PE","bGetSet4Music","parseGetUserDetails","bInvoices","bManageSchool","bManageUsers","bSubscriptions","mainAccountHolder","getSet4PE","getSet4Music","parseGetUserAccessPermissions","buildUserPayload","platforms","buildAccessPermissionsPayload","schoolUsersID","parseUserBulkDetails","countInserted","insertionsStatus","recordsInserted","parseCSVError","UsersApi","_UsersApi","getUserDetails","getUserAccessPermissions","submitUser","submitAccessPermissions","deleteUser","idsToDelete","insertionsStatusErr","deepGet","obj","segments","toPath","FormBooleanField","fieldName","tooltip","role","Tooltip","text","handleHover","useGetDashboardList","AddUser","validationSchemaAddUser","subscriptionsListError","subscriptionsList","setSubscriptionList","subjectsList","positionAbsolute","DropzoneCSVOnly","imageBase64","setImageBase64","uploadedFile","isCSVCheck","reader","FileReader","onloadend","readAsDataURL","getRootProps","getInputProps","isDragActive","useDropzone","dropzoneOptions","onDrop","hasUploadedImage","multiple","uploadedImageUrl","showWarningMessage","warningIcon","dropzoneText","fileName","BulkUpload","errorList","setErrorList","setIsSubmitting","fileUploaded","setFileUploaded","uploadList","formData","FormData","append","marginBottom","downloadUrl","URL","createObjectURL","Blob","createElement","setAttribute","appendChild","click","revokeObjectURL","downloadList","downloadTemplate","file","isCSV","resetFile","InfoTable","secondButtonText","updateListStatus","setCheckTableLoading","hideBtmCtrls","wondeRow","wondeRowType","setTableData","setTableError","infoTxt","setInfoListData","setErrorMessage","setNoResultsMessage","listPanelOpen","setListPanelOpen","bulkUploadPopupOpen","setBulkUploadPopupOpen","paramsArr","listResults","infoTableData","useFetchUserDetails","setInitialState","fetchUserDetails","ViewUser","setInitialValues","UpdateUser","detailsError","setDetailsError","handleSubmitUserDetails","DeleteUsers","addPluralTxt","ManageUsersMenuOptions","openViewPopup","setOpenViewPopup","openUpdatePopup","setOpenUpdatePopup","openAccessPopup","setOpenAccessPopup","openDeletePopup","setOpenDeletePopup","Transition","in","timeout","mountOnEnter","transitionState","useFetchUserAccessPermissions","fetchUserAccessPermissions","AccessPermission","ManageUsersDropdownOptions","closeMenu","rowId","ManageUsers","updateUsersListStatus","removeItem","SchoolParser","createEmptyArchivingInfo","yearlyArchivingDate","parseGetSchoolDetails","_response$addressLine","_response$addressLine2","_response$county","buildSubmitSchoolPayload","schoolPhoneNumber","buildArchiveSchoolPayload","formatISO","SchoolApi","_SchoolApi","submitSchoolDetails","submitSchoolDetailsIForm","submitArchiveDate","submitArchiveNow","Dropzone","dropzoneOptObj","acceptedTypes","accept","uploadIcon","UploadIcon","fileType","FileUploadPanel","_props$readOnly","setHasUploadedImage","setShowWarningMessage","setFileType","chosen_file","isImage","isVideo","isDoc","showUploadedImage","setDropzoneWarningMsg","warning_str","acceptedFiles","filesValPassed","fileExt","maximumNoOfFiles","pluralTxtMsg","_props$fileType","toLocaleLowerCase","maximumFileSizeInMB","file_validated","onFileUploadEnd","completeFileValidation","validateFiles","videoName","videoExtension","fileInstructions","UpdateSchoolForm","languageList","languageOption","setLanguageOption","langDropdownToggle","setLangDropdownToggle","langOpt","langItem","getFieldProps","setSchoolLogoFile","setSchoolLogoUrl","setSchoolLogoUpdated","schoolLogoUrl","schoolLogoFile","schoolLogoExt","removeSchoolLogo","setRemoveSchoolLogo","validationSchemaUpdateSchool","nullable","UpdateSchool","setSchoolDetails","logoUrl","logoExtension","schoolLogoUpdated","setSchoolLogoExt","valuesObj","handleSubmitUpdateSchool","validateOnBlur","UpdateArchiveDateForm","ArchiveInstantly","archive","validationSchemaArchivingDate","typeError","transform","originalValue","isDate","UpdateArchive","openArchivePopup","setOpenArchivePopup","archiveNowError","setArchiveNowError","handleArchiveNow","closePanel","handleSubmitArchivingDate","useFetchSchoolDetails","WondeLinkStatusError","WondeApi","_WondeApi","educationNumber","requestAccessFromSelectedSchool","selectedSchoolId","schoolAddress","wondeSchoolId","SchoolUsersEmailAddress","syncWondeData","selectedSyncType","dataType","wondePupilRecords","submitSelectedWondePupilRecords","submitSelectedWondeExactMatches","selectedIds","matchedPairs","getWondeUnmatchedRecords","submitSelectedMatchedWondeRecords","selectedRecords","submitSelectedWondeRecords","_error$response","_error$response$data","deleteRemainingGetSetRecords","WondeLink","setWondeIntegration","setSelectedSyncType","setWondeSchoolId","setSyncResponse","linkStatusLoading","setLinkStatusLoading","linkStatusLoadingError","setLinkStatusLoadingError","wondeAccessDetails","setWondeAccessDetails","accessRequested","accessApproved","schoolUsersEmailAddress","setEducationNumber","findSchoolLoading","setFindSchoolLoading","findSchoolLoadingError","setFindSchoolLoadingError","syncLoadingError","setSyncLoadingError","schoolsList","setSchoolsList","selectSchoolLoading","setSelectSchoolLoading","setSelectedSchoolId","selectedSchoolError","setSelectedSchoolError","savedCallback","setInterval","clearInterval","updateWondeDetails","followUpCheckLinkStatus","bWondeAccessRequested","bWondeAccessApproved","schoolAddressStr","zipPostCode","WondeImg","ProgressIndicator","scrollTo","scrollHeight","submitSelectedSyncType","findSchoolsList","school_address","address_line_1","address_postcode","address_country","generateSchoolAddress","address","confirmSchoolSelection","PreviouslyMatchedRecords","currentSynOpt","setListUrl","tableError","tableData","toggleRecordsShow","setToggleRecordsShow","loadData","currentListUrl","WIStep1","setCurrentStep","checkTableLoading","submitUrl","setSubmitUrl","pageName","setPageName","matchesSelected","setMatchesSelected","successToast","currentSubmitUrl","classes__id","wondeclasses__id","pupils__id","wondepupils__id","schoolusers__id","wondeSchoolusers__id","submitMatchOpts","WIStep2","generalError","setGeneralError","originalRecordsData","setOriginalRecordsData","recordsData","setRecordsData","selectedWondeItem","setSelectedWondeItem","selectedGetSetItem","setSelectedGetSetItem","matchedRecordsData","setMatchedRecordsData","updatingRecords","setUpdatingRecords","matchSelectedRecords","wondeRecordsTypeList","unmatchedWondeClasses","unmatchedWondePupils","getSetRecordsTypeList","unmatchedClasses","unmatchedPupils","inititalData","recordsType","columnName","records","applicableYear","keyStage","recordsDataCopy","matchedRecordsDataCopy","wondeRecordMatchIndex","getSetRecordMatchIndex","selectedWondeItemObj","selectedGetSetItemObj","splice","getStyle","draggableStyle","virtualStyle","isDragging","combined","height","grid","Item","provided","draggableProps","dragHandleProps","innerRef","recordClassName","recordYearGroup","recordKeyStage","Row","memo","items","Draggable","draggableId","isDragDisabled","snapshot","areEqual","DragDropContext","onDragEnd","results","destination","droppableId","onDragUpdate","list_col_index","Droppable","mode","renderClone","rubric","source","itemCount","isUsingPlaceholder","FixedSizeList","itemSize","outerRef","itemData","wondeRecord","getSetRecord","unmatchRecord","item_index","wondeRecordUnmatchIndex","getSetRecordUnmatchIndex","original_item","submitSelectedRecords","CreateRecordsPopup","recordsSelected","setCreateErrors","closeModal","isEmailError","EMAIL_ERROR_MSG","selected_items","errorsIndexs","num","errorIds","_","includes","wondeschoolusers__id","submitRecordOpts","wondeclasses__classname","wondepupils__name","wondeschoolusers__name","WIStep3","setRecordsSelected","createRecordsPopupOpen","setCreateRecordsPopupOpen","createErrors","DeleteRecordsPopup","syncDataOpts","setSyncDataOpts","handleDataSyncNextStep","updatedSyncDataOpts","classes__classname","pupils__name","contactdetails__name","WIStep4","deleteRecordsPopupOpen","setDeleteRecordsPopupOpen","UnableToSyncDataPopup","backToProfilePage","unableToSyncMsg","SimpleTableSyncError","errorMsg","seeMore","setSeeMore","dataLength","handleToggleSeeMore","WondeYearSink","_syncResponse$nonConf","syncResponse","recordData","setRecordData","unableToSyncPopupOpen","setUnableToSyncPopupOpen","setUnableToSyncMsg","submitYearSync","yearSelected","years_to_sync","currentAcademicStartYear","nonConformingPupils","samplePupils","textAlign","fullName","wondeId","wondeClassName","wondeApplicableYears","currentAcademicYear","nextAcademicYear","WondeIntegration","currentStep","currentStepPage","ManageSchool","_schoolDetails$school","_schoolDetails$addres","_schoolDetails$addres2","_schoolDetails$addres3","_schoolDetails$postco","_schoolDetails$countr","_schoolDetails$yearly","dateIsOpen","setDateIsOpen","backgroundImage","backgroundSize","backgroundPosition","backgroundRepeat","downloadFile","responseType","fileExtention","InvoicesParser","InvoicesApi","_InvoicesApi","getViewInvoiceUrl","openFile","InvoicesMenuOptions","InvoiceDropdownOptions","Invoices","FormCheckboxField","labelLinkText","labelLinkHref","onlyOneOptionSelected","SignInForm","submitError","setSubmitError","rememberMe","getURLToken","resetForm","signIn","encodeURIComponent","FORGOTTEN_PASSWORD","SignIn","useDefaultRoute","getURLArea","SUCCESS_MESSAGE","ForgottenPasswordForm","formIsPosted","setFormIsPosted","PostForgottenPassword","ForgottenPassword","passwordResetToken","tokenVal","PostResetPassword","ResetPassword","ResetPasswordForm","ProfileDetailsForm","freeTrialPage","setFreeTrialPage","test","registartionToken","onlyDigitsBracketsSpacesDashesPluses","SchoolDetailsForm","schoolDetailsError","useFetchSchoolInfo","setSchoolInfo","Subscribe","subscriptionStep","setSubscriptionStep","subscriptionIsComplete","setSubscriptionIsComplete","UpgradeSubscriptionsForm","PAY_BY_INVOICE","discountedTotalPriceWithoutVAT","vatValue","paddingTop","UpgradeStep","UpgradeSubscriptionsWithStripe","menuTitle","upgradeStep","setUpgradeStep","SELECT_TYPE","handlePayByCardToast","handlePayByInvoiceToast","subscriptionsListInfo","setSubscriptionsListInfo","upgradeList","useFetchUpgradeSubscriptionsList","handleFormSubmission","setFieldError","PAY","_values$package3","_values$package4","STANDARD","INVESTEMENT","UpgradeSubscriptions","RenewSubscriptionsWithStripe","promoCodeList","setPromoCodeList","packageIdState","setPackageIdState","subscriptionOption","setSubscriptionOption","subscriptionError","setSubscription","useFetchRenewalSubscription","promoCodeVal","completeTotal","promoCodeListCopy","addCodeToList","renewAfter3DSecure","subscriptionTypes","PackageId","newPrice","newTotal","handlePriceChange","RenewSubscriptionsForm","Subscriptions","isUpgradeMenuOpen","setIsUpgradeMenuOpen","isRenewMenuOpen","setIsRenewMenuOpen","selectedSubscription","setSelectedSubscription","selectedSubject","setSelectedSubject","sideMenuTitle","setSideMenuTitle","isRenewable","handleRenewMenuOpen","subjectId","Toast","InvoicePage","generalErrors","setGeneralErrors","searchParams","invoice_id","PaidImage","UpgradeFreeSubscriptions","ChooseFreeTrialPackageForm","FreeTrialPackageCard","selectedPackagesIds","updatedScopes","SubscribeFreeTrial","CheckMark","SetPasswordForm","PostSetPassword","SetPassword","NotFound","ErrorBoundary","Component","super","hasError","getDerivedStateFromError","componentDidCatch","errorInfo","isRedirect","render","fallback","defaultProps","ErrorFallback","AddFreeTrialParser","ToggleSwitch","htmlId","disable","getCookieDescriptions","category","CookieSettingsPopup","toggleCookieSettings","setToggleCookieSettings","cookiesList","setCookiesList","cookiesListUpdated","setCookiesListUpdated","functionalCookiesOn","setFunctionalCookiesOn","marketingCookiesOn","setMarketingCookiesOn","acceptSiteCookies","setMonth","getMonth","reload","toggleCookieShow","cookie_index","cookiesListCopy","submitSelectedCookies","rejectSelectedSiteCookies","cookieValStr","rejectSiteCookies","MinusIcon","CrossIcon","CookieBanner","App","cookieSettingsSelection","setCookieSettingsSelection","cookieSettingFlag","Router","ROOT","RESET_PASSWORD","SET_PASSWORD","AddFreeTrial","PROFILE","MANAGEUSERS","MANAGESCHOOL","INVOICES","INVOICE_PAGE","default","epicMiddleware","createEpicMiddleware","configureStore","createStore","composeWithDevTools","applyMiddleware","run","ReactDOM","StripeProvider","apiKey","Provider","getElementById"],"mappings":"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","file":"static/js/main.99b1e7a7.chunk.js","sourcesContent":["export const isProduction = process.env.REACT_APP_BUILD_TYPE === \"production\";\nexport const isStaging = process.env.REACT_APP_BUILD_TYPE === \"staging\";\n\nlet baseUrl = \"https://api.getset4education.co.uk/api/v1\";\nlet domain = 'getset4education.co.uk';\nif (!isProduction) {\n  baseUrl = \"https://getset4pe-getset4education-customer-v1.api.avamae.co.uk/api/v1\";\n  domain = \".avamae.co.uk\";\n} \n\nexport const STOPLIGHT_BASE_URL =\n  \"https://stoplight.io/mocks/avamae/getset4pe-cloud-web-getset4education-customer-v1\";\nexport const BASE_URL = baseUrl;\nexport const DOMAIN = domain;\n\nexport const endpoints = {\n  auth: {\n    login: `${BASE_URL}/publicrole/authmodule/login`,\n    authLogin: `${BASE_URL}/publicrole/authmodule/autologin`,\n    refreshAccessToken: `${BASE_URL}/publicrole/authmodule/refreshaccesstoken`,\n    createPassword: `${BASE_URL}/publicrole/authmodule/createpassword`,\n    user: `${BASE_URL}/userrole/clientsmodule/listclients`,\n  },\n  public: {\n    navigation: {\n      headerLinks: `${BASE_URL}/publicrole/navigationmodule/headerlinks`,\n      footerLinks: `${BASE_URL}/publicrole/navigationmodule/footerlinks`,\n    },\n    subscription: {\n      getSubscriptions: `${BASE_URL}/publicrole/subscriptionsmodule/getsubscriptions`,\n      getSubscriptionsWithPromocode: `${BASE_URL}/publicrole/subscriptionsmodule/getsubscriptionswithpromocode`,\n      validateSchoolInfo: `${BASE_URL}/publicrole/subscriptionsmodule/validateschoolinfo`,\n      createsSchoolUser: `${BASE_URL}/publicrole/subscriptionsmodule/createsschooluser`,\n      createsSchoolUserFreeTrial: `${BASE_URL}/publicrole/subscriptionsmodule/createsschooluserfreetrial`,\n      subscribeByInvoice: `${BASE_URL}/publicrole/subscriptionsmodule/subscribebyinvoice`,\n      subscribeByCard: `${BASE_URL}/publicrole/subscriptionsmodule/subscribebycard`,\n      updateAfter3DSecure: `${BASE_URL}/publicrole/subscriptionsmodule/updateafter3dsecure`,\n      getSubscriptionsFreeTrial: `${BASE_URL}/publicrole/subscriptionsmodule/getsubscriptionsFreeTrial`,\n      subscribeFreeTrial: `${BASE_URL}/publicrole/subscriptionsmodule/subscribefreetrial`,\n    },\n  },\n  forgottenPassword: {\n    requestPasswordReset: `${BASE_URL}/publicrole/forgottenpasswordmodule/requestpasswordreset`,\n    resetPassword: `${BASE_URL}/publicrole/forgottenpasswordmodule/resetpassword`,\n  },\n  dashboard: {\n    list: `${BASE_URL}/schoolrole/dashboardmodule/dashboard`,\n    availablePages: `${BASE_URL}/schoolrole/dashboardmodule/availablepages`,\n    autoLoginToken: `${BASE_URL}/schoolrole/dashboardmodule/autologintoken`,\n    restartTrial: `${BASE_URL}/schoolrole/dashboardmodule/restart-trial`,\n  },\n  subscriptions: {\n    list: `${BASE_URL}/schoolrole/subscriptionsmodule/subscriptions`,\n    upgradeSubscriptionsList: `${BASE_URL}/schoolrole/subscriptionsmodule/getupgradesubscriptions`,\n    packages: `${BASE_URL}/schoolrole/subscriptionsmodule/addsubscriptions`,\n    addsubscriptionswithpromocode: `${BASE_URL}/schoolrole/subscriptionsmodule/addsubscriptionswithpromocode`,\n    checkpromocode: `${BASE_URL}/schoolrole/subscriptionsmodule/checkpromocode`,\n    subscribebyinvoice: `${BASE_URL}/schoolrole/subscriptionsmodule/subscribebyinvoice`,\n    subscribeByCard: `${BASE_URL}/schoolrole/subscriptionsmodule/subscribebycard`,\n    updatAfter3DSecure: `${BASE_URL}/schoolrole/subscriptionsmodule/updateafter3dsecure`,\n    upgradeByCard: `${BASE_URL}/schoolrole/subscriptionsmodule/upgradebycard`,\n    upgradeByInvoice: `${BASE_URL}/schoolrole/subscriptionsmodule/upgradebyinvoice`,\n    updatAfter3DSecureUpgrade: `${BASE_URL}/schoolrole/subscriptionsmodule/updateafter3dsecureUpgrade`,\n    getSchoolInfo: `${BASE_URL}/schoolrole/subscriptionsmodule/getschoolinfo`,\n    updateSchoolInfo: `${BASE_URL}/schoolrole/subscriptionsmodule/updateschoolinfo`,\n    getSchoolUsers: `${BASE_URL}/schoolrole/subscriptionsmodule/getschoolusers`,\n    updateSchoolUserAccess: `${BASE_URL}/schoolrole/subscriptionsmodule/updateschooluseraccess`,\n    getRenewalSubscriptions: `${BASE_URL}/schoolrole/subscriptionsmodule/getrenewalsubscriptions`,\n    renewByInvoice: `${BASE_URL}/schoolrole/subscriptionsmodule/renewbyinvoice`,\n    renewByCard: `${BASE_URL}/schoolrole/subscriptionsmodule/renewbycard`,\n    updateAfter3DSecureRenew: `${BASE_URL}/schoolrole/subscriptionsmodule/updateafter3dsecureRenew`,\n    getSubscriptionsFreeTrial: `${BASE_URL}/schoolrole/subscriptionsmodule/getsubscriptionsFreeTrial`,\n    subscribeFreeTrial: `${BASE_URL}/schoolrole/subscriptionsmodule/subscribefreetrial`,\n  },\n  profile: {\n    profileDetails: `${BASE_URL}/schoolrole/profilemodule/profile`,\n    updateemailpreferences: `${BASE_URL}/schoolrole/profilemodule/updateemailpreferences`,\n    updateprofile: `${BASE_URL}/schoolrole/profilemodule/updateprofile`,\n  },\n  manageUsers: {\n    list: `${BASE_URL}/schoolrole/usermanagementmodule/list`,\n    addUser: `${BASE_URL}/schoolrole/usermanagementmodule/adduser`,\n    updateuser: `${BASE_URL}/schoolrole/usermanagementmodule/updateuser`,\n    updateaccesspermissions: `${BASE_URL}/schoolrole/usermanagementmodule/updateaccesspermissions`,\n    viewuser: `${BASE_URL}/schoolrole/usermanagementmodule/viewuser`,\n    deleteuser: `${BASE_URL}/schoolrole/usermanagementmodule/deleteuser`,\n    downloadUserTemplateCSV: `${BASE_URL}/schoolrole/usermanagementmodule/templatedownloadcsv`,\n    downloadUserListCSV: `${BASE_URL}/schoolrole/usermanagementmodule/listdownloadcsv`,\n    uploadUserListCSV: `${BASE_URL}/schoolrole/usermanagementmodule/uploadcsv`,\n  },\n  invoices: {\n    list: `${BASE_URL}/schoolrole/invoicesmodule/list`,\n    viewInvoice: `${BASE_URL}/schoolrole/invoicesmodule/viewinvoice`,\n    downloadInvoice: `${BASE_URL}/schoolrole/invoicesmodule/downloadinvoice`,\n  },\n  manageschool: {\n    getSchoolDetails: `${BASE_URL}/schoolrole/schoolmanagementmodule/school`,\n    updateSchoolDetails: `${BASE_URL}/schoolrole/schoolmanagementmodule/updateschool`,\n    updateArchivingDate: `${BASE_URL}/schoolrole/schoolmanagementmodule/updatearchivingdate`,\n    archiveNow: `${BASE_URL}/schoolrole/schoolmanagementmodule/archivenow`,\n  },\n  subscribe: {\n    subscriptionContent: `${STOPLIGHT_BASE_URL}/1302880/subscriptionsmodule/packages`,\n  },\n  wondeIntegration: {\n    checkLinkStatus: `${BASE_URL}/schoolrole/wondeintegrationmodule/checkaccess`,\n    getSchoolLinkList: `${BASE_URL}/schoolrole/wondeintegrationmodule/schools`,\n    requestAccess: `${BASE_URL}/schoolrole/wondeintegrationmodule/requestaccess`,\n    syncData: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncdata`,\n    compareAcademicYears: `${BASE_URL}/schoolrole/wondeintegrationmodule/compareacademicyears`,\n    syncMatchedData: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncmatcheddata`,\n    classStep1List: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncclasses_namematch_list`,\n    classStep1NameMatch: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncclasses_namematch`,\n    classStep2ManualMatchList: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncclasses_manualmatch_list`,\n    classStep2ManualMatch: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncclasses_manualmatch`,\n    classStep3List: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncclasses_unmatchedwondeclasses_list`,\n    classStep3UnmatchedWondeClasses: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncclasses_unmatchedwondeclasses`,\n    classStep4List: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncclasses_unmatchedclasses_list`,\n    classStep4UnmatchedClassesDelete: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncclasses_unmatchedclasses_delete`,\n    pupilStep1List: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncpupils_namematch_list`,\n    pupilStep1NameMatch: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncpupils_namematch`,\n    pupilStep2ManualMatchList: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncpupils_manualmatch_list`,\n    pupilStep2ManualMatch: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncpupils_manualmatch`,\n    pupilStep3List: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncpupils_unmatchedwondepupils_list`,\n    pupilStep3UnmatchedWondeClasses: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncpupils_unmatchedwondepupils`,\n    pupilStep4List: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncpupils_unmatchedpupils_list`,\n    pupilStep4UnmatchedClassesDelete: `${BASE_URL}/schoolrole/wondeintegrationmodule/syncpupils_unmatchedpupils_delete`,\n    prevMatchedRecordsClass: `${BASE_URL}/schoolrole/wondeintegrationmodule/matchedclasses`,\n    prevMatchedRecordsPupil: `${BASE_URL}/schoolrole/wondeintegrationmodule/matchedpupil`,\n  },\n};\n","import { addSeconds, isPast } from 'date-fns';\nimport { useEffect, useState, useMemo } from 'react';\nimport { selectSignedIn, SignInResponse } from 'reducers/auth';\nimport { useSelector } from 'react-redux';\nimport Cookies from 'universal-cookie';\nimport { DOMAIN } from 'endpoints.config';\n\nexport type TokenResource = {\n  accessToken: string;\n  refreshToken: string;\n  refreshTokenExpires: Date;\n  tokenExpires: Date;\n  scopes?: Scopes;\n  profileInitials: string;\n};\n\n/**\n * Save token data in local storage.\n */\nexport function saveTokenResource(resource: TokenResource): void {\n  if (window) {\n    window.localStorage.setItem('ATE', resource.tokenExpires.toString());\n    window.localStorage.setItem('AT', resource.accessToken);\n    window.localStorage.setItem('RT', resource.refreshToken);\n    window.localStorage.setItem('RTE', resource.refreshTokenExpires.toString());\n    window.localStorage.setItem('UI', resource.profileInitials);\n    if (resource.scopes) {\n      window.localStorage.setItem('SCOPES', JSON.stringify(resource.scopes));\n    }\n  }\n}\n\nexport type LoadedTokenResource = {\n  accessToken: string;\n  refreshToken: string;\n  refreshTokenExpires: Date;\n  scopes?: string;\n  profileInitials: string;\n};\n\n/**\n * Fetch token data from local storage.\n */\nexport function loadTokenResource(): null | LoadedTokenResource {\n  try {\n    const tokenExpiry = window.localStorage.getItem('ATE');\n    const accessToken = window.localStorage.getItem('AT');\n    const refreshToken = window.localStorage.getItem('RT');\n    const refreshExpiry = window.localStorage.getItem('RTE');\n    const profileInitials = window.localStorage.getItem('UI');\n    const scopes = window.localStorage.getItem('SCOPES');\n\n    // If anything's missing, abort.\n    if (\n      accessToken == null ||\n      refreshToken == null ||\n      tokenExpiry == null ||\n      refreshExpiry == null\n    )\n      throw new Error();\n\n    const tokenExpiryDate = new Date(tokenExpiry);\n    const refreshExpiryDate = new Date(refreshExpiry);\n\n    if (isPast(refreshExpiryDate)) {\n      throw new Error()\n    };\n\n    return {\n      accessToken,\n      refreshToken,\n      refreshTokenExpires: refreshExpiryDate,\n      scopes: scopes ?? '[]',\n      profileInitials: profileInitials ?? '',\n    };\n  } catch (_error) {\n    localStorage.clear();\n    return null;\n  }\n}\n\nconst cookies = new Cookies();\n\nexport const setAuthCookie = (data: any) => {\n  const { expiresIn } = data.details;\n  if (!expiresIn) return;\n  const tokenExpires: Date = addSeconds(new Date(), parseInt(expiresIn, 10));\n  cookies.set('GETSET_SchoolUser', 'sign-in', {\n    expires: tokenExpires,\n    domain: DOMAIN\n  });\n};\n\nexport const clearAuthCookie = () => {\n  cookies.remove('GETSET_SchoolUser', { domain: DOMAIN });\n};\n\nexport type AccessElement = {\n  displayName: string;\n  path: string;\n  childElements?: Scopes;\n};\n\nexport type Scopes = AccessElement[];\n\nexport function loadScopes(): string {\n  try {\n    const scopes = window.localStorage.getItem('SCOPES');\n    if (scopes == null) throw new Error();\n\n    return scopes;\n  } catch (error) {\n    return '[]';\n  }\n}\n\n/**\n * Used to load navigation routes that are available to this user.\n * Effect runs on app load and sign-in.\n */\nexport function useLoadScopes(): Scopes {\n  const [scopeString, setScopeString] = useState('[]');\n  const isSignedIn = useSelector(selectSignedIn);\n\n  useEffect(() => {\n    if (isSignedIn) setScopeString(loadScopes());\n  }, [isSignedIn]);\n\n  const scopes: Scopes = useMemo(() => JSON.parse(scopeString), [scopeString]);\n\n  return scopes;\n}\n","import axios, { AxiosError, AxiosResponse } from 'axios';\nimport { saveTokenResource, loadTokenResource, clearAuthCookie } from 'helpers/auth';\nimport { setUserInitials, signOut as signOutCreator } from 'reducers/auth';\nimport { store } from './index';\nimport { BASE_URL, endpoints } from 'endpoints.config';\nimport { createUseTable } from '@avamae/table';\nimport { createUseFetch } from '@avamae/use-fetch';\nimport { addSeconds } from 'date-fns';\nimport Cookies from 'universal-cookie';\nimport { DOMAIN } from 'endpoints.config';\nimport { navigate } from '@reach/router';\nimport { PUBLIC_SITE_URL } from 'appConstants';\n\nconst signOut = () =>\n  signOutCreator('Your session has expired. Please sign in again.');\n\nconst { refreshAccessToken: refreshEndpoint } = endpoints.auth;\n\n/**\n * Custom axios instance with base url set, and some interceptors to\n * handle auth headers.\n *\n */\nconst instance = axios.create({\n  baseURL: BASE_URL,\n});\n\n/**\n * A function that, given an access token, will modify an axios request\n * config and re-run the request.\n */\ntype RequestCallback = (token: string) => void;\n\n/**\n * Some mutable state for a queue of requests. If we're already in the middle of\n * requesting a new token, we want to hold other requests in a queue, then make\n * them with the new token once we get it.\n */\nclass RequestHandler {\n  isFetchingToken: boolean;\n  private pendingRequests: RequestCallback[];\n\n  constructor() {\n    this.isFetchingToken = false;\n    this.pendingRequests = [];\n  }\n\n  addToQueue = (callback: RequestCallback) => {\n    this.pendingRequests.push(callback);\n  };\n\n  onTokenFetched = (token: string) => {\n    this.pendingRequests.forEach((cb) => cb(token));\n    this.clearQueue();\n  };\n\n  clearQueue = () => {\n    this.pendingRequests = [];\n    this.isFetchingToken = false;\n  };\n}\n\nconst reqHandler = new RequestHandler();\n\n// Before each request, attach the stored token if it exists.\ninstance.interceptors.request.use((request) => {\n  try {\n    const resource = loadTokenResource();\n    resource?.profileInitials &&\n      store.dispatch(setUserInitials(resource?.profileInitials));\n    if (resource === null) throw new Error();\n    const { accessToken } = resource;\n    const authHeader = { Authorization: `Bearer ${accessToken}` };\n    return { ...request, headers: { ...request.headers, ...authHeader } };\n  } catch (err) {\n    return request;\n  }\n});\n\n// After each request, if it comes back with a 401 error, refresh token and then retry.\ninstance.interceptors.response.use(\n  (fulfilled) => {\n    return fulfilled;\n  },\n  (rejected: AxiosError) => {\n    const status = rejected.response?.status;\n\n    if (status === 401 /*&& has the expired token header*/) {\n      // Refresh access token.\n      return refreshAccessToken(rejected);\n    }\n\n    // It's not an authorisation issue, just pass on the rejection.\n    // store.dispatch(signOut());\n    return Promise.reject(rejected);\n  }\n);\n\n/**\n * Intercept the error, and replace it with a promise (awaitingNewToken), which\n * on construction will add a callback to our RequestHandler's queue.\n *\n * The first time the request handler receives one of these additions to its\n * queue, it will attempt to fetch a new access token. It stores up pending\n * requests until the new token arrives. To the initial callers it looks like\n * their request is waiting for a response from the server.\n *\n * Once the request handler has fetched a new access token, it will run every\n * callback in its queue. The callback takes an original request's config,\n * changes it to use the new access token, and remakes the request. It then\n * resolves the promise made in awaitingNewToken. The response to this new\n * request is thereby delivered to the original caller. The queue is then cleared.\n *\n * To that initial caller, it just looks like its original request took a while\n * to resolve.\n */\nconst refreshAccessToken = async (rejected: AxiosError) => {\n  type RefreshResponse = {\n    status: string;\n    accessToken: string;\n    tokenType: string;\n    refreshTokenExpiresIn: string;\n    expiresIn: string;\n    refreshToken: string;\n    profileInitials: string;\n  };\n\n  try {\n    const { response: errorResponse } = rejected;\n\n    // Extract the refresh token from LS and make sure it's there.\n    // Otherwise, just return the error.\n\n    const resource = loadTokenResource();\n    resource?.profileInitials &&\n      store.dispatch(setUserInitials(resource?.profileInitials));\n    if (resource == null) {\n      store.dispatch(signOut());\n      localStorage.setItem('SP', 'synced-sign-out');\n      return Promise.reject(rejected);\n    }\n\n    // Build a promise that will be handed to the caller instead of the error.\n    const awaitingNewToken = new Promise((resolve) => {\n      reqHandler.addToQueue((token) => {\n        if (errorResponse) {\n          errorResponse.config.headers.Authorization = `Bearer ${token}`;\n          resolve(axios(errorResponse.config));\n        }\n      });\n    });\n\n    // Check if we're already trying to fetch a replacement access token.\n    if (!reqHandler.isFetchingToken) {\n      reqHandler.isFetchingToken = true;\n      const data = {\n        accessToken: resource.accessToken,\n        refreshToken: resource.refreshToken,\n      };\n\n      const response = await axios.post<\n        typeof data,\n        AxiosResponse<{ details: any, errors: any } & RefreshResponse>\n      >(refreshEndpoint, data);\n\n      if (\n        !response.data ||\n        (response.data.errors && response.data.errors.length > 0)\n      ) {\n        // The refresh request failed, reset the queue, sign the\n        // user out and return the error.\n        clearAuthCookie();\n        reqHandler.clearQueue();\n        store.dispatch(signOut());\n        localStorage.setItem('SP', 'synced-sign-out');\n        return Promise.reject(rejected);\n      }\n\n      // The refresh request succeeded, save the token details for future\n      // requests and make the queued requests again.\n      const {\n        accessToken,\n        refreshToken,\n        expiresIn,\n        refreshTokenExpiresIn,\n        profileInitials,\n      } = response.data.details;\n      const tokenExpires = addSeconds(new Date(), parseInt(expiresIn, 10));\n      const refreshTokenExpires = addSeconds(\n        new Date(),\n        parseInt(refreshTokenExpiresIn, 10)\n      );\n      const cookies = new Cookies();\n\n      cookies.set('GETSET_SchoolUser', 'sign-in', {\n        expires: tokenExpires,\n        domain: DOMAIN,\n        sameSite: \"none\",\n        secure: true\n      });\n\n      saveTokenResource({\n        tokenExpires,\n        accessToken,\n        refreshToken,\n        refreshTokenExpires,\n        profileInitials,\n      });\n      reqHandler.onTokenFetched(accessToken);\n    }\n\n    // Return the promise, which will fulfill when we have a new token,\n    // instead of the error.\n    return awaitingNewToken;\n  } catch (error) {\n    // Something went generically wrong, return this error and signout.\n    store.dispatch(signOut());\n    localStorage.setItem('SP', 'synced-sign-out');\n    return Promise.reject(error);\n  }\n};\n\nexport default instance;\nexport const useTable = createUseTable(instance);\nexport type TableInfo = ReturnType<typeof useTable>;\n\nexport const useFetch = createUseFetch(instance);\n\nexport type ErrorMessage = {\n  type: any;\n  fieldName: string;\n  messageText: string;\n};\nexport interface ApiResponse<T = any, M = any> {\n  id: number;\n  details: T;\n  metadata: M[];\n  status: '0' | '1';\n  errors: ErrorMessage[];\n}\n","import { produce } from 'immer';\nimport { Store } from './rootReducer';\nimport { of, from, Observable } from 'rxjs';\nimport { AxiosRequestConfig, AxiosError } from 'axios';\nimport { endpoints } from 'endpoints.config';\nimport {\n  Scopes,\n  loadTokenResource,\n  saveTokenResource,\n  setAuthCookie,\n  clearAuthCookie,\n} from 'helpers/auth';\nimport api from 'api';\nimport {\n  map,\n  tap,\n  switchMap,\n  catchError,\n  ignoreElements,\n} from 'rxjs/operators';\nimport { combineEpics, ofType, ActionsObservable } from 'redux-observable';\nimport { createSelector } from 'reselect';\nimport { addSeconds } from 'date-fns';\n\nexport type SignInAttempt = {\n  emailAddress: string;\n  password: string;\n  rememberMe: boolean;\n};\n\nexport type AutoSignInAttempt = {\n  token: string;\n};\n\ntype SignInError = {\n  error: null | string;\n  error_description: string;\n  error_uri: null;\n};\n\ntype SignInOkay = {\n  details: {\n    accessToken: string;\n    expiresIn: string;\n    refreshToken: string;\n    refreshTokenExpiresIn: string;\n    scopes?: Scopes;\n    tokenType: string;\n    profileInitials: string;\n  };\n  status: string;\n};\n\nexport type SignInResponse = SignInOkay | SignInError;\n\nconst isResponseOkay = (r: SignInResponse): r is SignInOkay =>\n  (r as SignInOkay).status === 'Success' || (r as SignInOkay).status === '1';\n\n/* STATE */\ntype AuthStatus = 'signed_out' | 'signed_in' | 'pending';\ntype State = {\n  appVisible: boolean;\n  authStatus: AuthStatus;\n  message: string;\n  profileInitials: string;\n};\n\nconst initialState: State = {\n  authStatus: 'signed_out',\n  appVisible: false,\n  message: '',\n  profileInitials: '',\n};\n\n/* ACTIONS */\n\nconst SIGN_OUT = 'app/auth/SIGN_OUT';\nconst SIGN_IN = 'app/auth/SIGN_IN';\nconst SIGN_IN_OKAY = 'app/auth/SIGN_IN_OKAY';\nconst SIGN_IN_ERROR = 'app/auth/SIGN_IN_ERROR';\nconst AUTO_SIGN_IN = `app/auth/AUTO_SIGN_IN`;\nconst SHOW_APP = 'app/auth/SHOW_APP';\nconst CHECK_SIGNED_IN = 'app/auth/CHECK_SIGNED_IN';\nconst SET_USER_INITIALS = 'app/auth/SET_USER_INITIALS';\n\ntype Action =\n  | { type: typeof SIGN_IN; payload: SignInAttempt }\n  | { type: typeof AUTO_SIGN_IN; payload: AutoSignInAttempt }\n  | { type: typeof SIGN_OUT; message: string; signOutMarker: boolean }\n  | { type: typeof CHECK_SIGNED_IN }\n  | { type: typeof SHOW_APP; payload: boolean }\n  | { type: typeof SIGN_IN_OKAY; payload: SignInOkay }\n  | { type: typeof SIGN_IN_ERROR; payload: SignInError }\n  | {\n      type: typeof SET_USER_INITIALS;\n      payload: string;\n    };\n\n/* REDUCER */\n\nexport default function reducer(state = initialState, action: Action): State {\n  return produce(state, (draft) => {\n    switch (action.type) {\n      case SHOW_APP:\n        draft.appVisible = true;\n        // Is the user already signed in?\n        if (action.payload === true) draft.authStatus = 'signed_in';\n        break;\n      case SIGN_OUT:\n        draft.authStatus = 'signed_out';\n        draft.message = action.message;\n        draft.profileInitials = '';\n        break;\n      case SIGN_IN:\n        draft.authStatus = 'pending';\n        draft.message = '';\n        break;\n      case AUTO_SIGN_IN:\n        draft.authStatus = 'pending';\n        draft.message = '';\n        break;\n      case SIGN_IN_OKAY:\n        draft.authStatus = 'signed_in';\n        draft.profileInitials = action.payload.details.profileInitials;\n        break;\n      case SIGN_IN_ERROR:\n        draft.authStatus = 'signed_out';\n        draft.message = action.payload.error_description;\n        break;\n      case SET_USER_INITIALS:\n        draft.profileInitials = action.payload;\n        break;\n    }\n  });\n}\n\n/* EPICS */\n\nfunction makeRequest<T>(config: AxiosRequestConfig) {\n  return from(api.request<T>(config));\n}\n\nfunction saveResponse(r: SignInResponse) {\n  if (isResponseOkay(r)) {\n    const {\n      accessToken,\n      refreshToken,\n      expiresIn,\n      scopes,\n      refreshTokenExpiresIn,\n      profileInitials,\n    } = r.details;\n    const refreshTokenExpires = addSeconds(\n      new Date(),\n      parseInt(refreshTokenExpiresIn, 10)\n    );\n    const tokenExpires = addSeconds(new Date(), parseInt(expiresIn, 10));\n\n    saveTokenResource({\n      accessToken,\n      refreshToken,\n      tokenExpires,\n      refreshTokenExpires: refreshTokenExpires,\n      scopes: scopes ?? [],\n      profileInitials,\n    });\n  }\n}\n\nfunction checkResponse(r: SignInResponse) {\n  if (isResponseOkay(r)) return signInOkay(r);\n  return signInError(r);\n}\n\nconst parseApiErrorMessageCode = (code: string): string => {\n  switch (code) {\n    case 'Email_Address_Incorrect':\n      return 'Invalid email or password.';\n    case 'Password_Incorrect':\n      return 'Invalid email or password.';\n    case 'Account_Locked':\n      return 'Your account has been locked after too many failed attempts. Please try again in 10 minutes.';\n    case 'Account_Suppressed':\n      return 'Your account is currently inactive.';\n    case 'Invalid_Token':\n      return 'Invalid token, please try to login. ';\n    default:\n      return 'Oops, something went wrong. Please try again later.';\n  }\n};\n\n/** Attempt to sign in and handle response, cancel if we sign out while a request pending. */\nconst signInEpic = (action$: ActionsObservable<any>): Observable<Action> =>\n  action$.pipe(\n    ofType(SIGN_IN),\n    switchMap((attempt) =>\n      makeRequest<SignInResponse>({\n        url: endpoints.auth.login,\n        data: attempt.payload,\n        method: 'post',\n      }).pipe(\n        tap((res) => {\n          saveResponse(res.data);\n          setAuthCookie(res.data);\n        }),\n        map((res) => checkResponse(res.data)),\n        catchError((err: AxiosError) => {\n          const errorMessage = parseApiErrorMessageCode(\n            err.response?.data.errors &&\n              err.response.data.errors.length &&\n              err.response.data.errors.length > 0\n              ? err.response?.data.errors[0].messageCode\n              : ''\n          );\n          return of(\n            signInError({\n              error: null,\n              error_description: `${errorMessage}`,\n              error_uri: null,\n            })\n          );\n        })\n        //takeUntil(action$.pipe(ofType(SIGN_OUT, SIGN_IN_ERROR)))\n      )\n    )\n  );\n\nconst autoSignInEpic = (action$: ActionsObservable<any>): Observable<Action> =>\n  action$.pipe(\n    ofType(AUTO_SIGN_IN),\n    switchMap((attempt) =>\n      makeRequest<SignInResponse>({\n        url: endpoints.auth.authLogin + `?token=${attempt.payload.token}`,\n        data: {},\n        method: 'post',\n      }).pipe(\n        tap((res) => {\n          saveResponse(res.data);\n          setAuthCookie(res.data);\n        }),\n        map((res) => checkResponse(res.data)),\n        catchError((err: AxiosError) => {\n          const errorMessage = parseApiErrorMessageCode(\n            err.response?.data.errors &&\n              err.response.data.errors.length &&\n              err.response.data.errors.length > 0\n              ? err.response?.data.errors[0].messageCode\n              : ''\n          );\n          return of(\n            signInError({\n              error: null,\n              error_description: `${errorMessage}`,\n              error_uri: null,\n            })\n          );\n        })\n        //takeUntil(action$.pipe(ofType(SIGN_OUT, SIGN_IN_ERROR)))\n      )\n    )\n  );\n\n/** Clear the local storage on sign out, so we don't appear logged in on refresh. */\nconst signOutEpic = (action$: ActionsObservable<any>) =>\n  action$.pipe(\n    ofType(SIGN_OUT),\n    tap((action) => {\n      const check = localStorage.getItem('SP');\n      window && window.localStorage.clear();\n      check && localStorage.setItem('SP', check);\n      if (action.signOutMarker) {\n        window && window.localStorage.setItem('signOutAlert', 'true');\n      }\n      clearAuthCookie();\n    }),\n    ignoreElements()\n  );\n\nconst checkSignedInEpic = (action$: ActionsObservable<any>) =>\n  action$.pipe(\n    ofType(CHECK_SIGNED_IN),\n    map(loadTokenResource),\n    map((r) => r !== null),\n    map(showApp)\n  );\n\nexport const authEpic = combineEpics(\n  signInEpic,\n  autoSignInEpic,\n  signOutEpic,\n  checkSignedInEpic\n);\n\n/* ACTION CREATORS */\n\nexport const signIn = (payload: SignInAttempt): Action => ({\n  type: SIGN_IN,\n  payload,\n});\n\nexport const autoSignIn = (payload: AutoSignInAttempt): Action => ({\n  type: AUTO_SIGN_IN,\n  payload,\n});\n\nexport const signOut = (message = '', marker = true): Action => ({\n  type: SIGN_OUT,\n  message,\n  signOutMarker: marker,\n});\n\nexport const checkSignedIn = (): Action => ({\n  type: CHECK_SIGNED_IN,\n});\n\nconst signInOkay = (payload: SignInOkay): Action => ({\n  type: SIGN_IN_OKAY,\n  payload,\n});\n\nconst signInError = (payload: SignInError): Action => ({\n  type: SIGN_IN_ERROR,\n  payload,\n});\n\nexport const showApp = (payload: boolean): Action => ({\n  type: SHOW_APP,\n  payload,\n});\n\nexport const setUserInitials = (payload: string): Action => ({\n  type: SET_USER_INITIALS,\n  payload,\n});\n\n/* SELECTORS */\n\nexport const selectAuthStatus = (app: Store) => app.auth.authStatus;\nexport const selectSignedIn = createSelector(\n  selectAuthStatus,\n  (status) => status === 'signed_in'\n);\nexport const selectAuthMessage = (app: Store) => app.auth.message;\nexport const selectAppVisible = (app: Store) => app.auth.appVisible;\nexport const selectUserInitials = (app: Store) => app.auth.profileInitials;\n","import { Package } from 'pages/newSubscription/models';\nimport { ISchoolDetails } from 'pages/subscribe/models';\nimport { Store } from './rootReducer';\n\n/*STATE*/\nexport type State = {\n  acceptCookies: boolean;\n  accessibilityMode: boolean;\n  mobileMenuOpen: boolean;\n  toastStatus: { open: boolean; message: string };\n  selectedPackages: Package[];\n  validPromoCode: string;\n  blogIds: number[];\n  caseStudiesIds: number[];\n  subscriptionPrice: {\n    price: number;\n    vat: number;\n    total: number;\n    vatRate: number;\n    discount: number;\n    discountType: string;\n  };\n  updateUsersList: boolean;\n  schoolDetails: ISchoolDetails | null;\n  registrationToken: string;\n  poNumber: string;\n  FinanceEmail: string;\n};\n\nexport const initialState: State = {\n  accessibilityMode: false,\n  acceptCookies: false,\n  mobileMenuOpen: false,\n  toastStatus: { open: false, message: '' },\n  selectedPackages: [],\n  validPromoCode: '',\n  blogIds: [],\n  caseStudiesIds: [],\n  subscriptionPrice: {\n    price: 0,\n    vat: 0,\n    total: 0,\n    vatRate: 0,\n    discount: 0,\n    discountType: '',\n  },\n  poNumber: '',\n  FinanceEmail: '',\n  updateUsersList: true,\n  schoolDetails: null,\n  registrationToken: '',\n};\n\n/* ACTIONS */\nexport enum GeneralAction {\n  TOGGLE_MOBILE_MENU = 'app/TOGGLE_MOBILE_MENU',\n  ACCEPT_COOKIES = 'app/ACCEPT_COOKIES',\n  TOGGLE_ACCESSIBILITY_MODE = 'app/TOGGLE_ACCESSIBILITY_MODE',\n  TOGGLE_TOAST = 'app/TOGGLE_TOAST',\n}\n\nexport enum PricingAction {\n  SELECT_PACKAGES = 'app/SELECT_PACKAGES',\n  SET_VALID_PROMO_CODE = 'app/SET_VALID_PROMO_CODE',\n  CLEAR_SELECTED_PACKAGE = 'app/CLEAR_SELECTED_PACKAGE',\n  SET_PO_NUMBER = 'app/SET_PO_NUMBER',\n  CLEAR_PO_NUMBER = 'app/CLEAR_PO_NUMBER',\n  SET_FINANCE_EMAIL = 'app/SET_FINANCE_EMAIL',\n  CLEAR_FINANCE_EMAIL = 'app/CLEAR_FINANCE_EMAIL',  \n}\n\nexport enum BlogAction {\n  SET_BLOG_IDS = 'app/SET_BLOG_IDS',\n}\n\nexport enum CaseStudyAction {\n  SET_CASE_STUDIES_IDS = 'app/SET_CASE_STUDIES_IDS',\n}\n\nexport enum SubscribeAction {\n  SET_PRICE = 'app/SET_PRICE',\n  SET_SCHOOL_DETAILS = 'app/SET_SCHOOL_DETAILS',\n  CLEAR_SCHOOL_DETAILS = 'app/CLEAR_SCHOOL_DETAILS',\n  SET_REGISTRATION_TOKEN = 'app/SET_REGISTRATION_TOKEN',\n}\n\nexport enum ManageUsersAction {\n  SET_UPDATE_USERS_LIST = 'app/SET_USERS_LIST',\n}\n\nexport type Action =\n  | { type: GeneralAction.TOGGLE_MOBILE_MENU }\n  | { type: GeneralAction.ACCEPT_COOKIES }\n  | { type: GeneralAction.TOGGLE_ACCESSIBILITY_MODE }\n  | {\n      type: GeneralAction.TOGGLE_TOAST;\n      payload: { open: boolean; message: string };\n    }\n  | { type: PricingAction.SELECT_PACKAGES; payload: Package[] }\n  | { type: PricingAction.CLEAR_SELECTED_PACKAGE }\n  | { type: PricingAction.SET_VALID_PROMO_CODE; payload: string }\n  | { type: PricingAction.SET_PO_NUMBER; payload: string }\n  | { type: PricingAction.CLEAR_PO_NUMBER }\n  | { type: PricingAction.SET_FINANCE_EMAIL; payload: string }\n  | { type: PricingAction.CLEAR_FINANCE_EMAIL }  \n  | { type: BlogAction.SET_BLOG_IDS; payload: number[] }\n  | { type: CaseStudyAction.SET_CASE_STUDIES_IDS; payload: number[] }\n  | {\n      type: SubscribeAction.SET_PRICE;\n      payload: {\n        price: number;\n        vat: number;\n        total: number;\n        vatRate: number;\n        discount: number;\n        discountType: string;\n      };\n    }\n  | { type: SubscribeAction.SET_SCHOOL_DETAILS; payload: ISchoolDetails }\n  | { type: SubscribeAction.CLEAR_SCHOOL_DETAILS }\n  | { type: SubscribeAction.SET_REGISTRATION_TOKEN; payload: string }\n  | { type: ManageUsersAction.SET_UPDATE_USERS_LIST; payload: boolean };\n\nexport const misc = (state = initialState, action: Action): State => {\n  switch (action.type) {\n    case GeneralAction.TOGGLE_MOBILE_MENU:\n      return {\n        ...state,\n        mobileMenuOpen: !state.mobileMenuOpen,\n      };\n    case GeneralAction.ACCEPT_COOKIES:\n      return {\n        ...state,\n        acceptCookies: true,\n      };\n    case GeneralAction.TOGGLE_ACCESSIBILITY_MODE:\n      return {\n        ...state,\n        accessibilityMode: !state.accessibilityMode,\n      };\n    case GeneralAction.TOGGLE_TOAST:\n      return {\n        ...state,\n        toastStatus: action.payload,\n      };\n    case PricingAction.SELECT_PACKAGES:\n      return {\n        ...state,\n        selectedPackages: action.payload,\n      };\n    case PricingAction.CLEAR_SELECTED_PACKAGE:\n      return {\n        ...state,\n        selectedPackages: [],\n      };\n    case PricingAction.SET_VALID_PROMO_CODE:\n      return {\n        ...state,\n        validPromoCode: action.payload,\n      };\n    case PricingAction.SET_PO_NUMBER:\n      return {\n        ...state,\n        poNumber: action.payload,\n      };\n    case PricingAction.CLEAR_PO_NUMBER:\n      return {\n        ...state,\n        poNumber: '',\n      };\n    case PricingAction.SET_FINANCE_EMAIL:\n      return {\n        ...state,\n        FinanceEmail: action.payload,\n      };\n    case PricingAction.CLEAR_FINANCE_EMAIL:\n      return {\n        ...state,\n        FinanceEmail: '',\n      };      \n    case BlogAction.SET_BLOG_IDS:\n      return {\n        ...state,\n        blogIds: action.payload,\n      };\n    case CaseStudyAction.SET_CASE_STUDIES_IDS:\n      return {\n        ...state,\n        caseStudiesIds: action.payload,\n      };\n    case SubscribeAction.SET_PRICE:\n      return {\n        ...state,\n        subscriptionPrice: action.payload,\n      };\n    case SubscribeAction.SET_SCHOOL_DETAILS:\n      return {\n        ...state,\n        schoolDetails: action.payload,\n      };\n    case SubscribeAction.CLEAR_SCHOOL_DETAILS:\n      return {\n        ...state,\n        schoolDetails: null,\n      };\n    case SubscribeAction.SET_REGISTRATION_TOKEN:\n      return {\n        ...state,\n        registrationToken: action.payload,\n      };\n    case ManageUsersAction.SET_UPDATE_USERS_LIST:\n      return {\n        ...state,\n        updateUsersList: action.payload,\n      };\n    default:\n      return state;\n  }\n};\n\n// Action creatorse\n\nexport const clearPackageForm = (): Action => ({\n  type: PricingAction.CLEAR_SELECTED_PACKAGE,\n});\n\nexport const updateSelectedPackages = (payload: Package[]): Action => ({\n  type: PricingAction.SELECT_PACKAGES,\n  payload,\n});\n\nexport const setValidPromoCode = (payload: string): Action => ({\n  type: PricingAction.SET_VALID_PROMO_CODE,\n  payload,\n});\n\nexport const setPoNumber = (payload: string): Action => ({\n  type: PricingAction.SET_PO_NUMBER,\n  payload,\n});\n\nexport const clearPoNumber = (): Action => ({\n  type: PricingAction.CLEAR_PO_NUMBER,\n});\n\nexport const setFinanceEmail = (payload: string): Action => ({\n  type: PricingAction.SET_FINANCE_EMAIL,\n  payload,\n});\n\nexport const clearFinanceEmail = (): Action => ({\n  type: PricingAction.CLEAR_FINANCE_EMAIL,\n});\n\nexport const setUpdateUsersList = (payload: boolean): Action => ({\n  type: ManageUsersAction.SET_UPDATE_USERS_LIST,\n  payload,\n});\n\nexport const setPrice = (payload: {\n  price: number;\n  vat: number;\n  total: number;\n  vatRate: number;\n  discount: number;\n  discountType: string;\n}): Action => ({\n  type: SubscribeAction.SET_PRICE,\n  payload,\n});\nexport const setSchoolDetails = (payload: ISchoolDetails): Action => ({\n  type: SubscribeAction.SET_SCHOOL_DETAILS,\n  payload,\n});\n\nexport const clearSchoolDetails = (): Action => ({\n  type: SubscribeAction.CLEAR_SCHOOL_DETAILS,\n});\n\nexport const setRegistrationToken = (payload: string): Action => ({\n  type: SubscribeAction.SET_REGISTRATION_TOKEN,\n  payload,\n});\n\nexport const toogleToast = (payload: {\n  open: boolean;\n  message: string;\n}): Action => ({\n  type: GeneralAction.TOGGLE_TOAST,\n  payload,\n});\n\n// Selectors\n\nexport const selectMobileMenuOpen = (store: Store) => store.misc.mobileMenuOpen;\nexport const selectAccessibilityMode = (store: Store) =>\n  store.misc.accessibilityMode;\nexport const selectSelectedPackages = (store: Store) =>\n  store.misc.selectedPackages;\nexport const selectValidPromoCode = (store: Store) => store.misc.validPromoCode;\nexport const selectSubscriptionPrice = (store: Store) =>\n  store.misc.subscriptionPrice;\nexport const selectPoNumber = (store: Store) => store.misc.poNumber;\nexport const selectFinanceEmail = (store: Store) => store.misc.FinanceEmail;\nexport const selectUpdateUsersList = (store: Store) =>\n  store.misc.updateUsersList;\nexport const selectPrice = (store: Store) => store.misc.subscriptionPrice;\nexport const selectShoolDetails = (store: Store) => store.misc.schoolDetails;\nexport const selectRegistrationToken = (store: Store) =>\n  store.misc.registrationToken;\nexport const selectToastStatus = (store: Store) => store.misc.toastStatus;\n","import { produce } from 'immer';\n\nconst VAT_AMOUNT = 0.2;\n\n/*STATE*/\ntype SubscribeState = {\n  preTaxPrice: number;\n  vat: number;\n  totalPrice: number;\n};\n\nconst initialState: SubscribeState = {\n  preTaxPrice: 0,\n  vat: 0,\n  totalPrice: 0,\n};\n\n// Reducer\nenum SubscribeActionType {\n  SET_TOTAL_PRICE = 'app/subscribe/SET_TOTAL_PRICE',\n}\n\ntype SubscribeAction = {\n  type: SubscribeActionType.SET_TOTAL_PRICE;\n  payload: { preTaxPrice: number };\n};\n\nexport const subscribe = (\n  state = initialState,\n  action: SubscribeAction\n): SubscribeState => {\n  return produce(state, (draft) => {\n    switch (action.type) {\n      case SubscribeActionType.SET_TOTAL_PRICE:\n        draft.preTaxPrice = action.payload.preTaxPrice;\n        draft.vat = action.payload.preTaxPrice * VAT_AMOUNT;\n        draft.totalPrice = draft.preTaxPrice + draft.vat;\n        break;\n    }\n  });\n};\n\n// Action creators\nexport const setPreTaxPrice = (preTaxPrice: number) => ({\n  type: SubscribeActionType.SET_TOTAL_PRICE,\n  payload: { preTaxPrice },\n});\n","import { combineReducers } from 'redux';\nimport { combineEpics } from 'redux-observable';\nimport auth, { authEpic } from './auth';\nimport { misc } from './misc';\nimport { subscribe } from './subscribe';\n\n\nexport const rootReducer = combineReducers({ auth, subscribe, misc });\nexport const rootEpic = combineEpics(authEpic);\n\nexport type Store = ReturnType<typeof rootReducer>;\n","const isProduction = process.env.REACT_APP_BUILD_TYPE === 'production';\nconst isStaging = process.env.REACT_APP_BUILD_TYPE === 'staging';\n\nlet publicbaseUrl = 'https://getset4education.co.uk';\nlet stripeKey = 'pk_live_4kM5QVsO0YETlXg1oaWyzieX';\nif (!isProduction) {\n  publicbaseUrl =\n    'https://getset4pe-getset4education-public-v1.uat.avamae.co.uk';\n  stripeKey = 'pk_test_VdhJmdlQLXHs2kZzwkyrvc4Q';\n}\n\nexport const PUBLIC_SITE_URL = publicbaseUrl;\nexport const STRIPE_KEY = stripeKey;\n\nexport enum AppPath {\n  ROOT = '/',\n  DASHBOARD = '/dashboard',\n  FORGOTTEN_PASSWORD = '/forgotten-password',\n  RESET_PASSWORD = '/reset-password-schooluser',\n  SET_PASSWORD = '/set-password-schooluser',\n  NEW_SUBSCRIPTION = '/subscriptions/add-subscriptions',\n  NEW_FREE_TRIAL = '/subscriptions/add-free-trial',\n  UPGRADE_SUBSCRIPTION = '/upgrade-subscription',\n  PROFILE = '/profile',\n  MANAGEUSERS = '/manage-users',\n  MANAGESCHOOL = '/manage-school',\n  INVOICES = '/invoices',\n  INVOICE_PAGE = 'template/subscription-invoice',\n  SIGN_IN = '/sign-in',\n  SUBSCRIBE = '/subscribe',\n  SUBSCRIBE_FREE_TRIAL = '/free-trial',\n  SUBSCRIPTIONS = '/subscriptions',\n}\n\nexport enum NewSubscriptionPath {\n  PAYMENT_DETAILS = '/payment-details',\n  PAYMENT_TYPE = '/payment-type',\n  ROOT = '/',\n}\n\nexport enum SubscriptionTypes {\n  STANDARD = 'Standard',\n  INVESTEMENT = 'Investment',\n}\n\nexport enum PaymentTypes {\n  PAY_BY_CARD = 'Pay by card',\n  PAY_BY_INVOICE = 'Pay by Invoice',\n}\n\n// export enum SubscriptionDuration {\n//   ONE_YEAR = '1 Year',\n//   THREE_YEARS = '3 Year',\n//   FIVE_YEARS = '5 Year',\n// }\n\nexport const ERROR_MESSAGE: string =\n  'Oops, something went wrong. Please try again later.';\nexport const NO_ACCESS_MESSAGE: string =\n  \"You don't have permissions to access this page\";\nexport const NOT_FOUND_PAGE: string = 'Page not found';\nexport const FALLBACK_ERROR_MESSAGE: string =\n  'Please try again. If the error persists, please contact support.';\n\nexport const PASSWORD_REGEX = /^(?=.*[a-zA-Z])(?=.*\\d)/;\nexport const PASSWORD_MATCH_POLICY_ERROR_MESSAGE =\n  'Password must contain between  8 and 20 characters, and at least one number and one letter';\n","export default __webpack_public_path__ + \"static/media/Img_Dashboard_PE.27764b23.jpg\";","export default __webpack_public_path__ + \"static/media/Img_Dashboard_Music.80c33721.jpg\";","import peImage from 'images/Img_Dashboard_PE.jpg';\nimport musicImage from 'images/Img_Dashboard_Music.jpg';\nimport { SubjectTypes } from 'pages/dashboard/models';\n\nexport const getSubjectImage = (subject: SubjectTypes) => {\n  switch (subject) {\n    case 'Get Set 4 Music':\n      return musicImage;\n\n    case 'Get Set 4 PE':\n      return peImage;\n\n    default:\n      return '';\n  }\n};\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaQAAAGkCAMAAABJkqEHAAAAwFBMVEVHcEz////////////////////////+/v7///////////////////////////////////////////////////////////////////////////////////////////9UXmM8SE3FycvS1dZjbHCvtLfX2tv///9LVluDio5cZmo2Qkhqc3dCTlP19fbLztD5+vp5gYWgpqjs7e4qNjwmMzkwPELl5+dye36prrDg4uOOlJiXnqC/w8Tx8fK3u73c3t/7x/SPAAAAH3RSTlMAPnhhEwXe/vcnHGxL5VYzkJkChfHUsAvGzb6pobnrSsxHPgAAGkpJREFUeF7s1clugzAUBdAGgx0bG5sYCI1Dli/j0Hke/v+vmhSpEou2lADq4p2FN95c6eraZ1UIITT2D4Q4nuN/EgkFQkvi2dgVeUpnCVQME0rPCxdbj0gtgp6joYDL0LhcMQAGDL7xeftF5c6EkndfFgo0MQVlULbTAKMTQ3RHjyES0nNpWc/JGM1sxEctpkO+tJMEWlTucJibSLQQD3EypdARBgDKhadMCgniFPRgloW8QTwUDGwKPVLTyP9LPiTCLIHesdyrOSikG09o/3pwdXc899AMNYNffig00oZCfdvH3cvD8+JivZxvVrc3FderzXy5vl88Xb7t3rdQn4p/6AlxW7OhD3bNcDlNIIrCI1RNQDBEq6ltFKQpy4IG2YtawOX936rTmc50xt1FJ5NEduF7AX6cuefce9jNC92hKMBwNVngJwVdXymW9TDu1OBhaNe4XLo9otCFN0DgLzhMdt7+Gt+bnOVTR99+vlgk7Gnuu/AuYD+n1aUPDhf6//qo4/5hecHevCLC8M5kfl6e6r87df7ZXjdEi9o6LqUoIPBRBIimtTo96d04fdGsugkqUQAfToxqJ2o6Mdrtc87dLyFVERIAAp8BWRVr8TgPf7TX9Xoz8Q87D8VA4FNxk1J8Aj+PWnm22k/C4qBMMNyE7ECFl9RXvd+2bUEfiGaoPGRwQ7KIiubJ0uZtksgUSDTcIgw3J0s8gQ8vtXnbJUqLGBqCm/9us0yPNl+iV+oTaBLhT77tWaby2TTiF3T73IXGgVHFr/V0pVvy8YK/b0cEmklIuen0Td2F3PjO9bljAA0m3p24d5OaHfl8wmsX0hxDw8nQnjf+joJPImyLF0UoAwkgB144LU3FoumeF0bVgYAsRGteNPWUcrqhbBKx+DyZ1PG83kAokfQyWbYaf4wcThYlBGQk4mTTzFByYUgRAUkhCbvpTU3ZT6MZexftMEhMlm/Yl69SH006+1i4DEByXLaFuNMepU0jdowqHxRgxW4Qsg7TiHmndUIE1CBJmWTSZbyNHMa6jxiUIStemTVPuptpzPySeFmBUgRb5maSrIAwz8vUTU5ANZLTuVdM+hJZHbMxeDEoCKbM/mBIY3UDZmEARYnSs1laSmJ5+h/27nYrcRgIA3BQoODnyuqCiFIKTKGCXZppUT7v/672nP3TxHUFSlteJc8deHKSvDPTSCW1bYTP65HO+golU+mGdOMBf2vTJel+1QW4swbpnBF/c/aCdOWqgFa4JI01l/z9DXzS3F58pesoGvJRcNfvLyaBqvaTdAuPj0T4SrpW6WtUR/6Aj8h0TJpGETIy3JMmavNRGa3x40O1TJqOx0cm7JEGr64tPAGkOrCUV7kSUK4qpBo/81EaBqSyzgWO2qlFqjeXj5TtkAYoip8AXEcg5Io0P0DLo1fJx2xu6d/1Cwg3pLJmfOSmPqlaNbiut//MR6+9JNVDSRxYrUWqZZsNdiOo2UXtgVTRiP9lQl6zDrRGfZv/MsLOu1WCOetePP6YieKPdZBctwgZAArZ01epBLFGK8kqY6Knh8Mkcb2G7UnWGXNStcQBnGxqMxjzQ3eITslS14g/YMxI9VPk7MKizWtkzA45ubiuJFgjs0oXIkfVpySZwdxLlWuRm2I5WfY2SfypKnJSb5CiI/kzRo9iVrko8tEihRPypwy5IEWzlH8R2/d4A0N2ci9qr9QCKbJ5IyPsk+Ik5/C9dHkLhvemBfFcg50/5K0Yo4BitxlHvFKTYtaUt2QMfYrd1UWWfpBixlszpqT4lW1oUPR4B8Y8p0dm1VuKvUhGM5w4S1o6kyEjWlHMKoiM1O8oFnkMprtW/hkYehC/LObQaRi3GUu4ItUqBI94zVo2vwRCiiljcd+I4F92DC2KnWR+IU0YixvQe4HLcAYZX0ule+DQYEf0r8jGDg/lYqYVUmAzFOnQRxzJaMI1xR5EygqWslGHsHM13YThuGOKnYpU1csUm+Hexzqrjd15uD0TaWoBj2Jln/6nL7EHtc2s2kGBDRyZ3hsw9rV0LlJTvFSOkC5j8Zb0f4HHcNpKQ7xSzeSwmzB2asDPDjzI4sC7oNg6ZCyuRZ+xXPBvHs7TP+z8NoPp0Oc6jMdepp7wbpDnfM+0yTP4BPBRpODaAq7hZUSbRBJ8tnQl9lZShki+y2BmtNmM8XiBMlqqi32dIP+59pg2G9vgB96N2NPZLXLDskfb6DGghZJAr8V+HpDTbNuiDeIWHvIh0BD7qBWUP3XCYKRD23EkeEl7mlZqiEIG85u29ZvxSCel7HBOsS6DCQPaVhAyHtdK5WV6UXl1uQB+QrfZHPwNYKWaxsh8PGIwI5+2548YTxik8OFxtYJcES5oFwuOQV6qhaTxG7m30qXddBmQs3cMv0buUso17WYtGU/b2reF96h8Z8dg5IB2NQB/mX5XE7srIJfs3ph2tfRQ+w7JK9paA7n59Uq7ewV/tVQu7TMz9230pt3XbeGFwT6T9HvkSvCFknhh7BbeZSnBRoI9zKeUzJTxyCj5VroHrmPDiJKJQsYzTbyVLpCbk3NKas545DrpVmoC/0DIH/autTdtLQgqhOSkvUnbvHvT3BoD+IHBBCwbY8D8/391P7TqqusHC5yoO1L3eyuLEx/PzuzscNJOXkYlhRcdCfDONL9IpXd8lRqxw+g42uFJ8Rcp9E6pUPer9O8B9Dd7kfBIOxgzDH+Vro8Z0C/09RUnlQl0A7wXsSBLOtJ0DGB0gabweK/0WcjadRhmhdPMkc0wr8IRoRu9rJ1vvFPL+KoZvKuuLOBAMXHseqeXq3vHe+dARsj4OEYXKkQzzHjGuCG5au4CGV2oIM0w+WEN7a3e4Y3Cs1OF6knJ/w7C3ztEo4uHZ4bhX9sPh0wWB4hGF1QzTMRmjoWwYTbG0czxlfTkFwo33y/ksKGEM7rIq696JOVaPv4dwhldFrt+7Lr90QLRDDMx0sHwC/JRrLCMLtP5gK7nxCl2cGYYgg6mK930VCCRdiYfV2Zcp2BK+lLKOjwx2g5EMzd1t5ezxTLDJAuZ9te90gobNkd0pwODZYaZy1qlc61sw+AorDbEMsP4skhaMlIsEiDN3GkETFhmmD5F/7XcdkapNBYc2fRssMwwgUCgvaPbznOAjC6BADBBKOk9Q/ed4LZbIRldmnFaarxqQWial4Lbbg1A2kn+oEZYSvobw3ft2M4HMrqUx7+DsV6B9n5vJ7sCMLqIhtUDMDOMu6+fvXig2w7J6BKdsEggS9Xedx/32V0cJKOLL+gPASg8ju/+2aNSZFBGlzYgPUbbZxPv0SsuCZpCGV1aiQMDZoYpaEryud1KMUAyumxb//0WzAzjt+uzNIEySwFIO+HdnKGZYeiBv7QC8A0CaSccPFuh7bMhveKxFYAHUEaXkcifBZMMEzEQ3mSTnQBo5uJDQjPDpIRmz1tMSRmW0WV16nXnGaUk2G3LUoAcy+gya/0vZnBmmKKZCb+4Ij4LwOgibWZTPDOMwz5K9Z+kHoTRRcZh+XhmmGTaaILp6PNSFBY8YSGgGcalj1Jjl5SjGV0CgcyBZIYpGuUKGi9eohld1jZsZ0ONTJh5biLuJgCaufj3nQOaYRJCpGcNM+ALOKOLa2VZVF/jtvBOg5ZUohhdREgn9gCTYeYNmtJXwjloiS7eVEo4oJhhCO3c/EYKUSsb4m2nafl1p4hrJSf0TN1a3GBSvOWQvoxwwFHSF7XC3ydlw1wbS1khE8xkGLcOOdzdE24ATHR5s7VlcqBuQOpb7RB4AaCZyzmdJWYyzJKps3xQaACY6JJbWzMZaJtGMbTS4ZlR4GCJLhvBvQG1VjKZVef27z7TUyImuozsLbrJtW3O/VRjp4iBSDsBk+WCrpUc1pgrCNzlCIku8hnWHWgyTEHwrkZMCoASXQTE/RY0GSaqkZQeCdwBJLrIBfQENRmG4N3Dr0N60OPwW9tcqjpBTYZJTIW9+0jfzQSAtJO3Nw5sMkxW0f3O9MxFllZjkSLYZJiYMHiFXnUxE12GdnMtQk29YqcyzpVjJrq4diPLRokiDH5b0c4LzESXnd3NuiZQND3wVGmT3jATXaYCWQqLwgupUaosMA4RNHO5gD6CTYah5uH7z0O6odYdNNHF3yNDI1F4vA3/KVbQj5OCJrqEDS0hbjLMllkrujSKgZDoIifcesDJMCu2+e6Dil42yawnhDjAyTDUzV4zwqGPmugyt5+2VGihXs4Z4bBBTXQp7QdpTns6kK7pMF12iJro0rdGOFANlagB94wVmqMmumTvcPDG0UG+fGHi+Ro10cUk75DS2NfBC70y6i5QZnSRV09uqcAww0SMvHulp1JmdJGXI7dUYJhhiLz7yvjVJWwMcyRYSAilpDt0SGwQfACjmfMKxDscQMww9PCPzOUXAhhd5H/zA+/k2iigwS+ZUuEoM7rIqxSjERAzDPGON2zqzkfRzHmZWEw0gZhhUpq844cEoJnL96nlnoUK/h4SGV1OrFki+NQhKel0SFfMQTbRZnSRV086rY9ihqEn4IeEG8McCvYRKlDSMQ8p9uzUm+VelioGOCRlRhe5Rud4lmoJcEgKjC6CGr7f+WcpwCGpMrrIG6XCs1VrBYfEIDgSaUeVCWCjAgoPsE8qPWtlEhkkATHDJGoOKfQs1kQWJYJihhnTIXEWHI60owpl6aUoZhjOgr8Q5wtH2lEFAjUJiMLz6ZCYMhupM7rIa24BgetJhqFDMj9Ev2/UtgFp5rxcGboHMMPwGQc+iAJgdJFicEKOkBQeKaEvf9CN6f5P3hnwppEDUXiOwDkXoACNwjVNL7sAwwLZ3YBv2QAB/v+/qqpKtbBXgJQZW46/P0DVaO3n9+bZSIso9HkuWmJXftmD9nLSzknRhYgZi7hTLBxNIva0FxffLBddGAXYDKlZSzclk+7pwL44WPw3kDPm/oGtG1ezpj2nHVssupAz4dENijRyElg3tRLZxF7RhR4x1zrN5IydzCJ+0eqYK6uZOefO/oIEuCzDDLUboAa2L+mSQ2RALOksJ/dlmLV+Va56qGJuSV6ycKQ7hbkvw+T6hXcqmp16UXS5fOXGXCALq8J6UiGMd3kWFk07To2cIBM76yZ4G0BzWBOPMnOTtSRKqtwn6SPNX7Vdmn1HNkoiz8l9GSYx7pxu2jwJjJCPdaE+JC5Glg2HLoBmOWReZeYmB/nrJ8ZIgNsyzEEzHAA69k6zMkFWslk0y5CVxO5ZtmU++lLwZ+a+s59bvUmtYz7X/MzuG/rPm81jEg7MB0xLdtPOBd4l6c8Vj5g+2cpMMvwMZBbD80cA42Lwg4Xf9p/SngLvVbxgOrFQdPGfdWHtwF+reAs4lxaLLvz4auFtDAUO/YZQTjK3aec//C/DFEK7y1grVpQ2TtH+c7Ak7u5B8d3ChzxDfsQmfo83AjnhL6DIV80D1+VdzPbLE+Qme/1tBsxfh8jNRFo58vdA0eJ37xJkZjP7X7HYIC8iseLcNUFxh3+IPDXtDqeyuDj4a+HJXHPujDdFFnYyc/6ZuDHysrSgG8QAFPCDWTlMBbKSmVuEzHy18JKTWyMVX5mNqRhZSavOLS8pciJi/vneJ4BK5ZBKlqILLztCh8N9GeZ4ohsUdeSMlOQaWRHVaicSyMpG8mgsoesG03NIOIouvMSOkpEtc7/utgEnPDE6HlGKvGwdObppxCuEH+GUG8bj7BiZKV3lV2Peo+xXUJymFTj1LjMf0c34uS/DFMLMKczjbMJXdPH/j8RfhlnoR9lKI/ydr+ji/3LHX4ZZGha4osl0UipW7oLSJWr4UIY56ltS9aY0YzLtrC86Qw+T9Aj1Lal6U9p5l5lPz5R8mMlfuHaH2wEY9P7sV0M/ii4KMbYv/bm28EPlKcmc6xIRb9GFXwqb0t+XMoxUuVsNTOqCXrLII9phbUZw8zXa4Sh56lsdqOBf+i84QVsMdZVVDNEWCYvOaoOGdltXKr0ruojJy6lgmfhZhtloMyg6HS0p8azokibqYyq2qZ9lmOkZAa7f5zD2suiyWs7mv77f0XLlaxlmpwnwMyIc99LXoku+ytE+Gb3d8AOqadHKyhLDoSRf7W6gmsa9WmVdFF3CL8OoCFvUQcOMZ/cy/KKLAwvvaNgNJi1CfRflGBJpRLvaNaEa6Kv1Dg/W5Xf4nXSpFh9xB3B5vcsLAvc7JPKIcvLtEeCa9e7V9o4U/q400rVdNf02UXovVxgaa0mXUtzW4QxdoknWGYbHM53UeoBzdIh2wi2Gx5ZuzvcLGFSPG+8LgkA2JN7JDPD/GnCWGo10OGJ4HMmK3104T12QuIYrDI8VlWzADlzggWTeOMfwyD8WkKr/sm9wiRZJK3SPwSH2VJMGTbhE/28K6TDEYKA5WUolG+4HcIl+jWLC4g3DY0lUWO3BZe5uCfqGIwyPEVGK3YEr+E4QWMgNeoT7Bu0zal2KS/xFkd0vMDQWRGXIG7iKbxR+1BjDYkwU7LQbcBU3FFaHjDEkYknUD6rBdTTaFBNlMiSF9yY/dJBNjZDiMjWar3gRinrYLMgS0h5cS13NOoiPdKRkmQn87Iis/GDcVyh/RvwDV9MlG7CIymV83Of4Gcn3x3hZRj/Zu7udhIEgCsBTKPTHmMJSqdRaEo1LajRiKdHE938vLztJb9jdmV6d7wG4m81kl54jGRizp9vlqcMogdgg2YIcbB1GCcQGqSYXWYJRGs3WVhSRk2amDGz4m9wIeY3ScYBZuvojctTM0ggJvx6DxEdJP04ePr4mg+S54L1cBlBv3a3JmclT9WJ26OyoIA8b7VYn4FmAe/Jg4lI5EhbOlt/aeVlM09FBKwtwS34q9q6ENVy3wKPMydNSs5gdTmz93pEvc9ArZgde4HFfkbdIL04efuxoSQGetHIs4b3nF0Ih8tKq1/3h0i4pKMhCJwMbuoSv32FWaxa+J5bNClf2T6o2pjAm0qjAhe/wrYFr5BPD4JjwrSGYidvx93qRAw+u7MPvNCMBS6v4SIvDbkcCjKllNzx4ZYfdQ0UislTyOhx4rHwSkZC7Se0uyCQ22A1JMY9ykWFwtqN1RSPBAy/phgBw+pwcdgoHXh+Q+g+XN9nNjnvGHi5fDXFYkai8lX5awiPSP3t3opyqEkUB9KiYBpwiomZ6Ts9sZ1FtYvSq/v9fvXpVqZJGvDfeKDbQ6xd2tWf3kQLdoCsr4rpjSQ0k5Ojqyrjmekitg1Aji66tXsUVHzxWN6SCRjdg6D97V7mygdC+b8HK/OgbacqI3a59B/+15FxYHpTeDkcvFgluNJYWY34BZbgWB9LNGDaODi7/NmU5FQfSDRX/8qVHShceObqpCn5a8VSxwxvdWA2X74eUFcPRc50ENy4PbMW/QRk4OGqYdBRGeXBG/DKqfOspCkFKx9Gkyf9AGS/gUaQwiJuHXY//ltL6gEeFQlLBty+1yvAAj1cKi/UKj3WLn6W4HXg81Sk02Ze/SUllVNUoPJZQxHE4k5LiTuFRMClUZkFIacj/SGVkGxQuy2hcdpZURnqKwmaV7ItSUhnlKXyWcKnFeswFyrADD5ahu8gLKX0IKSmtd3jl6E6KDB4Lz+5BGR/8GcmR0q7Jvyi9D3il6Y4yQkqTr5240lzIk5H/LLE+FyTVyJEpI7LElDBfcqXPJJhHgqIOr73LE245x2XdO/wmjs6QJ5q7hZdeJCmkbHitE13FWx349gySKDXgtRuo6v3FTpE0jAK82IYn1GoiVUYiswoPhr2rKgNQMEgq2gsEhwQOptYUgqpJksm+woslb/swWEDwUif5VCBgv5Y8SfoOBG9ZklFGh6Dd4onhdiFKk6RSDQgWI54QzTX8V1hpGVUI2KfLE2D5i0FQKJHE6jWIDk0ee+MpRE8aSc1KMwicTdz7w2wCUTlLssvbSFJ/GO4h0jMkP8t8hmg347E1WkD0UKIosOpl+EzHPJZaezAIahpFRcZGEibTbAcRS1OEGM/weY9dzRu3EbmfOlH2ET7O3OUxstw48HmtU9TkG/BZj3hsDN7BILAzFEFaDX7bmBSIVpfB58kkQXT7A5z5kEeeu5nAR09bFFGW+QK/RT/qPW/1Ab/nEgkif5hw+JdHWLMDPz2dpUizzH9wYhrZOt7b4sSTQdGXaeDEtscjaNxl8LNzFsWBVsYJto9cTONPBydqJsVFqhoYU+QjeshTjGRzdlBMkZlNvaCI9Eqd4kUrI0A7Ek2vuWc4VTMobiyr9IQAndWSS205aiNANU9xZFHxAQEWmyGXlttfI0Ahl6W4yqYbCOB0JR1OvfkOSMIwEmkVG0EOfemOkzvrIIj+aFLcaY86go/TgEuk+TlBEPZmUPxZZJZ1BFpvWlwKw/47ArFXgxLifEysPXP5nbmrraMi+p/5qCOYs1+59yzc3QmC6W8GJY1WaeAMZzsb3ucM7Sc4w340KYnquQecw6abHg/V+L926645TSAMw/C7gICAsCwiX6pDGF8hTQLotBDiJP//X5WZHvSgFdEizcS9TuD8mXt302OOp8wECe4VM8LTM+Fr+W2kg++QvG3xtMCcwF2zbBWxK6jscOOBNk2c42lqRIDBvfN0F7vkL2/JjYr6njXxM3aRBQk4AAZAlnPspHzUxW7QpA67qn5QsJOyMNjvijhJ9PGc/KFOs8cB+tkU9csznuPqf0TETR0Ze9jHZZo8XVXV4SkryuMP7GFGLWB/i4iz6Az7yV/juimSXa+wHndZ0dTHjxz7mdukYx+OESrjJZT9Nn6vyyYtqippbVpZ+62qIm3K+j3e7nO8xNo2JmcvIs5yAvxPZNq7IU4TozWOTAmFKVyEY8QJlBETMjy4BieZtjvCQEtRg397y/GhqK/ijSiBbWowBG5i6UtXGXgfORKIB4PiPEu0wzUOYO7b+o324RgASESnC1fFq6juiupEg1FwGjEFuvDlXmupM39BBZFo7NfUI+O8qWWYuuBQO4pWq1UYtML2J4ps6gi6aVhT73NOw32pXX4CbhEk9gXbwx4AAAAASUVORK5CYII=\"","import WarningIcon from '../../images/Icon_Warning.png';\n\ntype Props = {\n  message: string;\n};\n\nconst ErrorMessage: React.FC<Props> = ({message}) => {\n  return (\n    <div className=\"InfoTableContainer\">\n      <div className=\"FailedMsg\">\n        <div className=\"MsgContainer Error\">\n          <div className=\"Img\">\n            <img src={WarningIcon} alt=\"Warning\" />\n          </div>\n          <div className=\"Txt\">{message}</div>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default ErrorMessage;\n","import { Redirect } from '@reach/router';\nimport { AppPath } from 'appConstants';\nimport React from 'react';\nimport { useSelector } from 'react-redux';\nimport { selectSignedIn } from 'reducers/auth';\n\nexport const Private: React.FC<any> = ({ children }) => {\n  const isSignedIn = useSelector(selectSignedIn);\n\n  if (!isSignedIn) return <Redirect noThrow to={AppPath.SIGN_IN} />;\n\n  return <>{children}</>;\n};\n\nexport default Private;\n","export const hasPageAccess = (pathName: string) => {\n  const stringifyScopes: string | null = window.localStorage.getItem('SCOPES');\n  const scopes = stringifyScopes && JSON.parse(stringifyScopes);\n\n  if (!scopes) return false;\n\n  const path = pathName.split('/')[1].replaceAll('-', '');\n\n  const isPageOnScopes = !!scopes.find((s: any) => s.path === path);\n\n  return isPageOnScopes;\n};\n","import { isFuture } from 'date-fns';\n\ninterface ContentWithExpiry<T = any> {\n  content: T;\n  expiryDate: string;\n}\n\nconst DEFAULT_EXPIRY_HOURS = 48;\n\nconst createExpiryDate = (hoursFromNow: number) => {\n  const currentTime = new Date();\n  currentTime.setHours(currentTime.getHours() + hoursFromNow);\n  return currentTime.toISOString();\n};\n\nconst addExpiryDate = <T>(\n  content: T,\n  expiryInHours: number\n): ContentWithExpiry<T> => {\n  const expiryDate = createExpiryDate(expiryInHours);\n  return {\n    expiryDate,\n    content,\n  };\n};\n\nconst isContentWithinExpiry = (content: ContentWithExpiry) => {\n  if (content && isFuture(new Date(content.expiryDate))) return true;\n  return false;\n};\n\nexport const storeInLocalStorage = <T>(\n  content: T,\n  resourceKey: string,\n  expiryInHours: number = DEFAULT_EXPIRY_HOURS\n) => {\n  const contentWithExpiry = addExpiryDate(content, expiryInHours);\n  const dataToCache = JSON.stringify(contentWithExpiry);\n  window.localStorage.setItem(resourceKey, dataToCache);\n};\n\nexport const getItemFromLocalStorage = <T = any>(item: string): T | null => {\n  const contentAsString = window.localStorage.getItem(item);\n  if (!contentAsString) {\n    return null;\n  }\n  const parsedContent: ContentWithExpiry<T> = JSON.parse(contentAsString);\n  if (isContentWithinExpiry(parsedContent)) {\n    return parsedContent.content;\n  }\n\n  return null;\n};\n","import AxiosInstance, { ApiResponse } from 'api';\nimport { getItemFromLocalStorage, storeInLocalStorage } from 'helpers/cache';\nimport { useState } from 'react';\n\nexport const useFetchContentAndCache = <T>(\n  url: string,\n  resourceKey: string,\n  expiryInHours?: number\n): T | null => {\n  const [cachedContent, setCachedContent] = useState<T | null>(() =>\n    getItemFromLocalStorage(resourceKey)\n  );\n\n  if (!cachedContent) {\n    try {\n      AxiosInstance.request<ApiResponse<T>>({ url: url }).then((response) => {\n        if (response.data.status === '1') {\n          storeInLocalStorage(\n            response.data.details,\n            resourceKey,\n            expiryInHours\n          );\n          setCachedContent(response.data.details);\n        } else {\n          throw new Error();\n        }\n      });\n    } catch (err) {\n      console.error(err);\n    }\n  }\n\n  return cachedContent;\n};\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAMAAAAPzWOAAAAAUVBMVEVHcExldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHjfzVXdAAAAGnRSTlMA3b0iiXjhDO799euC0HFIbgU/GFCWLFukrfQMhz0AAACpSURBVFjD7dNJDsMgDEDRkBBiIPPU9t//oF20i65xpKqq/wGejIGqsizLskpq5jqIiDiFsY1DAiCWG8sceJUVh6nfBql8kJsDiEmzk67PAEM77VM54gXAb5r7fSFxXC5A2k5hrPsjAdz3dVpLERckAkgIoS5F+Gi4AImXTFLrd+IGX/xzzkOA6M+mUby3PgNxrr792Awx5NeQA4Beh/RORPKoQizLsv62J1f7ExgaJclwAAAAAElFTkSuQmCC\"","import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { GeneralAction, selectAccessibilityMode } from 'reducers/misc';\nimport { PUBLIC_SITE_URL } from 'appConstants';\nimport { endpoints } from 'endpoints.config';\nimport { useFetchContentAndCache } from 'hooks/useFetchContentAndCache';\nimport FacebookIcon from 'images/Icon_Social_01.png';\nimport TwitterIcon from 'images/Icon_Social_02.png';\nimport { getYear } from 'date-fns';\nimport Cookies from 'universal-cookie';\n\ninterface FooterItem {\n  id: number;\n  name: string;\n  url: string;\n}\n\ninterface FooterItemsResponse {\n  navigationLinks: FooterItem[];\n}\n\nconst GENERIC_PAGE_PATH = '/info';\n\nconst Footer: React.FC = () => {\n  const dispatch = useDispatch();\n  const accessibilityMode = useSelector(selectAccessibilityMode);\n\n  const footerItems = useFetchContentAndCache<FooterItemsResponse>(\n    endpoints.public.navigation.footerLinks,\n    'footerLinks'\n  );\n\n  const cookies = new Cookies();\n  const cookieBannerSetting = cookies.get('cookie_settings');\n\n  const toggleAccessibilityMode = () =>\n    dispatch({ type: GeneralAction.TOGGLE_ACCESSIBILITY_MODE });\n\n  return (\n    <footer className=\"Footer\">\n      <div className=\"FooterContent WidthContent\">\n        <div className=\"LeftSection\">\n          <div className=\"SocialMediaLinks\">\n            <a\n              href=\"https://en-gb.facebook.com/getset4education\"\n              className=\"Btn BtnGrey\"\n              target=\"_blank\"\n              rel=\"noreferrer\"\n              aria-label=\"Go to Get Set 4 Education facebook page\"\n            >\n              <img src={FacebookIcon} alt=\"Facebook\" />\n            </a>\n            <a\n              href=\"https://twitter.com/getset4ed\"\n              className=\"Btn BtnGrey\"\n              target=\"_blank\"\n              rel=\"noreferrer\"\n              aria-label=\"Go to Get Set 4 Education twitter page\"\n            >\n              <img src={TwitterIcon} alt=\"Twitter\" />\n            </a>\n          </div>\n          <div className=\"FooterLinks\">\n            {footerItems &&\n              footerItems.navigationLinks.map((item, index) => (\n                <div key={'FooterLink' + index} className=\"FooterLink\">\n                  <a\n                    href={`${PUBLIC_SITE_URL}${GENERIC_PAGE_PATH}${item.url}`}\n                    aria-label=\"Go to Terms and conditions page\"\n                  >\n                    {item.name}\n                  </a>\n                </div>\n              ))}\n            {cookieBannerSetting && cookieBannerSetting !== \"functional\" && cookieBannerSetting !== \"functional_and_marketing\" && \n              <div className=\"FooterLink\" onClick={toggleAccessibilityMode}>\n                <span>\n                  {accessibilityMode\n                    ? 'Turn off accessibility mode'\n                    : 'Turn on accessibility mode'}\n                </span>\n              </div>\n            }\n          </div>\n        </div>\n        <div className=\"RightSection\">\n          <div className=\"Copyright\">\n            <span>\n              Copyright &#169;{getYear(new Date())} Get Set 4 Education. All rights\n              reserved.{' '}\n            </span>\n            <span> | </span>\n            <span>\n              {' '}\n              Website development by{' '}\n              <a\n                href=\"https://www.avamae.co.uk/\"\n                target=\"_blank\"\n                rel=\"noreferrer\"\n                aria-label=\"Go to AVAMAE website\"\n              >\n                AVAMAE\n              </a>\n            </span>\n          </div>\n        </div>\n      </div>\n    </footer>\n  );\n};\n\nexport default Footer;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAMAAAAPzWOAAAAAbFBMVEVHcExldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHjbWxfnAAAAI3RSTlMAUvGC4aj89hkCJxN5MuvMBWMsnQmYDtJwxUxbIDtD2bmwkYBEFAsAAAEtSURBVBgZ7cFHYsIwFAXAJ1vVVe4NMPDvf8dAgMSQLKSwjGYQBEEQBA92Vyfa4i09E1M393iHqQbFz4mBpzxbNO7sfiKKymZJ4ecwrV2VW1yljaKrdUzhRWcFFaKqW8AeON3w0cJLfZIk1XHR0J2iuzKHl0QouiiaZL/SQ5T18JGX9Ek1jaIHeczRazjT8aDoSkX0rRDZksOdjjn9gncz3LUxp5/4KWZwZzMuJb1QIjtouDNJ1ZWSnsjpoFv4qTg9i+IWvthaSNoq9waOrMGNHktJG0XcwlW66w0uTL8MtCHFDs5SlrFdqmt2HhRtiBrubJ2djkIcB0UbqqnhJYlXelHGCTy17MQVfYlWMVt4M+ncDUWkLqJiOs+pwV9YXe9ZNY4VyxNtEARBEPx3H65ILqLnYVq+AAAAAElFTkSuQmCC\"","import { useRef, useEffect } from \"react\";\n\n/**\n * Detect when user has clicked outside a component, and\n * run a callback. By default the callback will also be called\n * when the user presses the Esc key, which makes sense if the \n * hook is being used for cancellation (it usually is). To disable\n * this behaviour, call the hook with the `callOnEsc` parameter set to \n * false.\n *\n *  @example\n *  const bind = useOnClickOutside(() => setShowDropdown(false));\n *\n *  return (\n *    // This div is presumably some sort of dropdown.\n *    <div {...bind}>...</div>\n *  )\n *\n */\nexport const useOnClickOutside = (callback: () => any, callOnEsc = true) => {\n  const ref = useRef<any>(null);\n  useEffect(() => {\n    const handleClick = (e: MouseEvent) => {\n      // If we we haven't set the node yet, or a click occurs within the target, return.\n      if (ref.current == null || ref.current.contains(e.target)) {\n        return;\n      }\n      // If the click is a left click and outside the target,\n      // run the callback.\n      if (e.buttons === 1) {\n        callback();\n      }\n    };\n\n    const handleEsc = (e: KeyboardEvent) => {\n      if (ref.current != null && callOnEsc) {\n        if (e.keyCode === 27) {\n          callback();\n        }\n      }\n    };\n\n    // Add event listener.\n    document.addEventListener(\"mousedown\", handleClick);\n    document.addEventListener(\"keydown\", handleEsc);\n\n    // Tear down event listener on cleanup.\n    return () => {\n      document.removeEventListener(\"mousedown\", handleClick);\n      document.removeEventListener(\"keydown\", handleEsc);\n    };\n  }, [callback]);\n\n  return { ref };\n};\n","import { Link } from '@reach/router';\nimport { useOnClickOutside } from 'hooks/useOnClickOutside';\nimport React, { useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { signOut } from 'reducers/auth';\nimport Cookies from 'universal-cookie';\n\ninterface LinkData {\n  accessElementID: number;\n  displayName: string;\n  url: string;\n}\n\ntype HeaderDropdownMenuProps = {\n  initials: string;\n  linkListData: LinkData[];\n};\n\nexport const HeaderDropdownMenu: React.FC<HeaderDropdownMenuProps> = ({\n  initials,\n  linkListData,\n}) => {\n  const dispatch = useDispatch();\n  const [isOpen, setIsOpen] = useState(false);\n\n  const cookies = new Cookies();\n  const cookieBannerSetting = cookies.get('cookie_settings');  \n\n  const toggleIsOpen = () => {\n    setIsOpen((oldVal) => !oldVal);\n  };\n\n  const bind = useOnClickOutside(() => setIsOpen(false));\n\n  const handleSignOut = () => {\n    dispatch(signOut());\n  };\n\n  return (\n    <div className=\"HeaderDropdownMenu\" {...bind}>\n      <div className=\"OpenButton\" onClick={toggleIsOpen}>\n        <span>{cookieBannerSetting && cookieBannerSetting !== \"functional\" && cookieBannerSetting !== \"functional_and_marketing\" ? initials : \"GS\"}</span>\n      </div>\n      <div className={`Menu ${isOpen ? 'Open' : ''}`}>\n        <ul>\n          {linkListData &&\n            linkListData.map((item: LinkData, index: number) => {\n              if (item.displayName !== 'Sign out') {\n                return (\n                  <li key={index}>\n                    <Link\n                      to={\n                        '/' +\n                        item.displayName.toLowerCase().replaceAll(' ', '-')\n                      }\n                    >\n                      {item.displayName}\n                    </Link>\n                  </li>\n                );\n              }\n            })}\n          <li onClick={handleSignOut}>\n            <span className=\"SignOut\">Sign out</span>\n          </li>\n        </ul>\n      </div>\n    </div>\n  );\n};\n","import React from 'react';\nimport { ThreeBounce } from 'better-react-spinkit';\n\ninterface SpinnerProps {\n  size?: number;\n  color?: string;\n  scaleStart?: number;\n  scaleEnd?: number;\n  positionAbsolute?: boolean;\n}\n\nconst Spinner: React.FC<SpinnerProps> = ({ size = 15, color = '#429ccc' }) => {\n  return (\n    <div className=\"Spinner\">\n      <ThreeBounce size={size} color={color} />\n    </div>\n  );\n};\n\nexport { Spinner };\n","//copy block event\nfunction copyEvent(event: any) {\n  event.clipboardData?.setData(\"text/plain\", \"This content is lovingly crafted and copyrighted by © Get Set 4 Education. You are unauthorised to share, distribute, or reproduce this material, as it is unlawful to do so. Thank you for your co-operation!\");\n  event.preventDefault();\n  event.stopPropagation();\n}\n\n//block copy and paste function\nexport const BlockCopyandPaste = () => {\n  //list of all elements, details of elements to avoid blocking, and arrays holding elements to block, to no block and containing class names\n  const eleList: any = document.querySelectorAll(\"*\");\n  const avoidEleEvents = [\n    { type: \"node\", value: \"input\", wholeSection: false }, \n    { type: \"singleClass\", value: \"email\", wholeSection: false },\n    { type: \"wholeSection\", value: \"NewSubscriptionPage\", wholeSection: true },\n  ];\n  let eleListEventAdd = [];\n  let eleListEventRemove = [];\n  let removeWholeSectionEvents = [];\n\n  //remove any existing copy events\n  for(let i = 0; i < eleList.length; i++){\n    eleList[i].removeEventListener(\"copy\", copyEvent);\n  }  \n\n   //loop through all elements and sort them into block/avoid arrays, depending on whether they meet blocking details array criteria or not\n  for(let j = 0; j < eleList.length; j++){\n    let addEle = true;\n\n    for(let k = 0; k < avoidEleEvents.length; k++){\n      if(\n        (avoidEleEvents[k].type === \"node\" && typeof eleList[j].nodeName === \"string\" && eleList[j].nodeName.toLowerCase() === avoidEleEvents[k].value) ||\n        (avoidEleEvents[k].type === \"singleClass\" && typeof eleList[j].className === \"string\" && eleList[j].className.toLowerCase().indexOf(avoidEleEvents[k].value) > -1) ||\n        (avoidEleEvents[k].wholeSection && typeof eleList[j].className === \"string\" && eleList[j].className.toLowerCase().indexOf(avoidEleEvents[k].value.toLowerCase()) > -1)\n      ) {\n        addEle = false;\n        \n        if(avoidEleEvents[k].wholeSection){\n          removeWholeSectionEvents.push(avoidEleEvents[k].value);\n        }\n      }\n    }\n\n    if(addEle){\n      if(removeWholeSectionEvents.length > 0){\n        let removeEle = false;\n\n        for(let n = 0; n < removeWholeSectionEvents.length; n++){\n          if(eleList[j].parentNode.closest(\".\" + removeWholeSectionEvents[n])){\n            removeEle = true;\n            break;\n          }\n        }\n\n        if(removeEle){\n          eleListEventRemove.push(eleList[j]);\n        } else {\n          eleListEventAdd.push(eleList[j]);\n        }\n      } else {\n        eleListEventAdd.push(eleList[j]);\n      }\n    } else {\n      eleListEventRemove.push(eleList[j]);\n    }\n  }\n\n  //clear containing class names\n  removeWholeSectionEvents = [];\n\n  //add copy event listeners\n  for(let l = 0; l < eleListEventAdd.length; l++){\n    eleListEventAdd[l].addEventListener(\"copy\", copyEvent);\n  }\n\n  //negate copy event listeners\n  for(let m = 0; m < eleListEventRemove.length; m++){\n    eleListEventRemove[m].addEventListener(\"copy\", (event: any) => {\n      event.stopPropagation();\n    }); \n  }\n};","import { Spinner } from 'components/spinner/Spinner';\nimport { useLockBody } from 'hooks/useLockBody';\nimport React, { useState, useEffect } from 'react';\nimport { BlockCopyandPaste } from 'helpers/blockCopyandPaste';\n\ntype PopoutMenuProps = {\n  isPopup: boolean;\n  isOpen: boolean;\n  handleClose: () => void;\n  className?: string;\n  position: 'left' | 'right';\n  width?: number;\n  minWidth?: number;\n  mobileMenu?: boolean;\n  loading?: boolean;\n  error?: boolean;\n  zIndexVal?: number;\n  children?: any;\n};\n\nconst OPEN_CLASS = 'Open';\n\nexport const PopoutMenu: React.FC<PopoutMenuProps> = ({\n  isPopup,\n  isOpen,\n  handleClose,\n  className,\n  position,\n  width,\n  minWidth,\n  mobileMenu,\n  children,\n  loading,\n  error,\n  zIndexVal,\n}) => {\n  const [noChildren, setNoChildren] = useState<any>();\n  const [openCloseState, setOpenCloseState] = useState<string>('Closed');\n  const openCloseTime = isPopup ? 100 : 250;\n\n  useEffect(() => {\n    setOpenCloseState('Opening');\n\n    let _safariStr = navigator.userAgent.toLowerCase();\n    let _safari = ((_safariStr.indexOf(\"safari\") != -1) && (_safariStr.indexOf(\"chrome\") === -1)) ? true : false;  \n    var is_iOS = navigator.userAgent.match(/(iPhone|iPod|iPad)/i);\n\n    if (isOpen) {\n      if(!_safari && !is_iOS){\n        document.body.style.overflowY = 'hidden';\n      }\n \n      setNoChildren(false);\n\n      setTimeout(function () {\n        setOpenCloseState('Open');\n      }, openCloseTime);\n    } else {\n      document.body.style.overflowY = '';\n      setOpenCloseState('Closing');\n\n      setTimeout(function () {\n        setNoChildren(true);\n        setOpenCloseState('Closed');\n      }, openCloseTime);\n    }\n  }, [isOpen]);\n\n  const lock = useLockBody(isOpen);\n\n  useEffect(() => {\n    if(children){\n      BlockCopyandPaste();\n    }\n  }, [children]);  \n    \n  let styleObj: any = {};\n\n  if(zIndexVal){\n    styleObj.zIndex = zIndexVal;\n  }\n\n  return (\n    <div\n      className={`PopoutContainer ${\n        isPopup ? ' Popup' : ' Panel'\n      } ${openCloseState}`}\n      style={styleObj}\n    >\n      <div className=\"Inner\">\n        <div\n          className={`PopoutMenuBackground ${openCloseState}`}\n          onClick={handleClose}\n        />\n        <div\n          className={`PopoutMenu ${className ?? ''} \n            ${isPopup ? 'Popup' : 'Panel'} \n            ${openCloseState} \n            ${position ? position : ''} \n            ${mobileMenu ? 'MobileMenu' : ''}`}\n          style={{\n            width: width ? width + 'px' : '560px',\n            minWidth: minWidth ? minWidth + 'px' : '320px',\n          }}\n        >\n          {loading && <Spinner color={'#f59e16'} />}\n          {error && (\n            <div>Oops, something went wrong. Please try again later.</div>\n          )}\n          {noChildren ? null : children}\n        </div>\n      </div>\n    </div>\n  );\n};\n","import { useRef, useLayoutEffect } from \"react\";\nimport { disableBodyScroll, clearAllBodyScrollLocks } from \"body-scroll-lock\";\n\nexport function useLockBody<T extends HTMLDivElement>(toggle = true) {\n  const ref = useRef<T>(null);\n\n  useLayoutEffect(() => {\n    if (toggle && ref.current !== null) {\n      disableBodyScroll(ref.current);\n    }\n    return () => {\n      clearAllBodyScrollLocks();\n    };\n  }, [toggle]);\n\n  return { ref };\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoBAMAAAB+0KVeAAAAGFBMVEVHcExldHhldHhldHhldHhldHhldHhldHj3sRX9AAAAB3RSTlMAN/ADqCiqqq/KegAAAD9JREFUKM9jYBgFAwtYDRgYmAPQBIWcGRjMFNEFSwyY09EFGdWdzYoEGDCUYigEKcVUCFSqiMVRjAKjEUMSAACNRAWV9xKI3wAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,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\"","/**Standard Avamae Endpoint Response**/\nexport interface ApiResponse<T> {\n    details: T;\n    status: '1' | '0';\n    errors: any;\n  }\n  \n  /* Shared */\n  \n  export interface Response<T> {\n    data: T | null;\n    error: { message: string | null | undefined; formErrors?: FormError[] } | null;\n  }\n\n  export type FormError = {fieldName: string; messageCode: string};\n  \n  export class BaseApi {\n    public static isResponseSuccessful = (response: ApiResponse<any>) =>\n      response.status === '1';\n  \n    public static successResponse = function <T>(data: T): Response<T> {\n      return {\n        data,\n        error: null,\n      };\n    };\n  \n    public static errorResponse = (message: string, errors?: FormError[]): Response<null> => {\n      return {\n        data: null,\n        error: {\n          message,\n          formErrors: errors\n        },\n      };\n    };\n  }\n  ","import instance, { ApiResponse } from '../../api';\nimport { AxiosResponse } from 'axios';\nimport { BaseApi } from '../../baseApi';\nimport { endpoints } from '../../endpoints.config';\n\nexport class DropdownLinksApi extends BaseApi {\n    public static getDropdownLinks = async (): Promise<any> => {\n        try {\n            const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n                endpoints.dashboard.availablePages\n            );\n            if(DropdownLinksApi.isResponseSuccessful(result.data)){\n                const data = result.data.details;\n                return DropdownLinksApi.successResponse(data);\n            }\n        } catch (error: any) {\n            if (error.response){\n                const errors = error.response.data.errors;\n\n                if (errors){\n                    return DropdownLinksApi.errorResponse(errors);\n                }\n            }\n        }\n    };\n}","import { useState, useCallback, useEffect } from 'react';\nimport { DropdownLinksApi } from './headerDropdownMenuApi';\n\nexport const useGetDropdownLinks = () => {\n    const [dropdownLinksInfo, setDropdownLinksInfo] = useState(null);\n    const [profileInitials, setProfileInitials] = useState('');\n\n    const getDropdownLinks = useCallback(async () => {\n        const result = await DropdownLinksApi.getDropdownLinks();\n\n        if (result){\n            setDropdownLinksInfo(result.data.listAvailablePages);\n\n            if(result.data.profileInitials){\n                window.localStorage.setItem('UI', result.data.profileInitials);\n                setProfileInitials(result.data.profileInitials);\n            }\n        }\n\n        if (result.error){\n            return { error: result.error };\n        }\n    }, []);\n\n    useEffect(() => {\n        getDropdownLinks();\n    }, [getDropdownLinks]);\n\n    return { dropdownLinksInfo, profileInitials };\n};","import { Link, navigate } from '@reach/router';\nimport { AppPath, PUBLIC_SITE_URL } from 'appConstants';\nimport { HeaderDropdownMenu } from 'components/headerDropdownMenu/HeaderDropdownMenu';\nimport { PopoutMenu } from 'components/popupsAndPanels/PopoutMenu';\nimport { endpoints } from 'endpoints.config';\nimport { useFetchContentAndCache } from 'hooks/useFetchContentAndCache';\nimport { useOnClickOutside } from 'hooks/useOnClickOutside';\nimport ArrowDown from 'images/Icon_Dropdown_01.png';\nimport ArrowLeft from 'images/Icon_Pagination_Dropdown.png';\nimport HamburgerMenu from 'images/Icon_Menu.png';\nimport Logo from 'images/Logo.png';\nimport React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { selectSignedIn, signOut } from 'reducers/auth';\nimport { selectUserInitials } from 'reducers/auth';\nimport { useGetDropdownLinks } from '../headerDropdownMenu/useGetDropdownLinks';\nimport { store } from '../../index';\nimport { loadTokenResource } from 'helpers/auth';\nimport { setUserInitials } from 'reducers/auth';\n\nexport interface HeaderItem {\n  id: number;\n  name: string;\n  url: string;\n  childElements?: HeaderItem[];\n  bAbsoluteURL: boolean;\n}\n\ninterface HeaderItemResponse {\n  navigationLinks: HeaderItem[];\n}\n\ntype HeaderProps = {\n  menuItems?: HeaderItem;\n};\n\nconst Header: React.FC<HeaderProps> = ({ menuItems }) => {\n  const dispatch = useDispatch();\n  const isSignedIn = useSelector(selectSignedIn);\n  const userInitials = useSelector(selectUserInitials);\n\n  const [burgerMenuIsOpen, setBurgerMenuIsOpen] = useState(false); \n\n  // eslint-disable-next-line react-hooks/rules-of-hooks\n  const linkListData: any = isSignedIn ? useGetDropdownLinks() : false;\n\n  useEffect(() => {\n    let initialsToUse: string = linkListData.profileInitials ? linkListData.profileInitials : window.localStorage.getItem('UI') ? window.localStorage.getItem('UI') : \"GS\";\n\n    store.dispatch(setUserInitials(initialsToUse));\n  }, [linkListData]);   \n\n  const headerItems = useFetchContentAndCache<HeaderItemResponse>(\n    endpoints.public.navigation.headerLinks,\n    'headerLinks'\n  );\n\n  const handleBurgerMenuOpen = () => {\n    setBurgerMenuIsOpen(true);\n  };\n\n  const handleBurgerMenuClose = () => {\n    setBurgerMenuIsOpen(false);\n  };\n\n  const handleSignOut = () => {\n    dispatch(signOut());\n  };\n\n  return (\n    <header className=\"Header\">\n      {/* Main Header */}\n      <div className=\"MainHeader WidthContent\">\n        <div className=\"HeaderLink\">\n          <a href={PUBLIC_SITE_URL} className=\"Logo\">\n            <img src={Logo} alt=\"GetSet4Education Logo\" />\n          </a>\n        </div>\n        <div className=\"HeaderActions\">\n          {headerItems &&\n            headerItems.navigationLinks &&\n            headerItems.navigationLinks.map((item, index) => {\n              const hasChildElements =\n                item.childElements && item.childElements.length > 0;\n              return (\n                <React.Fragment key={'HdrLink' + index}>\n                  {hasChildElements ? (\n                    <HeaderLinkWithChildElements item={item} />\n                  ) : (\n                    <div className=\"HeaderLink\">\n                      <a\n                        href={`${PUBLIC_SITE_URL}${item.url}`}\n                        rel=\"noreferrer\"\n                      >\n                        {item.name}\n                      </a>\n                    </div>\n                  )}\n                </React.Fragment>\n              );\n            })}\n          {isSignedIn ? (\n            <HeaderDropdownMenu\n              initials={userInitials}\n              linkListData={linkListData.dropdownLinksInfo}\n            />\n          ) : (\n            <>\n              <Link\n                to={AppPath.SUBSCRIBE}\n                className=\"Btn BtnOrange SubscribeButton\"\n              >\n                Subscribe\n              </Link>\n              {!isSignedIn && (\n                <Link\n                  to={AppPath.SIGN_IN}\n                  className=\"Btn BtnOrange SignInButton\"\n                >\n                  Sign in\n                </Link>\n              )}\n            </>\n          )}\n        </div>\n      </div>\n\n      {/*Mobile Header*/}\n      <div className=\"MobileHeader\">\n        <div className=\"HamburgerMenuOpen\" onClick={handleBurgerMenuOpen}>\n          <img src={HamburgerMenu} alt=\"HamburgerMenu\" />\n        </div>\n        <a href={isSignedIn ? '/' : PUBLIC_SITE_URL} className=\"Logo\">\n          <img src={Logo} alt=\"GetSet4Education Logo\" />\n        </a>\n        <PopoutMenu\n          isPopup={false}\n          position=\"left\"\n          isOpen={burgerMenuIsOpen}\n          handleClose={handleBurgerMenuClose}\n          className=\"BurgerMenu\"\n          width={260}\n          minWidth={260}\n          mobileMenu={true}\n        >\n          <div className=\"BurgerMenuContent\">\n            {headerItems &&\n              headerItems?.navigationLinks &&\n              headerItems?.navigationLinks.map((item, index) => (\n                <React.Fragment key={'MobHdrLink' + index}>\n                  <div className=\"HeaderLink\">\n                    {item.childElements ? null : (\n                      <a\n                        href={`${PUBLIC_SITE_URL}${item.url}`}\n                        aria-label={item.name}\n                      >\n                        {item.name}\n                      </a>\n                    )}\n                  </div>\n\n                  {item.childElements &&\n                    item.childElements.map((childItem, index) => {\n                      return (\n                        <React.Fragment key={'MobHdrSubLink' + index}>\n                          <div className=\"HeaderLink\" key={childItem.id}>\n                            {childItem.childElements ? null : (\n                              <a\n                                href={\n                                  childItem.bAbsoluteURL\n                                    ? `${childItem.url}`\n                                    : `${PUBLIC_SITE_URL}${childItem.url}`\n                                }\n                                aria-label={childItem.name}\n                              >\n                                {`${\n                                  item.name === 'About Us'\n                                    ? ''\n                                    : `${item.name} - `\n                                }${childItem.name}`}\n                              </a>\n                            )}\n                          </div>\n                          {childItem.childElements &&\n                            childItem.childElements.map((subChildItem, index) => (\n                              <React.Fragment key={'MobHdrSubSubLink' + index}>\n                                <div className=\"HeaderLink\" key={subChildItem.id}>\n                                  {subChildItem.childElements ? null : (\n                                    <a\n                                      href={\n                                        subChildItem.bAbsoluteURL\n                                          ? `${subChildItem.url}`\n                                          : `${PUBLIC_SITE_URL}${subChildItem.url}`\n                                      }\n                                      aria-label={subChildItem.name}\n                                    >\n                                      {`${childItem.name} - ${subChildItem.name}`}\n                                    </a>\n                                  )}\n                                </div>\n                              </React.Fragment>\n                            ))}\n                        </React.Fragment>\n                      );\n\n})}\n                </React.Fragment>\n              ))}\n            {linkListData && linkListData.dropdownLinksInfo &&\n              linkListData.dropdownLinksInfo.map((item: any, index: number) => {\n                if (item.displayName !== 'Sign out') {\n                  return (\n                    <React.Fragment key={'MobHdrLink' + index}>\n                      <div className=\"HeaderLink\" key={index}>\n                        <a\n                          href={\n                            '/' +\n                            item.displayName.toLowerCase().replaceAll(' ', '-')\n                          }\n                        >\n                          {item.displayName}\n                        </a>\n                      </div>\n                    </React.Fragment>\n                  );\n                }\n              })}\n            {isSignedIn ? (\n              <button\n                onClick={handleSignOut}\n                className=\"Btn BtnOrange SignOutButton\"\n              >\n                Sign out\n              </button>\n            ) : (\n              <>\n                <Link\n                  to={AppPath.SUBSCRIBE}\n                  className=\"Btn BtnOrange SubscribeButton\"\n                >\n                  Subscribe\n                </Link>\n                <Link\n                  to={AppPath.SIGN_IN}\n                  className=\"Btn BtnOrange SignInButton\"\n                >\n                  Sign in\n                </Link>\n              </>\n            )}\n          </div>\n        </PopoutMenu>\n      </div>\n    </header>\n  );\n};\n\ntype HeaderLinkWithChildElementsProps = {\n  item: HeaderItem;\n};\n\nexport const HeaderLinkWithChildElements: React.FC<\n  HeaderLinkWithChildElementsProps\n> = ({ item }) => {\n  const [isOpen, setIsOpen] = useState(false);\n\n  const toggleIsOpen = () => {\n    setIsOpen((prevIsOpen) => !prevIsOpen);\n  };\n\n  const bind = useOnClickOutside(() => setIsOpen(false));\n\n  return (\n    <div className={`HeaderLink`} onClick={toggleIsOpen} {...bind}>\n      <span>{item.name}</span>{' '}\n      <img src={ArrowDown} alt=\"Open About us submenu\" />\n      {isOpen && (\n        <div className=\"HeaderSubMenu\" onMouseLeave={() => setIsOpen(false)}>\n          {item.childElements?.map((item, index) => {\n            const hasChildElements =\n              item.childElements && item.childElements.length > 0;\n            return hasChildElements ? (\n              <HeaderSubLinkWithChildElements item={item} />\n            ) : (\n              <div key={'SubHdrLink' + index} className=\"HeaderSubLink\">\n                <a\n                  target=\"_self\"\n                  href={\n                    item.bAbsoluteURL\n                      ? `${item.url}`\n                      : `${PUBLIC_SITE_URL}${item.url}`\n                  }\n                  rel=\"noreferrer\"\n                >\n                  {item.name}\n                </a>\n              </div>\n            );\n          })}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport const HeaderSubLinkWithChildElements: React.FC<\n  HeaderLinkWithChildElementsProps\n> = ({ item }) => {\n  const [isOpen, setIsOpen] = useState(false);\n\n  const toggleIsOpen = () => {\n    setIsOpen((prevIsOpen) => !prevIsOpen);\n  };\n\n  const bind = useOnClickOutside(() => setIsOpen(false));\n\n  return (\n    <div\n      className={`HeaderSubLink SubMenu`}\n      onClick={toggleIsOpen}\n      onMouseEnter={() => setIsOpen(true)}\n      onMouseLeave={() => setIsOpen(false)}\n      {...bind}\n    >\n      <span>{item.name}</span>\n      <img src={ArrowLeft} alt=\"Open About us submenu\" />\n      {isOpen && (\n        <div className=\"HeaderSubSubLink\">\n          {item.childElements?.map((item) => (\n            <div className=\"HeaderSubLink\" key={item.id}>\n              <a\n                href={\n                  item.bAbsoluteURL\n                    ? `${item.url}`\n                    : `${PUBLIC_SITE_URL}${item.url}`\n                }\n                aria-label={item.name}\n                rel=\"noreferrer\"\n              >\n                {item.name}\n              </a>\n            </div>\n          ))}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default Header;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAaCAYAAADfcP5FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF5GlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuZGFiYWNiYiwgMjAyMS8wNC8xNC0wMDozOTo0NCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMS0wNi0yMlQxNjo0MzowNyswMTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjEtMDYtMjJUMTY6NTE6NDkrMDE6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMDYtMjJUMTY6NTE6NDkrMDE6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6YzU3ODEzMmQtYmMwYy0wMTRmLThmZjgtOTFiZGZhMDRmYTdkIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjkwY2NiYzI4LTJjYzQtYjQ0YS1hOWIyLWY3Mjk0ZGFmYzkyMiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjkwY2NiYzI4LTJjYzQtYjQ0YS1hOWIyLWY3Mjk0ZGFmYzkyMiI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTBjY2JjMjgtMmNjNC1iNDRhLWE5YjItZjcyOTRkYWZjOTIyIiBzdEV2dDp3aGVuPSIyMDIxLTA2LTIyVDE2OjQzOjA3KzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmM1NzgxMzJkLWJjMGMtMDE0Zi04ZmY4LTkxYmRmYTA0ZmE3ZCIgc3RFdnQ6d2hlbj0iMjAyMS0wNi0yMlQxNjo1MTo0OSswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PshhpOwAAAEBSURBVEiJ7dYxDoIwGIbhF+EgXorJxNEDqCFRY5w0oDdwF2M8ll7D4GCJDalQ/p9EBr6pbWj7pC3QoCgK+pTRvwHVDKCm9A4UuRpnyboszoEHcO9ovhgYAyeA8/HgBzJZmo4vU9eiYiA3c46AzPXQry1bGAxACFzNgF1gAFIgaQN68l0ZLSo2fe3deJk5vEE3YNIBqsSEFcyUz4p5g7pAtcY0gTQoEcYHJEGJMb6gNigVBuq/Qy4UwMWasEQFQKHFtAXVoXKrLMZIQHUoOyIMyH+urjOlxmhAJWrjaN9JMaC/fmTAyqpvgb1mQMkZqibl84ZFWgxAMFzyGzKAmtI70Bty8k99fR1VwQAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4AQMAAAADqqSRAAAABlBMVEVHcExldHjEu8hmAAAAAXRSTlMAQObYZgAAAB5JREFUOMtjYBgFo2Cwg/8gQAF/1P+j/h8Fo2DwAQAzoDvFPboCKAAAAABJRU5ErkJggg==\"","import instance, { ApiResponse } from 'api';\nimport { AxiosError, AxiosResponse } from 'axios';\nimport { BaseApi } from 'baseApi';\nimport { endpoints } from 'endpoints.config';\n\nconst UNKNOWN_ERROR_MESSAGE = 'Sorry, something went wrong. Please try again.';\n\nexport class DashboardApi extends BaseApi {\n  public static getDashboardList = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.dashboard.list\n      );\n      if (DashboardApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return DashboardApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          return DashboardApi.errorResponse('');\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          return DashboardApi.errorResponse('');\n        }\n      }\n      return DashboardApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static getAutoLoginToken = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.dashboard.autoLoginToken\n      );\n      if (DashboardApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return DashboardApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          return DashboardApi.errorResponse('');\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          return DashboardApi.errorResponse('');\n        }\n      }\n      return DashboardApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static restartTrial = async (account_package_id: number): Promise<any> => {\n    try {\n      const payload = { packageID: account_package_id };\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.dashboard.restartTrial,\n        payload\n      );\n      if (DashboardApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return DashboardApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          return DashboardApi.errorResponse('');\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          return DashboardApi.errorResponse('');\n        }\n      }\n      return DashboardApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  }; \n}\n","import React, { useEffect, useState } from 'react';\nimport { navigate, Redirect, useLocation } from '@reach/router';\nimport Cookies from 'universal-cookie/es6';\nimport queryString from 'query-string';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n  autoSignIn,\n  selectAuthMessage,\n  selectSignedIn,\n  showApp,\n  signOut,\n} from 'reducers/auth';\nimport { AppPath, NO_ACCESS_MESSAGE, NOT_FOUND_PAGE } from 'appConstants';\nimport ErrorMessage from 'components/errorMessage/ErrorMessage';\nimport Private from 'components/private/Private';\nimport { hasPageAccess } from 'helpers/hasPageAccess';\nimport Footer from './Footer';\nimport Header from './Header';\nimport { DashboardApi } from '../../pages/dashboard/dashboardApi';\nimport { Spinner } from 'components/spinner/Spinner';\n\ntype PageProps = {\n  isPublic?: boolean;\n  isNotFound?: boolean;\n  className?: string;\n  redirectPath?: string;\n  redirectParams?: boolean;\n  autoLogin?: boolean;\n  children?: any;\n};\n\nconst cookies = new Cookies();\n\nconst Page: React.FC<PageProps> = ({\n  isPublic = false,\n  isNotFound = false,\n  className,\n  redirectPath,\n  children,\n  redirectParams = true,\n  autoLogin = true,\n}) => {\n  const [token, setToken] = useState<string>('');\n  const [showPleaseWait, setShowPleaseWait] = useState<boolean>(false);\n  const dispatch = useDispatch();\n  const isSignedIn = useSelector(selectSignedIn);\n  const location = useLocation();\n  const pathName = location.pathname;\n\n  const message = useSelector(selectAuthMessage);\n\n  const getFetchAutoLoginToken = async () => {\n    const result = await DashboardApi.getAutoLoginToken();\n    if (result.data) {\n      setToken(result.data.token);\n    }\n    if (result.error) {\n      setToken('');\n    }\n  };\n\n  const queryParams: any = location\n    ? queryString.parse(location.search)\n    : undefined;\n\n  useEffect(() => {\n    if(isSignedIn){\n      getFetchAutoLoginToken();\n    }\n  }, []);    \n\n  useEffect(() => {\n    if (isSignedIn && token && queryParams.redirectURL) {\n      setShowPleaseWait(true);\n      const holdsHttps = queryParams.redirectURL.indexOf(\"https://\") !== -1;\n      const newRedirectURL = (holdsHttps ? \"\" : \"https://\") + queryParams.redirectURL.replace(\"AUTOLOGINTOKEN\", token) + \"&area=\" + queryParams.area;\n      window.location.href = newRedirectURL;\n    }\n  }, [token]);\n\n  useEffect(() => {\n    if (queryParams?.auth === 'sign-out' && isSignedIn) dispatch(signOut());\n  }, []);\n\n\n  if (queryParams?.auth === 'sign-out' && isSignedIn) return null;\n\n  // const getURLToken = new URLSearchParams(window.location.search).get('token');\n  // if (getURLToken && autoLogin) {\n  //   dispatch(autoSignIn({ token: encodeURIComponent(getURLToken) }));\n\n  //   if (message) {\n  //     navigate(AppPath.SIGN_IN);\n  //   }\n  //   return (\n  //     <div className=\"PageSpinner\">\n  //       <Spinner />\n  //     </div>\n  //   );\n  // }\n\n  if (isSignedIn && isPublic) {\n    return (\n      <Redirect\n        noThrow\n        to={\n          redirectPath\n            ? `/${redirectPath}${redirectParams ? '?area=&token=' : ''}`\n            : AppPath.DASHBOARD\n        }\n      />\n    );\n  }\n\n  return isPublic ? (\n    <div className={`Page ${className ? className : ''}`}>\n      <Header />\n      <main className=\"Main\">{children}</main>\n      <Footer />\n    </div>\n  ) : (\n    <Private>\n      <div className={`Page ${className ? className : ''}`}>\n        <Header />\n        <main className=\"Main\">\n          {hasPageAccess(pathName) ? (\n            children\n          ) : (\n            <>\n              {showPleaseWait ? \n                <div className=\"PleaseWaitMsg\">\n                  <div className=\"MsgContainer\">\n                    <Spinner />\n                    <div className=\"Txt\">Please wait</div>\n                  </div>\n                </div>\n                :\n                <ErrorMessage\n                  message={isNotFound ? NOT_FOUND_PAGE : NO_ACCESS_MESSAGE}\n                />\n              }\n            </>\n          )}\n        </main>\n        <Footer />\n      </div>\n    </Private>\n  );\n};\n\nexport default Page;\n","import { useEffect, useState } from 'react';\n\ntype Props = {\n  daysLeft: number | null;\n  isFreeTrialValid: boolean;\n  upgradeSubscriptions: () => void;\n  dashboardListInfo: any;\n};\n\nconst getPackageTrialTxtList = (list_info: any) => {\n  let txtList = [];\n\n  for(let i = 0; i < list_info.length; i++){\n    if(list_info[i].trialRemainingDays && list_info[i].trialRemainingDays > 0){\n      txtList.push(list_info[i].subject + \" trial \" + list_info[i].trialRemainingDays + \" days left\");\n    }\n  }\n\n  return txtList;\n};\n\nconst FreeTrialBanner: React.FC<Props> = ({\n  daysLeft,\n  isFreeTrialValid,\n  upgradeSubscriptions,\n  dashboardListInfo,\n}) => {\n  const [trialTxtList, setTrialTxtList] = useState<any>();\n\n  useEffect(() => {\n    setTrialTxtList(getPackageTrialTxtList(dashboardListInfo));   \n  }, [dashboardListInfo]);  \n\n  return (\n    <div className=\"FreeTrialBannerContainer\">\n      <div className=\"FreeTrialBanner WidthContent\">\n        {isFreeTrialValid && daysLeft && daysLeft > 1 ? (\n          <>\n            {trialTxtList && trialTxtList.map((item: string, index: number) => {\n              return (\n                <span key={index}>{item}</span>\n              );\n            })}\n          </>\n        ) : (\n          <span>Upgrade to a full subscription now to maintain access</span>\n        )}\n\n        {trialTxtList && trialTxtList.length !== dashboardListInfo.length && \n          <button\n            onClick={() => upgradeSubscriptions()}\n            className=\"Btn BtnOrange TileButton SlimButton\"\n          >\n            Upgrade to subscription\n          </button>\n        }\n      </div>\n    </div>\n  );\n};\n\nexport default FreeTrialBanner;\n","import { PaymentTypes } from 'appConstants';\nimport { format, parse } from 'date-fns';\n\nexport type ISubscription = {\n  id: number;\n  subject: string;\n  price: string;\n  subscription: string;\n  fromDate: string;\n  toDate: string;\n  renewalDate: string;\n  isFreeTrial: boolean;\n  isRenewable: boolean;\n  isUpgradable: boolean;\n  subjectId: number;\n  trialRemainingDays: number | null;\n};\n\nexport type SubscriptionsList = ISubscription[];\n\nexport type UpgradeSubscription = {\n  packageId: number;\n  subjectId: number;\n  price: number;\n  subscription: string;\n  type: string;\n};\n\nexport interface UpgradePackageInfo {\n  packageId: number;\n  subjectId: number;\n  price: number;\n  subscription: string;\n  accessLength: number;\n  type: string;\n}\n\nexport interface UpgradeSubscriptionFormValues {\n  poNumber: string;\n  paymentType: PaymentTypes.PAY_BY_CARD | PaymentTypes.PAY_BY_INVOICE;\n  package: UpgradePackageInfo | null;\n  cardholderName: string;\n  card: string;\n  validPromoCode: string;\n  total: number;\n  validDiscount: number;\n  FinanceEmail: string;\n}\n\nexport interface RenewSubscriptionFormValues {\n  poNumber: string;\n  paymentType: PaymentTypes.PAY_BY_CARD | PaymentTypes.PAY_BY_INVOICE;\n  cardholderName: string;\n  card: string;\n  validPromoCode: string;\n  total: number;\n  validDiscount: number;\n  subDuration: string;\n  FinanceEmail: string;\n}\n\nexport interface accessInformation {\n  bCanAddFreeTrial: boolean;\n  bCanAddSubscription: boolean;\n}\n\nexport type UpgradeSubscriptionsList = UpgradeSubscription[];\n\nexport class SubscriptionsParser {\n  public static parseGetSubscriptionList = (response: SubscriptionsList) => {\n    return response.map((s: ISubscription) => ({\n      ...s,\n      fromDate: s.fromDate\n        ? format(parse(s.fromDate, 'yyyy-MM-dd', new Date()), 'dd/MM/yyyy')\n        : '',\n      toDate: s.toDate\n        ? format(parse(s.toDate, 'yyyy-MM-dd', new Date()), 'dd/MM/yyyy')\n        : '',\n\n      renewalDate: s.renewalDate\n        ? format(parse(s.renewalDate, 'yyyy-MM-dd', new Date()), 'dd/MM/yyyy')\n        : '',\n    }));\n  };\n\n  public static createEmptyUpgradePackages: (FinanceEmail: any) => UpgradeSubscriptionFormValues =\n    (FinanceEmail) => ({\n      poNumber: '',\n      paymentType: PaymentTypes.PAY_BY_CARD,\n      package: null,\n      cardholderName: '',\n      card: '',\n      validPromoCode: '',\n      total: 0,\n      validDiscount: 0,\n      FinanceEmail: FinanceEmail ? FinanceEmail : '',\n    });\n\n  public static createEmptyRenewPackages: (\n    SubOption: string,\n    FinanceEmail: string | undefined\n  ) => RenewSubscriptionFormValues = (SubOption, FinanceEmail) => ({\n    poNumber: '',\n    paymentType: PaymentTypes.PAY_BY_CARD,\n    cardholderName: '',\n    card: '',\n    validPromoCode: '',\n    total: 0,\n    validDiscount: 0,\n    subDuration: SubOption,\n    FinanceEmail: FinanceEmail ? FinanceEmail : '',\n  });\n\n  public static buildUpgradeByInvoicePayload = (\n    values: UpgradeSubscriptionFormValues\n  ) => ({\n    promoCode: values.validPromoCode,\n    packageIDs: [values.package?.packageId],\n    expectedGrossAmount: values.total,\n    poNumber: values.poNumber,\n    FinanceEmail: values.FinanceEmail,\n  });\n\n  public static buildUpgradeByCardPayload = (\n    values: UpgradeSubscriptionFormValues,\n    token: any\n  ) => ({\n    promoCode: values.validPromoCode,\n    packageIDs: [values.package?.packageId],\n    expectedGrossAmount: values.total,\n    nameOnCard: token.card.name,\n    cardEndDigits: token.card.last4,\n    expiryDate: `${\n      token.card.exp_month.toString().length === 1 && '0'\n    }${token.card.exp_month.toString()}/${token.card.exp_year.toString()[2]}${\n      token.card.exp_year.toString()[3]\n    }`,\n    stripeToken: token.id,\n    poNumber: values.poNumber,\n    FinanceEmail: values.FinanceEmail,\n  });\n\n  public static buildRenewByInvoicePayload = (\n    values: RenewSubscriptionFormValues,\n    packageIDs: number[],\n    expectedGrossAmount: number\n  ) => ({\n    promoCode: values.validPromoCode,\n    packageIDs,\n    expectedGrossAmount,\n    poNumber: values.poNumber,\n    FinanceEmail: values.FinanceEmail,\n  });\n\n  public static buildRenewByCardPayload = (\n    values: RenewSubscriptionFormValues,\n    token: any,\n    expectedGrossAmount: number,\n    packageIDs: number[]\n  ) => ({\n    promoCode: values.validPromoCode,\n    packageIDs,\n    expectedGrossAmount,\n    nameOnCard: token.card.name,\n    cardEndDigits: token.card.last4,\n    expiryDate: `${\n      token.card.exp_month.toString().length === 1 && '0'\n    }${token.card.exp_month.toString()}/${token.card.exp_year.toString()[2]}${\n      token.card.exp_year.toString()[3]\n    }`,\n    stripeToken: token.id,\n    poNumber: values.poNumber,\n    FinanceEmail: values.FinanceEmail,\n  });\n\n  public static buildRenewAfter3DSecurePayload = (response: any) => {\n    return {\n      tid: response.tid,\n      stripePaymentIntentID: response.error\n        ? response.error.payment_intent.id\n        : response.paymentIntent.id,\n    };\n  };\n\n  public static parseError = (errors: any) => {\n    let error: string;\n    switch (errors[0].messageCode) {\n      case 'Invalid_PromoCode_Expired':\n        error = 'Promo code is expired';\n        break;\n      case 'ExpectedGrossAmount':\n        error = 'Sorry, something went wrong. Please try again. ';\n        break;\n      case 'pkey_general_payment_subscription_failed':\n        error =\n          'Something went wrong when processing the payment. Please try again.';\n        break;\n      default:\n        error = 'Sorry, something went wrong. Please try again. ';\n    }\n    return error;\n  };\n}\n","import { Package } from 'pages/newSubscription/models';\nimport { ISchoolDetails } from 'pages/subscribe/models';\n\nexport interface IAccountUser {\n  name: string;\n  id: string;\n}\n\nexport interface ISchoolInfo {\n  schoolName: string;\n  phoneNumber: string;\n  addressLine1: string;\n  addressLine2: string;\n  addressLine3: string;\n  townCity: string;\n  county: string;\n  country: string;\n  postcodeZipcode: string;\n}\n\nexport type SchoolUser = {\n  userID: number;\n  userName: string;\n  userEmail: string;\n};\n\nexport type SchoolUsers = SchoolUser[];\n\nexport enum UpgradeFreeSubscriptionStep {\n  CHOOSE_PACKAGE,\n  SCHOOL_DETAILS,\n  PAYMENT_TYPE,\n  PAYMENT_DETAILS,\n  CONFIRMATION,\n}\n\nexport class UpgradeSubscriptionParser {\n  public static buildSchoolDetailsPayload = (values: ISchoolDetails) => ({\n    ...values,\n    addressLine2: values.addressLine2 ? values.addressLine2 : null,\n    addressLine3: values.addressLine3 ? values.addressLine3 : null,\n    county: values.county ? values.county : null,\n  });\n\n  public static buildSchoolUserAccess = (\n    selectedUsers: string[],\n    selectedPackages: Package[]\n  ) => ({\n    packageIDs: selectedPackages.map((p: Package) => p.packageID),\n    idsToGrantAccess: selectedUsers.map((i: string) => parseInt(i)),\n  });\n\n  public static getPageHeaderInfo = (step: number) => {\n    switch (step) {\n      case UpgradeFreeSubscriptionStep.CHOOSE_PACKAGE:\n        return {\n          title: 'Choose your package',\n          nextStep: 'School details',\n        };\n      case UpgradeFreeSubscriptionStep.SCHOOL_DETAILS:\n        return {\n          title: 'Enter school details',\n          nextStep: 'Payment type',\n        };\n      case UpgradeFreeSubscriptionStep.PAYMENT_TYPE:\n        return {\n          title: 'Payment type',\n          nextStep: 'Payment details / Confirmation',\n        };\n      case UpgradeFreeSubscriptionStep.PAYMENT_DETAILS:\n        return { title: 'Payment details', nextStep: '' };\n      case UpgradeFreeSubscriptionStep.CONFIRMATION:\n        return { title: 'Confirmation', nextStep: '' };\n      default:\n        return { title: '', nextStep: '' };\n    }\n  };\n}\n","import instance, { ApiResponse } from 'api';\nimport { AxiosError, AxiosResponse } from 'axios';\nimport { BaseApi } from 'baseApi';\nimport { endpoints } from 'endpoints.config';\nimport { Package } from 'pages/newSubscription/models';\nimport { ISchoolDetails } from 'pages/subscribe/models';\nimport {\n  RenewSubscriptionFormValues,\n  SubscriptionsParser,\n  UpgradeSubscriptionFormValues,\n} from 'pages/subscriptions/models';\nimport { UpgradeSubscriptionParser } from 'pages/upgradeSubscription/models';\nimport { setValidPromoCode } from 'reducers/misc';\n\nconst UNKOWN_ERROR_MESSAGE = 'Sorry, something went wrong. Please try again.';\n\nexport class SubscriptionsApi extends BaseApi {\n  // get subscription list\n  public static getSubscriptionsList = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.subscriptions.list\n      );\n\n      if (SubscriptionsApi.isResponseSuccessful(result.data)) {\n        const list = result.data.details.listSubscriptions;\n        const parsedList = list\n          ? SubscriptionsParser.parseGetSubscriptionList(\n              result.data.details.listSubscriptions\n            )\n          : null;\n\n        const data = { ...result.data.details, listSubscriptions: parsedList };\n\n        return SubscriptionsApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          //TODO: build error parser\n          // const message = UsersParser.parseError(errors);\n          // return UsersApi.errorResponse(message);\n          return null;\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          //TODO: build error parser\n          // const message = UsersParser.parseError(errors);\n          // return UsersApi.errorResponse(message);\n          return null;\n        }\n      }\n      return SubscriptionsApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  // get upgrade subscriptions list\n  public static getUpgradeSubscriptionsList = async (\n    id: number\n  ): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.subscriptions.upgradeSubscriptionsList + `?SubjectId=${id}`\n      );\n\n      if (SubscriptionsApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscriptionsApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          //TODO: build error parser\n          // const message = UsersParser.parseError(errors);\n          // return UsersApi.errorResponse(message);\n          return null;\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          //TODO: build error parser\n          // const message = UsersParser.parseError(errors);\n          // return UsersApi.errorResponse(message);\n          return null;\n        }\n      }\n      return SubscriptionsApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static upgradeByInvoice = async (\n    values: UpgradeSubscriptionFormValues\n  ): Promise<any> => {\n    try {\n      const payload = SubscriptionsParser.buildUpgradeByInvoicePayload(values);\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.subscriptions.upgradeByInvoice,\n        payload\n      );\n\n      if (SubscriptionsApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscriptionsApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        }\n      }\n      return SubscriptionsApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static upgradeByCard = async (\n    values: UpgradeSubscriptionFormValues,\n    token: any\n  ): Promise<any> => {\n    try {\n      const payload = SubscriptionsParser.buildUpgradeByCardPayload(\n        values,\n        token\n      );\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.subscriptions.upgradeByCard,\n        payload\n      );\n\n      if (SubscriptionsApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscriptionsApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        }\n      }\n      return SubscriptionsApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static updateAfter3DSecureUpgrade = async (\n    values: any\n  ): Promise<any> => {\n    try {\n      const payload =\n        SubscriptionsParser.buildRenewAfter3DSecurePayload(values);\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.subscriptions.updatAfter3DSecureUpgrade,\n        payload\n      );\n\n      if (SubscriptionsApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscriptionsApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        }\n      }\n      return SubscriptionsApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static getSchoolInfo = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.subscriptions.getSchoolInfo\n      );\n\n      if (SubscriptionsApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscriptionsApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        }\n      }\n      return SubscriptionsApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static updateSchoolInfo = async (\n    values: ISchoolDetails\n  ): Promise<any> => {\n    try {\n      const payload =\n        UpgradeSubscriptionParser.buildSchoolDetailsPayload(values);\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.subscriptions.updateSchoolInfo,\n        payload\n      );\n\n      if (SubscriptionsApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscriptionsApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        }\n      }\n      return SubscriptionsApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static getSchoolUsers = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.subscriptions.getSchoolUsers\n      );\n\n      if (SubscriptionsApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details.schoolUsers;\n        return SubscriptionsApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        }\n      }\n      return SubscriptionsApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static updateSchoolUserAccess = async (\n    selectedUsers: string[],\n    selectedPackages: Package[]\n  ): Promise<any> => {\n    try {\n      const payload = UpgradeSubscriptionParser.buildSchoolUserAccess(\n        selectedUsers,\n        selectedPackages\n      );\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.subscriptions.updateSchoolUserAccess,\n        payload\n      );\n\n      if (SubscriptionsApi.isResponseSuccessful(result.data)) {\n        const data = result.data;\n        return SubscriptionsApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        }\n      }\n      return SubscriptionsApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static getRenewalSubscription = async (id: number): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.subscriptions.getRenewalSubscriptions + '?SubjectId=' + id\n      );\n\n      if (SubscriptionsApi.isResponseSuccessful(result.data)) {\n        const data = result.data;\n        return SubscriptionsApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        }\n      }\n      return SubscriptionsApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static renewByInvoice = async (\n    values: RenewSubscriptionFormValues,\n    packageIDs: number[],\n    expectedGrossAmount: number\n  ): Promise<any> => {\n    try {\n      const payload = SubscriptionsParser.buildRenewByInvoicePayload(\n        values,\n        packageIDs,\n        expectedGrossAmount\n      );\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.subscriptions.renewByInvoice,\n        payload\n      );\n\n      if (SubscriptionsApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscriptionsApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        }\n      }\n      return SubscriptionsApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static renewByCard = async (\n    values: RenewSubscriptionFormValues,\n    token: any,\n    expectedGrossAmount: number,\n    packageIDs: number[]\n  ): Promise<any> => {\n    try {\n      const payload = SubscriptionsParser.buildRenewByCardPayload(\n        values,\n        token,\n        expectedGrossAmount,\n        packageIDs\n      );\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.subscriptions.renewByCard,\n        payload\n      );\n\n      if (SubscriptionsApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscriptionsApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        }\n      }\n      return SubscriptionsApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static renewAfter3DSecureUpgrade = async (\n    values: any\n  ): Promise<any> => {\n    try {\n      const payload =\n        SubscriptionsParser.buildRenewAfter3DSecurePayload(values);\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.subscriptions.updateAfter3DSecureRenew,\n        payload\n      );\n\n      if (SubscriptionsApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscriptionsApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscriptionsParser.parseError(errors);\n          return SubscriptionsApi.errorResponse(message);\n        }\n      }\n      return SubscriptionsApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n}\n","import React, { useEffect, useState } from 'react';\nimport { navigate, RouteComponentProps } from '@reach/router';\nimport { ISubject } from './models';\nimport { AppPath, ERROR_MESSAGE } from 'appConstants';\nimport { getSubjectImage } from 'helpers/getImage';\nimport { useGetDashboardList } from './useGetDashboardList';\nimport Page from 'components/shared/Page';\nimport { Spinner } from 'components/spinner/Spinner';\nimport FreeTrialBanner from 'components/freeTrialBanner/FreeTrialBanner';\nimport ErrorMessage from 'components/errorMessage/ErrorMessage';\nimport { DashboardApi } from './dashboardApi';\nimport { isBefore, isToday } from 'date-fns';\nimport { parseISO } from 'date-fns/esm';\nimport { SubscriptionsApi } from 'api/subscriptionsApi';\nimport { accessInformation } from 'pages/subscriptions/models';\n\nconst allLessonsOnTrialCheck = (list_info: any) => {\n  let allLessonsOnTrial = true;\n\n  for(let i = 0; i < list_info.length; i++){\n    if(!list_info[i].isFreeTrial){\n      allLessonsOnTrial = false;\n    }\n  }\n\n  return allLessonsOnTrial;\n};\n\nconst notOneLessonTrialExpiredCheck = (list_info: any) => {\n  let oneLessonTrialExpired = true;\n  let prevLessonExpired = false;\n\n  if(list_info.length > 1){\n    for(let i = 0; i < list_info.length; i++){\n      let expiredFlag = !list_info[i].bExpired ? false : list_info[i].bExpired;\n\n      if(i === 0){\n        prevLessonExpired = expiredFlag;\n      }\n  \n      if(i !== 0 && expiredFlag !== prevLessonExpired){\n        oneLessonTrialExpired = false;\n      }\n  \n      prevLessonExpired = expiredFlag;\n    }\n  }\n\n  return oneLessonTrialExpired;\n};\n\nexport const Dashboard: React.FC<RouteComponentProps> = () => {\n  const [token, setToken] = useState<string>('');\n  const [loading, setLoading] = useState<boolean>(false);\n  const [updateToken, setUpdateToken] = useState<boolean>(true);\n  const [updateList, setUpdateList] = useState(true);\n  const [dashboardListInfo, setDashboardListInfo] = useState<any>(null);\n  const [accessInfo, setAccessInfo] = useState<accessInformation | null>(null);\n  const [error, setError] = useState<string>('');\n  const [allLessonsOnTrial, setAllLessonsOnTrial] = useState<boolean>(false);\n  const [notOneLessonTrialExpired, setNotOneLessonTrialExpired] = useState<boolean>(false);\n  const [isFreeTrialValid, setIsFreeTrialValid] = useState<any>(false);\n  const [isFreeTrialExpired, setIsFreeTrialExpired] = useState<any>(false);\n  const [oneTrialOneActive, setOneTrialOneActive] = useState<any>(false);\n\n  const fetchSubscriptionsList = async () => {\n    const result = await SubscriptionsApi.getSubscriptionsList();\n\n    if (result.data) {\n      const { bCanAddFreeTrial, bCanAddSubscription } = result.data;\n      setAccessInfo({ bCanAddFreeTrial, bCanAddSubscription });\n    }\n\n    if (result.error) {\n      setError(result.error);\n    }\n  };\n\n  const getDashboardListInfo = async () => {\n    const result = await DashboardApi.getDashboardList();\n\n    if (result.data) {\n      setDashboardListInfo(\n        result.data.listSubjects ? result.data.listSubjects : []\n      );\n    }\n\n    if (result.error) {\n      setError(result.error);\n    }\n  };\n\n  useEffect(() => {\n    getDashboardListInfo();   \n  }, []);  \n\n  useEffect(() => {\n    if (!updateList) return;\n    fetchSubscriptionsList();\n    setUpdateList(false);\n  }, [updateList]);\n\n  useEffect(() => {\n    if(dashboardListInfo && dashboardListInfo.length){\n      setAllLessonsOnTrial(allLessonsOnTrialCheck(dashboardListInfo));\n      setNotOneLessonTrialExpired(notOneLessonTrialExpiredCheck(dashboardListInfo));\n\n      const isFreeTrialValidCheck =\n        dashboardListInfo &&\n        dashboardListInfo.find((i: any) => {\n          return i.isFreeTrial && i.trialRemainingDays !== null && i.trialRemainingDays > 0; \n        });\n\n      const isFreeTrialExpiredCheck =\n        dashboardListInfo &&\n        dashboardListInfo.find((i: any) => {\n          return i.isFreeTrial && (i.trialRemainingDays === null || i.trialRemainingDays <= 0);\n        });\n\n      let oneLessonExpiredArr: any = [];\n      let oneLessonActiveArr: any = [];\n      let oneLessonExpiredFunc = (arr: any[]) => arr.some(v => v === true);\n      let oneLessonActiveFunc = (arr: any[]) => arr.some(v => v === true);      \n\n      for(let i = 0; i < dashboardListInfo.length; i++){\n        oneLessonExpiredArr.push(dashboardListInfo[i].bExpired);\n        oneLessonActiveArr.push(dashboardListInfo[i].isFreeTrial === false && dashboardListInfo[i].bExpired === false);\n      }\n\n      let oneLessonExpired = oneLessonExpiredFunc(oneLessonExpiredArr);\n      let oneLessonActive = oneLessonActiveFunc(oneLessonActiveArr);\n\n      setIsFreeTrialValid(isFreeTrialValidCheck ? isFreeTrialValidCheck : false);\n      setIsFreeTrialExpired(isFreeTrialExpiredCheck ? isFreeTrialExpiredCheck : false);\n      setOneTrialOneActive(oneLessonExpired && oneLessonActive);     \n    }\n  }, [dashboardListInfo]);  \n\n  const getFetchAutoLoginToken = async () => {\n    const result = await DashboardApi.getAutoLoginToken();\n    if (result.data) {\n      setToken(result.data.token);\n    }\n    if (result.error) {\n      setToken('');\n    }\n    setUpdateToken(false);\n  };\n\n  useEffect(() => {\n    if (!updateToken) return;\n    getFetchAutoLoginToken();\n  }, [updateToken]);\n\n  const upgradeSubscriptions = () => {\n    navigate(AppPath.UPGRADE_SUBSCRIPTION);\n  };\n\n  const isTodayOrBeforeExpiryDate = (date: string) => {\n    const parsedDate = parseISO(date);\n    const isBeforeDate = isBefore(parsedDate, new Date());\n    const isTodayDate = isToday(parsedDate);\n    return isBeforeDate || isTodayDate;\n  };\n\n  const redirectToSubjectSite = (url: string) => {\n    const newWindow = window.open(url, '_self', 'noopener,noreferrer');\n    if (newWindow) newWindow.opener = null;\n    setUpdateToken(true);\n  };\n\n  const restartLessonTrial  = async (account_package_id: number) => {\n    setLoading(true);\n\n    const result = await DashboardApi.restartTrial(account_package_id);\n\n    if (result.data) {\n      getDashboardListInfo();\n    }\n    if (result.error) {\n      setError(result.error);\n    }\n\n    setLoading(false);\n  };\n\n  const handleNewSubscription = () => {\n    navigate(AppPath.NEW_SUBSCRIPTION);\n  };\n\n  const handleNewFreeTrial = () => {\n    navigate(AppPath.NEW_FREE_TRIAL);\n  };\n\n  const spinnerHTML = (\n    <div className=\"PageSpinner\">\n      <Spinner />\n    </div>\n  );\n\n  const dashboardHTML = (\n    <React.Fragment>\n      <div className=\"TitleBar\">\n        <h1 className=\"PageTitle\">Dashboard</h1>\n        {/* <div className=\"SubscriptionsButtonContainer\">\n          {accessInfo?.bCanAddFreeTrial && (\n            <button\n              className=\"Btn BtnLightOrange NewSubscriptionButton\"\n              onClick={handleNewFreeTrial}\n            >\n              <span className=\"Plus\">+</span>\n              <span className=\"Text\">Add a free trial</span>\n            </button>\n          )}\n          {accessInfo?.bCanAddSubscription && (\n            <button\n              className=\"Btn BtnLightOrange NewFreeTrial\"\n              onClick={handleNewSubscription}\n            >\n              <span className=\"Plus\">+</span>\n              <span className=\"Text\">Add a new subscription</span>\n            </button>\n          )}\n        </div> */}\n      </div>\n      {error && <ErrorMessage message={ERROR_MESSAGE} />}\n      {dashboardListInfo && dashboardListInfo?.length > 0 ? (\n        <div className=\"GridSection\">\n          {dashboardListInfo.map((sub: ISubject) => {\n            return (\n              <div className=\"GridTile GridImageTile\" key={sub.subject}>\n                <img\n                  src={getSubjectImage(sub.subject)}\n                  className=\"TileImage\"\n                  alt=\"Subscription\"\n                />\n                <div className=\"TileBody\">\n                  <h2 className=\"TileTitle\">{sub.subject}</h2>\n                  <p className=\"TileSubtitle\">\n                    {sub.package}\n                    {`${sub.isFreeTrial ? ' Trial' : ''}`}\n                  </p>\n\n                  {sub.canGetFreeTrial && (\n                    <button\n                      className=\"Btn BtnLightOrange NewFreeTrial TileButton\"\n                      onClick={handleNewFreeTrial}\n                    >\n                      <span className=\"Plus\">+</span>\n                      <span className=\"Text\">Start Free Trial</span>\n                    </button>\n                  )}\n\n                  {sub.canSubscribe && (\n                    <button\n                      onClick={handleNewSubscription}\n                      className=\"Btn BtnOrange TileButton\"\n                    >\n                      Start Subscription\n                    </button>\n                  )}\n\n                  {!sub.canGetFreeTrial && !sub.canSubscribe && (!sub.isFreeTrial || (sub.isFreeTrial && !sub.bExpired && (sub.trialRemainingDays !== null && sub.trialRemainingDays > 0))) && (\n                    <button\n                      onClick={() =>\n                        redirectToSubjectSite(\n                          `https://${sub.link}${token ? '?token=' + token : ''}`\n                        )\n                      }\n                      className=\"Btn BtnOrange TileButton\"\n                      disabled={sub.bExpired}\n                    >\n                      Go to {sub.subject}\n                    </button>\n                  )}\n\n                  {/*sub.isFreeTrial && (sub.trialRemainingDays === null || sub.trialRemainingDays <= 0) && (\n                    <button\n                      onClick={upgradeSubscriptions}\n                      className=\"Btn BtnOrange TileButton\"\n                    >\n                      Complete subscription payment\n                    </button>\n                  )*/}\n\n\n                  {sub.isFreeTrial && sub.bExpired && (sub.trialRemainingDays === null || sub.trialRemainingDays <= 0)  && (\n                    <button\n                      onClick={() => restartLessonTrial(sub.accountPackageID)}\n                      className=\"Btn BtnLightOrange TileButton\"\n                    >\n                      Restart trial\n                    </button>                  \n                  )}                  \n\n                  {(sub.isFreeTrial) && (!sub.bExpired || (sub.bExpired && (sub.trialRemainingDays === null || sub.trialRemainingDays <= 0) )) && (\n                    <button\n                      onClick={upgradeSubscriptions}\n                      className=\"Btn BtnLightOrange TileButton\"\n                    >\n                      Upgrade to subscription\n                    </button>                  \n                  )}\n\n                  {!sub.isFreeTrial &&\n                    sub.bExpired &&\n                    isTodayOrBeforeExpiryDate(sub.renewalDate) && (\n                      //when the subscription is expired\n                      <p>\n                        This subscription is expired. Please renew it{' '}\n                        <a\n                          className=\"Underlined\"\n                          href={`${AppPath.SUBSCRIPTIONS}`}\n                        >\n                          here\n                        </a>\n                      </p>\n                    )}\n                  {!sub.canGetFreeTrial &&\n                    !sub.canSubscribe &&\n                    sub.bExpired &&\n                    ((sub.isFreeTrial && (sub.trialRemainingDays !== null && sub.trialRemainingDays > 0)) || (!sub.isFreeTrial && !sub.renewalDate)) && (\n                      //when account has been created buy paying the subscription by invoice and the subscription wasn't been activated yet\n                      <p>\n                        Someone from our team will notify you once your\n                        trial has been activated\n                      </p>\n                    )}\n                </div>\n              </div>\n            );\n          })}\n        </div>\n      ) : (\n        <div className=\"MsgContainer\">\n          <div className=\"Txt\">No subscriptions</div>\n        </div>\n      )}\n    </React.Fragment>\n  );\n\n  return (\n    <Page>\n      {(isFreeTrialExpired || isFreeTrialValid) && !oneTrialOneActive && (\n        <FreeTrialBanner\n          daysLeft={isFreeTrialValid?.trialRemainingDays ?? null}\n          upgradeSubscriptions={upgradeSubscriptions}\n          isFreeTrialValid={!!isFreeTrialValid}\n          dashboardListInfo={dashboardListInfo}\n        />\n      )}      \n      <div className=\"PageContent DashboardPage WidthContent\">\n        {loading ? spinnerHTML :\n          <>\n            {dashboardListInfo || error ? dashboardHTML : spinnerHTML}\n          </>\n        }\n      </div>\n    </Page>\n  );\n};\n","import { SubscriptionTypes } from 'appConstants';\n\nexport type PackagesList = PackageGroup[];\n\nexport type PackageGroup = {\n  name: string;\n  description: string;\n  subjects: Subjects[];\n};\n\nexport type Subjects = {\n  name: string;\n  subscriptions: Package[];\n};\n\nexport type Package = {\n  packageID: number;\n  type: SubscriptionTypes.INVESTEMENT | SubscriptionTypes.STANDARD;\n  price: number;\n  multiPurchaseDiscount: number;\n  promoCodeDiscount: number;\n  subscribed: boolean;\n  isAvailableForSchool: boolean;\n  isFreeTrial: boolean;\n  trialRemainingDays: number | null;\n  ageGroup?: string;\n  subject?: string;\n};\n\nexport type PackagePricesList = PackagePrices[];\n\nexport type PackagePrices = {\n  packagesID: number;\n  discountedPrice: number;\n  discountType: number;\n  percentageOff: number;\n  amountOff: number;\n};\n\nexport interface IPromoCode {\n  value: string;\n  error: string;\n}\n\nexport interface IPaymentTypes {\n  poNumber: string;\n  byCard: boolean;\n  byInvoice: boolean;\n  FinanceEmail:  string;\n}\n\nexport interface IPriceInfo {\n  price: any;\n  vat: any;\n  total: any;\n  discount: any;\n  appliedDiscountType: any;\n}\n\nexport interface ICardInfo {\n  cardholderName: string;\n  card: any;\n}\n\nexport interface IUpdateAfter3DSecure {\n  tid: number;\n  stripePaymentIntentID: string;\n  stripePaymentIntentID1: string;\n  stripeChargeResponse: string;\n  stripeChargeStatus: string;\n  stripePaymentIntentStatus: string;\n  stripeReceiptUrl: string;\n  bPaid: true;\n  purchaseHistoryStatusType: string;\n}\n\nexport enum NewSubscriptionStep {\n  CHOOSE_PACKAGE,\n  PAYMENT_TYPE,\n  PAYMENT_DETAILS,\n  CONFIRMATION,\n}\n\nexport class NewSubscriptionParser {\n  public static getPageHeaderInfo = (step: number) => {\n    switch (step) {\n      case NewSubscriptionStep.CHOOSE_PACKAGE:\n        return { title: 'Choose your package', nextStep: 'Payment type' };\n\n      case NewSubscriptionStep.PAYMENT_TYPE:\n        return {\n          title: 'PaymentType',\n          nextStep: 'Payment details / Confirmation',\n        };\n\n      case NewSubscriptionStep.PAYMENT_DETAILS:\n        return { title: 'Payment details', nextStep: '' };\n\n      case NewSubscriptionStep.CONFIRMATION:\n        return { title: 'Confirmation', nextStep: '' };\n\n      default:\n        return { title: '', nextStep: '' };\n    }\n  };\n\n  public static createEmptyPaymentType = (financeEmail: string | null) => ({\n    poNumber: '',\n    byCard: false,\n    byInvoice: false,\n    FinanceEmail: financeEmail ? financeEmail : '',\n  });\n\n  public static buildArchiveNowPayload = (\n    promoCode: string,\n    packages: Package[],\n    expectedGrossAmount: number,\n    poNumber: string,\n    FinanceEmail: string\n  ) => ({\n    promoCode,\n    expectedGrossAmount,\n    packageIDs: packages.map((p: Package) => p.packageID),\n    poNumber,\n    FinanceEmail,\n  });\n\n  public static buildUpgradeByCardPayload = (\n    promoCode: string,\n    packages: Package[],\n    total: number,\n    token: any,\n    poNumber: string,\n    FinanceEmail: string,\n  ) => ({\n    promoCode,\n    packageIDs: packages.map((p: Package) => p.packageID),\n    expectedGrossAmount: total,\n    nameOnCard: token.card.name,\n    cardEndDigits: token.card.last4,\n    expiryDate: `${\n      token.card.exp_month.toString().length === 1 && '0'\n    }${token.card.exp_month.toString()}/${token.card.exp_year.toString()[2]}${\n      token.card.exp_year.toString()[3]\n    }`,\n    stripeToken: token.id,\n    poNumber,\n    FinanceEmail,\n  });\n\n  public static buildUpdateAfter3DSecurePayload = (response: any) => {\n    return {\n      tid: response.tid,\n      stripePaymentIntentID: response.error\n        ? response.error.payment_intent.id\n        : response.paymentIntent.id,\n    };\n  };\n\n  public static parseError = (errors: any) => {\n    let error: string;\n    switch (errors[0].messageCode) {\n      case 'Missing_PromoCode':\n        error = 'Promo code is missing';\n        break;\n      case 'Invalid_PromoCode':\n        error = 'Invalid promo code';\n        break;\n      case 'No_valid_package_selected':\n        error = 'The selected packages are invalid';\n        break;\n      case 'payment_amount_mismatch':\n        error = 'Sorry something went wrong. Please try again.';\n        break;\n      case 'pkey_general_invalid_payment_token':\n        error = 'Sorry something went wrong. Please try again.';\n        break;\n      case 'Invalid_PromoCode_NotStarted':\n        error = 'Invalid promocode ';\n        break;\n      case 'Invalid_PromoCode_Expired':\n        error = 'Promo code is expired ';\n        break;\n      case 'Invalid_PromoCode_UsedAlready':\n        error = 'Invalid promocode ';\n        break;\n      case 'Invalid_School_Account':\n        error = 'Invalid school account';\n        break;\n      case 'Invalid_PackageID':\n        error = 'Invalid packages';\n        break;\n      case 'Invalid_SubscriptionHistory':\n        error = 'Invalid subscription history';\n        break;\n      case 'pkey_general_payment_card_error':\n        error = 'Payment failed. Please try again.';\n        break;\n      case 'pkey_general_payment_error':\n        error = 'Payment failed. Please try again.';\n        break;\n      case 'pkey_general_payment_subscription_failed':\n        error = 'Payment failed. Please try again.';\n        break;\n      case 'pkey_general_payment_failed':\n        error = 'Payment failed. Please try again.';\n        break;\n      case 'Required':\n        error = 'Sorry something went wrong. Please try again.';\n        break;\n      default:\n        error = 'Sorry something went wrong. Please try again.';\n    }\n    return error;\n  };\n}\n","export const formatDate = (date: string) => {\n  const isoDate = new Date(date);\n  return (\n    `${isoDate.getDate() < 10 ? '0' : ''}` +\n    isoDate.getDate() +\n    ' / ' +\n    `${isoDate.getMonth() < 10 ? '0' : ''}` +\n    (isoDate.getMonth() + 1) +\n    ' / ' +\n    isoDate.getFullYear()\n  );\n};\n\nexport const formatNumber = (number: string | number) =>\n  parseFloat(Number(number).toFixed(2));\n\nexport const formatPrice = (number: string | number) =>\n  Number(number).toFixed(2);\n","import React from 'react';\nimport { useLocation } from '@reach/router';\nimport { AppPath, SubscriptionTypes } from 'appConstants';\nimport { Package, Subjects } from 'pages/newSubscription/models';\n\ntype Props = {\n  duration: SubscriptionTypes.STANDARD | SubscriptionTypes.INVESTEMENT;\n  toggleSubscriptionDuration: (p: Package) => void;\n  subjectInfo: Subjects;\n  checkPackageAvailable: boolean;\n};\n\nexport const SubscriptionDurationOptions: React.FC<Props> = ({\n  duration,\n  toggleSubscriptionDuration,\n  subjectInfo,\n  checkPackageAvailable\n}) => {\n  const location = useLocation();\n  const pathname = location.pathname;\n\n  return (\n    <div className=\"SubscriptionDurationOptions\">\n      {subjectInfo.subscriptions.map((s: Package, i: number) => (\n        <div\n          key={i}\n          className={`SDOpt \n            ${duration === s.type && (checkPackageAvailable || AppPath.SUBSCRIBE === pathname) ? `Selected` : `Unselected`} \n            ${s.isAvailableForSchool || AppPath.SUBSCRIBE === pathname ? `` : `Block`}\n          `}\n          onClick={() =>\n            s.isAvailableForSchool || AppPath.SUBSCRIBE === pathname ? toggleSubscriptionDuration(s)\n              : null\n          }          \n        >\n          <span>{s.type}</span>\n        </div>\n      ))}\n    </div>\n  );\n};\n","import { useLocation } from '@reach/router';\nimport { AppPath, SubscriptionTypes } from 'appConstants';\nimport { Package, Subjects } from 'pages/newSubscription/models';\nimport React, { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { selectValidPromoCode } from 'reducers/misc';\n\nimport { SubscriptionDurationOptions } from './SubscriptionDurationOptions';\n\ntype Props = {\n  subjectInfo: Subjects;\n  selectPackage: (p: Package) => void;\n  selectedPackages: Package[];\n  ageGroup: string;\n};\n\nconst PackageCard: React.FC<Props> = ({\n  subjectInfo,\n  selectPackage,\n  selectedPackages,\n  ageGroup,\n}) => {\n  const location = useLocation();\n  const pathname = location.pathname;\n\n  const validPromoCode = useSelector(selectValidPromoCode);\n  const [isChecked, setIsChecked] = useState<boolean>(false);\n  const [packageDuration, setPackageDuration] = useState<any>(null);\n\n  useEffect(() => {\n    const packageCardSelected = selectedPackages.find(\n      (p: Package) => p.ageGroup === ageGroup && p.subject === subjectInfo.name\n    );\n\n    setIsChecked(packageCardSelected ? true : false);\n    setPackageDuration(\n      packageCardSelected &&\n        packageCardSelected.type && packageDuration\n        ? packageCardSelected.type\n        : setFirstPackageHighlight()\n    );\n  }, [selectedPackages]);\n\n  const togglePackageCard = () => {\n    if (!isPackagedAvailable()) return;\n    if (isChecked) setPackageDuration(setFirstPackageHighlight());\n    setIsChecked((prevState) => !prevState);\n    const selectedPackage = subjectInfo.subscriptions.find(\n      (s: Package) => s.type === packageDuration\n    );\n    selectedPackage &&\n      selectPackage({\n        ...selectedPackage,\n        ageGroup,\n        subject: subjectInfo.name,\n      });\n  };\n\n  const selectPackageDuration = (p: Package) => {\n    setPackageDuration(p.type);\n    setIsChecked(true);\n    selectPackage({\n      ...p,\n      ageGroup,\n      subject: subjectInfo.name,\n    });\n  };\n\n  const setFirstPackageHighlight = () => {\n    let firstPackageAvailable = subjectInfo.subscriptions.find(\n      (s: Package) => s.isAvailableForSchool\n    )?.type;\n\n    return firstPackageAvailable ? firstPackageAvailable : subjectInfo.subscriptions[0].type;\n  };\n\n  let checkPackageAvailable = subjectInfo.subscriptions.find(\n    (s: Package) => s.isAvailableForSchool\n  ) ? true : false;\n\n  const packagePrice = subjectInfo.subscriptions.find(\n    (s: Package) => s.type === packageDuration\n  )?.price;\n\n  const isPackagedAvailable = () => {\n    /*Check if the package is available to buy*/\n    if (AppPath.SUBSCRIBE === pathname) return true;\n    \n    let isPackageAvailable = false;\n    subjectInfo.subscriptions.map((s: Package) => {\n      if(s.isAvailableForSchool){\n        isPackageAvailable = !isPackageAvailable;\n      }\n    });\n\n    return isPackageAvailable;\n  };\n\n  return (\n    <div\n      className={`PackageCard ${isChecked ? 'Checked' : 'Unchecked'} ${\n        !isPackagedAvailable() && 'Disabled'\n      }`}\n    >\n      <div className=\"CardContent\" onClick={togglePackageCard}>\n        <span className=\"Checkbox\"></span>\n\n        <div className=\"Details\">\n          <h3>{subjectInfo.name}</h3>\n          <span>\n            £{' '}\n            {packageDuration && packagePrice}\n          </span>\n        </div>\n      </div>\n\n      <SubscriptionDurationOptions\n        duration={packageDuration}\n        toggleSubscriptionDuration={selectPackageDuration}\n        subjectInfo={subjectInfo}\n        checkPackageAvailable={checkPackageAvailable}\n      />\n    </div>\n  );\n};\n\nexport default PackageCard;\n","import { Package } from 'pages/newSubscription/models';\n\nconst UNKNOWN_ERROR_MESSAGE = 'Sorry, something went wrong. Please try again.';\n\nexport class FreeTrialSubscriptionParser {\n  public static getPageHeaderInfo = (step: number) => {\n    switch (step) {\n      case 1:\n        return {\n          title: 'Choose your trial package',\n          nextStep: 'School details',\n        };\n      case 2:\n        return {\n          title: 'Enter school details',\n          nextStep: 'Profile details',\n        };\n      case 3:\n        return { title: 'Enter profile details', nextStep: '' };\n      default:\n        return { title: '', nextStep: '' };\n    }\n  };\n\n  public static buildSubmitFreeTrialPackagesPayload = (\n    selectedPackages: Package[],\n    registrationToken: string\n  ) => {\n    const packageIDs = selectedPackages.map((p: Package) => p.packageID);\n    return { registrationToken, packageIDs };\n  };\n\n  public static parseError = (errors: any) => {\n    let error: string;\n    switch (errors[0].messageCode) {\n      default:\n        error = UNKNOWN_ERROR_MESSAGE;\n    }\n    return error;\n  };\n}\n","import instance from 'api';\nimport { AxiosError, AxiosResponse } from 'axios';\nimport { ApiResponse, BaseApi } from 'baseApi';\nimport { endpoints } from 'endpoints.config';\nimport { FreeTrialSubscriptionParser } from 'pages/subscribeFreeTrial/models';\n\nconst UNKNOWN_ERROR_MESSAGE = 'Sorry, something went wrong. Please try again.';\n\nexport class AddFreeTrialApi extends BaseApi {\n  // get free trial subscription packages\n  public static getPackages = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.subscriptions.getSubscriptionsFreeTrial\n      );\n\n      if (AddFreeTrialApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return AddFreeTrialApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = FreeTrialSubscriptionParser.parseError(errors);\n          return AddFreeTrialApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = FreeTrialSubscriptionParser.parseError(errors);\n          return AddFreeTrialApi.errorResponse(message);\n        }\n      }\n      return AddFreeTrialApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static submitFreeTrialPackages = async (\n    selectedPackages: number[]\n  ): Promise<any> => {\n    try {\n      const payload = { packageIDs: selectedPackages };\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.subscriptions.subscribeFreeTrial,\n        payload\n      );\n\n      if (AddFreeTrialApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return AddFreeTrialApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = FreeTrialSubscriptionParser.parseError(errors);\n          return AddFreeTrialApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = FreeTrialSubscriptionParser.parseError(errors);\n          return AddFreeTrialApi.errorResponse(message);\n        }\n      }\n      return AddFreeTrialApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n}\n","import instance from 'api';\nimport { AxiosError, AxiosResponse } from 'axios';\nimport { ApiResponse, BaseApi } from 'baseApi';\nimport { endpoints } from 'endpoints.config';\nimport { FreeTrialSubscriptionParser } from 'pages/subscribeFreeTrial/models';\n\nconst UNKNOWN_ERROR_MESSAGE = 'Sorry, something went wrong. Please try again.';\n\nexport class FreeTrialSubscriptionApi extends BaseApi {\n  // get free trial subscription packages\n  public static getPackages = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.public.subscription.getSubscriptionsFreeTrial\n      );\n\n      if (FreeTrialSubscriptionApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return FreeTrialSubscriptionApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = FreeTrialSubscriptionParser.parseError(errors);\n          return FreeTrialSubscriptionApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = FreeTrialSubscriptionParser.parseError(errors);\n          return FreeTrialSubscriptionApi.errorResponse(message);\n        }\n      }\n      return FreeTrialSubscriptionApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static submitFreeTrialPackages = async (\n    selectedPackages: any,\n    registrationToken: string\n  ): Promise<any> => {\n    try {\n      const payload =\n        FreeTrialSubscriptionParser.buildSubmitFreeTrialPackagesPayload(\n          selectedPackages,\n          registrationToken\n        );\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.public.subscription.subscribeFreeTrial,\n        payload\n      );\n\n      if (FreeTrialSubscriptionApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return FreeTrialSubscriptionApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = FreeTrialSubscriptionParser.parseError(errors);\n          return FreeTrialSubscriptionApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = FreeTrialSubscriptionParser.parseError(errors);\n          return FreeTrialSubscriptionApi.errorResponse(message);\n        }\n      }\n      return FreeTrialSubscriptionApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n}\n","import instance from 'api';\nimport { AxiosError, AxiosResponse } from 'axios';\nimport { ApiResponse, BaseApi } from 'baseApi';\nimport { endpoints } from 'endpoints.config';\nimport { NewSubscriptionParser, Package } from 'pages/newSubscription/models';\n\nconst UNKNOWN_ERROR_MESSAGE = 'Sorry, something went wrong. Please try again.';\n\nexport class NewSubscriptionApi extends BaseApi {\n  // get subscription packages\n  public static getPackages = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.subscriptions.packages\n      );\n\n      if (NewSubscriptionApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return NewSubscriptionApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          return NewSubscriptionApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          return NewSubscriptionApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n        }\n      }\n      return NewSubscriptionApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n\n  // get subscription packages\n  public static checkPromoCode = async (promoCode: string): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.subscriptions.addsubscriptionswithpromocode +\n          `?promoCode=${promoCode}`\n      );\n\n      if (NewSubscriptionApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return NewSubscriptionApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = NewSubscriptionParser.parseError(errors);\n          return NewSubscriptionApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = NewSubscriptionParser.parseError(errors);\n          return NewSubscriptionApi.errorResponse(message);\n        }\n      }\n      return NewSubscriptionApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static subscribeByInvoice = async (\n    promoCode: string,\n    selectedPackages: Package[],\n    total: number,\n    poNumber: string,\n    FinanceEmail: string,\n  ): Promise<any> => {\n    try {\n      const payload = NewSubscriptionParser.buildArchiveNowPayload(\n        promoCode,\n        selectedPackages,\n        total,\n        poNumber,\n        FinanceEmail\n      );\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.subscriptions.subscribebyinvoice,\n        payload\n      );\n\n      if (NewSubscriptionApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        if (data.status === 'Success') {\n          return NewSubscriptionApi.successResponse(data);\n        } else {\n          throw new Error();\n        }\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = NewSubscriptionParser.parseError(errors);\n          return NewSubscriptionApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = NewSubscriptionParser.parseError(errors);\n          return NewSubscriptionApi.errorResponse(message);\n        }\n      }\n      return NewSubscriptionApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static subscribeByCard = async (\n    promoCode: string,\n    packages: Package[],\n    total: number,\n    token: any,\n    poNumber: string,\n    FinanceEmail: string,\n  ): Promise<any> => {\n    try {\n      const payload = NewSubscriptionParser.buildUpgradeByCardPayload(\n        promoCode,\n        packages,\n        total,\n        token,\n        poNumber,\n        FinanceEmail,\n      );\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.subscriptions.subscribeByCard,\n        payload\n      );\n\n      if (NewSubscriptionApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return NewSubscriptionApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = NewSubscriptionParser.parseError(errors);\n          return NewSubscriptionApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = NewSubscriptionParser.parseError(errors);\n          return NewSubscriptionApi.errorResponse(message);\n        }\n      }\n      return NewSubscriptionApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static updateAfter3DSecure = async (values: any): Promise<any> => {\n    try {\n      const payload =\n        NewSubscriptionParser.buildUpdateAfter3DSecurePayload(values);\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.subscriptions.updatAfter3DSecure,\n        payload\n      );\n\n      if (NewSubscriptionApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return NewSubscriptionApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = NewSubscriptionParser.parseError(errors);\n          return NewSubscriptionApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = NewSubscriptionParser.parseError(errors);\n          return NewSubscriptionApi.errorResponse(message);\n        }\n      }\n      return NewSubscriptionApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n}\n","import { PaymentTypes } from 'appConstants';\nimport { Package } from 'pages/newSubscription/models';\nimport { UpgradePackageInfo } from 'pages/subscriptions/models';\nimport { ISchoolInfo } from 'pages/upgradeSubscription/models';\n\nexport enum SubscriptionStep {\n  CHOOSE_PACKAGE,\n  SCHOOL_DETAILS,\n  PROFILE_DETAILS,\n  PAYMENT_TYPE,\n  PAYMENT_DETAILS,\n  CONFIRMATION,\n}\n\nexport interface ISchoolDetails {\n  schoolname: string;\n  phoneNumber: string;\n  addressLine1: string;\n  addressLine2: string;\n  addressLine3: string;\n  townCity: string;\n  county: string;\n  country: string;\n  postcodeZipcode: string;\n}\n\nexport interface ISchoolUser {\n  firstName: string;\n  lastName: string;\n  emailAddress: string;\n  password: string;\n  confirmPassword: string;\n  schoolOfficeFirstName: string;\n  schoolOfficeLastName: string;\n  schoolOfficeEmailAddress: string;\n  bAcceptedTermsAndConditions: boolean;\n}\n\nexport interface ISchoolUserFreeTrial {\n  firstName: string;\n  lastName: string;\n  emailAddress: string;\n  password: string;\n  confirmPassword: string;\n  bAcceptedTermsAndConditions: boolean;\n}\n\nexport interface PayByCardFormValues {\n  poNumber: string;\n  paymentType: PaymentTypes.PAY_BY_CARD | PaymentTypes.PAY_BY_INVOICE;\n  package: UpgradePackageInfo | null;\n  cardholderName: string;\n  card: string;\n  validPromoCode: string;\n  total: number;\n  validDiscount: number;\n}\n\nexport class SubscribeParser {\n  public static createEmptySchoolDetails = (\n    schoolInfo: ISchoolInfo | null\n  ): ISchoolDetails => ({\n    schoolname: schoolInfo ? schoolInfo.schoolName : '',\n    phoneNumber: schoolInfo?.phoneNumber ?? '',\n    addressLine1: schoolInfo?.addressLine1 ?? '',\n    addressLine2: schoolInfo?.addressLine2 ?? '',\n    addressLine3: schoolInfo?.addressLine3 ?? '',\n    townCity: schoolInfo?.townCity ?? '',\n    county: schoolInfo?.county ?? '',\n    country: schoolInfo?.country ?? '',\n    postcodeZipcode: schoolInfo?.postcodeZipcode ?? '',\n  });\n\n  public static createEmptySchoolUser = (): ISchoolUser => ({\n    firstName: '',\n    lastName: '',\n    emailAddress: '',\n    password: '',\n    confirmPassword: '',\n    schoolOfficeFirstName: '',\n    schoolOfficeLastName: '',\n    schoolOfficeEmailAddress: '',\n    bAcceptedTermsAndConditions: false\n  });\n\n  public static createEmptySchoolUserFreeTrial = (): ISchoolUserFreeTrial => ({\n    firstName: '',\n    lastName: '',\n    emailAddress: '',\n    password: '',\n    confirmPassword: '',\n    bAcceptedTermsAndConditions: false\n  });  \n\n  public static buildSchoolDetailsPayload = (values: ISchoolDetails) => ({\n    ...values,\n    addressLine2: values.addressLine2 ? values.addressLine2 : null,\n    addressLine3: values.addressLine3 ? values.addressLine3 : null,\n    county: values.county ? values.county : null,\n  });\n\n  public static buildSchoolUserDetailsPayload = (\n    values: ISchoolUser,\n    schoolDetails: ISchoolDetails\n  ) => ({\n    ...values,\n    ...schoolDetails,\n    addressLine2: schoolDetails.addressLine2\n      ? schoolDetails.addressLine2\n      : null,\n    addressLine3: schoolDetails.addressLine3\n      ? schoolDetails.addressLine3\n      : null,\n    county: schoolDetails.county ? schoolDetails.county : null,\n  });\n\n  public static buildSchoolUserDetailsPayloadFreeTrial = (\n    values: ISchoolUserFreeTrial,\n    schoolDetails: ISchoolDetails\n  ) => ({\n    ...values,\n    ...schoolDetails,\n    addressLine2: schoolDetails.addressLine2\n      ? schoolDetails.addressLine2\n      : null,\n    addressLine3: schoolDetails.addressLine3\n      ? schoolDetails.addressLine3\n      : null,\n    county: schoolDetails.county ? schoolDetails.county : null,\n  });  \n\n  public static buildArchiveNowPayload = (\n    registrationToken: string,\n    promoCode: string,\n    packages: Package[],\n    expectedGrossAmount: number,\n    poNumber: string,\n    FinanceEmail: string,\n  ) => ({\n    registrationToken,\n    promoCode,\n    expectedGrossAmount,\n    packageIDs: packages.map((p: Package) => p.packageID),\n    poNumber,\n    FinanceEmail,\n  });\n\n  public static buildSubscribeByCardPayload = (\n    promoCode: string,\n    packages: Package[],\n    total: number,\n    token: any,\n    registrationToken: string,\n    poNumber: string,\n    FinanceEmail: string,\n  ) => ({\n    registrationToken,\n    promoCode,\n    packageIDs: packages.map((p: Package) => p.packageID),\n    expectedGrossAmount: total,\n    nameOnCard: token.card.name,\n    cardEndDigits: token.card.last4,\n    expiryDate: `${\n      token.card.exp_month.toString().length === 1 && '0'\n    }${token.card.exp_month.toString()}/${token.card.exp_year.toString()[2]}${\n      token.card.exp_year.toString()[3]\n    }`,\n    stripeToken: token.id,\n    poNumber,\n    FinanceEmail,\n  });\n\n  public static getPageHeaderInfo = (step: any) => {\n    switch (step) {\n      case SubscriptionStep.CHOOSE_PACKAGE:\n        return { title: 'Choose your package', nextStep: 'School details' };\n\n      case SubscriptionStep.SCHOOL_DETAILS:\n        return { title: 'Enter school details', nextStep: 'Enter two contact details' };\n\n      case SubscriptionStep.PROFILE_DETAILS:\n        return { title: 'Enter two contact details', nextStep: 'Payment type' };\n\n      case SubscriptionStep.PAYMENT_TYPE:\n        return {\n          title: 'Payment type',\n          nextStep: 'Payment details / Confirmation',\n        };\n\n      case SubscriptionStep.PAYMENT_DETAILS:\n        return { title: 'Payment details', nextStep: '' };\n\n      case SubscriptionStep.CONFIRMATION:\n        return { title: 'Confirmation', nextStep: '' };\n\n      default:\n        return { title: '', nextStep: '' };\n    }\n  };\n\n  public static buildUpdateAfter3DSecurePayload = (response: any) => {\n    return {\n      registrationToken: response.registrationToken,\n      tid: response.tid,\n      stripePaymentIntentID: response.error\n        ? response.error.payment_intent.id\n        : response.paymentIntent.id,\n    };\n  };\n\n  public static parseError = (errors: any) => {\n    let error: string;\n    switch (errors[0].messageCode) {\n      case 'Invalid_PromoCode_Expired':\n        error = 'Promo code is expired';\n        break;\n      case 'Exisiting_SChoolName_PostcodeZipcode_Combination':\n        error =\n          'Hey! Your school already exists, contact admin@getset4education so we can get you started.';\n        break;\n      case 'Missing_PromoCode':\n        error = 'Please provide a promo code';\n        break;\n      case `Invalid_PromoCode`:\n        error = `Invalid promo code `;\n        break;\n      case 'EmailAddress_Already_Exists':\n        error = 'Email address already exists';\n        break;\n      case 'OfficeEmailAddress_Already_Exists':\n        error = 'Office email address already exists';\n        break;        \n      case 'Access_Token_Invalid':\n        error = 'Sorry, something went wrong. Please try again. ';\n        break;\n      case 'ExpectedGrossAmount':\n        error = 'Sorry, something went wrong. Please try again. ';\n        break;\n      case 'pkey_general_payment_card_error':\n        error = 'Payment failed. Please try again.';\n        break;\n      case 'pkey_general_payment_error':\n        error = 'Payment failed. Please try again.';\n        break;\n      case 'pkey_general_payment_subscription_failed':\n        error = 'Payment failed. Please try again.';\n        break;\n      case 'pkey_general_payment_failed':\n        error = 'Payment failed. Please try again.';\n        break;\n      case 'Invalid_PromoCode_NotStarted':\n        error = 'Invalid Promo code';\n        break;\n      default:\n        error = 'Sorry, something went wrong. Please try again. ';\n    }\n    return error;\n  };\n}\n","import instance, { ApiResponse } from 'api';\nimport { AxiosError, AxiosResponse } from 'axios';\nimport { BaseApi } from 'baseApi';\nimport { endpoints } from 'endpoints.config';\nimport { Package } from 'pages/newSubscription/models';\nimport {\n  ISchoolDetails,\n  ISchoolUser,\n  ISchoolUserFreeTrial,\n  SubscribeParser,\n} from 'pages/subscribe/models';\n\nconst UNKOWN_ERROR_MESSAGE = 'Sorry, something went wrong. Please try again.';\n\nexport class SubscribeApi extends BaseApi {\n  public static getPackages = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.public.subscription.getSubscriptions\n      );\n\n      if (SubscribeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscribeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        }\n      }\n      return SubscribeApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  // get subscription packages\n  public static getSubscriptionsWithPromocode = async (\n    promoCode: string\n  ): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.public.subscription.getSubscriptionsWithPromocode +\n          `?promoCode=${promoCode}`\n      );\n\n      if (SubscribeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscribeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        }\n      }\n      return SubscribeApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static validateSchoolInfo = async (\n    values: ISchoolDetails\n  ): Promise<any> => {\n    try {\n      const payload = SubscribeParser.buildSchoolDetailsPayload(values);\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.public.subscription.validateSchoolInfo,\n        payload\n      );\n\n      if (SubscribeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscribeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        }\n      }\n      return SubscribeApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static createSchoolUser = async (\n    values: ISchoolUser,\n    schoolDetails: ISchoolDetails\n  ): Promise<any> => {\n    try {\n      const payload = SubscribeParser.buildSchoolUserDetailsPayload(\n        values,\n        schoolDetails\n      );\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.public.subscription.createsSchoolUser,\n        payload\n      );\n\n      if (SubscribeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscribeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        }\n      }\n      return SubscribeApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static createSchoolUserFreeTrial = async (\n    values: ISchoolUserFreeTrial,\n    schoolDetails: ISchoolDetails\n  ): Promise<any> => {\n    try {\n      const payload = SubscribeParser.buildSchoolUserDetailsPayloadFreeTrial(\n        values,\n        schoolDetails\n      );\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.public.subscription.createsSchoolUserFreeTrial,\n        payload\n      );\n\n      if (SubscribeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscribeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        }\n      }\n      return SubscribeApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };  \n\n  public static subscribeByInvoice = async (\n    registrationToken: string,\n    promoCode: string,\n    packageIDs: Package[],\n    expectedGrossAmount: number,\n    poNumber: string,\n    FinanceEmail: string,\n  ): Promise<any> => {\n    try {\n      const payload = SubscribeParser.buildArchiveNowPayload(\n        registrationToken,\n        promoCode,\n        packageIDs,\n        expectedGrossAmount,\n        poNumber,\n        FinanceEmail,\n      );\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.public.subscription.subscribeByInvoice,\n        payload\n      );\n\n      if (SubscribeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscribeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        }\n      }\n      return SubscribeApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static subscribeByCard = async (\n    promoCode: string,\n    packages: Package[],\n    total: number,\n    token: any,\n    registrationToken: string,\n    poNumber: string,\n    FinanceEmail: string,\n  ): Promise<any> => {\n    try {\n      const payload = SubscribeParser.buildSubscribeByCardPayload(\n        promoCode,\n        packages,\n        total,\n        token,\n        registrationToken,\n        poNumber,\n        FinanceEmail,\n      );\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.public.subscription.subscribeByCard,\n        payload\n      );\n\n      if (SubscribeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscribeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        }\n      }\n      return SubscribeApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static updateAfter3DSecure = async (values: any): Promise<any> => {\n    try {\n      const payload = SubscribeParser.buildUpdateAfter3DSecurePayload(values);\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.public.subscription.updateAfter3DSecure,\n        payload\n      );\n\n      if (SubscribeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return SubscribeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SubscribeParser.parseError(errors);\n          return SubscribeApi.errorResponse(message);\n        }\n      }\n      return SubscribeApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n}\n","import { AddFreeTrialApi } from 'api/addFreeTrialApi';\nimport { FreeTrialSubscriptionApi } from 'api/freeTrialSubscriptionApi';\nimport { NewSubscriptionApi } from 'api/newSubscriptionApi';\nimport { SubscribeApi } from 'api/subscribeApi';\nimport { AppPath } from 'appConstants';\nimport { useState, useCallback, useEffect } from 'react';\n\nexport const useFetchPackages = (pathName: string) => {\n  const [packages, setPackages] = useState<any>(null);\n  const [vatRate, setVatRate] = useState<number | null>(null);\n  const [amountOff, setAmountOff] = useState<number | null>(null);\n  const [financeEmail, setFinanceEmail] = useState<any>('');\n  const [error, setError] = useState<string>('');\n\n  const getSubscriptionsList = useCallback(async () => {\n    let result;\n    if (pathName === AppPath.SUBSCRIBE) {\n      result = await SubscribeApi.getPackages();\n    }\n    if (pathName === AppPath.NEW_FREE_TRIAL) {\n      result = await AddFreeTrialApi.getPackages();\n    }\n    if (pathName === AppPath.SUBSCRIBE_FREE_TRIAL) {\n      result = await FreeTrialSubscriptionApi.getPackages();\n    }\n    if (\n      pathName === AppPath.NEW_SUBSCRIPTION ||\n      pathName === AppPath.UPGRADE_SUBSCRIPTION\n    ) {\n      result = await NewSubscriptionApi.getPackages();\n    }\n    if (result.data) {\n      setPackages(result.data.generalPackages);\n      setVatRate(result.data.vatRate);\n      setAmountOff(result.data.amountOff);\n      setFinanceEmail(result.data.financeEmail);\n    }\n\n    if (result.error) {\n      setError(result.error);\n    }\n  }, []);\n\n  useEffect(() => {\n    getSubscriptionsList();\n  }, [getSubscriptionsList]);\n\n  return { packages, vatRate, amountOff, financeEmail, error };\n};\n","import React from 'react';\n\ntype Props = {\n  message: string;\n};\n\nconst FormGeneralError: React.FC<Props> = ({ message }) => {\n  return (\n    <div className=\"FormError\">\n      <div className=\"ErrorMessage\">{message}</div>\n    </div>\n  );\n};\n\nexport default FormGeneralError;\n","export const getVATAndPriceWithVAT = (price: number, vatRate: number) => {\n  const vat = price * (vatRate / 100);\n  const priceWithVAT = price + vat;\n  return { vat, priceWithVAT };\n};\n","import { Link, useLocation } from '@reach/router';\nimport React, { useEffect, useState } from 'react';\nimport queryString from 'query-string';\nimport { formatNumber, formatPrice } from 'utils/formating';\nimport PackageCard from './PackageCard';\nimport { useFetchPackages } from 'hooks/useFetchPackages';\nimport {\n  IPriceInfo,\n  IPromoCode,\n  Package,\n  PackageGroup,\n  PackagesList,\n  Subjects,\n} from 'pages/newSubscription/models';\nimport { NewSubscriptionApi } from 'api/newSubscriptionApi';\nimport FormGeneralError from 'components/formComponents/FormGeneralError';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n  selectSelectedPackages,\n  setPrice,\n  setValidPromoCode,\n  updateSelectedPackages,\n} from 'reducers/misc';\nimport { Spinner } from 'components/spinner/Spinner';\nimport { AppPath, ERROR_MESSAGE, PUBLIC_SITE_URL } from 'appConstants';\nimport { SubscribeApi } from 'api/subscribeApi';\nimport ErrorMessage from 'components/errorMessage/ErrorMessage';\nimport { getVATAndPriceWithVAT } from 'helpers/priceCalculations';\n\ntype ChoosePackageFormProps = {\n  onSubmit: () => void;\n};\n\nexport const ChoosePackageForm: React.FC<ChoosePackageFormProps> = ({\n  onSubmit,\n}) => {\n  const dispatch = useDispatch();\n  const location = useLocation();\n\n  const pathname = location.pathname;\n  const queryParams = location\n    ? queryString.parse(location.search, { decode: false })\n    : undefined;\n\n  const selectedPackages = useSelector(selectSelectedPackages);\n\n  const [allPackages, setAllPackages] = useState<PackagesList>([]);\n  const [amountOffDiscount, setAmountOffDiscount] = useState<number | null>();\n  const [promoCode, setPromoCode] = useState<IPromoCode>({\n    value: '',\n    error: '',\n  });\n  const [priceInfo, setPriceInfo] = useState<IPriceInfo>({\n    price: 0,\n    vat: 0,\n    total: 0,\n    discount: 0,\n    appliedDiscountType: '',\n  });\n\n  const { packages, vatRate, amountOff, error } = useFetchPackages(\n    location.pathname\n  );\n\n  useEffect(() => {\n    if (!packages) return;\n    setAmountOffDiscount(amountOff);\n    setAllPackages(packages);\n  }, [packages]);\n\n  useEffect(() => {\n    if (!packages) return;\n    //preselect subscribed free trial packages\n    const freeTrialPackages = packages\n      .map((p: any) =>\n        p.subjects.map((subject: any) =>\n          subject.subscriptions.map((subscription: any) => {\n            if (subscription.isFreeTrial) {\n              return {\n                ...subscription,\n                ageGroup: p.name,\n                subject: subject.name,\n              };\n            }\n          })\n        )\n      )\n      .flat()\n      .flat()\n      .filter((item: Package | undefined) => item);\n\n    if (freeTrialPackages && freeTrialPackages.length > 0) {\n      dispatch(updateSelectedPackages(freeTrialPackages));\n    }\n\n    //the subscribe url will include a param when the user has selected a package\n    //from the pricing page and it gets redirected to the subscribe page\n    const packageId = queryParams ? queryParams.packageId : null;\n    if (!packageId) return;\n    const paramPackage = packages\n      .map((p: any) =>\n        p.subjects.map((subject: any) =>\n          subject.subscriptions.map((subscription: any) => {\n            if (subscription.packageID == packageId) {\n              return {\n                ...subscription,\n                ageGroup: p.name,\n                subject: subject.name,\n              };\n            }\n          })\n        )\n      )\n      .flat()\n      .flat()\n      .filter((item: Package | undefined) => item);\n\n    if (paramPackage && paramPackage.length > 0) {\n      dispatch(updateSelectedPackages(paramPackage));\n    }\n  }, [packages]);\n\n  useEffect(() => {\n    if (!vatRate) return;\n    const [price, total, vat, discount, appliedDiscountType] =\n      calculatePrice(vatRate);\n\n    setPriceInfo({ price, vat, total, discount, appliedDiscountType });\n  }, [selectedPackages]);\n\n  const selectPackage = (p: Package) => {\n    const packageList = selectedPackages;\n    const includesPackage = packageList.find(\n      (i: Package) => i.packageID === p.packageID\n    );\n\n    if (includesPackage) {\n      /*Clear unselected packages*/\n      const filteredPackageList = packageList.filter(\n        (i: Package) => i.packageID !== p.packageID\n      );\n      dispatch(updateSelectedPackages(filteredPackageList));\n    } else {\n      /*Clear packages of the same subject and different age group of the selected package*/\n      const filteredPackageList = packageList.filter(\n        (i: Package) => i.subject !== p.subject\n      );\n      dispatch(updateSelectedPackages([...filteredPackageList, p]));\n    }\n  };\n\n  const isAgeGroupSelected = (ageGroup: string) => {\n    /*To define the age group container styles*/\n    const ageGroupPackage = selectedPackages.find(\n      (i: Package) => i.ageGroup === ageGroup\n    );\n    return ageGroupPackage ? true : false;\n  };\n\n  const calculatePrice = (vatRate: number) => {\n    //total without vat\n    const price = selectedPackages.reduce(function (prev, cur) {\n      return prev + cur.price;\n    }, 0);\n\n    const VATValue = price * (vatRate / 100);\n\n    const priceWithVAT = price + VATValue;\n\n    //----- Multi package discount -----///\n    const multiPackageDiscountedTotalPriceWithoutVat = selectedPackages.reduce(\n      function (prev, cur) {\n        return prev + cur.price - cur.multiPurchaseDiscount;\n      },\n      0\n    );\n    const multiPackageDiscountedTotalPriceWithVat = selectedPackages.reduce(\n      function (prev, cur) {\n        return (\n          prev +\n          getVATAndPriceWithVAT(cur.price - cur.multiPurchaseDiscount, vatRate)\n            .priceWithVAT\n        );\n      },\n      0\n    );\n\n    const multiPackageVATValue = selectedPackages.reduce(function (prev, cur) {\n      return prev + (cur.price - cur.multiPurchaseDiscount) * (vatRate / 100);\n    }, 0);\n\n    const multiPackageDiscount =\n      price - multiPackageDiscountedTotalPriceWithoutVat;\n    //------------------------------------//\n\n    //------- Percentage of discount -------- //\n\n    const percentageOffDiscountedTotalPriceWithoutVat = selectedPackages.reduce(\n      function (prev, cur) {\n        return prev + cur.price - cur.promoCodeDiscount;\n      },\n      0\n    );\n    const percentageOffDiscountedTotalPriceWithVat = selectedPackages.reduce(\n      function (prev, cur) {\n        return (\n          prev +\n          getVATAndPriceWithVAT(cur.price - cur.promoCodeDiscount, vatRate)\n            .priceWithVAT\n        );\n      },\n      0\n    );\n\n    const percentageOffVATValue = selectedPackages.reduce(function (prev, cur) {\n      return prev + (cur.price - cur.promoCodeDiscount) * (vatRate / 100);\n    }, 0);\n\n    const percentageOffDiscount =\n      price - percentageOffDiscountedTotalPriceWithoutVat;\n\n    //------------------------------------//\n\n    //------- Amount of discount -------- //\n    const accumulatedDiscounts = selectedPackages.reduce(function (prev, cur) {\n      return prev + cur.promoCodeDiscount;\n    }, 0);\n\n    let amountOffDiscountedTotalPriceWithoutVat;\n    if (amountOffDiscount && accumulatedDiscounts > amountOffDiscount) {\n      amountOffDiscountedTotalPriceWithoutVat = price - amountOffDiscount;\n    } else {\n      amountOffDiscountedTotalPriceWithoutVat = selectedPackages.reduce(\n        function (prev, cur) {\n          return prev + (cur.price - cur.promoCodeDiscount);\n        },\n        0\n      );\n    }\n\n    const amountOffDiscountedTotalPriceWithVAT =\n      amountOffDiscountedTotalPriceWithoutVat * 1.2;\n\n    const amountOffDiscountValue = amountOffDiscount;\n\n    const amountOffVATValue =\n      amountOffDiscountedTotalPriceWithVAT -\n      amountOffDiscountedTotalPriceWithoutVat;\n\n    //------------------------------------//\n\n    //------- Select the right discount-------- //\n\n    const getSelectedPromoCodeDiscount = () => {\n      if (amountOffDiscount) {\n        return [\n          amountOffDiscountedTotalPriceWithVAT,\n          amountOffVATValue,\n          amountOffDiscountValue,\n        ];\n      } else {\n        return [\n          percentageOffDiscountedTotalPriceWithVat,\n          percentageOffVATValue,\n          percentageOffDiscount,\n        ];\n      }\n    };\n\n    const [\n      discountedTotalPriceWithVAT,\n      discountedVATValue,\n      discountValue,\n    ]: any = getSelectedPromoCodeDiscount();\n\n    //------- Final Discount Value -------- //\n    const getDiscountedPrice = () => {\n      if (selectedPackages.length > 1) {\n        if (\n          multiPackageDiscountedTotalPriceWithVat <= discountedTotalPriceWithVAT\n        ) {\n          return [\n            multiPackageDiscountedTotalPriceWithVat,\n            multiPackageVATValue,\n            multiPackageDiscount,\n          ];\n        }\n        if (\n          multiPackageDiscountedTotalPriceWithVat > discountedTotalPriceWithVAT\n        ) {\n          return [\n            discountedTotalPriceWithVAT,\n            discountedVATValue,\n            discountValue,\n          ];\n        }\n      } else {\n        return [discountedTotalPriceWithVAT, discountedVATValue, discountValue];\n      }\n    };\n\n    const [\n      finalDiscountTotalPriceWithVAT,\n      finalDiscountedVATValue,\n      finalDiscountValue,\n    ]: any = getDiscountedPrice();\n\n    //------------------------------------//\n\n    //------- Final Price -------- //\n    const finalPrice =\n      finalDiscountTotalPriceWithVAT &&\n      finalDiscountTotalPriceWithVAT < priceWithVAT\n        ? finalDiscountTotalPriceWithVAT\n        : priceWithVAT;\n\n    const finalVATValue =\n      finalDiscountTotalPriceWithVAT &&\n      finalDiscountTotalPriceWithVAT < priceWithVAT\n        ? finalDiscountedVATValue\n        : VATValue;\n\n    const finalDiscount =\n      finalDiscountTotalPriceWithVAT &&\n      finalDiscountTotalPriceWithVAT < priceWithVAT\n        ? finalDiscountValue\n        : 0;\n\n    const finalDiscountType: string =\n      selectedPackages.length > 1\n        ? multiPackageDiscountedTotalPriceWithVat < discountedTotalPriceWithVAT\n          ? 'Multipack'\n          : 'Promo code'\n        : 'Promo code';\n\n    //------------------------------------//\n\n    return [\n      formatNumber(price),\n      formatNumber(finalPrice),\n      formatNumber(finalVATValue),\n      formatNumber(finalDiscount),\n      finalDiscountType,\n    ];\n  };\n\n  const updateSelectedPackagesWithDiscount = (packages: any) => {\n    const allUpdatedPackages = packages\n      .map((p: any) =>\n        p.subjects.map((i: any) =>\n          i.subscriptions.map((j: any) => ({\n            ...j,\n            ageGroup: p.name,\n            subject: i.name,\n          }))\n        )\n      )\n      .flat()\n      .flat()\n      .flat();\n\n    const updatedSelectedPackages = selectedPackages\n      .map((p: Package) => {\n        return allUpdatedPackages.filter(\n          (i: Package) => p.packageID === i.packageID\n        );\n      })\n      .flat();\n    updatedSelectedPackages.length > 0 &&\n      dispatch(updateSelectedPackages(updatedSelectedPackages));\n  };\n\n  const applyPromoCode = async (vatRate: number) => {\n    let result;\n    if (AppPath.SUBSCRIBE === pathname) {\n      result = await SubscribeApi.getSubscriptionsWithPromocode(\n        promoCode.value\n      );\n    } else {\n      result = await NewSubscriptionApi.checkPromoCode(promoCode.value);\n    }\n\n    if (result.data) {\n      setPromoCode({\n        value: '',\n        error: '',\n      });\n      setAmountOffDiscount(result.data.amountOff);\n      setAllPackages(result.data.generalPackages);\n      updateSelectedPackagesWithDiscount(result.data.generalPackages);\n      dispatch(setValidPromoCode(promoCode.value));\n    }\n\n    if (result.error) {\n      setPromoCode({ value: '', error: result.error.message });\n    }\n  };\n\n  const onContinue = () => {\n    if (!vatRate) return;\n\n    dispatch(\n      setPrice({\n        price: priceInfo.price,\n        vat: priceInfo.vat,\n        total: priceInfo.total,\n        vatRate,\n        discount: priceInfo.discount,\n        discountType: priceInfo.appliedDiscountType,\n      })\n    );\n    onSubmit();\n  };\n\n  if (error) {\n    return <ErrorMessage message={ERROR_MESSAGE}></ErrorMessage>;\n  }\n\n  if (allPackages.length === 0 && !error) {\n    return (\n      <div\n        style={{\n          minHeight: ' calc(100vh - 300px)',\n          display: 'flex',\n          justifyContent: 'center',\n          alignItems: 'center',\n        }}\n      >\n        <Spinner />\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"ChoosePackageForm\">\n      <div className=\"PackagesContainer\">\n        {allPackages.map((packageGroup: PackageGroup, i: number) => (\n          <div\n            key={i}\n            className={`PackageOptions ${\n              isAgeGroupSelected(packageGroup.name) ? 'Selected' : 'Unselected'\n            }\n              `}\n          >\n            <h2>{packageGroup.name}</h2>\n            <p>{packageGroup.description + ' '}</p>\n            {packageGroup &&\n              packageGroup.subjects.map(\n                (subjectInfo: Subjects, index: number) => (\n                  <PackageCard\n                    key={index}\n                    subjectInfo={subjectInfo}\n                    selectPackage={selectPackage}\n                    selectedPackages={selectedPackages}\n                    ageGroup={packageGroup.name}\n                  />\n                )\n              )}\n          </div>\n        ))}\n      </div>\n      <div className=\"TotalDetails\">\n        <div className=\"DiscoundContainer\">\n          <input\n            className=\"Discount\"\n            type=\"text\"\n            onChange={(e) =>\n              setPromoCode((prevState) => ({\n                ...prevState,\n                value: e.target.value,\n              }))\n            }\n            value={promoCode.value}\n            placeholder=\"Enter promo code (optional)\"\n          />\n\n          <button\n            className=\"Btn BtnOrange\"\n            type=\"button\"\n            disabled={promoCode.value && vatRate ? false : true}\n            onClick={() => vatRate && applyPromoCode(vatRate)}\n          >\n            Apply\n          </button>\n        </div>\n\n        <FormGeneralError message={promoCode.error} />\n        <div className=\"DetailsItem\">\n          <p>Price</p>\n          <span>£ {formatPrice(priceInfo.price)}</span>\n        </div>\n        {priceInfo.discount > 0 && selectedPackages.length > 0 && (\n          <div className=\"DetailsItem\">\n            <p>Discount ({priceInfo.appliedDiscountType})</p>\n            <span>-£ {formatPrice(priceInfo.discount)}</span>\n          </div>\n        )}\n        {priceInfo.discount > 0 && selectedPackages.length > 0 && (\n          <div className=\"DetailsItem\">\n            <p>Discounted price</p>\n            <span>£ {formatPrice(priceInfo.price - priceInfo.discount)}</span>\n          </div>\n        )}\n        <div className=\"DetailsItem\">\n          <p>VAT ({vatRate}%)</p>\n          <span>£ {formatPrice(priceInfo.vat)}</span>\n        </div>\n\n        <div className=\"DetailsItem\">\n          <p>Total</p>\n          <span>£ {formatPrice(priceInfo.total)}</span>\n        </div>\n        <button\n          className=\"Btn BtnOrange\"\n          type=\"submit\"\n          onClick={onContinue}\n          disabled={selectedPackages.length === 0 || priceInfo?.price === 0}\n        >\n          Continue\n        </button>\n      </div>\n    </div>\n  );\n};\n","import React from 'react';\n\ntype Props = {\n  activeStep: number;\n  numOfSteps: number;\n  title: string;\n  nextStep?: string;\n};\n\nconst FormHeader: React.FC<Props> = ({\n  activeStep,\n  numOfSteps,\n  title,\n  nextStep,\n}) => {\n  return (\n    <div className=\"FormHeader\">\n      <h3>\n        Step {activeStep} of {numOfSteps}\n      </h3>\n      <h1>{title}</h1>\n      {nextStep && <p>Next: {nextStep}</p>}\n    </div>\n  );\n};\n\nexport default FormHeader;\n","import React from 'react';\nimport { ErrorMessage } from 'formik';\n\nconst ErrorM: React.FC<{ name: string }> = (props) => (\n  <ErrorMessage name={props.name}>\n    {(msg) => <div className=\"ErrorLabel\">{msg}</div>}\n  </ErrorMessage>\n);\n\nexport { ErrorM };\n","import { ErrorMessage, Field } from 'formik';\nimport React from 'react';\nimport { CardElement } from 'react-stripe-elements';\nimport { ErrorM } from './ErrorM';\n\ninterface FormTextFieldProps<T> {\n  field: string;\n  label: string;\n  required: boolean;\n  disabled?: boolean;\n\n  labelPosition?: 'left' | 'right';\n}\n\nconst FormStripeCardField = function <T>({\n  field,\n  label,\n  required,\n  labelPosition,\n}: FormTextFieldProps<T>) {\n  return (\n    <div\n      className={`FormBox FormSideBySide ${labelPosition ? labelPosition : ''}`}\n    >\n      <div className=\"FormLabel\">\n        <label>{label} </label>\n      </div>\n      <div className=\"FormField\">\n        <Field>\n          {({ field, form }: any) => (\n            <CardElement\n              className={`EditBox`}\n              id={'card_details'}\n              onChange={(val) =>\n                form.setErrors({\n                  ...form.errors,\n                  card_details: val.error && val.error.message,\n                })\n              }\n            />\n          )}\n        </Field>\n        <ErrorM name={field} />\n      </div>\n    </div>\n  );\n};\n\nexport default FormStripeCardField;\n","import React from 'react';\nimport { FieldAttributes, useField } from 'formik';\n\nfunction Input(props: any) {\n  const [field, meta] = useField(props);\n  const showError = meta.touched && meta.error;\n\n  if (props.type === 'textarea') {\n    return (\n      <textarea\n        rows={5}\n        maxLength={1000}\n        {...(field as any)}\n        className={`EditBox${showError ? ' ErrorInput' : ''} ${\n          props.readOnly ? 'ViewOnly' : ''\n        }`}\n        {...props}\n      ></textarea>\n    );\n  }\n  return (\n    <input\n      {...(field as any)}\n      className={`EditBox${showError ? ' ErrorInput' : ''} ${\n        props.readOnly ? 'ViewOnly' : ''\n      }`}\n      disabled={props.disabled === true}\n      value={props.value}\n      {...props}\n    />\n  );\n}\n\nexport { Input };\n","import React from 'react';\nimport { ErrorM } from './ErrorM';\nimport { Input } from './Input';\n\ninterface FormTextFieldProps<T> {\n  field: string;\n  label?: string;\n  required: boolean;\n  type?: string;\n  hint?: string;\n  optionalTag?: string;\n  visible?: boolean;\n  disabled?: boolean;\n  placeholder?: string;\n  labelPosition?: 'left' | 'top';\n  value?: string;\n  readOnly?: boolean;\n}\n\nconst FormTextField = function <T>({\n  field,\n  label,\n  required,\n  type,\n  hint,\n  optionalTag,\n  visible,\n  disabled,\n  placeholder,\n  labelPosition,\n  value,\n  readOnly,\n}: FormTextFieldProps<T>) {\n  return (\n    <div\n      className={`FormBox FormSideBySide ${\n        visible === false ? 'HideField' : ''\n      } ${labelPosition ? labelPosition : ''}`}\n    >\n      <div className=\"FormLabel\">\n        {label && (\n          <label>\n            {label}{' '}\n            {!required && <span className=\"Optional\">- {optionalTag}</span>}\n          </label>\n        )}\n        {hint && <div className=\"FormHint\">{hint}</div>}\n      </div>\n      <div className=\"FormField\">\n        <Input\n          name={field}\n          type={type ? type : 'text'}\n          disabled={disabled}\n          placeholder={placeholder}\n          value={value}\n          readOnly={readOnly ?? false}\n        />\n        <ErrorM name={field} />\n      </div>\n    </div>\n  );\n};\n\nexport default FormTextField;\n","import { useDispatch } from 'react-redux';\nimport { toogleToast } from 'reducers/misc';\n\nexport function useToast(message: string) {\n  const dispatch = useDispatch();\n  const windowGlobal = typeof window !== 'undefined';\n\n  return () => {\n    dispatch(toogleToast({ open: true, message: message }));\n\n    windowGlobal &&\n      window.setTimeout(() => {\n        dispatch(toogleToast({ open: true, message: '' }));\n      }, 3500);\n\n    windowGlobal &&\n      window.setTimeout(() => {\n        dispatch(toogleToast({ open: false, message: '' }));\n      }, 3600);\n  };\n}\n","import { Elements, injectStripe } from 'react-stripe-elements';\nimport FormStripeCardField from 'components/formComponents/FormStripeCardField';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport { Form, Formik, FormikHelpers } from 'formik';\nimport React, { useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport * as Yup from 'yup';\nimport {\n  selectPoNumber,\n  selectFinanceEmail,\n  selectPrice,\n  selectRegistrationToken,\n  selectSelectedPackages,\n  selectValidPromoCode,\n} from 'reducers/misc';\nimport { ThreeBounce } from 'better-react-spinkit';\nimport FormGeneralError from 'components/formComponents/FormGeneralError';\nimport { NewSubscriptionApi } from 'api/newSubscriptionApi';\nimport { useLocation, useNavigate } from '@reach/router';\nimport { AppPath } from 'appConstants';\nimport { useToast } from 'hooks/useToast';\nimport { formatNumber } from 'utils/formating';\nimport App from 'App';\nimport { SubscribeApi } from 'api/subscribeApi';\n\ntype PaymentDetailsFormProps = { onSubmit: () => void };\n\ntype InnerPaymentDetailsFormProps = {\n  onSubmit: () => void;\n  stripe?: any;\n};\n\nconst InnerPaymentDetailsForm: React.FC<InnerPaymentDetailsFormProps> = ({\n  onSubmit,\n  stripe,\n}) => {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const pathname = location.pathname;\n\n  const handleToast = useToast('Your payment was successful');\n\n  const [error, setError] = useState<string>('');\n  const subscriptionPrice = useSelector(selectPrice);\n  const promoCode = useSelector(selectValidPromoCode);\n  const priceInfo = useSelector(selectPrice);\n  const selectedPackages = useSelector(selectSelectedPackages);\n  const registrationToken = useSelector(selectRegistrationToken);\n  const poNumber = useSelector(selectPoNumber);\n  const FinanceEmail = useSelector(selectFinanceEmail);\n\n  const initialValues = {\n    cardholderName: '',\n    cardNumber: '',\n    expiryDate: '',\n    cvv: '',\n  };\n\n  const validationSchema = Yup.object({\n    cardholderName: Yup.string().required(\"Please enter the cardholder's name\"),\n  });\n\n  const createStripeToken = (\n    values: any,\n    { setSubmitting }: FormikHelpers<any>\n  ) =>\n    stripe\n      .createToken({ name: values.cardholderName })\n      .then(({ token, error }: any) => {\n        if (token) {\n          upgradeByCard(token, setSubmitting);\n        }\n        if (error) {\n          setSubmitting(false);\n          setError('Sorry, something went wrong. Please try again.');\n        }\n      });\n\n  const upgradeByCard = async (\n    token: any,\n    setSubmitting: (status: boolean) => void\n  ) => {\n    let result;\n    if (AppPath.SUBSCRIBE === pathname) {\n      result = await SubscribeApi.subscribeByCard(\n        promoCode,\n        selectedPackages,\n        priceInfo.total,\n        token,\n        registrationToken,\n        poNumber,\n        FinanceEmail\n      );\n    } else {\n      result = await NewSubscriptionApi.subscribeByCard(\n        promoCode,\n        selectedPackages,\n        priceInfo.total,\n        token,\n        poNumber,\n        FinanceEmail\n      );\n    }\n\n    if (result.data) {\n      const status = result.data.status;\n      if (status === 'succeeded') {\n        handleToast();\n        AppPath.SUBSCRIBE === pathname\n          ? onSubmit()\n          : navigate(AppPath.DASHBOARD);\n      }\n\n      if (status === 'requires_action') {\n        const clientSecret = result.data.clientSecret;\n        const tid = result.data.tid;\n        handleCardAction(clientSecret, setSubmitting, tid);\n      }\n    }\n    if (result.error) {\n      setError(result.error.message);\n      setSubmitting(false);\n    }\n  };\n\n  const handleCardAction = (\n    clientSecret: string,\n    setSubmitting: (status: boolean) => void,\n    tid: string\n  ) => {\n    stripe.handleCardAction(clientSecret).then((res: any) => {\n      updateAfte3DSecure(res, tid, setSubmitting);\n    });\n  };\n\n  const updateAfte3DSecure = async (\n    values: any,\n    tid: string,\n    setSubmitting: (status: boolean) => void\n  ) => {\n    let result;\n\n    if (AppPath.SUBSCRIBE === pathname) {\n      result = await SubscribeApi.updateAfter3DSecure({\n        registrationToken,\n        ...values,\n        tid,\n      });\n    } else {\n      result = await NewSubscriptionApi.updateAfter3DSecure({\n        ...values,\n        tid,\n      });\n    }\n    if (result.data) {\n      AppPath.SUBSCRIBE === pathname ? onSubmit() : navigate(AppPath.DASHBOARD);\n    }\n    if (result.error) {\n      setSubmitting(false);\n      setError(result.error.message);\n    } else {\n      AppPath.SUBSCRIBE === pathname ? onSubmit() : navigate(AppPath.DASHBOARD);\n    }\n  };\n\n  const handleFormSubmition = (\n    values: any,\n    formikHelpers: FormikHelpers<any>\n  ) => {\n    createStripeToken(values, formikHelpers);\n  };\n\n  return (\n    <div className=\"Form\">\n      <FormGeneralError message={error} />\n      <Formik\n        initialValues={initialValues}\n        onSubmit={(values, formikHelpers) =>\n          handleFormSubmition(values, formikHelpers)\n        }\n        validationSchema={validationSchema}\n      >\n        {({ isSubmitting }) => (\n          <Form>\n            <FormTextField\n              field={'cardholderName'}\n              label={\"Cardholder's name\"}\n              required={true}\n            />\n\n            <FormStripeCardField\n              field={'card'}\n              label={'Card '}\n              required={true}\n            />\n\n            {/* <div className=\"SideBySideDifferent\">\n              <FormTextField\n                field={'expiryDate'}\n                label={'Expiry date'}\n                placeholder={'mm/yyyy'}\n                required={true}\n              />\n              <FormTextField field={'cvv'} label={'CVV'} required={true} />\n            </div> */}\n            <div className=\"TotalDetails\">\n              <div className=\"DetailsItem\">\n                <p>Price</p>\n                <span>£ {subscriptionPrice.price}</span>\n              </div>\n              {subscriptionPrice.discount > 0 && (\n                <div className=\"DetailsItem\">\n                  <p>Discount ({subscriptionPrice.discountType})</p>\n                  <span>-£ {formatNumber(subscriptionPrice.discount)}</span>\n                </div>\n              )}\n              {subscriptionPrice.discount > 0 && (\n                <div className=\"DetailsItem\">\n                  <p>Discounted price</p>\n                  <span>\n                    £\n                    {formatNumber(\n                      subscriptionPrice.price - subscriptionPrice.discount\n                    )}\n                  </span>\n                </div>\n              )}\n              <div className=\"DetailsItem\">\n                <p>VAT ({priceInfo.vatRate}%)</p>\n                <span>£ {formatNumber(subscriptionPrice.vat)}</span>\n              </div>\n              <div className=\"DetailsItem\">\n                <p>Total</p>\n                <span>£ {formatNumber(subscriptionPrice.total)}</span>\n              </div>\n            </div>\n            <button\n              className=\"Btn BtnOrange\"\n              type=\"submit\"\n              disabled={isSubmitting}\n            >\n              {isSubmitting ? (\n                <ThreeBounce size={10} color={'#ffffff'} />\n              ) : (\n                'Subscribe'\n              )}\n            </button>\n          </Form>\n        )}\n      </Formik>\n    </div>\n  );\n};\n\nconst PaymentDetailsFormWithStripe = injectStripe(InnerPaymentDetailsForm);\n\nconst PaymentDetailsForm: React.FC<PaymentDetailsFormProps> = (props) => {\n  return (\n    <Elements>\n      <PaymentDetailsFormWithStripe {...props} />\n    </Elements>\n  );\n};\nexport default PaymentDetailsForm;\n","import React, { useState } from 'react';\nimport { Form, Formik, FormikHelpers } from 'formik';\nimport * as Yup from 'yup';\n\nimport FormTextField from 'components/formComponents/FormTextField';\nimport {\n  IPaymentTypes,\n  NewSubscriptionParser,\n} from 'pages/newSubscription/models';\nimport { NewSubscriptionApi } from 'api/newSubscriptionApi';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n  selectPrice,\n  selectRegistrationToken,\n  selectSelectedPackages,\n  selectValidPromoCode,\n  setPoNumber,\n  setFinanceEmail,\n} from 'reducers/misc';\nimport { useLocation } from '@reach/router';\nimport { AppPath } from 'appConstants';\nimport { ThreeBounce } from 'better-react-spinkit';\nimport FormGeneralError from 'components/formComponents/FormGeneralError';\nimport { formatNumber, formatPrice } from 'utils/formating';\nimport { SubscribeApi } from 'api/subscribeApi';\nimport { useFetchPackages } from 'hooks/useFetchPackages';\n\ntype PaymentTypeFormProps = {\n  onSubmit: (typeOfPayment: 'card' | 'invoice') => void | null;\n};\n\nexport const PaymentTypeForm: React.FC<PaymentTypeFormProps> = ({\n  onSubmit,\n}) => {\n  const dispatch = useDispatch();\n  const location = useLocation();\n  const pathname = location.pathname;\n\n  const [error, setError] = useState<string>('');\n\n  const promoCode = useSelector(selectValidPromoCode);\n  const selectedPackages = useSelector(selectSelectedPackages);\n  const price = useSelector(selectPrice);\n  const registrationToken = useSelector(selectRegistrationToken);\n\n  const { financeEmail } = useFetchPackages(pathname);\n\n  const validationSchema = Yup.object({\n    FinanceEmail: Yup.string()\n      .required('Please enter an email')\n      .email('Please enter a valid email'),\n  });\n\n  const subscribeByInvoice = async (\n    setSubmitting: (status: boolean) => void,\n    poNumber: string,\n    FinanceEmail: string,\n  ) => {\n    setSubmitting(true);\n    let result;\n    if (AppPath.SUBSCRIBE === pathname) {\n      result = await SubscribeApi.subscribeByInvoice(\n        registrationToken,\n        promoCode,\n        selectedPackages,\n        price.total,\n        poNumber,\n        FinanceEmail\n      );\n    } else {\n      result = await NewSubscriptionApi.subscribeByInvoice(\n        promoCode,\n        selectedPackages,\n        price.total,\n        poNumber,\n        FinanceEmail\n      );\n    }\n    if (result.data) {\n      onSubmit('invoice');\n    }\n    if (result.error) {\n      setError(result.error.message);\n    }\n    setSubmitting(false);\n  };\n\n  const handleSubmitForm = (\n    values: IPaymentTypes,\n    { setSubmitting }: FormikHelpers<IPaymentTypes>\n  ) => {\n    if (!values.byCard && !values.byInvoice) return;\n\n    const { poNumber, FinanceEmail } = values;\n\n    if (values.byCard) {\n      dispatch(setPoNumber(poNumber));\n      dispatch(setFinanceEmail(FinanceEmail));\n      setSubmitting(true);\n      onSubmit('card');\n    }\n\n    if (values.byInvoice) {\n      subscribeByInvoice(setSubmitting, poNumber, FinanceEmail);\n    }\n  };\n\n  return (\n    <div className=\"Form PaymentTypeForm\">\n      <Formik\n        initialValues={NewSubscriptionParser.createEmptyPaymentType(financeEmail)}\n        onSubmit={(values, formikHelpers) =>\n          handleSubmitForm(values, formikHelpers)\n        }\n        validationSchema={validationSchema}\n        enableReinitialize={true}\n      >\n        {({ isSubmitting, values, setFieldValue }) => (\n          <Form>\n            <FormGeneralError message={error} />\n            <FormTextField\n              field={'poNumber'}\n              placeholder={'Enter PO number (optional)'}\n              required={false}\n            />\n            {/* <div className=\"PaymentTypeOption\">\n              <FormCheckboxField\n                field={'byCard'}\n                label={'Pay by card'}\n                onlyOneOptionSelected={() => setFieldValue('byInvoice', false)}\n              />\n              <span>£{formatNumber(price.total)}</span>\n            </div> */}\n            <label className={'PaymentTypeOption'}>\n              <input\n                type=\"radio\"\n                name=\"payment-type\"\n                className=\"HiddenInput\"\n                checked={values.byCard}\n                onChange={() => {\n                  setFieldValue('byCard', true);\n                  setFieldValue('byInvoice', false);\n                }}\n              />\n              <label className=\"CustomInput\" htmlFor={'byCard'}>\n                Pay by card\n                <span>£{formatPrice(price.total)}</span>\n              </label>\n            </label>\n            {/* <div className=\"PaymentTypeOption\">\n              <FormCheckboxField\n                field={'byInvoice'}\n                label={'Pay by invoice'}\n                onlyOneOptionSelected={() => setFieldValue('byCard', false)}\n              />\n              <span>£{formatNumber(price.total)}</span>\n            </div> */}\n            <label className={'PaymentTypeOption'}>\n              <input\n                type=\"radio\"\n                name=\"payment-type\"\n                className=\"HiddenInput\"\n                checked={values.byInvoice}\n                onChange={() => {\n                  setFieldValue('byInvoice', true);\n                  setFieldValue('byCard', false);\n                }}\n              />\n              <label className=\"CustomInput\" htmlFor={'byInvoice'}>\n                Pay by invoice\n                <span>£{formatPrice(price.total)}</span>\n              </label>\n            </label>\n            <p>Enter email address to send card receipt / invoice to:</p>\n            <div className=\"FinanceEmailField\">\n              <FormTextField\n                field={'FinanceEmail'}\n                placeholder={'Email address'}\n                required={true}\n                value={values.FinanceEmail}\n              />\n            </div>\n            <button\n              className=\"Btn BtnOrange\"\n              type=\"submit\"\n              disabled={isSubmitting || (!values.byCard && !values.byInvoice) || values.FinanceEmail === \"\"}\n            >\n              {isSubmitting ? (\n                <ThreeBounce size={10} color={'#ffffff'} />\n              ) : (\n                'Save and continue'\n              )}\n            </button>\n          </Form>\n        )}\n      </Formik>\n    </div>\n  );\n};\n","import React from 'react';\n\ntype Props = {\n  title: string;\n  message: string;\n  buttonText: string;\n  buttonOnClick: () => void;\n};\n\nconst ConfirmationBox: React.FC<Props> = ({\n  title,\n  message,\n  buttonText,\n  buttonOnClick,\n}) => {\n  return (\n    <div className=\"ConfirmationBox\">\n      <span className=\"ConfirmIcon\"></span>\n      <h2>{title}</h2>\n      <p>{message}</p>\n      <button onClick={buttonOnClick} className=\"Btn BtnOrange\">\n        {buttonText}\n      </button>\n    </div>\n  );\n};\n\nexport default ConfirmationBox;\n","import React, { useEffect, useState } from 'react';\nimport { RouteComponentProps, useNavigate } from '@reach/router';\nimport { NewSubscriptionParser, NewSubscriptionStep } from './models';\nimport { ChoosePackageForm } from 'components/choosePackageForm/ChoosePackageForm';\nimport FormHeader from 'components/formHeader/FormHeader';\nimport Page from 'components/shared/Page';\nimport PaymentDetailsForm from 'components/paymentDetailsForm/PaymentDetailsForm';\nimport { PaymentTypeForm } from 'components/paymentTypeForm/PaymentTypeForm';\nimport { useDispatch } from 'react-redux';\nimport {\n  clearPackageForm,\n  clearPoNumber,\n  setValidPromoCode,\n} from 'reducers/misc';\nimport ConfirmationBox from 'components/confirmationBox/ConfirmationBox';\nimport { AppPath, PUBLIC_SITE_URL } from 'appConstants';\n\nconst INVOICE_SUCCESS_MESSAGE = {\n  title: 'Congratulations',\n  message: 'You will shortly be contacted by email',\n  buttonText: 'Dashboard',\n};\n\nexport const NewSubscription: React.FC<RouteComponentProps> = () => {\n  const dispatch = useDispatch();\n  const navigate = useNavigate();\n\n  const [activeStep, setActiveSet] = useState<NewSubscriptionStep>(\n    NewSubscriptionStep.CHOOSE_PACKAGE\n  );\n\n  useEffect(() => {\n    return () => {\n      dispatch(clearPackageForm());\n      dispatch(clearPoNumber());\n      dispatch(setValidPromoCode(''));\n    };\n  }, []);\n  return (\n    <Page>\n      <div className=\"PageContent WidthContent NewSubscriptionPage\">\n        <div className=\"SubscriptionPageHead\">\n          <div className=\"WhatsIncludedBtn\">\n            <a\n              aria-current=\"page\"\n              className=\"Btn BtnOrange\"\n              href={`${PUBLIC_SITE_URL}/pricing`}\n            >\n              What's included?\n            </a>\n          </div>\n          <FormHeader\n            activeStep={activeStep < 3 ? activeStep + 1 : 3}\n            numOfSteps={3}\n            title={NewSubscriptionParser.getPageHeaderInfo(activeStep).title}\n            nextStep={\n              NewSubscriptionParser.getPageHeaderInfo(activeStep).nextStep\n            }\n          />\n        </div>\n        {activeStep === NewSubscriptionStep.CHOOSE_PACKAGE && (\n          <ChoosePackageForm\n            onSubmit={() => setActiveSet(NewSubscriptionStep.PAYMENT_TYPE)}\n          />\n        )}\n\n        {activeStep === NewSubscriptionStep.PAYMENT_TYPE && (\n          <PaymentTypeForm\n            onSubmit={(typeOfPayment: 'card' | 'invoice') =>\n              typeOfPayment === 'invoice'\n                ? setActiveSet(NewSubscriptionStep.CONFIRMATION)\n                : setActiveSet(NewSubscriptionStep.PAYMENT_DETAILS)\n            }\n          />\n        )}\n\n        {activeStep === NewSubscriptionStep.PAYMENT_DETAILS && (\n          <PaymentDetailsForm onSubmit={() => {}} />\n        )}\n        {activeStep === NewSubscriptionStep.CONFIRMATION && (\n          <div className=\"Success\">\n            <div className=\"ConfirmationBoxContainer\">\n              <ConfirmationBox\n                {...INVOICE_SUCCESS_MESSAGE}\n                buttonOnClick={() => navigate(AppPath.DASHBOARD)}\n              />\n            </div>\n          </div>\n        )}\n      </div>\n    </Page>\n  );\n};\n","import React from 'react';\n\ntype PageHeroProps = {\n  title: string;\n  image?: string;\n};\n\nexport const PageHero: React.FC<PageHeroProps> = ({ title, image }) => {\n  return (\n    <div className=\"PageHero\">\n      <div className={`PageHeroContent ${image ? 'WithImage' : ''}`}>\n        <h1 className=\"HeroTitle\">{title}</h1>\n        {image && <img src={image} className=\"Image\" alt=\"Hero\" />}\n      </div>\n    </div>\n  );\n};\n","const UNKOWN_ERROR_MESSAGE = 'Sorry, something went wrong. Please try again.';\n\nexport interface IProfileInfo {\n  firstName: string;\n  lastName: string;\n  emailAddress: string;\n  bEmailAlerts: boolean;\n}\n\nexport interface IProfileDeatilsForm {\n  firstName: string;\n  lastName: string;\n  emailAddress: string;\n  newPassword: string;\n  confirmNewPassword: string;\n}\n\nexport class ProfileParser {\n  public static createEmptyProfileDetails = (\n    details: IProfileInfo\n  ): IProfileDeatilsForm => ({\n    firstName: details.firstName,\n    lastName: details.lastName,\n    emailAddress: details.emailAddress,\n    newPassword: '',\n    confirmNewPassword: '',\n  });\n\n  public static parseError = (errors: any) => {\n    let error: string;\n    switch (errors[0].messageCode) {\n      case 'EmailAddress_Already_Exists':\n        error = 'Email already exists';\n        break;\n      case 'OfficeEmailAddress_Already_Exists':\n        error = 'Office email already exists';\n        break;        \n      case 'Invalid_ArchivingDate':\n        error = 'Invalid archiving date ';\n        break;\n      case 'Password_Must_Be_At_Least_Eight_Characters':\n        error = 'Password must be at least eight characters';\n        break;\n      default:\n        error = UNKOWN_ERROR_MESSAGE;\n    }\n    return error;\n  };\n}\n","import { ThreeBounce } from 'better-react-spinkit';\nimport { Spinner } from 'components/spinner/Spinner';\nimport React from 'react';\n\ntype PopoutMenuFooterProps = {\n  handlePrimaryButtonClick?: () => void;\n  handleSecondaryButtonClick?: () => void;\n  primaryButtonText?: string;\n  secondaryButtonText?: string;\n  primaryBtnColor?: string;\n  isSubmitting?: boolean;\n};\n\nexport const PopoutMenuFooter: React.FC<PopoutMenuFooterProps> = ({\n  handlePrimaryButtonClick,\n  handleSecondaryButtonClick,\n  primaryButtonText,\n  secondaryButtonText,\n  primaryBtnColor,\n  isSubmitting,\n}) => {\n  const btnColour = primaryBtnColor ? primaryBtnColor : 'BtnOrange';\n\n  return (\n    <div className=\"PopoutMenuFooter\">\n      {secondaryButtonText && handleSecondaryButtonClick && \n        <button\n          className=\"Btn BtnGrey SecondaryButton\"\n          onClick={handleSecondaryButtonClick}\n        >\n          {secondaryButtonText}\n        </button>\n      }\n      <button\n        type=\"button\"\n        className={'Btn PrimaryButton ' + btnColour}\n        onClick={handlePrimaryButtonClick && handlePrimaryButtonClick}\n        disabled={isSubmitting ? true : false}\n      >\n        {isSubmitting ? (\n          <ThreeBounce size={10} color={'#ffffff'} />\n        ) : (\n          primaryButtonText\n        )}\n      </button>\n    </div>\n  );\n};\n","import closeIcon from 'images/Icon_Cross_02.png';\nimport React from 'react';\n\ntype PopoutMenuHeaderProps = {\n  title: string;\n  handleClose: () => void;\n};\n\nexport const PopoutMenuHeader: React.FC<PopoutMenuHeaderProps> = ({\n  handleClose,\n  title,\n}) => {\n  return (\n    <div className=\"PopoutMenuTitleBar\">\n      <h1 className=\"PopoutMenuTitle\">{title}</h1>\n      <div className=\"CloseButton\" onClick={handleClose}>\n        <img src={closeIcon} className=\"CloseButtonImage\" alt=\"Close\" />\n      </div>\n    </div>\n  );\n};\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAG1BMVEUmMzlHcEwmMzkmMzkmMzkmMzkmMzkmMzkmMzkTwikdAAAACHRSTlP9AFZX1xoEVVYybPIAAADASURBVDjL3dRLFoMgDAXQyAPM/ldcLWrzeVqmrUNyD0ISIsvkJ78EO4/3CFtdmSu1ediqSiFO9JQD9qpK5OZUa7c7QogsdvE8I5HOfW6dpHcmj0EGZxPuZHSuMkYm50t4yexCrQ9JXGyKIVlSY/e8JStTarMhczmF1ncCzv569jJHevAtPRfAc8JNGE8ldEHcN0UI4a7N0hbgjUuOD/YUxiJYUkt+rqB19891HwDIAwBxAOwSbKQgjpT5IfUXo/kFfHgKxv2lmrYAAAAASUVORK5CYII=\"","import React from 'react';\nimport { PopoutMenu } from './PopoutMenu';\nimport { PopoutMenuFooter } from './PopoutMenuFooter';\nimport { PopoutMenuHeader } from './PopoutMenuHeader';\n\ntype Props = {\n  isPopup: boolean;\n  isOpen: boolean;\n  isSubmitting?: boolean;\n  position: 'left' | 'right';\n  hdrTitle: string;\n  primaryBtnTxt?: string;\n  secondaryBtnTxt?: string;\n  givenClass?: string;\n  noFooter?: boolean;\n  primaryBtnColor?: string;\n  handleClose: any;\n  handlePrimaryBtn?: any;\n  handleSecondaryBtn?: any;\n  width?: number;\n  minWidth?: number;\n  mobileMenu?: boolean;\n  zIndexVal?: number;\n  children?: any;\n};\n\nexport const PopupOrPanel: React.FC<Props> = ({\n  isPopup,\n  isOpen,\n  isSubmitting,\n  position,\n  hdrTitle,\n  primaryBtnTxt,\n  secondaryBtnTxt,\n  givenClass,\n  noFooter,\n  primaryBtnColor,\n  handleClose,\n  handlePrimaryBtn,\n  handleSecondaryBtn,\n  width,\n  minWidth,\n  mobileMenu,\n  zIndexVal,\n  children,\n}) => {\n  let handCLoseFunc = () => {\n    document.body.style.overflowY = '';\n    handleClose();\n  };\n\n  let primaryBtnFunc = () => {\n    if(primaryBtnTxt && (primaryBtnTxt?.toLowerCase() === \"close\" || primaryBtnTxt?.toLowerCase() === \"cancel\")){\n      document.body.style.overflowY = '';\n    }\n\n    handlePrimaryBtn();\n  };\n\n  let secondaryBtnFunc = () => {\n    if(secondaryBtnTxt && (secondaryBtnTxt?.toLowerCase() === \"close\" || secondaryBtnTxt?.toLowerCase() === \"cancel\")){\n      document.body.style.overflowY = '';\n    }\n\n    handleSecondaryBtn();\n  };    \n\n  return (\n    <PopoutMenu\n      isPopup={isPopup}\n      isOpen={isOpen}\n      handleClose={handCLoseFunc}\n      className={givenClass && givenClass}\n      position={position}\n      width={width}\n      minWidth={minWidth}\n      mobileMenu={mobileMenu}\n      zIndexVal={zIndexVal}\n    >\n      <PopoutMenuHeader handleClose={handCLoseFunc} title={hdrTitle} />\n\n      <div className=\"PopoutMenuContent\">{children}</div>\n\n      {!noFooter &&\n        <PopoutMenuFooter\n          primaryButtonText={primaryBtnTxt && primaryBtnTxt}\n          secondaryButtonText={secondaryBtnTxt && secondaryBtnTxt}\n          handlePrimaryButtonClick={handlePrimaryBtn && primaryBtnFunc}\n          handleSecondaryButtonClick={handleSecondaryBtn && secondaryBtnFunc}\n          primaryBtnColor={primaryBtnColor}\n          isSubmitting={isSubmitting ?? false}\n        />      \n      }\n    </PopoutMenu>\n  );\n};\n","import instance, { ApiResponse } from 'api';\nimport { AxiosError, AxiosResponse } from 'axios';\nimport { BaseApi } from 'baseApi';\nimport { endpoints } from 'endpoints.config';\nimport { IProfileDeatilsForm, ProfileParser } from 'pages/profile/models';\n\nconst UNKOWN_ERROR_MESSAGE = 'Sorry, something went wrong. Please try again.';\n\nexport class ProfileApi extends BaseApi {\n  // get profile information\n  public static getProfileDetails = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.profile.profileDetails\n      );\n\n      if (ProfileApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return ProfileApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          //TODO: build error parser\n          // const message = UsersParser.parseError(errors);\n          // return UsersApi.errorResponse(message);\n          return null;\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.errors;\n        if (errors) {\n          //TODO: build error parser\n          // const message = UsersParser.parseError(errors);\n          // return UsersApi.errorResponse(message);\n          return null;\n        }\n      }\n      return ProfileApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  // update email preferences\n  public static updateEmailPreferences = async (values: {\n    bEmailAlerts: boolean;\n  }): Promise<any> => {\n    try {\n      const payload = values;\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.profile.updateemailpreferences,\n        payload\n      );\n\n      if (ProfileApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return ProfileApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          //TODO: build error parser\n          // const message = UsersParser.parseError(errors);\n          // return UsersApi.errorResponse(message);\n          return null;\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.errors;\n        if (errors) {\n          //TODO: build error parser\n          // const message = UsersParser.parseError(errors);\n          // return UsersApi.errorResponse(message);\n          return null;\n        }\n      }\n      return ProfileApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  // update Profile details\n  public static updateProfileDetails = async (\n    values: IProfileDeatilsForm\n  ): Promise<any> => {\n    try {\n      const payload = values;\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.profile.updateprofile,\n        payload\n      );\n\n      if (ProfileApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return ProfileApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = ProfileParser.parseError(errors);\n          return ProfileApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = ProfileParser.parseError(errors);\n          return ProfileApi.errorResponse(message);\n        }\n      }\n      return ProfileApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n}\n","import React, { useState } from 'react';\nimport { Formik, Form, FormikHelpers } from 'formik';\nimport * as Yup from 'yup';\nimport { IProfileDeatilsForm, IProfileInfo, ProfileParser } from './models';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport { PopupOrPanel } from 'components/popupsAndPanels/PopupAndPanels';\nimport { ProfileApi } from 'api/profileAPI';\nimport FormGeneralError from 'components/formComponents/FormGeneralError';\nimport { useDispatch } from 'react-redux';\nimport { setUserInitials } from 'reducers/auth';\nimport { PASSWORD_REGEX } from 'appConstants';\n\ntype Props = {\n  updateIsOpen: boolean;\n  handleMenuClose: () => void;\n  profileDetails: IProfileInfo;\n  setProfileDetails: React.Dispatch<React.SetStateAction<IProfileInfo | null>>;\n};\n\nconst validationSchema = Yup.object({\n  firstName: Yup.string().required('First name is required'),\n  lastName: Yup.string().required('Last name is required'),\n  emailAddress: Yup.string()\n    .email('Please enter a valid email address')\n    .required('Email address is required'),\n  newPassword: Yup.string()\n    .required('Password is required')\n    .min(8, 'Password must contain between  8 and 20 characters')\n    .max(20, 'Password must contain between  8 and 20 characters')\n    .matches(\n      PASSWORD_REGEX,\n      'Password must contain at least one number and one letter'\n    ),\n  confirmNewPassword: Yup.string()\n    .required('Confirm password is required')\n    .oneOf([Yup.ref('newPassword'), null], 'Passwords must match'),\n});\n\nexport const UpdateProfileForm: React.FC<Props> = ({\n  updateIsOpen,\n  handleMenuClose,\n  profileDetails,\n  setProfileDetails,\n}) => {\n  const dispatch = useDispatch();\n  const [error, setError] = useState<string>('');\n\n  const handleSubmit = async (\n    values: IProfileDeatilsForm,\n    { setSubmitting }: FormikHelpers<IProfileDeatilsForm>\n  ) => {\n    setSubmitting(true);\n    const result = await ProfileApi.updateProfileDetails(values);\n    if (result.data) {\n      setProfileDetails(result.data);\n      const userInitials = `${result.data.firstName.slice(\n        0,\n        1\n      )}${result.data.lastName?.slice(0, 1)}`;\n      dispatch(setUserInitials(userInitials.toUpperCase()));\n      window.localStorage.setItem('UI', userInitials.toUpperCase());\n      setSubmitting(false);\n      handleMenuClose();\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n      setError(error);\n      setSubmitting(false);\n    }\n  };\n\n  return (\n    <Formik\n      initialValues={ProfileParser.createEmptyProfileDetails(profileDetails)}\n      validationSchema={validationSchema}\n      onSubmit={(values, formikHelpers) => handleSubmit(values, formikHelpers)}\n    >\n      {({ values, submitForm, isSubmitting }) => (\n        <PopupOrPanel\n          isPopup={false}\n          isOpen={updateIsOpen}\n          isSubmitting={isSubmitting}\n          position=\"right\"\n          hdrTitle=\"Update profile\"\n          primaryBtnTxt=\"Update\"\n          secondaryBtnTxt=\"Cancel\"\n          givenClass=\"ProfilePopoutMenu\"\n          handleClose={handleMenuClose}\n          handlePrimaryBtn={submitForm}\n          handleSecondaryBtn={handleMenuClose}\n          width={560}\n        >\n          <FormGeneralError message={error} />\n          <Form>\n            <FormTextField\n              label=\"First name\"\n              field=\"firstName\"\n              required={true}\n              labelPosition=\"left\"\n              value={values.firstName}\n            />\n            <FormTextField\n              label=\"Last name\"\n              field=\"lastName\"\n              required={true}\n              labelPosition=\"left\"\n              value={values.lastName}\n            />\n            <FormTextField\n              label=\"Email address\"\n              field=\"emailAddress\"\n              required={true}\n              labelPosition=\"left\"\n              value={values.emailAddress}\n            />\n            <FormTextField\n              label=\"Password\"\n              field=\"newPassword\"\n              type=\"password\"\n              labelPosition=\"left\"\n              required={true}\n              value={values.newPassword}\n            />\n            <FormTextField\n              label=\"Confirm password\"\n              field=\"confirmNewPassword\"\n              type=\"password\"\n              labelPosition=\"left\"\n              required={true}\n              value={values.confirmNewPassword}\n            />\n          </Form>\n        </PopupOrPanel>\n      )}\n    </Formik>\n  );\n};\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgCAMAAAC8EZcfAAAAPFBMVEVHcExldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHi7EppYAAAAE3RSTlMAlUiiGs5189qFBVLnJzLEtw9con+6YQAAAbdJREFUGBntwEmunTAUBNAyuKWH2v9ek1EG+WDeIxLXkepARERERERERERERERERP5v++jWiZxWN+5oz9In/pH6BW3Ze/6l39GQOfOHPKMZy8QT04JGLImn0oIm+IkXJo8WrLy0ogEHKw7YC6wIMDezaoa1g1UHrBVWFVjrWdXD2saqDdYCqwKsZVZlWMusyrCWWJVgLbEqwVpiVYK1iVUTrGVWZdhyObEqZQdDOz+ww1DirQRLgbcCLDnecrB08NYBS563PEwF3giwFXkjwpZPrEoexrrCitLB3JB4KQ1owMZLG1oQeSmiBTMvzWhC4IWANoy8MKIRhacKWuF5yqMVM0/NaEXHUx1acfDUgVZEnopowjD2gadCPw6w5svEiql4GBrGjbe2cYANXyZ+ZCoe7+s2fmHr8Ko9Zn4pxx1v8SXxgVQ8XlESH0oFb4h8LOIVjg85vMTxEYfXOD7g8KLIr0W8akz8ShrxsjnwC2HG64bCj5UBFpaVH1kXWBkzb+URhoYjsCocA4wtfeKF1C9owdC5zB+y6wa0w3exX3MiyZTXPnYeIiIiIiIiIiIiIiIiIiIi/+IXBM2jk8Y46TcAAAAASUVORK5CYII=\"","export default __webpack_public_path__ + \"static/media/Img_Profile.43b500ef.png\";","import { useCallback, useEffect } from 'react';\nimport { ProfileApi } from 'api/profileAPI';\nimport { IProfileInfo } from 'pages/profile/models';\n\nexport const useFetchProfileDetails = (\n  setProfileDetails: React.Dispatch<React.SetStateAction<IProfileInfo | null>>\n) => {\n  const fetchProfileDetails = useCallback(async () => {\n    const result = await ProfileApi.getProfileDetails();\n    if (result.data) {\n      const data = result.data;\n      setProfileDetails(data);\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n    }\n  }, []);\n\n  useEffect(() => {\n    fetchProfileDetails();\n  }, []);\n};\n\nexport default useFetchProfileDetails;\n","import { RouteComponentProps } from '@reach/router';\nimport { PageHero } from '../../components/pageHero/PageHero';\nimport Page from '../../components/shared/Page';\nimport { PopupOrPanel } from '../../components/popupsAndPanels/PopupAndPanels';\nimport { UpdateProfileForm } from './UpdateProfileForm';\nimport placeholderProfileImage from '../../images/Icon_Profile_01.png';\nimport profileHeroImage from '../../images/Img_Profile.png';\nimport React, { useState } from 'react';\nimport { IProfileInfo } from './models';\nimport useFetchProfileDetails from 'hooks/useFetchProfiledetails';\nimport { ProfileApi } from 'api/profileAPI';\n\nexport const Profile: React.FC<RouteComponentProps> = () => {\n  const [updateIsOpen, setUpdateIsOpen] = useState(false);\n  const [isSubmitting, setSubmitting] = useState(false);\n  const [profileDetails, setProfileDetails] = useState<IProfileInfo | null>(\n    null\n  );\n\n  useFetchProfileDetails(setProfileDetails);\n\n  const updateEmailPreferences = async (emailAlertValue: boolean) => {\n    if (!profileDetails) return;\n    setSubmitting(true);\n    const result = await ProfileApi.updateEmailPreferences({\n      bEmailAlerts: emailAlertValue,\n    });\n    if (result.data) {\n      setSubmitting(false);\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n      setSubmitting(false);\n      const newState = {\n        ...profileDetails,\n        bEmailAlerts: !emailAlertValue,\n      };\n      setProfileDetails(newState);\n    }\n  };\n\n  const toggleEmailAlerts = (\n    e: React.MouseEvent<HTMLLabelElement, MouseEvent>\n  ) => {\n    e.preventDefault();\n\n    const emailAlertValue = !profileDetails?.bEmailAlerts;\n\n    if (!profileDetails) return;\n    const newState = {\n      ...profileDetails,\n      bEmailAlerts: emailAlertValue,\n    };\n    setProfileDetails(newState);\n\n    updateEmailPreferences(emailAlertValue);\n  };\n\n  const handleMenuClose = () => {\n    setUpdateIsOpen(false);\n  };\n\n  return (\n    <Page>\n      <div className=\"PageContent ProfilePage\">\n        <PageHero\n          title={`${profileDetails?.firstName ?? ''} ${\n            profileDetails?.lastName ?? ''\n          }`}\n          image={profileHeroImage}\n        />\n        <div className=\"WidthContent\">\n          <div className=\"ProfileSection Top\">\n            <div className=\"FlexLeft\">\n              <div className=\"ProfileImageContainer\">\n                <img src={placeholderProfileImage} alt=\"Profile\" />\n              </div>\n              <div className=\"ProfileInfo\">\n                <h5 className=\"Name\">{`${profileDetails?.firstName ?? ''} ${\n                  profileDetails?.lastName ?? ''\n                }`}</h5>\n                <p className=\"Email\">{profileDetails?.emailAddress ?? ''}</p>\n                <p className=\"Password\">••••••••••••••</p>\n              </div>\n            </div>\n            <button\n              className=\"Btn BtnLightOrange UpdateButton\"\n              onClick={() => setUpdateIsOpen(true)}\n              disabled={profileDetails ? false : true}\n            >\n              Update details\n            </button>\n          </div>\n          <label\n            className={`ProfileSection CheckboxSection ${\n              profileDetails?.bEmailAlerts ? 'Checked' : ''\n            }`}\n            onClick={toggleEmailAlerts}\n          >\n            <div className=\"FormBox \">\n              <div className=\"Checkbox\">\n                <input\n                  type=\"checkbox\"\n                  checked={profileDetails?.bEmailAlerts}\n                  disabled={\n                    profileDetails ? (isSubmitting ? true : false) : true\n                  }\n                />\n                <div className=\"CustomInput Black\">Receive email alert</div>\n              </div>\n            </div>\n          </label>\n        </div>\n\n        {/* Update profile form */}\n\n        {profileDetails && updateIsOpen && (\n          <UpdateProfileForm\n            updateIsOpen={updateIsOpen}\n            handleMenuClose={handleMenuClose}\n            profileDetails={profileDetails}\n            setProfileDetails={setProfileDetails}\n          />\n        )}\n      </div>\n    </Page>\n  );\n};\n","import React, { useState, useEffect } from 'react';\n\ntype Props = {\n  checkboxList: Array<number>;\n  setIsPanelClosed: React.Dispatch<React.SetStateAction<boolean>>;\n  name: string;\n  children?: any;\n};\n\nexport const RightMenu: React.FC<Props> = ({\n  checkboxList,\n  children,\n  setIsPanelClosed,\n  name,\n}) => {\n  const [openCloseState, setOpenCloseState] = useState<string>('Closed');\n\n  useEffect(() => {\n    if (checkboxList.length) {\n      setIsPanelClosed(false);\n      setOpenCloseState('Open');\n    } else {\n      setIsPanelClosed(true);\n      setOpenCloseState('Closed');\n    }\n  }, [checkboxList]);\n\n  const childrenWithProps = React.Children.map(children, (child) => {\n    if (React.isValidElement(child)) {\n      return React.cloneElement(child as React.ReactElement, { openCloseState, checkboxList, name });\n    }\n    return child;\n  });\n\n  return <React.Fragment>{childrenWithProps}</React.Fragment>;\n};\n","import React, { useState, useEffect } from 'react';\nimport {\n  Form,\n  setNestedObjectValues,\n  useField,\n  useFormikContext,\n} from 'formik';\nimport DatePicker from 'react-datepicker';\nimport Select from 'react-select';\nimport { ErrorM } from 'components/formComponents/ErrorM';\nimport { Input } from 'components/formComponents/Input';\nimport { format, parse } from 'date-fns';\n\ntype Props = {\n  listData: any;\n};\n\nlet filterOptList: any = [\n  { value: 'contains', label: 'Contains' },\n  { value: 'eq', label: 'Equals' },\n];\n\nexport const TableFilters: React.FC<Props> = ({ listData }) => {\n  const [filterOpts, setFilterOpts] = useState<any>();\n\n  const formikContext = useFormikContext();\n\n  useEffect(() => {\n    if (listData) {\n      let filterOptList = [];\n\n      for (let i = 0; i < listData.columns.length; i++) {\n        if (listData.columns[i].type === 'String') {\n          filterOptList.push({\n            column: listData.columns[i].columnKey,\n            value: 'contains',\n            label: 'Contains',\n          });\n        }\n        if (listData.columns[i].type === 'DateTime') {\n          filterOptList.push({\n            column: listData.columns[i].columnKey,\n            value: 'between',\n            label: 'Between',\n          });\n        }\n        if (listData.columns[i].bFilterable) {\n          if (listData.columns[i].type === 'String') {\n            formikContext.setFieldValue(\n              listData.columns[i].columnKey + '_dropdown',\n              { value: 'contains', label: 'Contains' }\n            );\n          }\n          if (listData.columns[i].type === 'DateTime') {\n            formikContext.setFieldValue(\n              listData.columns[i].columnKey + '_dropdown',\n              { value: 'between', label: 'Between' }\n            );\n          }\n        }\n      }\n      setFilterOpts(filterOptList);\n    }\n  }, [listData]);\n\n  return (\n    <React.Fragment>\n      {listData && (\n        <Form>\n          <div className=\"ListTableFilters\">\n            {listData &&\n              listData.columns\n                .filter((i: any) => i.bFilterable)\n                .map((item: any, index: number) => {\n                  if (item.bFilterable) {\n                    if (item.type === 'String')\n                      return (\n                        <div\n                          className=\"FormBox FormSideBySide left\"\n                          key={index}\n                        >\n                          <div className=\"FormLabel\">\n                            <label>{item.labelValue}</label>\n                          </div>\n                          <div className=\"FormField\">\n                            {filterOpts && (\n                              <Select\n                                key={'filter_dropdown_' + index}\n                                isSearchable={false}\n                                options={filterOptList}\n                                value={filterOpts[index - 1]}\n                                onChange={(value) => {\n                                  formikContext.setFieldValue(\n                                    item.columnKey + '_dropdown',\n                                    value\n                                  );\n                                  let newArray = [...filterOpts];\n                                  let newVal = Object.assign(\n                                    { column: item.columnKey },\n                                    value\n                                  );\n                                  newArray[index] = newVal;\n                                  setFilterOpts(newArray);\n                                }}\n                              />\n                            )}\n                          </div>\n                          <div className=\"FormField\">\n                            <Input\n                              name={item.columnKey}\n                              type=\"text\"\n                              onKeyUp={(e: any) =>\n                                formikContext.setFieldValue(\n                                  item.columnKey,\n                                  e.target.value\n                                )\n                              }\n                            />\n                            <ErrorM name={item.columnKey} />\n                          </div>\n                        </div>\n                      );\n                    if (item.type === 'DateTime') {\n                      return (\n                        <DateTimeRangeField\n                          name={item.columnKey}\n                          label={item.labelValue}\n                          setFilterOpts={setFilterOpts}\n                          filterOpts={filterOpts}\n                          index={index}\n                        />\n                      );\n                    }\n                  } else {\n                    return null;\n                  }\n                })}\n          </div>\n        </Form>\n      )}\n    </React.Fragment>\n  );\n};\n\nfunction DateTimeRangeField(props: {\n  name: string;\n  label: string;\n  setFilterOpts: React.Dispatch<any>;\n  filterOpts: any;\n  index: number;\n  range?: boolean;\n}) {\n  const [field, , helpers] = useField(props.name);\n\n  const value = '';\n  let values = value.split('TO');\n  if (values.length !== 2) values = ['NULL', 'NULL'];\n\n  const [startDate, setStartDate] = useState<any>(null);\n\n  const [endDate, setEndDate] = useState<any>(null);\n\n  function handleChangeFirst(date: Date | null) {\n    const formattedDate = date ? format(date, 'MM/dd/yyyy') : 'NULL';\n\n    let newArray = [...props.filterOpts];\n\n    let newVal = {\n      columnKey: props.name,\n      operator: 'BETWEEN',\n      value: `${formattedDate}TO${values[1]}`,\n    };\n    newArray[props.index] = newVal;\n    props.setFilterOpts(newArray);\n\n    helpers.setValue(\n      `${formattedDate}TO${endDate ? format(endDate, 'MM/dd/yyyy') : 'NULL'}`\n    );\n  }\n\n  function handleChangeSecond(date: Date | null) {\n    const formattedDate = date ? format(date, 'MM/dd/yyyy') : 'NULL';\n\n    let newArray = [...props.filterOpts];\n    let newVal = {\n      columnKey: props.name,\n      operator: 'BETWEEN',\n      value: `${values[0]}TO${formattedDate}}`,\n    };\n    newArray[props.index] = newVal;\n    props.setFilterOpts(newArray);\n\n    helpers.setValue(\n      `${\n        startDate ? format(startDate, 'MM/dd/yyyy') : 'NULL'\n      }TO${formattedDate}`\n    );\n  }\n\n  useEffect(() => {\n    let newValues = field.value ? field.value.split('TO') : [];\n    if (newValues.length !== 2) newValues = ['NULL', 'NULL'];\n    setStartDate(() =>\n      newValues[0] === 'NULL'\n        ? null\n        : parse(newValues[0], 'MM/dd/yyyy', new Date())\n    );\n    setEndDate(() =>\n      newValues[1] === 'NULL'\n        ? null\n        : parse(newValues[1], 'MM/dd/yyyy', new Date())\n    );\n  }, [field.value]);\n\n  return (\n    <div className=\"FormBox FormSideBySide left\" key={props.index}>\n      <div className=\"FormLabel\">\n        <label>{props.label}</label>\n      </div>\n      <div className=\"FormField\">\n        <div className=\"DateFields\">\n          <DatePicker\n            // locale={userLocale}\n            className=\"EditBox\"\n            placeholderText=\"Starting at...\"\n            selected={startDate}\n            onChange={handleChangeFirst}\n            startDate={startDate}\n            endDate={endDate}\n            dateFormat=\"dd/MM/yyyy\"\n            popperModifiers={{\n              hide: {\n                enabled: false, // turn off since needs preventOverflow to be enabled\n              },\n            }}\n          />\n          <DatePicker\n            // locale={userLocale}\n            className=\"EditBox\"\n            placeholderText=\"Ending at...\"\n            selected={endDate}\n            onChange={handleChangeSecond}\n            startDate={startDate}\n            endDate={endDate}\n            minDate={startDate}\n            dateFormat=\"dd/MM/yyyy\"\n            popperModifiers={{\n              hide: {\n                enabled: false, // turn off since needs preventOverflow to be enabled\n              },\n            }}\n          />\n        </div>\n      </div>\n    </div>\n  );\n}\n","import React from 'react';\nimport { Formik } from 'formik';\nimport { PopupOrPanel } from '../../components/popupsAndPanels/PopupAndPanels';\nimport { TableFilters } from './tableFilters';\n\ntype Props = {\n  listUrl: string;\n  loadInfoTableList: (listUrl: string, paramsArr?: any) => void;\n  panelOpen: boolean;\n  togglePanelOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  listData: any;\n};\n\nexport const ListTableFilter: React.FC<Props> = ({\n  listUrl,\n  loadInfoTableList,\n  panelOpen,\n  togglePanelOpen,\n  listData\n}) => {\n\n  const handleSubmitForm = async (values: any) => {\n\n    let filterValueList: any = [];\n    let fieldsFiltered: number = 0;\n    let endpointString: string = \"\";\n  \n    //input fields\n    for (const property in values) {\n      if(property.indexOf(\"_dropdown\") === -1){\n        filterValueList.push({ \"field\": property, \"value\": values[property] });\n        ++fieldsFiltered;\n      }\n    }\n  \n    //dropdown fields\n    if(fieldsFiltered > 0){\n      for (const property in values) {\n        \n        if(property.indexOf(\"_dropdown\") !== -1){\n  \n          //check if field already exists in array\n          for(let i = 0; i < filterValueList.length; i++){\n            if(filterValueList[i].field === property.replace('_dropdown','')){\n              filterValueList[i].type = values[property].value.toUpperCase();\n            }\n          }\n  \n        }\n      }\n    }\n\n    //set up string for endpoint\n    if(filterValueList.length)  {\n      filterValueList.map((item: any, index: number) => {\n        if(index === 0){\n          endpointString += item.field + \" \" + item.type + \" (\" + item.value + \")\";\n        } else {\n          endpointString += \" | \" + item.field + \" \" + item.type + \" (\" + item.value + \")\";\n        }\n      });\n\n      loadInfoTableList(listUrl, [{ param: \"bClearFilters\", value: \"false\" }, { param: \"filters\", value: endpointString }]);\n    } else {\n      loadInfoTableList(listUrl, [{ param: \"bClearFilters\", value: \"true\" }]);\n    }\n  };  \n\n  return (\n    <Formik\n      initialValues={{}}\n      onSubmit={handleSubmitForm}\n    >   \n      {({ submitForm }) => (    \n        <PopupOrPanel\n          isPopup={false}\n          isOpen={panelOpen}\n          hdrTitle={\"Filters\"}\n          position=\"right\"\n          primaryBtnTxt=\"Submit\"\n          secondaryBtnTxt=\"Cancel\"\n          givenClass=\"ListTableFilters\"\n          handleClose={() => togglePanelOpen(false)}\n          handlePrimaryBtn={submitForm}\n          handleSecondaryBtn={() => togglePanelOpen(false)}\n          width={560}\n        >\n          <TableFilters listData={listData} />\n        </PopupOrPanel>\n      )}\n    </Formik>        \n  );\n};    ","import { of } from 'rxjs';\nimport { number } from 'yup/lib/locale';\n\n//set list endpoint url with parameters\nlet listTableUrlParamObj: any = {};\n\nexport function setUpListEndpoint(listUrl: string, newParams?: any) {\n  listTableUrlParamObj = {};\n\n  newParams &&\n    newParams.map((paramArr: any) => {\n      if (paramArr.value !== null) {\n        listTableUrlParamObj[paramArr.param] = paramArr.value;\n      } else {\n        delete listTableUrlParamObj[paramArr.param];\n      }\n    });\n\n  const urlParamStr =\n    '?' + new URLSearchParams(listTableUrlParamObj).toString();\n\n  return listUrl + urlParamStr;\n}\n\n//provide edited values from returned endpoint data for the table list\nexport function tableDataValues(infoListData: any) {\n  //returned data, one variable to edit, another as the original for backup\n  const listDataOriginal = JSON.parse(\n    JSON.stringify(Object.assign({}, infoListData))\n  );\n  const listData = infoListData;\n\n  //organised column data\n  const dataColumns = listData\n    ? listData.columns\n        .map((col: any) => {\n          col.columnKey = col.columnKey.toLowerCase();\n          return col;\n        })\n        .sort((col1: { orderNumber: number }, col2: { orderNumber: number }) =>\n          col1.orderNumber > col2.orderNumber ? 1 : -1\n        )\n    : undefined;\n\n  //list of column keys, keep after previously organised column data\n  const dataColumnKeys = listData\n    ? dataColumns.map((item: { columnKey: string }) => item.columnKey)\n    : undefined;\n\n  //organised list item data\n  const dataItems = listData\n    ? listData.listData.map((item: any) => {\n        const lcKeyNames = Object.keys(item).map((key) => {\n          const newKey = key.indexOf('__') !== -1 ? key.toLowerCase() : key;\n          return { [newKey]: item[key] };\n        });\n        const newItem = Object.assign({}, ...lcKeyNames);\n        return newItem;\n      })\n    : undefined;\n\n  //list of all id's currently seen on page\n  const allCheckedIds = listData\n    ? dataItems.map((item: any) => {\n        return item[dataColumnKeys[0]];\n      })\n    : undefined;\n\n  //find out if any of the table columns are filterable, otherwise don't show the filter icon\n  let tableToFilter =\n    listData && dataColumns.some((column: any) => column.bFilterable === true);\n\n  return {\n    listDataOriginal,\n    listData,\n    dataColumns,\n    dataColumnKeys,\n    dataItems,\n    allCheckedIds,\n    tableToFilter,\n  };\n}\n\n//pagination values\nexport function tablePaginationValues(\n  infoListData: any,\n  listUrl: string,\n  loadInfoTableList: (listUrl: string, paramsArr?: any) => void\n) {\n  //returned data, one variable to edit, another as the original for backup\n  const listData = infoListData;\n\n  //page number\n  const pageNumber = listData && (infoListData.pageNumber === 0 ? 1 : infoListData.pageNumber);\n\n  //page size\n  const pageSize = listData && infoListData.pageSize;\n\n  //total item number\n  const resultsCount = listData && infoListData.resultsCount;\n\n  //total number of pages\n  const countDividedBySize = Math.ceil(resultsCount / pageSize);\n  const totalPages = !countDividedBySize || !pageSize ? 1 : Math.ceil(resultsCount / pageSize);\n\n  //dropdown values\n  let ddValArr = [];\n  if(listData){\n    for(let k = 0; k < listData.resultsCount; k++){\n      if(k > 0 && k % 10 === 0){\n        ddValArr.push(k);\n      }\n    }\n\n    if(listData.resultsCount < 10){\n      ddValArr.push(10);\n    }    \n\n    if(listData.resultsCount > ddValArr[ddValArr.length - 1]){\n      ddValArr.push(ddValArr[ddValArr.length - 1] + 10);\n    }\n\n    if(ddValArr.length <= 0){\n      ddValArr.push(10);\n    }\n  }\n\n  //page item start and end numbers\n  let itemNumCounter = resultsCount;\n  for (let i = 1; i < pageNumber; i++) {\n    itemNumCounter -= pageSize;\n  }\n  let itemNumStart = resultsCount - itemNumCounter + 1;\n  let itemNumEnd =\n    resultsCount - itemNumCounter + pageSize > resultsCount\n      ? resultsCount\n      : resultsCount - itemNumCounter + pageSize;\n\n  //make previous and next pagination buttons active\n  let previousBtnsInactive = pageNumber === 1;\n\n  let nextBtnsInactive =\n    (resultsCount - itemNumCounter + pageSize >= resultsCount) || !pageSize;\n\n  //go to page via dropdown\n  function pageSizeViaDropdown(event: any) {\n    loadInfoTableList(listUrl, [\n      { param: 'pageSize', value: parseInt(event.target.value) },\n      { param: 'pageNumber', value: 1 },\n    ]);\n  }\n\n  //go to page via input number\n  function goToPageViaInput(event: any) {\n    //check key code\n    let keynum;\n\n    if (window.event) {\n      // IE\n      keynum = event.keyCode;\n    } else if (event.which) {\n      // Netscape/Firefox/Opera\n      keynum = event.which;\n    }\n\n    //check value is a number, otherwise provide last entry\n    if (\n      !isNaN(event.target.value) &&\n      parseInt(event.target.value) &&\n      !(parseInt(event.target.value) > totalPages)\n    ) {\n      //if enter pressed (code 13) trigger load refresh\n      if (keynum === 13) {\n        loadInfoTableList(listUrl, [\n          { param: 'pageNumber', value: parseInt(event.target.value) },\n        ]);\n      }\n    } else {\n      //event.target.value = pageNumber;\n    }\n  }\n\n  //go to first page\n  function goToFirstPage() {\n    loadInfoTableList(listUrl, [{ param: 'pageNumber', value: 1 }]);\n  }\n\n  //go to previous page\n  function goToPreviousPage() {\n    loadInfoTableList(listUrl, [\n      { param: 'pageNumber', value: listData.pageNumber - 1 },\n    ]);\n  }\n\n  //go the next page\n  function goToNextPage() {\n    loadInfoTableList(listUrl, [\n      { param: 'pageNumber', value: listData.pageNumber + 1 },\n    ]);\n  }\n\n  //go to last page\n  function goToLastPage() {\n    loadInfoTableList(listUrl, [{ param: 'pageNumber', value: totalPages }]);\n  }\n\n  return {\n    pageNumber,\n    pageSize,\n    resultsCount,\n    totalPages,\n    ddValArr,\n    itemNumStart,\n    itemNumEnd,\n    previousBtnsInactive,\n    nextBtnsInactive,\n    pageSizeViaDropdown,\n    goToPageViaInput,\n    goToFirstPage,\n    goToPreviousPage,\n    goToNextPage,\n    goToLastPage,\n  };\n}\n\n//set up first column width detection\nexport function firstColWidthDetect(\n  isDesktopOrLaptop: boolean,\n  lgColWidth: number | undefined,\n  smColWidth: number | undefined\n) {\n  //default width inherit\n  let firstColWidth = 'inherit';\n\n  //add large screen width\n  if (lgColWidth) {\n    if (!isDesktopOrLaptop) {\n      firstColWidth = lgColWidth + 'px';\n    }\n  }\n\n  //add small screen width\n  if (smColWidth) {\n    if (isDesktopOrLaptop) {\n      firstColWidth = smColWidth + 'px';\n    }\n  }\n\n  return firstColWidth;\n}\n\n//check item values types and convert accordingly, e.g. money, dates\nexport function checkItemValType(item: any, column: string) {\n  switch (true) {\n    case column.toLowerCase().indexOf('date') !== -1:\n      const newDate =\n        item[column].indexOf('T') !== -1\n          ? item[column].split('T')[0].split('-').reverse().join('/')\n          : item[column].split('-').reverse().join('/');\n\n      return newDate;\n    case column.toLowerCase().indexOf('amount') !== -1:\n      return '£' + item[column].toFixed(2);\n    default:\n      return item[column];\n  }\n}\n\n//toggle all list checkboxes\nexport function toggleSelectAll(\n  event: React.ChangeEvent<HTMLInputElement>,\n  setCheckedIds: React.Dispatch<React.SetStateAction<any[]>>,\n  allChkChecked: Array<number>,\n  getSelectedIdsFunc?: any,\n  getSelectedOpts?: any,\n) {\n  if (event.target.checked) {\n    if(getSelectedOpts){\n      getSelectedIdsFunc(allChkChecked);\n    }\n\n    setCheckedIds(allChkChecked);\n  } else {\n    if(getSelectedOpts){\n      getSelectedIdsFunc([]);\n    }  \n\n    setCheckedIds([]);  \n  }\n}\n\n//toggle checkboxes\nexport function toggleCurrentChkBox(\n  checkboxList: Array<number>,\n  setCheckboxList: React.Dispatch<React.SetStateAction<number[]>>,\n  setSelectedRowName: React.Dispatch<React.SetStateAction<string>>,\n  currentId: number,\n  rowName: string,\n  allowSelectAll: boolean,\n  getSelectedIdsFunc?: any,\n  getSelectedOpts?: any,\n) {\n  const isChecked =\n    checkboxList.filter((id) => {\n      return id === currentId;\n    }).length > 0;\n\n  if (isChecked) {\n    setCheckboxList((ids) => {\n        if(getSelectedOpts){\n          getSelectedIdsFunc(ids.filter((i) => {\n            return i.toString() !== currentId.toString();\n          }));\n        }\n\n        return ids.filter((i) => {\n          return i.toString() !== currentId.toString();\n        });\n      }\n    );\n    setSelectedRowName('');\n  } else {\n    if (allowSelectAll) {\n      setCheckboxList((ids) => {\n        if(getSelectedOpts){\n          getSelectedIdsFunc([...ids, currentId]);\n        }\n\n        return [...ids, currentId];\n      });\n      setSelectedRowName('');\n    } else {\n      setCheckboxList([currentId]);\n      setSelectedRowName(rowName);\n    }\n  }\n}\n\n//check/uncheck checkboxes\nexport function assignCheck(checkboxList: Array<number>, currentId: number) {\n  return (\n    checkboxList.filter((id) => {\n      return id === currentId;\n    }).length > 0\n  );\n}\n\n//sort table data by column\nexport function sortCol(\n  columnKey: string,\n  listUrl: string,\n  loadInfoTableList: (listUrl: string, paramsArr?: any) => void,\n  infoListData?: any\n) {\n  if (infoListData.sortBy) {\n    const currentSortCol: string = infoListData.sortBy.substr(\n      0,\n      infoListData.sortBy.indexOf(' ')\n    );\n    const currentSortBy: string = infoListData.sortBy.substring(\n      infoListData.sortBy.lastIndexOf(' ')\n    );\n    let newSortBy = null;\n\n    if (currentSortCol.indexOf(columnKey) !== -1) {\n      const sortCheck = currentSortBy === ' DESC' ? ' ASC' : '';\n      newSortBy = sortCheck === '' ? null : columnKey + sortCheck;\n    } else {\n      newSortBy = columnKey + ' DESC';\n    }\n\n    loadInfoTableList(listUrl, [{ param: 'sortBy', value: newSortBy }]);\n  } else {\n    loadInfoTableList(listUrl, [\n      { param: 'sortBy', value: columnKey + ' DESC' },\n    ]);\n  }\n}\n","import React, { useState, useEffect, Dispatch } from 'react';\nimport { RightMenu } from './rightMenu';\nimport { ListTableFilter } from './listTableFilter';\nimport {\n  tableDataValues,\n  firstColWidthDetect,\n  checkItemValType,\n  toggleSelectAll,\n  toggleCurrentChkBox,\n  assignCheck,\n  sortCol,\n} from './listTableHelpers';\nimport { useMediaQuery } from 'react-responsive';\nimport SortBy04 from '../../images/Icon_Filter.png';\nimport ActionIcon from '../../images/Icon_Action.png';\nimport ClearFilters from '../../images/Icon_Clear_Filter.png';\n\ntype Props = {\n  infoListData?: any;\n  firstColWidth?: number;\n  firstColWidthSm?: number;\n  listUrl: string;\n  loadInfoTableList: (listUrl: string, paramsArr?: any) => void;\n  dropdrownMenuOptions:\n    | ((\n        ids: number,\n        name: string,\n        closeMenu: () => void,\n        openCloseState: { open: boolean; id: number | null }\n      ) => JSX.Element)\n    | null;\n  setIsPanelClosed: React.Dispatch<React.SetStateAction<boolean>>;\n  isPanelClosed: boolean;\n  allowSelectAll: boolean;\n  filterTable?: boolean;\n  noResultsMessage?: string | null;\n  hideSideMenu?: boolean;\n  getSelectedOpts?: any;\n  rowHighlight?: boolean;\n  hideChkboxCol?: boolean;\n  children?: any;\n  // TODO: Generic type to matchinfoListData type\n  rowClassname?: (row: any) => string;\n};\n\nexport const ListTable: React.FC<Props> = ({\n  infoListData,\n  firstColWidth,\n  firstColWidthSm,\n  listUrl,\n  loadInfoTableList,\n  children,\n  dropdrownMenuOptions,\n  setIsPanelClosed,\n  isPanelClosed,\n  allowSelectAll,\n  filterTable = true,\n  noResultsMessage,\n  hideSideMenu,\n  getSelectedOpts,\n  rowHighlight,\n  hideChkboxCol,\n  rowClassname = () => '',\n}) => {\n  const {\n    listDataOriginal,\n    listData,\n    dataColumns,\n    dataColumnKeys,\n    dataItems,\n    allCheckedIds,\n    tableToFilter,\n  } = tableDataValues(infoListData);\n  const firstColWidthDetails = firstColWidthDetect(\n    useMediaQuery({ query: '(max-width: 1024px)' }),\n    firstColWidth,\n    firstColWidthSm\n  );\n  const [checkboxList, setCheckboxList] = useState<Array<number>>([]);\n  const [selectedRowName, setSelectedRowName] = useState<string>('');\n  const [openFiltersPopup, setFiltersPopup] = useState<boolean>(false);\n  const [openDropdownMenu, setDropdownMenu] = useState<{\n    open: boolean;\n    id: null | number;\n  }>({\n    open: false,\n    id: null,\n  });\n  const [sortByCol, setSortByCol] = useState<any>(null);\n\n  function itemOptions(itemId: number) {\n    setDropdownMenu((state) => ({\n      open: !state.open,\n      id: state.open ? null : itemId,\n    }));\n  }\n\n  function getSelectedIdsFunc(ids_list: any) {\n    let optList = [];\n\n    for(let i = 0; i < dataItems.length; i++){\n      for(let j = 0; j < ids_list.length; j++){\n        if(dataItems[i][getSelectedOpts.id] === ids_list[j]){\n          optList.push(dataItems[i]);\n        }\n      }\n    }\n\n    getSelectedOpts.getOpts(optList);    \n  }\n\n  useEffect(() => {\n    if (infoListData && infoListData.sortBy) {\n      const sortByCol = infoListData.sortBy.substr(\n        0,\n        infoListData.sortBy.indexOf(' ')\n      );\n      const sortByVal = infoListData.sortBy.substring(\n        infoListData.sortBy.lastIndexOf(' ') + 1\n      );\n      setSortByCol({ sortCol: sortByCol, sortVal: sortByVal });\n    }\n  }, [infoListData]);\n\n  return (\n    <React.Fragment>\n      {listData && (\n        <React.Fragment>\n          <div className={\"InfoTable\" + (hideChkboxCol ? \" HideChkboxCol\" : \"\")}>\n            <div className=\"LeftTable\">\n              <div className=\"Head\">\n                <div className=\"Cell CheckboxCell\">\n                  {allowSelectAll && (\n                    <div className=\"Checkbox\">\n                      <input\n                        id=\"toggleSelectAll\"\n                        type=\"checkbox\"\n                        onChange={(event) =>\n                          toggleSelectAll(\n                            event, \n                            setCheckboxList, \n                            allCheckedIds,\n                            getSelectedIdsFunc,\n                            getSelectedOpts                           \n                          )\n                        }\n                      />\n                      <label\n                        className=\"CustomInput\"\n                        htmlFor=\"toggleSelectAll\"\n                      />\n                    </div>\n                  )}\n                </div>\n                <div\n                  className={\n                    'Cell SecondCol' + (dataColumns[1].bSortable ? ' Sortable' : '')\n                  }\n                  style={{\n                    minWidth: firstColWidthDetails,\n                    maxWidth: firstColWidthDetails,\n                  }}\n                  key={dataColumnKeys[1]}\n                  onClick={() =>\n                    sortCol(\n                      dataColumnKeys[1],\n                      listUrl,\n                      loadInfoTableList,\n                      infoListData\n                    )\n                  }\n                >\n                  <span className=\"Txt\">{dataColumns[1].labelValue}</span>\n                  {dataColumns[1].bSortable && (\n                    <i\n                      className={\n                        'SortIcon' +\n                        (sortByCol && sortByCol.sortCol === dataColumnKeys[1]\n                          ? ' ' + sortByCol.sortVal\n                          : '')\n                      }\n                    ></i>\n                  )}\n                </div>\n              </div>\n              <div className=\"TableBody\">\n                {dataItems.map((item: any) => {\n                  return (\n                    <div className={\"Row\" + (rowHighlight && assignCheck(\n                      checkboxList,\n                      item[dataColumnKeys[0]]\n                    ) === true ? \" Highlight\" : \"\") + ` ${rowClassname(item)}`} key={item[dataColumnKeys[0]]}>\n                      <div className=\"Cell CheckboxCell\">\n                        <div className=\"Checkbox\">\n                          <input\n                            id={item[dataColumnKeys[0]]}\n                            type=\"checkbox\"\n                            checked={assignCheck(\n                              checkboxList,\n                              item[dataColumnKeys[0]]\n                            )}\n                            onChange={() => {\n                              toggleCurrentChkBox(\n                                checkboxList,\n                                setCheckboxList,\n                                setSelectedRowName,\n                                item[dataColumnKeys[0]],\n                                item[dataColumnKeys[1]],\n                                allowSelectAll,\n                                getSelectedIdsFunc,\n                                getSelectedOpts\n                              );\n                            }}\n                          />\n                          <label\n                            className=\"CustomInput\"\n                            htmlFor={item[dataColumnKeys[0]]}\n                          />\n                        </div>\n                      </div>\n                      <div\n                        className=\"Cell SecondCol\"\n                        style={{\n                          minWidth: firstColWidthDetails,\n                          maxWidth: firstColWidthDetails,\n                        }}\n                      >\n                        <span className=\"Txt\">{item[dataColumnKeys[1]]}</span>\n                      </div>\n                    </div>\n                  );\n                })}\n              </div>\n            </div>\n\n            <div className=\"MiddleTable\">\n              <div className=\"Head\">\n                {dataColumns.map((column: any, index: number) => {\n                  if (index > 1) {\n                    return (\n                      <div\n                        className={\n                          'Cell' + (column.bSortable ? ' Sortable' : '')\n                        }\n                        data-head-column-key={column.columnKey}\n                        key={dataColumnKeys[index]}\n                        onClick={() =>\n                          sortCol(\n                            dataColumnKeys[index],\n                            listUrl,\n                            loadInfoTableList,\n                            infoListData\n                          )\n                        }\n                      >\n                        <span className=\"Txt\">{column.labelValue}</span>\n                        {column.bSortable && (\n                          <i\n                            className={\n                              'SortIcon' +\n                              (sortByCol &&\n                              sortByCol.sortCol === dataColumnKeys[index]\n                                ? ' ' + sortByCol.sortVal\n                                : '')\n                            }\n                          ></i>\n                        )}\n                      </div>\n                    );\n                  }\n                })}\n              </div>\n              <div className=\"TableBody\">\n                {dataItems.map((item: any, itemIndex: number) => {\n                  return (\n                    <div className={\"Row\" + (rowHighlight && assignCheck(\n                      checkboxList,\n                      item[dataColumnKeys[0]]\n                    ) === true ? \" Highlight\" : \"\") + ` ${rowClassname(item)}`} key={'item_row_' + itemIndex}>\n                      {dataColumnKeys.map((column: any, colIndex: number) => {\n                        if (colIndex > 1) {\n                          const itemVal = checkItemValType(item, column);\n                          return (\n                            <div\n                              className=\"Cell\"\n                              key={'item_info_' + itemIndex + '_' + colIndex}\n                              data-body-column-key={column}\n                            >\n                              <span className=\"Txt\">{itemVal}</span>\n                            </div>\n                          );\n                        }\n                      })}\n                    </div>\n                  );\n                })}\n              </div>\n            </div>\n\n            <div className=\"RightTable\">\n              <div className=\"Head\">\n                {tableToFilter && filterTable ? (\n                  <div\n                    className=\"Cell NoSortIcon FilterCell\"\n                    onClick={() =>\n                      listData.filters\n                        ? loadInfoTableList(listUrl, [\n                            { param: 'bClearFilters', value: 'true' },\n                            { param: 'filters', value: '' },\n                          ])\n                        : setFiltersPopup(true)\n                    }\n                  >\n                    {listData.filters ? (\n                      <img\n                        src={ClearFilters}\n                        alt=\"ClearFilter\"\n                        className=\"FilterIcon\"\n                      />\n                    ) : (\n                      <img src={SortBy04} alt=\"Filter\" className=\"FilterIcon\" />\n                    )}\n                  </div>\n                ) : (\n                  <div className=\"Cell NoSortIcon\"></div>\n                )}\n              </div>\n              <div className=\"TableBody\">\n                {dataItems.map((item: any, index: number) => {\n                  return (\n                    <div className={\"Row\" + (rowHighlight && assignCheck(\n                      checkboxList,\n                      item[dataColumnKeys[0]]\n                    ) === true ? \" Highlight\" : \"\") + ` ${rowClassname(item)}`} key={'item_options_' + index}>\n                      <div\n                        className=\"Cell RowOptionCell\"\n                        style={!isPanelClosed ? { cursor: 'default' } : {}}\n                      >\n                        <img\n                          src={ActionIcon}\n                          alt=\"Options\"\n                          className=\"Icon\"\n                          onClick={() => itemOptions(item[dataColumnKeys[0]])}\n                          style={\n                            isPanelClosed && !hideSideMenu\n                              ? {\n                                  visibility: 'visible',\n                                }\n                              : { visibility: 'hidden' }\n                          }\n                        />\n                        {dropdrownMenuOptions\n                          ? dropdrownMenuOptions(\n                              item[dataColumnKeys[0]],\n                              item[dataColumnKeys[1]],\n                              () => itemOptions(item[dataColumnKeys[0]]),\n                              openDropdownMenu\n                            )\n                          : null}\n                      </div>\n                    </div>\n                  );\n                })}\n              </div>\n            </div>\n\n            <RightMenu\n              name={selectedRowName}\n              checkboxList={checkboxList}\n              setIsPanelClosed={setIsPanelClosed}\n            >\n              {children}\n            </RightMenu>\n          </div>\n\n          <ListTableFilter\n            listUrl={listUrl}\n            loadInfoTableList={loadInfoTableList}\n            panelOpen={openFiltersPopup}\n            togglePanelOpen={setFiltersPopup}\n            listData={listData}\n          />\n        </React.Fragment>\n      )}\n    </React.Fragment>\n  );\n};\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAYAAACN1PRVAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAAIXRFWHRDcmVhdGlvbiBUaW1lADIwMjA6MDg6MTEgMTQ6MDQ6NDYr2J79AAACgElEQVRIS+2VQWsTQRTHdzZNttWUYlJE68G7YBGEKl68eLIWexL04DfQIDXQJCuL2mxLK0rqwYM3L4J6smhAvAneRKkfQBRTCZhqMJqmSWf8v92XkNDtbiq5CPnB8N68mcx/3tuZidanjx+CrfZtaWlvpNE4q6Q8juCmEsLQlNKFEBuwUUwpo41oQlSUUoOwUihVU5oWEbr+bnNg4OXBZPK3s9gOtMRKtr2GRa190egjPZGocTgQmcsZPyqVyxC/GU+nxzjsSbsYNqy24K4i+AF2Da2AWBU7r0lYpDmEzA1kO4SxQ2hjyOwY7DhiIYi11vOiXWwZ5orb+yfuQ+wq+57obDVnolLXsVPJoa5w5uN3QULEtrRLc3OTqP9jtGEO7YxSv9Auxk3zBUd88axxaX7+KL7VCgYPc2gbyOgzvtNUPJX6yKFAWmVshxaoh8MTWPAthzqgOI3vRojwPT10rNcrlWfI4ByHqHTPcT0u7OZ6NPHMrAktCKEH3HVB30vop2XF2O2gYFl7PlnWIPm+YoQU4g+7DuhvsNuiuLh4YMswVnF9bnPIgV4lIxLJDxvGE+oHinXD/mSyiPI+hWtCMEuxomVFw/V6HpU4qUv5kGI9EUOpVTyTuYYTfBfd9HfbvhNCRtjAhJByOmaaKzSvJ2JNRjOZGZgcTt0MdnAKm5jGHcy7o12IhYR4j6P+hru+rC8sjMCcwPwGBHXYM+6IS6BYbHa2jPt0Gu4llOWrjr8Vd6QTEsIj/QruONokmk0ZlrLZeyivc8V871m3sNBruEfwP3h+NJUinx53Op0mNrmMb5royTcrV6uU7Rdci6mmEIHH+QbMLbSCE+jzn6FpfwGmTvQTcWKHzQAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFF2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuZGFiYWNiYiwgMjAyMS8wNC8xNC0wMDozOTo0NCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMS0wNi0yMVQxMTo0OTo1MCswMTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjEtMDYtMjFUMTE6NTQ6MzMrMDE6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMDYtMjFUMTE6NTQ6MzMrMDE6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjY1NjY5OGQtZWRiMy0yYTQ3LWEwYmItNDNlNzRlOTg4YzQ2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjI2NTY2OThkLWVkYjMtMmE0Ny1hMGJiLTQzZTc0ZTk4OGM0NiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjI2NTY2OThkLWVkYjMtMmE0Ny1hMGJiLTQzZTc0ZTk4OGM0NiI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MjY1NjY5OGQtZWRiMy0yYTQ3LWEwYmItNDNlNzRlOTg4YzQ2IiBzdEV2dDp3aGVuPSIyMDIxLTA2LTIxVDExOjQ5OjUwKzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoV2luZG93cykiLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+JQTqHAAAARxJREFUOI3V1TFKQ0EQgOEvKsagYK3eQRTBxkKwtPAAFpaChamChY2dhZAqRcBjiPECQjpRSGkVUIt0IWoSi8QiK4Rnnu+lCJKBgd2ZnX+W3ZndTL/fNwmZmQh1KsFzw5Pjs/NF7GMLX8iG5B0soYllvGMBPXQxjwfcXV9dfvwC4xkXQbtjbDCLoxC/Ogq8gjJO8IQ3vKIdErWRC6Ac1gJoA+uYHXkUKOEUm0HHldLPIHp5eRQMzm4c6YW4fBwYijhAKyW0FdYXh41x5VbBDuoJ0HpYV4k6/qrjGrZRjfFXg782ypnUIA3s4TZivwn2Rlxgms7rGpTgsJQl1Hnalv6MzDtJAdP3CP07+BH3kwA3sYtDvEjx8mWm7s/7BstbO/kK51TfAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF9WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuZGFiYWNiYiwgMjAyMS8wNC8xNC0wMDozOTo0NCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6NDA2NzI4ODktNmQ4Ny01YjQ1LWFmZjgtNzQ3MzZiN2UxOWJjIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIzNEI4NjM4NkQxQTExRUJBMDA1OEExN0I0Qjc2RTQ5IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjA5YjUzNGRhLTk4N2EtYmI0NC1iZDNlLTg3YTc2YWMyNWIyNyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIxLTA2LTIxVDEzOjE2OjM1KzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0wNi0yMVQxMzoxNzo1MiswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMS0wNi0yMVQxMzoxNzo1MiswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmViYmQ0ZmRjLWEyM2YtNTU0Ny05MDQyLTFkYjZiODk4MDA1YiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0MDY3Mjg4OS02ZDg3LTViNDUtYWZmOC03NDczNmI3ZTE5YmMiLz4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MDliNTM0ZGEtOTg3YS1iYjQ0LWJkM2UtODdhNzZhYzI1YjI3IiBzdEV2dDp3aGVuPSIyMDIxLTA2LTIxVDEzOjE3OjUyKzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNCAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+G6kljgAAAbBJREFUeJzt2z2KU2EARuEzIsJ0bsElqDCFMrY2rsHSwlJQ1FJBBwXtLCxdwzT+FGJhIbgGSztJJ9jEIiMjgyTf9eQiwnmqhMt7yT0kfFV2lssl+Xun/vUH+N8VUCqgVECpgFIBpQJKBZQKKBVQKqBUQKmAUgGlAkoFlAooFVAqoFRAqYBSAaUCSgWUCigVUCqgVECpgFIBpQJKBZQKKBVQKqB0eps3u3Hn/q+X54EDYB/4DhwCd4Gvg7faAx7OsX/55NHgLcZsNeCRPeA9sHv0fhe4zuphLrM5wj7wDjjzh/0FYLFhfwV4K/aTzPETfsFxvN+dA+4N7J9z/PAn9w8G9s/W7G8P7CfZdsCzwMU116/J/SW5v7phP1mHiLTtgAvg85rrh3L/Ue5fb9hPNsc38Cark++kL8Djgf0t4MdM+6cD+0nmCPiJ1Wn7hlXIb8Arxk5ggA+sTsw59ovxxxiz03/lnA4RqYBSAaUCSgWUCigVUCqgVECpgFIBpQJKBZQKKBVQKqBUQKmAUgGlAkoFlAooFVAqoFRAqYBSAaUCSgWUCigVUCqgVECpgFIBpZ+MSEMrlPCQegAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQBAMAAAB8P++eAAAAJ1BMVEVHcEyDjY+DjY+DjY+DjY+DjY+DjY+DjY+DjY+DjY+DjY+DjY+DjY8uAkPOAAAAC3RSTlMA4KYOOvyBxiFc8XAWtVkAAABlSURBVEjHY2AYBaNgFIyC4QjOQCgjIhWyyBCpMPUMcQrbzxCnkHMNcQqZdc4Qp9DxDHEK2WKIU8hRc4Y4hbPOUFsh0VYT7Rnig4f4ACc6ColPFMQnM+ITLhFZYRSMglEwCoYmAADbMkK/C5Gj6wAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQBAMAAAB8P++eAAAAJFBMVEVHcEyDjY+DjY+DjY+DjY+DjY+DjY+DjY+DjY+DjY+DjY+DjY88pvXFAAAAC3RSTlMAxjrxgSGm4A5dW17cHDUAAABjSURBVEjHY2AYBaNgFIyC4QvaiFTHVE2kQu/dxKkL3E2cQk5r4hRyZO8mTqH6buIUsuwmTiGrNJEKJ++mtkKirSbaM8QHD/EBzsBFZBQSnyiIT2bEJ1yis8IoGAWjYBQMOQAASCUvUtz2l5sAAAAASUVORK5CYII=\"","import React, { useEffect } from 'react';\nimport { tablePaginationValues } from './listTableHelpers';\nimport Pagination1 from '../../images/Icon_Pagination_01.png';\nimport Pagination2 from '../../images/Icon_Pagination_02.png';\nimport Pagination3 from '../../images/Icon_Pagination_03.png';\nimport Pagination4 from '../../images/Icon_Pagination_04.png';\n\ntype Props = {\n    listUrl: string;\n    infoListData?: any;\n    loadInfoTableList: (listUrl: string, paramsArr?: any) => void;\n};\n\nexport const ListPagination: React.FC<Props> = ({\n    listUrl,\n    infoListData,\n    loadInfoTableList\n}) => {\n    const { \n        pageNumber,\n        pageSize,\n        resultsCount,\n        totalPages, \n        ddValArr, \n        itemNumStart, \n        itemNumEnd, \n        previousBtnsInactive, \n        nextBtnsInactive,\n        pageSizeViaDropdown, \n        goToPageViaInput,\n        goToFirstPage,\n        goToPreviousPage,\n        goToNextPage,\n        goToLastPage\n    } = tablePaginationValues(infoListData, listUrl, loadInfoTableList);\n\n    useEffect(() => {\n        if(resultsCount <= 0 && pageNumber > 1){\n            goToPreviousPage();\n        }\n    }, [pageNumber, resultsCount]);    \n    \n    return (\n        <React.Fragment>\n            {infoListData && \n                <div className=\"TableNavigation\">\n                    <div className=\"PaginatonButtons\">\n                        <div className=\"PaginationButtonsLeft\">\n                            <button className=\"PaginatorBtn First\" disabled={previousBtnsInactive} onClick={() => goToFirstPage()}>\n                                <img src={Pagination1} alt=\"First\" />\n                            </button>\n                            <button className=\"PaginatorBtn\" disabled={previousBtnsInactive} onClick={() => goToPreviousPage()}>\n                                <img src={Pagination2} alt=\"Back\" />\n                            </button>\n                        </div>\n                        <div className=\"PageNumber\">\n                            <div className=\"PageNumberInput\">\n                                <div className=\"FormBox\">\n                                    <div className=\"FormField\">\n                                        <select name=\"pageSize\" className=\"DropDown\" defaultValue={pageSize} onChange={(e) => pageSizeViaDropdown(e)}>\n                                            {ddValArr.map((item: any) => {\n                                                return (\n                                                    <option className=\"DropDownOption\" key={\"pagination_option_\" + item} value={item}>{item}</option>\n                                                );\n                                            })}\n                                        </select>\n                                    </div>\n                                </div>\n                                <div className=\"PageNumDetails\">\n                                    <span className=\"PageLabel\">Page</span>\n                                    <input name=\"pageNumber\" type=\"text\" className=\"EditBox\" defaultValue={pageNumber} onKeyUp={(e) => goToPageViaInput(e)} />\n                                    <span className=\"OfNumLabel\">of {totalPages}</span>\n                                </div>\n                            </div>\n                        </div>\n                        <div className=\"PaginationButtonsMobile\">\n                            <div className=\"PaginationButtonsLeft Mobile\">\n                                <button className=\"PaginatorBtn First\" disabled={previousBtnsInactive} onClick={() => goToFirstPage()}>\n                                    <img src={Pagination1} alt=\"First\" />\n                                </button>\n                                <button className=\"PaginatorBtn\" disabled={previousBtnsInactive} onClick={() => goToPreviousPage()}>\n                                    <img src={Pagination2} alt=\"Back\" />\n                                </button>\n                            </div>\n                            <div className=\"PaginationButtonsRight\">\n                                <button className=\"PaginatorBtn\" disabled={nextBtnsInactive} onClick={() => goToNextPage()}>\n                                    <img src={Pagination3} alt=\"Next\" />\n                                </button>\n                                <button className=\"PaginatorBtn Last\" disabled={nextBtnsInactive} onClick={() => goToLastPage()}>\n                                    <img src={Pagination4} alt=\"Last\" />\n                                </button>\n                            </div>\n                        </div>\n                    </div>\n                    {resultsCount ?\n                        <div className=\"PaginatorInfo\">Showing {itemNumStart}-{itemNumEnd} of {resultsCount}</div>\n                        :\n                        null\n                    }\n                </div>\n            }\n        </React.Fragment>\n    );\n};","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQBAMAAAB8P++eAAAAJ1BMVEVHcEyDjY+DjY+DjY+DjY+DjY+DjY+DjY+DjY+DjY+DjY+DjY+DjY8uAkPOAAAADHRSTlMAovBZH33dDsQ6OMNkqHWBAAAAXklEQVRIx2NgGAWjYBSMgmEKxIlVeGwCkQrPHCVW4ZkWYhUeMiBS4ZmDBUQqPJNJrMIzAcQqPOFApMIzytRWSLTVxHomi8oBTnQUbqFyMju2gNpZYRSMglEwCoYgAACbVDpcrZvMGQAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,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\"","import instance, { ApiResponse } from '../../api';\nimport { AxiosResponse } from 'axios';\nimport { BaseApi } from '../../baseApi';\nimport { setUpListEndpoint } from './listTableHelpers';\nexport class InfoTableApi extends BaseApi {\n  public static getInfoTableList = async (\n    listUrl: string,\n    newParams?: any\n  ): Promise<any> => {\n    const urlWithParams: string = setUpListEndpoint(listUrl, newParams);\n\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        urlWithParams\n      );\n      if (InfoTableApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return InfoTableApi.successResponse(data);\n      }\n    } catch (error: any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n\n        if (errors) {\n          return InfoTableApi.errorResponse(errors);\n        }\n      }\n    }\n  };\n}\n","export interface IUser extends IUserAccessPermissions {\n  firstName: string;\n  lastName: string;\n  emailAddress: string;\n  bMainAccountHolder: boolean;\n  insertionsStatus?: any;\n}\n\nexport interface IUserAccessPermissions {\n  bGetSet4PE: boolean;\n  bGetSet4Music: boolean;\n}\n\nexport interface IGetUserResponse {\n  firstName: string;\n  lastName: string;\n  emailAddress: string;\n  mainAccountHolder: boolean;\n  suppressed: boolean;\n  getSet4PE: boolean;\n  getSet4Music: boolean;\n  bSubscriptions: boolean;\n  bManageUsers: boolean;\n  bManageSchool: boolean;\n  bInvoices: boolean;\n}\n\nexport interface ManageUserBulkResponse {\n  countInserted: number;\n  insertionsStatus: any;\n  recordsInserted: any;\n}\n\nexport interface IGetUserAccessPermissionsResponse {\n  getSet4PE: boolean;\n  getSet4Music: boolean;\n  bSubscriptions: boolean;\n  bManageUsers: boolean;\n  bManageSchool: boolean;\n  bInvoices: boolean;\n}\n\nexport interface ISubscriptionItem {\n  label: string;\n  fieldName: string;\n}\n\nexport enum AccessPermissions {\n  MANAGEUSERS = 'Manage users',\n  MANAGESCHOOL = 'Manage school',\n  INVOICES = 'Invoices',\n  SUBSCRIPTIONS = 'Subscriptions',\n}\n\nexport class UsersParser {\n  public static createEmptyUser = (): IUser => ({\n    firstName: '',\n    lastName: '',\n    emailAddress: '',\n    bMainAccountHolder: false,\n    bGetSet4PE: true,\n    bGetSet4Music: true,\n  });\n\n  public static parseGetUserDetails = (response: IGetUserResponse): IUser => {\n    const hasAccessToGetSet4Education =\n      response.bInvoices ||\n      response.bManageSchool ||\n      response.bManageUsers ||\n      response.bSubscriptions;\n\n    return {\n      firstName: response.firstName,\n      lastName: response.lastName,\n      emailAddress: response.emailAddress,\n      bMainAccountHolder: response.mainAccountHolder,\n      bGetSet4PE: response.getSet4PE,\n      bGetSet4Music: response.getSet4Music,\n    };\n  };\n\n  public static parseGetUserAccessPermissions = (\n    response: IGetUserAccessPermissionsResponse\n  ): IUserAccessPermissions => {\n    const hasAccessToGetSet4Education =\n      response.bInvoices ||\n      response.bManageSchool ||\n      response.bManageUsers ||\n      response.bSubscriptions;\n    return {\n      bGetSet4PE: response.getSet4PE,\n      bGetSet4Music: response.getSet4Music,\n    };\n  };\n\n  public static buildUserPayload = (values: IUser): any => ({\n    firstName: values.firstName,\n    lastName: values.lastName,\n    emailAddress: values.emailAddress,\n    bMainAccountHolder: values.bMainAccountHolder,\n    platforms: {\n      bGetSet4PE: values.bGetSet4PE,\n      bGetSet4Music: values.bGetSet4Music,\n    },\n  });\n\n  public static buildAccessPermissionsPayload = (\n    values: IUserAccessPermissions,\n    id: number\n  ): any => ({\n    schoolUsersID: id,\n    platforms: {\n      bGetSet4PE: values.bGetSet4PE,\n      bGetSet4Music: values.bGetSet4Music,\n    },\n  });\n\n  public static parseError = (errors: any) => {\n    let error: string;\n    switch (errors[0].messageCode) {\n      case 'EmailAddress_Already_Exists':\n        error = 'Email address already exists';\n        break;\n      case 'OfficeEmailAddress_Already_Exists':\n        error = 'Office email address already exists';\n        break;        \n      case 'Invalid_RemoveSelfMainAccountHolder':\n        error = \"You can't remove yourself as main account holder\";\n        break;\n      case 'Invalid_Deleting_Main_Account_Holder':\n        error = \"You can't delete a main account holder\";\n        break;\n      default:\n        error = 'Sorry, something went wrong. Please try again.';\n    }\n    return error;\n  };\n  \n\n  public static parseUserBulkDetails = (response: ManageUserBulkResponse) => {\n    return {\n      countInserted: response.countInserted,\n      insertionsStatus: response.insertionsStatus,\n      recordsInserted: response.recordsInserted,\n    };\n  };  \n\n  public static parseCSVError = (errors: any) => {\n    return errors[0].messageCode;\n  };  \n}\n","import { AxiosError, AxiosResponse } from 'axios';\nimport instance from 'api';\nimport { ApiResponse, BaseApi } from 'baseApi';\nimport { endpoints } from 'endpoints.config';\nimport {\n  IUser,\n  IUserAccessPermissions,\n  UsersParser,\n} from '../pages/manageUsers/models';\n\nconst UNKOWN_ERROR_MESSAGE = 'Sorry, something went wrong. Please try again.';\n\nexport class UsersApi extends BaseApi {\n  // get user details\n  public static getUserDetails = async (\n    url: string,\n    id: number\n  ): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        url + `?schoolUsersID=${id}`\n      );\n\n      if (UsersApi.isResponseSuccessful(result.data)) {\n        const data = UsersParser.parseGetUserDetails(result.data.details);\n        return UsersApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.errors;\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        }\n      }\n      return UsersApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  //get user access rights\n  public static getUserAccessPermissions = async (id: number): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.manageUsers.updateaccesspermissions + `?schoolUsersID=${id}`\n      );\n\n      if (UsersApi.isResponseSuccessful(result.data)) {\n        const data = UsersParser.parseGetUserAccessPermissions(\n          result.data.details\n        );\n        return UsersApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.errors;\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        }\n      }\n      return UsersApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static submitUser = async (\n    id: number | null,\n    values: IUser\n  ): Promise<any> => {\n    try {\n      let payload = UsersParser.buildUserPayload(values);\n      payload = id ? { ...payload, schoolUsersID: id } : payload;\n\n      const url = id\n        ? endpoints.manageUsers.updateuser\n        : endpoints.manageUsers.addUser;\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        url,\n        payload\n      );\n      if (UsersApi.isResponseSuccessful(result.data)) {\n        const data = UsersParser.parseGetUserDetails(result.data.details);\n        return UsersApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        }\n      }\n      return UsersApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static submitAccessPermissions = async (\n    id: number,\n    values: IUserAccessPermissions\n  ): Promise<any> => {\n    try {\n      let payload = UsersParser.buildAccessPermissionsPayload(values, id);\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.manageUsers.updateaccesspermissions,\n        payload\n      );\n\n      if (UsersApi.isResponseSuccessful(result.data)) {\n        const data = UsersParser.parseGetUserDetails(result.data.details);\n        return UsersApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.errors;\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        }\n      }\n      return UsersApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static deleteUser = async (ids: number[]): Promise<any> => {\n    const payload = { idsToDelete: ids };\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.manageUsers.deleteuser,\n        payload\n      );\n\n      if (UsersApi.isResponseSuccessful(result.data)) {\n        const data = UsersParser.parseGetUserDetails(result.data.details);\n        return UsersApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.errors;\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        }\n      }\n      return UsersApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  public static downloadUserTemplateCSV = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.manageUsers.downloadUserTemplateCSV\n      );\n\n      if (result.data) {\n        return result;\n      } else {\n        const errors = [\"\"];\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.errors;\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        }\n      }\n      return UsersApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n  \n  public static downloadUserListCSV = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.manageUsers.downloadUserListCSV\n      );\n\n      if (result.data) {\n        return result;\n      } else {\n        const errors = [\"\"];\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.errors;\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        }\n      }\n      return UsersApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  }; \n\n  public static uploadUserListCSV = async (data: FormData): Promise<any> => {\n    const config = {\n      headers: {\n        \"content-type\": \"multipart/form-data\",\n      },\n    }; \n\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.manageUsers.uploadUserListCSV,\n        data,\n        config\n      );\n\n      if (UsersApi.isResponseSuccessful(result.data)) {\n        const data = UsersParser.parseUserBulkDetails(result.data.details);\n        const insertionsStatus = data.insertionsStatus;\n        let insertionsStatusErr = [];\n        \n        if(insertionsStatus && insertionsStatus.length){\n          for(let i = 0; i < insertionsStatus.length; i++){\n            if(insertionsStatus[i].errorMessage){\n              insertionsStatusErr.push(insertionsStatus[i].errorMessage);\n            }\n          }\n        }\n        \n        if(insertionsStatusErr.length){\n          return {\n            insertionsStatusErr: insertionsStatusErr\n          };\n        } else {\n          return UsersApi.successResponse(data);\n        }\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = UsersParser.parseError(errors);\n          return UsersApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.errors;\n        if (errors) {\n          const message = UsersParser.parseCSVError(errors);\n          return UsersApi.errorResponse(message);\n        }\n      }\n      return UsersApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n}\n","import toPath from 'lodash/toPath';\n/**\n * Given an object and a path, traverse the object to find the value,\n * and return it.\n */\nexport function deepGet(obj: any, path: string | string[]) {\n  const segments = toPath(path);\n  let i = 0;\n  let val = obj;\n  for (; i < segments.length; i++) {\n    if (val === undefined) {\n      return val;\n    }\n    val = val[segments[i]];\n  }\n  return val;\n}\n","import React, { ReactElement } from 'react';\nimport { useFormikContext, FormikContextType } from 'formik';\nimport { deepGet } from './helpers';\nimport { Input } from './Input';\nimport { ErrorM } from './ErrorM';\n\nexport interface FormBooleanFieldProps {\n  fieldName: string;\n  label: string;\n  labelPosition?: 'left' | 'top';\n  readOnly?: boolean;\n  tooltip?: ReactElement;\n}\n\nconst FormBooleanField = function <T>({\n  fieldName,\n  label,\n  readOnly,\n  labelPosition,\n  tooltip,\n}: FormBooleanFieldProps) {\n  const formikContext = useFormikContext<FormikContextType<T>>();\n  if (readOnly) {\n    return (\n      <div\n        className={`FormBox FormSideBySide  ${\n          labelPosition ? labelPosition : ''\n        }`}\n      >\n        <div className=\"FormLabel\">\n          <label>{label}</label>\n        </div>\n\n        <div className=\"FormField\">\n          <Input\n            name={fieldName}\n            className={'EditBox ViewOnly'}\n            readOnly={readOnly}\n            value={deepGet(formikContext.values, fieldName) ? 'Yes' : 'No'}\n          />\n        </div>\n      </div>\n    );\n  } else {\n    return (\n      <div\n        className={`FormBox FormSideBySide  ${\n          labelPosition ? labelPosition : ''\n        }`}\n      >\n        <div className=\"FormLabel NoPaddingTop\">\n          <label>{label}</label>\n          {tooltip && tooltip}\n        </div>\n\n        <div className=\"RadioButtons\">\n          <div\n            className=\"Radio\"\n            role=\"checkbox\"\n            aria-checked={deepGet(formikContext.values, fieldName)}\n            onClick={() => formikContext.setFieldValue(fieldName as any, true)}\n          >\n            <input\n              id={fieldName + '-yes'}\n              type=\"radio\"\n              name={fieldName}\n              value={'true'}\n              checked={deepGet(formikContext.values, fieldName)}\n              onChange={() => {}} // Prevent console error about providing a checked attribute but no onChange prop. The onChange is the onClick on the div that wraps this.\n            />\n            <label className=\"CustomInput\" htmlFor={fieldName + '-yes'}>\n              Yes\n            </label>\n          </div>\n          <div\n            className=\"Radio\"\n            role=\"checkbox\"\n            aria-checked={deepGet(formikContext.values, fieldName)}\n            onClick={() => formikContext.setFieldValue(fieldName as any, false)}\n          >\n            <input\n              id={fieldName + '-no'}\n              type=\"radio\"\n              name={fieldName}\n              value={'false'}\n              checked={!deepGet(formikContext.values, fieldName)}\n              onChange={() => {}} // Prevent console error about providing a checked attribute but no onChange prop. The onChange is the onClick on the div that wraps this.\n            />\n            <label className=\"CustomInput\" htmlFor={fieldName + '-no'}>\n              No\n            </label>\n          </div>\n        </div>\n        <ErrorM name={fieldName.toString()} />\n      </div>\n    );\n  }\n};\n\nexport { FormBooleanField };\n","import React, { useState } from 'react';\nimport TooltipIcon from 'images/Icon_Tooltip.png';\n\ntype Props = {\n  text: string;\n};\n\nconst Tooltip = ({ text }: Props) => {\n  const [isOpen, setIsOpen] = useState<boolean>(false);\n\n  const handleHover = () => setIsOpen(!isOpen);\n\n  return (\n    <div className=\"Tooltip\">\n      <img\n        onMouseEnter={handleHover}\n        onMouseLeave={handleHover}\n        className=\"TooltipIcon\"\n        src={TooltipIcon}\n        alt=\"Tooltip\"\n      />\n      {isOpen && <div className=\"TooltipText\">{text}</div>}\n    </div>\n  );\n};\n\nexport default Tooltip;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDYuMC1jMDA2IDc5LmRhYmFjYmIsIDIwMjEvMDQvMTQtMDA6Mzk6NDQgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6YmMzN2ZhZmEtOGEyYS05YTQwLWE3ZDEtNTIyMzUxMGU5YzJjIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkM4NzQ3MDk1MUI3RDExRUNBQTFERTRENzExQTBEMkVDIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkM4NzQ3MDk0MUI3RDExRUNBQTFERTRENzExQTBEMkVDIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMS4yIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjk0YjJlOTVmLTU1OWEtYTE0Ni05NWU5LWEyMzllZjU0NWU1NSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpiYzM3ZmFmYS04YTJhLTlhNDAtYTdkMS01MjIzNTEwZTljMmMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4umCQZAAAC0klEQVR42syZTUhUURTH30yvpAwlJ4jCIkjLMLRFtEihRdIiKoNaRBBFnxDqIrdSUG2CCstFEBVFtGthBRJoBJFtchOV0SckbSaImojEj5r+B8/E4/Lem3vOe8E98HOY63Dn987z3nfuMVMsFj2Xw6cfq9ZtSDpPhuei1yz4w/wGZTPwZuRp5O+ySqEKsBPcAJ9YZhJMgHF+nWLBl6APbOQLkGdQEDnQCbrAAsvMNjId4AM4B67zBZWNrOAWHgbvwElLubBYAS6DF2BTWoI14B64kkDMjJVgiLPpJxFcCobB1v+0SLvBXSzSeRrBJeAxaLD8Mlooz/j2SWILS86RCM4FA2C55ZfQSl4D1oMm0AZ+CiTp81clgpdAs+ALaIW+Drx/CE4LM7kXWTxoI0j71SHh5MOWY+XiAiQXxQnSdtKr3D7MqFfMUwXOxAluB2sVE9NFVQbeL+b9UhP7kMVlUYJHlZO28N9gL++Xo4IFZsZscODfLaVqhouFhSCf4PmcZrxHAVFvPovblHL0fH0SMr6Hs6GJOiStGpKFoKC25iK5/SHjO0B1gizWgkIwY6sdq1Vz5iKpdUywyhScr90WuGruT1mwwnNkxVrXg98dc5swBfOOCf4wBZ87JvjVFBxxTPCzKfgATDsiR4+6gin4jQtNaeS5ov5ijI/xeEEx5+2oauaiYrLdXLkcMcabeFxaX07xuTlUcNCB23wTt3csSrBV0W1Ie2vpiWt9bFNW03GbvKRwPY7s5dMWbE4pe7cgdy3uUdegPOikEUNRJ8lswuylEdQgaEf2Jl0UPM9yv6I+4AdaHS0WExY9RRMyJN6CYzYPBj9w8A5mc5yPkdQIesWvo7wNdDE55QFL1MAsCc4CJ1iEWrYfvZluVVicAmfBZrCLD1t1MRmnC3sE7ngz3TJR194PlFqScouKyftMqWVSaqJnWMK6iR4XGdf/DfFXgAEAqUWoffKPdtoAAAAASUVORK5CYII=\"","import { useState, useCallback, useEffect } from 'react';\nimport { DashboardApi } from './dashboardApi';\nimport { ISubject } from './models';\n\nexport const useGetDashboardList = () => {\n  const [dashboardListInfo, setDashboardListInfo] = useState<ISubject[] | null>(\n    null\n  );\n  const [error, setError] = useState<any>('');\n\n  const getDashboardList = useCallback(async () => {\n    const result = await DashboardApi.getDashboardList();\n\n    if (result.data) {\n      setDashboardListInfo(\n        result.data.listSubjects ? result.data.listSubjects : []\n      );\n    }\n\n    if (result.error) {\n      setError(result.error);\n    }\n  }, []);\n\n  useEffect(() => {\n    getDashboardList();\n  }, [getDashboardList]);\n\n  return { dashboardListInfo, error };\n};\n","import React, { useState, useEffect } from 'react';\nimport { Form, Formik, FormikHelpers } from 'formik';\nimport * as Yup from 'yup';\nimport { useDispatch } from 'react-redux';\nimport { ISubscriptionItem, IUser, UsersParser } from './models';\nimport { UsersApi } from '../../api/usersApi';\nimport { PopupOrPanel } from '../../components/popupsAndPanels/PopupAndPanels';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport { FormBooleanField } from 'components/formComponents/FormBooleanField';\nimport Tooltip from 'components/tooltip/Tooltip';\nimport { setUpdateUsersList } from 'reducers/misc';\nimport FormGeneralError from 'components/formComponents/FormGeneralError';\nimport { useGetDashboardList } from 'pages/dashboard/useGetDashboardList';\nimport { Spinner } from 'components/spinner/Spinner';\nimport { useToast } from 'hooks/useToast';\n\ntype Props = {\n  panelOpen: boolean;\n  togglePanelOpen: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nconst tooltip = (\n  <Tooltip text=\"This person will have access to subscriptions, manage users and manage school\" />\n);\n\nexport const AddUser: React.FC<Props> = ({ panelOpen, togglePanelOpen }) => {\n  const [error, setError] = useState<string>('');\n\n  const dispatch = useDispatch();\n  const setUpdateList = (status: boolean) =>\n    dispatch(setUpdateUsersList(status));\n\n  const handleToast = useToast(\n    'This member of your team will now be emailed a password to login. Please ask them to check their junk folder if they do not see this in their inbox.'\n  );\n\n  const validationSchemaAddUser = Yup.object({\n    firstName: Yup.string().required('First name is required'),\n    lastName: Yup.string().required('Last name is required'),\n    emailAddress: Yup.string()\n      .email('Please enter a valid email address')\n      .required('Email address is required'),\n    bMainAccountHolder: Yup.boolean().required('Required field'),\n    bGetSet4PE: Yup.boolean().required('Required field'),\n    bGetSet4Music: Yup.boolean().required('Required field'),\n  });\n\n  const { dashboardListInfo, error: subscriptionsListError } =\n    useGetDashboardList();\n\n  const [subscriptionsList, setSubscriptionList] = useState<\n    ISubscriptionItem[] | null\n  >(null);\n\n  useEffect(() => {\n    if (subscriptionsListError) {\n      setError(subscriptionsListError.message);\n      return;\n    }\n    if (dashboardListInfo) {\n      const subjectsList = dashboardListInfo.map((item) => ({\n        label: item.subject,\n        fieldName: `b${item.subject.split(' ').join('')}`,\n      }));\n      setSubscriptionList(subjectsList);\n    }\n  }, [dashboardListInfo, subscriptionsListError]);\n\n  const handleSubmitAddUser = async (\n    values: IUser,\n    { setSubmitting }: FormikHelpers<IUser>\n  ) => {\n    setError('');\n    setSubmitting(true);\n    const result = await UsersApi.submitUser(null, values);\n\n    if (result.data) {\n      setSubmitting(false);\n      setUpdateList(true);\n      togglePanelOpen(false);\n      handleToast();\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n      setError(error);\n      setSubmitting(false);\n    }\n  };\n\n  return (\n    <Formik\n      initialValues={UsersParser.createEmptyUser()}\n      validationSchema={validationSchemaAddUser}\n      onSubmit={handleSubmitAddUser}\n    >\n      {({ values, submitForm, setFieldValue, isSubmitting }) => (\n        <PopupOrPanel\n          isPopup={false}\n          isOpen={panelOpen}\n          position=\"right\"\n          hdrTitle=\"Add new user\"\n          primaryBtnTxt=\"Save\"\n          secondaryBtnTxt=\"Cancel\"\n          givenClass=\"TestPanelClass\"\n          handleClose={() => togglePanelOpen(false)}\n          handlePrimaryBtn={submitForm}\n          handleSecondaryBtn={() => togglePanelOpen(false)}\n          isSubmitting={isSubmitting}\n        >\n          {subscriptionsList ? (\n            <Form>\n              <FormGeneralError message={error} />\n              <FormTextField\n                label=\"First name\"\n                field=\"firstName\"\n                labelPosition=\"left\"\n                required={true}\n                optionalTag={'optional'}\n                value={values.firstName}\n              />\n              <FormTextField\n                label=\"Last name\"\n                field=\"lastName\"\n                labelPosition=\"left\"\n                required={true}\n                optionalTag={'optional'}\n                value={values.lastName}\n              />\n              <FormTextField\n                label=\"Email address\"\n                field=\"emailAddress\"\n                labelPosition=\"left\"\n                required={true}\n                optionalTag={'optional'}\n                value={values.emailAddress}\n              />\n              <FormBooleanField\n                fieldName=\"bMainAccountHolder\"\n                label=\"Main account holder\"\n                labelPosition=\"left\"\n                tooltip={tooltip}\n              />\n\n              <h4 className=\"SpaceTopBtm\">Platform access</h4>\n\n              {subscriptionsList.map(\n                (item: ISubscriptionItem, index: number) => (\n                  <FormBooleanField\n                    key={index}\n                    fieldName={item.fieldName}\n                    label={item.label}\n                    labelPosition=\"left\"\n                  />\n                )\n              )}\n            </Form>\n          ) : subscriptionsListError ? (\n            <FormGeneralError message={error} />\n          ) : (\n            <Spinner positionAbsolute />\n          )}\n        </PopupOrPanel>\n      )}\n    </Formik>\n  );\n};\n","export default \"data:image/png;base64,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\"","import React from \"react\";\nimport { useDropzone, DropzoneOptions, DropEvent } from \"react-dropzone\";\n\n// Icons\nimport WarningIcon from \"../../images/Icon_Warning.png\";\n\ntype DropzoneProps = {\n  children?(isDragActive: boolean): React.ReactNode;\n  uploadedFile?: any;\n  onDrop<T extends File>(\n    acceptedFiles: T[],\n    rejectedFiles: T[],\n    event: DropEvent\n  ): void;\n  resetFile: () => void;\n  fileType?: string;\n  dropzoneOptions?: DropzoneOptions;\n  readOnly: boolean;\n  dropzoneText?: string;\n  uploadIcon?: string;\n  warningIcon?: string;\n  showWarningMessage?: string | null;\n  hasUploadedImage?: boolean;\n  uploadedImageUrl?: string;\n  fileName?: string;\n  isCSVCheck: (file: File) => boolean;\n};\n\nfunction DropzoneCSVOnly<T>(props: DropzoneProps) {\n  const [imageBase64, setImageBase64] = React.useState<string>(\"\");\n\n  if (props.uploadedFile && props.uploadedFile.type && props.isCSVCheck(props.uploadedFile[0])) {\n    const reader = new FileReader();\n    reader.onloadend = () => {\n      const imageBase64 = reader.result;\n      setImageBase64(imageBase64 as string);\n    };\n    reader.readAsDataURL(props.uploadedFile);\n  }\n\n  const { getRootProps, getInputProps, isDragActive } = useDropzone({\n    ...props.dropzoneOptions,\n    onDrop: props.onDrop,\n    disabled: props.readOnly,\n  });\n\n  return (\n    <div\n      className={\n        props.uploadedFile || props.hasUploadedImage\n          ? \"Dropzone Disabled\"\n          : \"Dropzone\"\n      }\n      {...getRootProps()}\n    >\n      {/* If no files uploaded */}\n      {!props.uploadedFile && (\n        <>\n          <input\n            {...getInputProps({\n              multiple: false,\n            })}\n          />\n\n          {props.children ? (\n            props.children(isDragActive)\n          ) : props.hasUploadedImage ? (\n            <>\n              <img src={props.uploadedImageUrl} alt=\"Upload\" />\n            </>\n          ) : (\n            <>\n              {!props.showWarningMessage ? (\n                <>\n                  {props.dropzoneText && <p>{props.dropzoneText}</p>}\n                </>\n              ) : (\n                <span className=\"WarningMessage NoImage\">\n                  {props.warningIcon ? (\n                    <img\n                      className=\"Icon\"\n                      src={props.warningIcon}\n                      alt=\"Upload\"\n                    />\n                  ) : (\n                    <img className=\"Icon\" src={WarningIcon} alt=\"Upload\" />\n                  )}\n\n                  {props.showWarningMessage}\n                </span>\n              )}\n            </>\n          )}\n        </>\n      )}\n\n      {/* If file uploaded, display it */}\n      {props.uploadedFile && (\n        <>\n          {props.fileName !== \"\" && props.fileName !== undefined ? (\n            <p>{props.fileName}</p>\n          ) : (\n            <p>{props.uploadedFile.name || props.fileName}</p>\n          )}\n        </>\n      )}\n    </div>\n  );\n}\n\nexport { DropzoneCSVOnly };\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { setUpdateUsersList } from 'reducers/misc';\nimport { UsersApi } from '../../api/usersApi';\nimport { PopupOrPanel } from '../../components/popupsAndPanels/PopupAndPanels';\nimport { DropzoneCSVOnly } from \"../../helpers/FileUploadPanel/DropzoneCSVOnly\";\nimport { Spinner } from 'components/spinner/Spinner';\n\ntype Props = {\n  panelOpen: boolean;\n  togglePanelOpen: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport const BulkUpload: React.FC<Props> = ({\n  panelOpen,\n  togglePanelOpen,\n}) => {\n  const [error, setError] = useState<string>('');\n  const [errorList, setErrorList] = useState<any>(null);\n  const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n  const [fileUploaded, setFileUploaded] = useState<any>(null); \n\n  const dispatch = useDispatch();\n  const setUpdateList = (status: boolean) =>\n    dispatch(setUpdateUsersList(status));\n\n  const downloadTemplate = async () => {\n    setIsSubmitting(true);\n\n    const result = await UsersApi.downloadUserTemplateCSV();\n    \n    if (result.data) {\n      const downloadUrl = window.URL.createObjectURL(new Blob([result.data]));\n      const link = document.createElement('a');\n      link.href = downloadUrl;\n      link.setAttribute('download', 'Manage Users Template.csv');\n      document.body.appendChild(link);\n  \n      link.click();\n      setTimeout(function () {\n        link.remove();\n        window.URL.revokeObjectURL(downloadUrl);\n      }, 100);\n      \n      togglePanelOpen(false);\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n      setError(error);\n      setErrorList(null);\n      setIsSubmitting(false);\n    }\n  };  \n\n  const downloadList = async () => {\n    setIsSubmitting(true);\n\n    const result = await UsersApi.downloadUserListCSV();\n    \n    if (result.data) {\n      const downloadUrl = window.URL.createObjectURL(new Blob([result.data]));\n      const link = document.createElement('a');\n      link.href = downloadUrl;\n      link.setAttribute('download', 'Manage Users List.csv');\n      document.body.appendChild(link);\n  \n      link.click();\n      setTimeout(function () {\n        link.remove();\n        window.URL.revokeObjectURL(downloadUrl);\n      }, 100);\n      \n      togglePanelOpen(false);\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n      setError(error);\n      setErrorList(null);\n      setIsSubmitting(false);\n    }\n  };\n\n  const uploadList = async () => {\n    setIsSubmitting(true);\n\n    const formData = new FormData();\n    formData.append(\"CsvFile\", fileUploaded[0]);\n\n    const result = await UsersApi.uploadUserListCSV(formData);\n\n    if (result.data) {\n      setUpdateList(true);\n      togglePanelOpen(false);\n    }\n\n    if(result.insertionsStatusErr){\n      setError('');\n      setErrorList(result.insertionsStatusErr);\n      setIsSubmitting(false);\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n      setError(error);\n      setErrorList(null);\n      setIsSubmitting(false);\n    }\n  };\n\n  return (\n    <PopupOrPanel\n      isPopup={true}\n      isOpen={panelOpen}\n      hdrTitle={\"Bulk Edit / Bulk Upload\"}\n      position=\"right\"\n      givenClass=\"BulkUploadUsers\"\n      noFooter={true}\n      handleClose={() => togglePanelOpen(false)}\n      handleSecondaryBtn={() => togglePanelOpen(false)}\n      width={560}\n      isSubmitting={isSubmitting}\n    >\n      {error && <p className=\"GeneralError2\">{error}</p>}\n\n      {errorList && \n        <>\n          <p className=\"GeneralError2\" style={{ marginBottom: \"0px\" }}><strong>Spreadsheet errors:</strong></p>\n          <>\n            {\n              errorList.map((item: any, index: number) => {\n                return (<p key={index} className=\"GeneralError2\" style={{ marginBottom: \"0px\" }}>{item}</p>);\n              })\n            }\n          </>\n        </>\n      }\n\n      <div className=\"FileDLTxtBtn\">\n        <div className=\"TxtBlock\">\n          <p>Use this file to bulk edit your school email addresses. Save as a .csv file.</p>\n        </div>\n        <div className=\"BtnBlock\">\n          <div \n            className=\"Btn BtnOrange\"\n            onClick={() => downloadList()}\n          >\n            <span>Bulk Edit</span>\n          </div>\n        </div>\n      </div>\n\n      <div className=\"FileDLTxtBtn\">\n        <div className=\"TxtBlock\">\n          <p>Use this file to bulk upload staff. Save as a .csv file.</p>\n        </div>\n        <div className=\"BtnBlock\">\n          <div \n            className=\"Btn BtnOrange\"\n            onClick={() => downloadTemplate()}\n          >\n            <span>Bulk Upload</span>\n          </div>\n        </div>\n      </div>\n\n      <div className=\"FileDLTxtBtn FullWidthRows\">\n        <div className=\"TxtBlock\">\n          <p>Click here to upload your csv file.</p>\n        </div>\n        <div className=\"BtnBlock\">\n          <div className=\"StyledFileUpload\">\n            <DropzoneCSVOnly\n              uploadedFile={fileUploaded}\n              onDrop={file => {\n                if (file && isCSV(file[0])) {\n                  setFileUploaded(file);\n                  setError(\"\");\n                } else {\n                  setFileUploaded(null);\n                  setError(\"Please upload only csv files.\");\n                }            \n              }}\n              resetFile={() => {\n                setFileUploaded(null);\n                setError(\"Please upload only csv files.\");\n              }}\n              readOnly={false}\n              hasUploadedImage={fileUploaded ? true : false}\n              fileName={fileUploaded ? fileUploaded[0].name : \"\"}\n              isCSVCheck={isCSV}\n            />           \n\n            {fileUploaded &&\n              <>\n                <div \n                  className=\"Btn BtnLightOrange\"\n                  onClick={() => {\n                    setError('');\n                    setErrorList(null);                  \n                    setFileUploaded(null);\n                  }}\n                >\n                  <span>Reset</span>\n                </div>\n\n                <div className=\"LineSpacer3\"></div>\n              </>            \n            }\n\n            <div \n              className={\"Btn BtnOrange\" + (fileUploaded ? \"\" : \" Disable\")}\n              onClick={() => uploadList()}\n            >\n              <span>Upload File</span>\n            </div>                                     \n          </div>\n        </div>\n      </div>\n\n      {isSubmitting && <Spinner /> }          \n    </PopupOrPanel>\n  );\n};\n\nconst isCSV = (file: File) => {\n  if (\n    file.type === \"text/csv\" ||\n    file.type === \"application/vnd.ms-excel\"\n  ) {\n    return true;\n  } else {\n    return false;\n  }\n};\n","import React, { useState, useEffect, Dispatch, SetStateAction } from 'react';\nimport { Action } from 'redux';\nimport { Spinner } from 'components/spinner/Spinner';\nimport { ListTable } from './listTable';\nimport { ListPagination } from './listPagination';\nimport { InfoTableApi } from './infoTableApi';\nimport { AddUser } from '../../pages/manageUsers/AddUser';\nimport WarningIcon from '../../images/Icon_Warning.png';\nimport NoResultsIcon from '../../images/Icon_No_Results.png';\nimport { BulkUpload } from '../../pages/manageUsers/BulkUpload';\n\ntype Props = {\n  title?: string;\n  listUrl: string;\n  firstColWidth?: number;\n  firstColWidthSm?: number;\n  buttonText?: string;\n  secondButtonText?: string;\n  updateListStatus?: boolean;\n  setUpdateList?: (status: boolean) => Action;\n  dropdrownMenuOptions?: (\n    ids: number,\n    name: string,\n    closeMenu: () => void,\n    openCloseState: { open: boolean; id: number | null }\n  ) => JSX.Element;\n  setIsPanelClosed: React.Dispatch<React.SetStateAction<boolean>>;\n  isPanelClosed: boolean;\n  allowSelectAll?: boolean;\n  filterTable?: boolean;\n  setCheckTableLoading?: any;\n  hideBtmCtrls?: boolean;\n  hideSideMenu?: boolean;\n  getSelectedOpts?: any;\n  rowHighlight?: boolean;\n  wondeRow?: boolean;\n  wondeRowType?: string;\n  hideChkboxCol?: boolean;\n  setTableData?: any;\n  setTableError?: Dispatch<SetStateAction<boolean>>;\n  infoTxt?: string;\n  children?: any;\n  rowClassname?: (row: any) => string;\n};\n\nexport const InfoTable: React.FC<Props> = ({\n  title,\n  listUrl,\n  firstColWidth,\n  firstColWidthSm,\n  buttonText,\n  secondButtonText,\n  children,\n  dropdrownMenuOptions,\n  updateListStatus,\n  setUpdateList,\n  setIsPanelClosed,\n  isPanelClosed,\n  allowSelectAll = true,\n  filterTable = true,\n  setCheckTableLoading,\n  hideBtmCtrls,\n  hideSideMenu,\n  getSelectedOpts,\n  rowHighlight,\n  wondeRow,\n  wondeRowType,\n  hideChkboxCol,\n  setTableData,\n  setTableError,\n  infoTxt,\n  rowClassname,\n}) => {\n  const [infoListData, setInfoListData] = useState<any>();\n  const [loading, setLoading] = useState<boolean>(false);\n  const [errorMessage, setErrorMessage] = useState<string | null>(null);\n  const [noResultsMessage, setNoResultsMessage] = useState<string | null>(null);\n  const [listPanelOpen, setListPanelOpen] = useState(false);\n  const [bulkUploadPopupOpen, setBulkUploadPopupOpen] = useState(false);\n\n  useEffect(() => {\n    if (!updateListStatus) return;\n\n    loadInfoTableList(listUrl);\n  }, [updateListStatus]);\n\n  function loadInfoTableList(listUrl: string, paramsArr?: any) {\n    if(setCheckTableLoading){\n      setCheckTableLoading(true);\n    }\n    setLoading(true);\n    setNoResultsMessage(null);\n    setUpdateList && setUpdateList(false);\n\n    (async () => {\n      const listResults = await InfoTableApi.getInfoTableList(\n        listUrl,\n        paramsArr\n      );\n\n      if (listResults.data) {\n        const infoTableData = listResults.data;\n\n        if (\n          infoTableData &&\n          infoTableData.errors &&\n          infoTableData.errors.length\n        ) {\n          setErrorMessage(\n            'Oops, something went wrong. Please try again later.'\n          );\n\n          if(setTableError){\n            setTableError(true);\n          }\n        } else if (\n          infoTableData &&\n          infoTableData.listData &&\n          !infoTableData.listData.length\n        ) {\n          setNoResultsMessage('No results');\n        } else {\n          setErrorMessage(null);\n        }\n\n        if(setTableData && infoTableData.listData && infoTableData.listData.length > 0){\n          setTableData(infoTableData.listData);\n        }\n\n        setInfoListData(infoTableData);\n        if(setCheckTableLoading){\n          setCheckTableLoading(false);\n        }        \n        setLoading(false);\n      }\n    })();\n  }\n\n  return (\n    <React.Fragment>\n      {title && (\n        <>\n          <div className=\"InfoTableHdr\">\n            <div className=\"LeftSide\">\n              <h1 className=\"PageTitle\">{title}</h1>\n            </div>\n            {!loading && !errorMessage && buttonText && (\n              <div className=\"RightSide\">\n                {secondButtonText &&\n                  <div className=\"Btn SecondBtn\" onClick={() => setBulkUploadPopupOpen(true)}>\n                    {secondButtonText}\n                  </div>              \n                }              \n                <div className=\"Btn\" onClick={() => setListPanelOpen(true)}>\n                  {buttonText}\n                </div>\n              </div>\n            )}\n          </div>        \n          {infoTxt && \n            <>\n              <p>{infoTxt}</p>\n              <div className=\"LineSpacer5\"></div>\n            </>\n          }\n        </>\n      )}\n\n      <div className=\"InfoTableContainer\">\n        {loading ? (\n          <div className=\"PageSpinner\">\n            <Spinner color={'#f59e16'} />\n          </div>\n        ) : errorMessage ? (\n          <div className=\"FailedMsg\">\n            <div className=\"MsgContainer Error\">\n              <div className=\"Img\">\n                <img src={WarningIcon} alt=\"Warning\" />\n              </div>\n              <div className=\"Txt\">{errorMessage}</div>\n            </div>\n          </div>\n        ) : (\n          <React.Fragment>\n            <div className=\"LTContainer\">\n              {wondeRow &&\n                <div className=\"WondeLTTopRow\">\n                  <div className=\"TRCol Col1\">\n                    <h4>Wonde Records</h4>\n                  </div>\n                  <div className={\"TRCol Col2 \" + wondeRowType}>\n                    <h4>Get Set 4 Education records</h4>\n                  </div>              \n                </div>\n              }\n\n              <ListTable\n                infoListData={infoListData}\n                firstColWidth={firstColWidth}\n                firstColWidthSm={firstColWidthSm}\n                listUrl={listUrl}\n                loadInfoTableList={loadInfoTableList}\n                dropdrownMenuOptions={dropdrownMenuOptions ?? null}\n                setIsPanelClosed={setIsPanelClosed}\n                isPanelClosed={isPanelClosed}\n                allowSelectAll={allowSelectAll}\n                filterTable={filterTable}\n                noResultsMessage={noResultsMessage}\n                hideSideMenu={hideSideMenu}\n                getSelectedOpts={getSelectedOpts}\n                rowHighlight={rowHighlight}\n                hideChkboxCol={hideChkboxCol}\n                rowClassname={rowClassname}\n              >\n                {children}\n              </ListTable>\n            </div>\n\n            {noResultsMessage && \n              <div className=\"FailedMsg\">\n                <div className=\"MsgContainer NoResults\">\n                  <div className=\"Img\">\n                    <img src={NoResultsIcon} alt=\"No Results\" />\n                  </div>\n                  <div className=\"Txt\">{noResultsMessage}</div>\n                </div>\n              </div>\n            }\n\n            {!hideBtmCtrls &&\n              <ListPagination\n                listUrl={listUrl}\n                infoListData={infoListData}\n                loadInfoTableList={loadInfoTableList}\n              />\n            }\n          </React.Fragment>\n        )}\n      </div>\n\n      {listPanelOpen && (\n        <AddUser panelOpen={listPanelOpen} togglePanelOpen={setListPanelOpen} />\n      )}\n\n      {bulkUploadPopupOpen && (\n        <BulkUpload\n          panelOpen={bulkUploadPopupOpen}\n          togglePanelOpen={setBulkUploadPopupOpen}\n        />        \n      )}      \n    </React.Fragment>\n  );\n};\n","import { useCallback, useEffect } from 'react';\nimport { IUser } from '../models';\nimport { UsersApi } from '../../../api/usersApi';\nimport { endpoints } from 'endpoints.config';\n\nexport const useFetchUserDetails = (\n  action: 'view' | 'update',\n  id: number,\n  setInitialState: React.Dispatch<React.SetStateAction<IUser | null>>,\n  setError: React.Dispatch<React.SetStateAction<string>>\n) => {\n  const fetchUserDetails = useCallback(async () => {\n    const url =\n      action === 'view'\n        ? endpoints.manageUsers.viewuser\n        : endpoints.manageUsers.updateuser;\n    const result = await UsersApi.getUserDetails(url, id);\n    if (result.data) {\n      const data = result.data;\n      setInitialState(data);\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n      setError(error);\n    }\n  }, []);\n\n  useEffect(() => {\n    fetchUserDetails();\n  }, []);\n};\n\nexport default useFetchUserDetails;\n","import React, { useEffect, useState } from 'react';\nimport { Form, Formik } from 'formik';\nimport useFetchUserDetails from './hooks/useFetchUserDetails';\nimport { ISubscriptionItem, IUser } from './models';\nimport { FormBooleanField } from 'components/formComponents/FormBooleanField';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport { PopupOrPanel } from '../../components/popupsAndPanels/PopupAndPanels';\nimport ErrorMessage from 'components/errorMessage/ErrorMessage';\nimport { ERROR_MESSAGE } from 'appConstants';\nimport { useGetDashboardList } from 'pages/dashboard/useGetDashboardList';\nimport { Spinner } from 'components/spinner/Spinner';\n\ntype Props = {\n  panelOpen: boolean;\n  togglePanelOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  id: number;\n};\n\nexport const ViewUser: React.FC<Props> = ({\n  panelOpen,\n  togglePanelOpen,\n  id,\n}) => {\n  const [initialValues, setInitialValues] = useState<IUser | null>(null);\n  const [error, setError] = useState<string>('');\n\n  useFetchUserDetails('view', id, setInitialValues, setError);\n\n  const { dashboardListInfo, error: subscriptionsListError } =\n    useGetDashboardList();\n\n  const [subscriptionsList, setSubscriptionList] = useState<\n    ISubscriptionItem[] | null\n  >(null);\n\n  useEffect(() => {\n    if (dashboardListInfo) {\n      const subjectsList = dashboardListInfo.map((item) => ({\n        label: item.subject,\n        fieldName: `b${item.subject.split(' ').join('')}`,\n      }));\n      setSubscriptionList(subjectsList);\n    }\n  }, [dashboardListInfo]);\n\n  if (error)\n    return (\n      <PopupOrPanel\n        isPopup={false}\n        isOpen={panelOpen}\n        hdrTitle={'View user'}\n        position=\"right\"\n        primaryBtnTxt=\"Close\"\n        secondaryBtnTxt=\"Cancel\"\n        givenClass=\"ViewManagedUser\"\n        handleClose={() => togglePanelOpen(false)}\n        handlePrimaryBtn={() => togglePanelOpen(false)}\n        handleSecondaryBtn={() => togglePanelOpen(false)}\n        width={560}\n      >\n        <ErrorMessage message={ERROR_MESSAGE} />\n      </PopupOrPanel>\n    );\n\n  if (initialValues)\n    return (\n      <Formik\n        initialValues={initialValues}\n        validationSchema={{}}\n        onSubmit={() => {}}\n      >\n        {({ values }) => (\n          <PopupOrPanel\n            isPopup={false}\n            isOpen={panelOpen}\n            hdrTitle={'View user'}\n            position=\"right\"\n            primaryBtnTxt=\"Close\"\n            secondaryBtnTxt=\"Cancel\"\n            givenClass=\"ViewManagedUser\"\n            handleClose={() => togglePanelOpen(false)}\n            handlePrimaryBtn={() => togglePanelOpen(false)}\n            handleSecondaryBtn={() => togglePanelOpen(false)}\n            width={560}\n          >\n            {subscriptionsList ? (\n              <Form>\n                <FormTextField\n                  label=\"First name\"\n                  field=\"firstName\"\n                  labelPosition=\"left\"\n                  required={true}\n                  optionalTag={'optional'}\n                  value={values.firstName}\n                  readOnly={true}\n                />\n                <FormTextField\n                  label=\"Last name\"\n                  field=\"lastName\"\n                  labelPosition=\"left\"\n                  required={true}\n                  optionalTag={'optional'}\n                  value={values.lastName}\n                  readOnly={true}\n                />\n                <FormTextField\n                  label=\"Email address\"\n                  field=\"emailAddress\"\n                  labelPosition=\"left\"\n                  required={true}\n                  optionalTag={'optional'}\n                  value={values.emailAddress}\n                  readOnly={true}\n                />\n                <FormBooleanField\n                  fieldName=\"bMainAccountHolder\"\n                  label=\"Main account holder\"\n                  labelPosition=\"left\"\n                  readOnly={true}\n                />\n                <h4 className=\"SpaceTopBtm\">Platform access</h4>\n\n                {subscriptionsList.map((item: any, index: number) => (\n                  <FormBooleanField\n                    key={index}\n                    fieldName={item.fieldName}\n                    label={item.label}\n                    labelPosition=\"left\"\n                    readOnly={true}\n                  />\n                ))}\n              </Form>\n            ) : (\n              <Spinner positionAbsolute />\n            )}\n          </PopupOrPanel>\n        )}\n      </Formik>\n    );\n  return null;\n};\n","import React, { useEffect, useState } from 'react';\nimport { Form, Formik, FormikHelpers } from 'formik';\nimport * as Yup from 'yup';\nimport { useDispatch } from 'react-redux';\nimport { setUpdateUsersList } from 'reducers/misc';\nimport { UsersApi } from '../../api/usersApi';\nimport useFetchUserDetails from './hooks/useFetchUserDetails';\nimport { ISubscriptionItem, IUser } from './models';\nimport { PopupOrPanel } from '../../components/popupsAndPanels/PopupAndPanels';\nimport { FormBooleanField } from 'components/formComponents/FormBooleanField';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport Tooltip from 'components/tooltip/Tooltip';\nimport FormGeneralError from 'components/formComponents/FormGeneralError';\nimport ErrorMessage from 'components/errorMessage/ErrorMessage';\nimport { ERROR_MESSAGE } from 'appConstants';\nimport { useGetDashboardList } from 'pages/dashboard/useGetDashboardList';\nimport { Spinner } from 'components/spinner/Spinner';\n\ntype Props = {\n  panelOpen: boolean;\n  togglePanelOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  id: number;\n};\n\nconst tooltip = (\n  <Tooltip text=\"This person will have access to subscriptions, manage users and manage school\" />\n);\n\nexport const UpdateUser: React.FC<Props> = ({\n  panelOpen,\n  togglePanelOpen,\n  id,\n}) => {\n  const [initialValues, setInitialValues] = useState<IUser | null>(null);\n  const [error, setError] = useState<string>('');\n  const [detailsError, setDetailsError] = useState<string>('');\n\n  const dispatch = useDispatch();\n  const setUpdateList = (status: boolean) =>\n    dispatch(setUpdateUsersList(status));\n\n  useFetchUserDetails('update', id, setInitialValues, setDetailsError);\n\n  const validationSchemaAddUser = Yup.object({\n    firstName: Yup.string().required('First name is required'),\n    lastName: Yup.string().required('Last name is required'),\n    emailAddress: Yup.string()\n      .email('Please enter a valid email address')\n      .required('Email address is required'),\n    bMainAccountHolder: Yup.boolean().required('Required field'),\n    bGetSet4PE: Yup.boolean().required('Required field'),\n    bGetSet4Music: Yup.boolean().required('Required field'),\n  });\n\n  const { dashboardListInfo, error: subscriptionsListError } =\n    useGetDashboardList();\n\n  const [subscriptionsList, setSubscriptionList] = useState<\n    ISubscriptionItem[] | null\n  >(null);\n\n  useEffect(() => {\n    if (dashboardListInfo) {\n      const subjectsList = dashboardListInfo.map((item) => ({\n        label: item.subject,\n        fieldName: `b${item.subject.split(' ').join('')}`,\n      }));\n      setSubscriptionList(subjectsList);\n    }\n  }, [dashboardListInfo]);\n\n  const handleSubmitUserDetails = async (\n    values: IUser,\n    { setSubmitting }: FormikHelpers<IUser>\n  ) => {\n    setError('');\n    setSubmitting(true);\n    const result = await UsersApi.submitUser(id, values);\n    if (result.data) {\n      const paramItems = JSON.stringify(localStorage.getItem(\"updateItemTableParams\") || '{}');\n      setSubmitting(false);\n      setUpdateList(true);\n      togglePanelOpen(false);\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n      setError(error);\n      setSubmitting(false);\n    }\n  };\n\n  if (detailsError)\n    return (\n      <PopupOrPanel\n        isPopup={false}\n        isOpen={panelOpen}\n        hdrTitle={'Update user'}\n        position=\"right\"\n        primaryBtnTxt=\"Close\"\n        secondaryBtnTxt=\"Cancel\"\n        givenClass=\"UpdateManagedUser\"\n        handleClose={() => togglePanelOpen(false)}\n        handlePrimaryBtn={() => togglePanelOpen(false)}\n        handleSecondaryBtn={() => togglePanelOpen(false)}\n        width={560}\n      >\n        <ErrorMessage message={ERROR_MESSAGE} />\n      </PopupOrPanel>\n    );\n\n  if (initialValues)\n    return (\n      <Formik\n        initialValues={initialValues}\n        validationSchema={validationSchemaAddUser}\n        onSubmit={(values, formikHelpers) =>\n          handleSubmitUserDetails(values, formikHelpers)\n        }\n      >\n        {({ values, submitForm, setFieldValue, isSubmitting }) => (\n          <PopupOrPanel\n            isPopup={false}\n            isOpen={panelOpen}\n            hdrTitle={'Update user'}\n            position=\"right\"\n            primaryBtnTxt=\"Update\"\n            secondaryBtnTxt=\"Cancel\"\n            givenClass=\"UpdateManagedUser\"\n            handleClose={() => togglePanelOpen(false)}\n            handlePrimaryBtn={submitForm}\n            handleSecondaryBtn={() => togglePanelOpen(false)}\n            width={560}\n            isSubmitting={isSubmitting}\n          >\n            {subscriptionsList ? (\n              <Form>\n                {error && <FormGeneralError message={error} />}\n                <FormTextField\n                  label=\"First name\"\n                  field=\"firstName\"\n                  labelPosition=\"left\"\n                  required={true}\n                  optionalTag={'optional'}\n                  value={values.firstName}\n                />\n                <FormTextField\n                  label=\"Last name\"\n                  field=\"lastName\"\n                  labelPosition=\"left\"\n                  required={true}\n                  optionalTag={'optional'}\n                  value={values.lastName}\n                />\n                <FormTextField\n                  label=\"Email address\"\n                  field=\"emailAddress\"\n                  labelPosition=\"left\"\n                  required={true}\n                  optionalTag={'optional'}\n                  value={values.emailAddress}\n                />\n                <FormBooleanField\n                  fieldName=\"bMainAccountHolder\"\n                  label=\"Main account holder\"\n                  labelPosition=\"left\"\n                  tooltip={tooltip}\n                />\n                <h4 className=\"SpaceTopBtm\">Platform access</h4>\n                {subscriptionsList.map((item: any, index: number) => (\n                  <FormBooleanField\n                    key={index}\n                    fieldName={item.fieldName}\n                    label={item.label}\n                    labelPosition=\"left\"\n                  />\n                ))}\n              </Form>\n            ) : (\n              <Spinner positionAbsolute />\n            )}\n          </PopupOrPanel>\n        )}\n      </Formik>\n    );\n  return null;\n};\n","import FormGeneralError from 'components/formComponents/FormGeneralError';\nimport React, { useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { setUpdateUsersList } from 'reducers/misc';\nimport { UsersApi } from '../../api/usersApi';\nimport { PopupOrPanel } from '../../components/popupsAndPanels/PopupAndPanels';\n\ntype Props = {\n  panelOpen: boolean;\n  togglePanelOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  addPluralTxt: boolean | undefined;\n  ids: number[];\n};\n\nexport const DeleteUsers: React.FC<Props> = ({\n  panelOpen,\n  togglePanelOpen,\n  addPluralTxt,\n  ids,\n}) => {\n  const [error, setError] = useState<string>('');\n  const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n\n  const dispatch = useDispatch();\n  const setUpdateList = (status: boolean) =>\n    dispatch(setUpdateUsersList(status));\n\n  const deleteUser = async () => {\n    setError('');\n    setIsSubmitting(true);\n    const result = await UsersApi.deleteUser(ids);\n    if (result.data) {\n      const paramItems = JSON.stringify(localStorage.getItem(\"updateItemTableParams\") || '{}');\n      togglePanelOpen(false);\n      setUpdateList(true);\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n      setError(error);\n    }\n    setIsSubmitting(false);\n  };\n  return (\n    <PopupOrPanel\n      isPopup={true}\n      isOpen={panelOpen}\n      hdrTitle={'Delete user' + (addPluralTxt ? 's' : '')}\n      position=\"right\"\n      primaryBtnTxt=\"Delete\"\n      secondaryBtnTxt=\"Cancel\"\n      givenClass=\"DeleteManagedUser\"\n      primaryBtnColor=\"BtnRed\"\n      handleClose={() => togglePanelOpen(false)}\n      handlePrimaryBtn={deleteUser}\n      handleSecondaryBtn={() => togglePanelOpen(false)}\n      width={560}\n      isSubmitting={isSubmitting}\n    >\n      {error && <FormGeneralError message={error} />}\n      <p>\n        Are you sure you want to delete{' '}\n        {addPluralTxt ? 'these users' : 'this user'}?\n      </p>\n    </PopupOrPanel>\n  );\n};\n","import React, { useState } from 'react';\nimport { ViewUser } from './ViewUser';\nimport { UpdateUser } from './UpdateUser';\nimport { AccessPermission } from './AccessPermission';\nimport { DeleteUsers } from './DeleteUsers';\nimport { Transition } from \"react-transition-group\";\n\ntype Props = {\n  openCloseState?: string;\n  checkboxList?: Array<number>;\n};\n\nexport const ManageUsersMenuOptions: React.FC<Props> = ({\n  openCloseState,\n  checkboxList,\n}) => {\n  const [openViewPopup, setOpenViewPopup] = useState<boolean>(false);\n  const [openUpdatePopup, setOpenUpdatePopup] = useState<boolean>(false);\n  const [openAccessPopup, setOpenAccessPopup] = useState<boolean>(false);\n  const [openDeletePopup, setOpenDeletePopup] = useState<boolean>(false);\n\n  return (\n    <Transition in={openCloseState?.toLowerCase() === \"open\"} timeout={0} mountOnEnter>\n      {transitionState => (\n        <div className={`RightMenu ${openCloseState} ` + transitionState}>\n          {checkboxList && checkboxList.length > 0 && (\n            <div className=\"ItemsContainer\">\n              {/* View User */}\n              {checkboxList.length === 1 && (\n                <div className=\"Item\" onClick={() => setOpenViewPopup(true)}>\n                  <span>View User</span>\n                </div>\n              )}\n              {openViewPopup && (\n                <ViewUser\n                  panelOpen={openViewPopup}\n                  togglePanelOpen={setOpenViewPopup}\n                  id={checkboxList[0]}\n                />\n              )}\n\n              {/* Update User */}\n              {checkboxList.length === 1 && (\n                <div className=\"Item\" onClick={() => setOpenUpdatePopup(true)}>\n                  <span>Update User</span>\n                </div>\n              )}\n              {openUpdatePopup && (\n                <UpdateUser\n                  panelOpen={openUpdatePopup}\n                  togglePanelOpen={setOpenUpdatePopup}\n                  id={checkboxList[0]}\n                />\n              )}\n\n              {/* Access Permission */}\n              {/* {checkboxList.length === 1 && (\n                <div className=\"Item\" onClick={() => setOpenAccessPopup(true)}>\n                  <span>Access Permission</span>\n                </div>\n              )}\n              {openAccessPopup && (\n                <AccessPermission\n                  panelOpen={openAccessPopup}\n                  togglePanelOpen={setOpenAccessPopup}\n                  id={checkboxList[0]}\n                />\n              )} */}\n\n              {/* Delete user(s) */}\n              <div className=\"Item\" onClick={() => setOpenDeletePopup(true)}>\n                <span>\n                  Delete User{checkboxList && checkboxList.length > 1 ? 's' : ''}\n                </span>\n              </div>\n              {openDeletePopup && (\n                <DeleteUsers\n                  panelOpen={openDeletePopup}\n                  togglePanelOpen={setOpenDeletePopup}\n                  addPluralTxt={checkboxList && checkboxList.length > 1}\n                  ids={checkboxList}\n                />\n              )}\n            </div>\n          )}\n        </div>\n      )}\n    </Transition>\n  );\n};\n","import { useCallback, useEffect } from 'react';\nimport { IUserAccessPermissions } from '../models';\nimport { UsersApi } from '../../../api/usersApi';\n\nexport const useFetchUserAccessPermissions = (\n  id: number,\n  setInitialState: React.Dispatch<\n    React.SetStateAction<IUserAccessPermissions | null>\n  >,\n  setError: React.Dispatch<React.SetStateAction<string>>\n) => {\n  const fetchUserAccessPermissions = useCallback(async () => {\n    const result = await UsersApi.getUserAccessPermissions(id);\n    if (result.data) {\n      const data = result.data;\n      setInitialState(data);\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n      setError(error);\n    }\n  }, []);\n\n  useEffect(() => {\n    fetchUserAccessPermissions();\n  }, []);\n};\n\nexport default useFetchUserAccessPermissions;\n","import React, { useEffect, useState } from 'react';\nimport { Form, Formik, FormikHelpers } from 'formik';\nimport * as Yup from 'yup';\nimport { ISubscriptionItem, IUserAccessPermissions } from './models';\nimport useFetchUserAccessPermissions from './hooks/useFetchUserAccesspermissions';\nimport { UsersApi } from '../../api/usersApi';\nimport { PopupOrPanel } from '../../components/popupsAndPanels/PopupAndPanels';\nimport { FormBooleanField } from 'components/formComponents/FormBooleanField';\nimport FormGeneralError from 'components/formComponents/FormGeneralError';\nimport ErrorMessage from 'components/errorMessage/ErrorMessage';\nimport { ERROR_MESSAGE } from 'appConstants';\nimport { useGetDashboardList } from 'pages/dashboard/useGetDashboardList';\nimport { Spinner } from 'components/spinner/Spinner';\n\ntype Props = {\n  panelOpen: boolean;\n  togglePanelOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  id: number;\n};\n\nexport const AccessPermission: React.FC<Props> = ({\n  panelOpen,\n  togglePanelOpen,\n  id,\n}) => {\n  const [initialValues, setInitialValues] =\n    useState<IUserAccessPermissions | null>(null);\n  const [error, setError] = useState<string>('');\n  const [detailsError, setDetailsError] = useState<string>('');\n\n  const validationSchemaAddUser = Yup.object({\n    bGetSet4PE: Yup.boolean().required('Required field'),\n    bGetSet4Music: Yup.boolean().required('Required field'),\n  });\n\n  useFetchUserAccessPermissions(id, setInitialValues, setDetailsError);\n\n  const { dashboardListInfo, error: subscriptionsListError } =\n    useGetDashboardList();\n\n  const [subscriptionsList, setSubscriptionList] = useState<\n    ISubscriptionItem[] | null\n  >(null);\n\n  useEffect(() => {\n    if (dashboardListInfo) {\n      const subjectsList = dashboardListInfo.map((item) => ({\n        label: item.subject,\n        fieldName: `b${item.subject.split(' ').join('')}`,\n      }));\n      setSubscriptionList(subjectsList);\n    }\n  }, [dashboardListInfo]);\n\n  const submitAccessPermissions = async (\n    values: IUserAccessPermissions,\n    { setSubmitting }: FormikHelpers<IUserAccessPermissions>\n  ) => {\n    setError('');\n    setSubmitting(true);\n    const result = await UsersApi.submitAccessPermissions(id, values);\n    if (result.data) {\n      setSubmitting(false);\n      togglePanelOpen(false);\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n      setError(error);\n      setSubmitting(false);\n    }\n  };\n\n  if (detailsError)\n    return (\n      <PopupOrPanel\n        isPopup={false}\n        isOpen={panelOpen}\n        hdrTitle={'Access permission'}\n        position=\"right\"\n        primaryBtnTxt=\"Close\"\n        secondaryBtnTxt=\"Cancel\"\n        givenClass=\"AccessPermissionManagedUser\"\n        handleClose={() => togglePanelOpen(false)}\n        handlePrimaryBtn={() => togglePanelOpen(false)}\n        handleSecondaryBtn={() => togglePanelOpen(false)}\n        width={560}\n      >\n        <ErrorMessage message={ERROR_MESSAGE} />\n      </PopupOrPanel>\n    );\n\n  if (initialValues)\n    return (\n      <Formik\n        initialValues={initialValues}\n        validationSchema={validationSchemaAddUser}\n        onSubmit={(values, formikHelpers) =>\n          submitAccessPermissions(values, formikHelpers)\n        }\n      >\n        {({ values, submitForm, setFieldValue, isSubmitting }) => (\n          <PopupOrPanel\n            isPopup={false}\n            isOpen={panelOpen}\n            hdrTitle={'Access permission'}\n            position=\"right\"\n            primaryBtnTxt=\"Apply\"\n            secondaryBtnTxt=\"Cancel\"\n            givenClass=\"AccessPermissionManagedUser\"\n            handleClose={() => togglePanelOpen(false)}\n            handlePrimaryBtn={submitForm}\n            handleSecondaryBtn={() => togglePanelOpen(false)}\n            width={560}\n            isSubmitting={isSubmitting}\n          >\n            {subscriptionsList ? (\n              <Form>\n                {error && <FormGeneralError message={error} />}\n                {subscriptionsList.map((item: any, index: number) => (\n                  <FormBooleanField\n                    key={index}\n                    fieldName={item.fieldName}\n                    label={item.label}\n                    labelPosition=\"left\"\n                  />\n                ))}\n              </Form>\n            ) : (\n              <Spinner positionAbsolute />\n            )}\n          </PopupOrPanel>\n        )}\n      </Formik>\n    );\n  return null;\n};\n","import React, { useState } from 'react';\nimport { ViewUser } from './ViewUser';\nimport { UpdateUser } from './UpdateUser';\nimport { AccessPermission } from './AccessPermission';\nimport { DeleteUsers } from './DeleteUsers';\n\ntype Props = {\n  closeMenu?: () => void;\n  rowId?: number;\n  openCloseState: { open: boolean; id: number | null };\n};\n\nexport const ManageUsersDropdownOptions: React.FC<Props> = ({\n  closeMenu,\n  rowId,\n  openCloseState,\n}) => {\n  const [openViewPopup, setOpenViewPopup] = useState<boolean>(false);\n  const [openUpdatePopup, setOpenUpdatePopup] = useState<boolean>(false);\n  const [openAccessPopup, setOpenAccessPopup] = useState<boolean>(false);\n  const [openDeletePopup, setOpenDeletePopup] = useState<boolean>(false);\n\n  return (\n    <React.Fragment>\n      {openCloseState.open && openCloseState.id === rowId && (\n        <div className=\"RowOptionsMenuContainer\">\n          {rowId && closeMenu && (\n            <div className=\"ItemsContainer\">\n              {/* View User */}\n              <div\n                className=\"Item\"\n                onClick={() => {\n                  closeMenu();\n                  setOpenViewPopup(true);\n                }}\n              >\n                <span>View User</span>\n              </div>\n\n              {/* Update User */}\n              <div\n                className=\"Item\"\n                onClick={() => {\n                  closeMenu();\n                  setOpenUpdatePopup(true);\n                }}\n              >\n                <span>Update User</span>\n              </div>\n\n              {/* Access Permission */}\n              {/* <div\n                className=\"Item\"\n                onClick={() => {\n                  closeMenu();\n                  setOpenAccessPopup(true);\n                }}\n              >\n                <span>Access Permission</span>\n              </div> */}\n\n              {/* Delete user */}\n              <div\n                className=\"Item\"\n                onClick={() => {\n                  closeMenu();\n                  setOpenDeletePopup(true);\n                }}\n              >\n                <span>Delete User</span>\n              </div>\n            </div>\n          )}\n        </div>\n      )}\n\n      {/* View User Panel  */}\n      {openViewPopup && rowId && (\n        <ViewUser\n          panelOpen={openViewPopup}\n          togglePanelOpen={setOpenViewPopup}\n          id={rowId}\n        />\n      )}\n\n      {/* Update User Panel  */}\n      {openUpdatePopup && rowId && (\n        <UpdateUser\n          panelOpen={openUpdatePopup}\n          togglePanelOpen={setOpenUpdatePopup}\n          id={rowId}\n        />\n      )}\n      {/* Access Permission Panel  */}\n      {openAccessPopup && rowId && (\n        <AccessPermission\n          panelOpen={openAccessPopup}\n          togglePanelOpen={setOpenAccessPopup}\n          id={rowId}\n        />\n      )}\n\n      {/* Delete User Modal  */}\n      {openDeletePopup && rowId && (\n        <DeleteUsers\n          panelOpen={openDeletePopup}\n          togglePanelOpen={setOpenDeletePopup}\n          addPluralTxt={false}\n          ids={[rowId]}\n        />\n      )}\n    </React.Fragment>\n  );\n};\n","import { RouteComponentProps } from '@reach/router';\nimport Page from 'components/shared/Page';\nimport React, { useEffect, useState } from 'react';\nimport { endpoints } from '../../endpoints.config';\nimport { InfoTable } from 'components/infoTable/infoTable';\nimport { ManageUsersMenuOptions } from './ManageUsersMenuOptions';\nimport { ManageUsersDropdownOptions } from './ManageUsersDropdownOptions';\nimport { selectUpdateUsersList, setUpdateUsersList } from 'reducers/misc';\nimport { useDispatch, useSelector } from 'react-redux';\n\nconst dropdrownMenuOptions = (\n  id: number,\n  name: string,\n  closeMenu: () => void,\n  openCloseState: { open: boolean; id: number | null }\n) => (\n  <ManageUsersDropdownOptions\n    rowId={id}\n    closeMenu={closeMenu}\n    openCloseState={openCloseState}\n  />\n);\n\nexport const ManageUsers: React.FC<RouteComponentProps> = () => {\n  const updateUsersListStatus: boolean = useSelector(selectUpdateUsersList);\n  const [isPanelClosed, setIsPanelClosed] = useState<boolean>(true);\n\n  const dispatch = useDispatch();\n  const setUpdateList = (status: boolean) =>\n    dispatch(setUpdateUsersList(status));\n\n  useEffect(() => {\n    return () => {\n      setUpdateList(true);\n    };\n  }, []);\n\n  useEffect(() => {\n    //clear saved list params when updating table items\n    localStorage.removeItem('updateItemTableParams');\n  }, []);  \n\n  return (\n    <Page>\n      <div className=\"PageContent ManageUsersPage WidthContent\">\n        <InfoTable\n          title=\"Manage Users\"\n          listUrl={endpoints.manageUsers.list}\n          firstColWidth={300}\n          firstColWidthSm={80}\n          buttonText={'Add new user'}\n          secondButtonText={'Bulk Edit / Bulk Upload'}\n          dropdrownMenuOptions={dropdrownMenuOptions}\n          updateListStatus={updateUsersListStatus}\n          setUpdateList={setUpdateList}\n          setIsPanelClosed={setIsPanelClosed}\n          isPanelClosed={isPanelClosed}\n        >\n          <ManageUsersMenuOptions />\n        </InfoTable>\n      </div>\n    </Page>\n  );\n};\n","import { format, formatISO, parse, parseISO } from 'date-fns';\n\nexport interface ISchool {\n  schoolName: string;\n  schoolPhoneNumber: string;\n  addressLine1: string;\n  addressLine2: string | null;\n  addressLine3: string | null;\n  townCity: string;\n  county: string;\n  country: string;\n  postcodeZipcode: string;\n  yearlyArchivingDate?: string;\n  financeEmail?: string;\n  Logo?: string;\n  bDeleteLogo?: boolean;\n  logoUrl?: string;\n  logoExtension?: string;\n}\n\nexport interface IArchivingInfo {\n  password: string;\n  yearlyArchivingDate?: string;\n}\n\nexport class SchoolParser {\n  public static createEmptyArchivingInfo = (): IArchivingInfo => ({\n    password: '',\n    yearlyArchivingDate: '',\n  });\n\n  public static parseGetSchoolDetails = (response: any): ISchool => ({\n    ...response,\n    addressLine2: response.addressLine2 ?? '',\n    addressLine3: response.addressLine3 ?? '',\n    county: response.county ?? '',\n    yearlyArchivingDate: format(\n      parseISO(response.yearlyArchivingDate),\n      'dd/MM/yyyy'\n    ),\n  });\n\n  public static buildSubmitSchoolPayload = (values: ISchool) => ({\n    schoolName: values.schoolName,\n    schoolPhoneNumber: values.schoolPhoneNumber,\n    addressLine1: values.addressLine1,\n    addressLine2: values.addressLine2,\n    addressLine3: values.addressLine3,\n    townCity: values.townCity,\n    county: values.county,\n    postcodeZipcode: values.postcodeZipcode,\n    country: values.country,\n    FinanceEmail: values.financeEmail,\n  });\n\n  public static buildArchiveSchoolPayload = (values: IArchivingInfo) => {\n    if (!values.yearlyArchivingDate) return;\n\n    return {\n      password: values.password,\n      yearlyArchivingDate: formatISO(\n        parse(values.yearlyArchivingDate, 'dd/MM/yyyy', new Date())\n      ),\n    };\n  };\n\n  public static buildArchiveNowPayload = (\n    values: IArchivingInfo\n  ): IArchivingInfo => ({\n    password: values.password,\n  });\n\n  public static parseError = (errors: any) => {\n    let error: string;\n    switch (errors[0].messageCode) {\n      case 'School_Acccount_Recently_Archived':\n        error = 'School account recently archived';\n        break;\n      case 'Invalid_ArchivingDate':\n        error = 'Invalid archiving date ';\n        break;\n      case 'Incorrect_Password':\n        error = 'Invalid password';\n        break;\n      default:\n        error = 'Sorry something went wrong. Please try again.';\n    }\n    return error;\n  };\n}\n","import { AxiosError, AxiosResponse } from 'axios';\nimport instance from 'api';\nimport { ApiResponse, BaseApi } from 'baseApi';\nimport { endpoints } from 'endpoints.config';\nimport {\n  IArchivingInfo,\n  ISchool,\n  SchoolParser,\n} from 'pages/manageSchool/models';\n\nconst UNKOWN_ERROR_MESSAGE = 'Sorry, something went wrong. Please try again.';\n\nexport class SchoolApi extends BaseApi {\n  // get school details\n  public static getSchoolDetails = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.manageschool.getSchoolDetails\n      );\n\n      if (SchoolApi.isResponseSuccessful(result.data)) {\n        const data = SchoolParser.parseGetSchoolDetails(result.data.details);\n        return SchoolApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          //TODO: build error parser\n          // const message = UsersParser.parseError(errors);\n          // return UsersApi.errorResponse(message);\n          return null;\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.errors;\n        if (errors) {\n          //TODO: build error parser\n          // const message = UsersParser.parseError(errors);\n          // return UsersApi.errorResponse(message);\n          return null;\n        }\n      }\n      return SchoolApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  //submit update school form\n  public static submitSchoolDetails = async (values: ISchool): Promise<any> => {\n    try {\n      let payload = SchoolParser.buildSubmitSchoolPayload(values);\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.manageschool.updateSchoolDetails,\n        payload\n      );\n\n      if (SchoolApi.isResponseSuccessful(result.data)) {\n        const data = SchoolParser.parseGetSchoolDetails(result.data.details);\n        return SchoolApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SchoolParser.parseError(errors);\n          return SchoolApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SchoolParser.parseError(errors);\n          return SchoolApi.errorResponse(message);\n        }\n      }\n      return SchoolApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  //submit update school form\n  public static submitSchoolDetailsIForm = async (data: any): Promise<any> => {\n    try {\n      const config = {\n        headers: {\n          \"content-type\": \"multipart/form-data\",\n        },\n      };       \n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.manageschool.updateSchoolDetails,\n        data,\n        config\n      );\n\n      if (SchoolApi.isResponseSuccessful(result.data)) {\n        const data = SchoolParser.parseGetSchoolDetails(result.data.details);\n        return SchoolApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SchoolParser.parseError(errors);\n          return SchoolApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SchoolParser.parseError(errors);\n          return SchoolApi.errorResponse(message);\n        }\n      }\n      return SchoolApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };  \n\n  //submit archiving data form\n  public static submitArchiveDate = async (\n    values: IArchivingInfo\n  ): Promise<any> => {\n    try {\n     \n      let payload = SchoolParser.buildArchiveSchoolPayload(values);\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.manageschool.updateArchivingDate,\n        payload\n      );\n      if (SchoolApi.isResponseSuccessful(result.data)) {\n        const data = SchoolParser.parseGetSchoolDetails(result.data.details);\n        return SchoolApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SchoolParser.parseError(errors);\n          return SchoolApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          //TODO: build error parser\n          const message = SchoolParser.parseError(errors);\n          return SchoolApi.errorResponse(message);\n        }\n      }\n      return SchoolApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n\n  //submit archiving now\n  public static submitArchiveNow = async (\n    values: IArchivingInfo\n  ): Promise<any> => {\n    try {\n      let payload = SchoolParser.buildArchiveNowPayload(values);\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.manageschool.archiveNow,\n        payload\n      );\n      if (SchoolApi.isResponseSuccessful(result.data)) {\n        const data = SchoolParser.parseGetSchoolDetails(result.data.details);\n        return SchoolApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = SchoolParser.parseError(errors);\n          return SchoolApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = SchoolParser.parseError(errors);\n          return SchoolApi.errorResponse(message);\n        }\n      }\n      return SchoolApi.errorResponse(UNKOWN_ERROR_MESSAGE);\n    }\n  };\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAA8CAMAAACn4e/8AAAAXVBMVEVHcEyVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKKVmKJCijjzAAAAHnRSTlMABtVsL/ztsPANhpF39yHjFsLcQVaaAmDLuE03Kac3PjGPAAACBklEQVRYw82Y65KCMAyFl0LLHeR+k7z/Y66uOiJAm4Q6s+enduaDkpyc9ufnvyis4yKXAKnwE+87iMpPYSHhhtYRUw9r5Z3ljWpgT8PFIiMTsK/c3qfxFBxJ2aJkxwyA/LVjTpZ5V4fLcAToVLT32m6EfDAH98qBxKBXkjXBxw99R34hTxog6XZBWRMhA3BEK+4r8KQqAiRiQqQc8RABXOEpF+ArxTbqeAICJdKn3TMQiI2N7nVJHBWnIFK7YU73OaG4EF8zPSIFlpQdMTprCIDkoGgHsCixbyMlWFVIG4Jrc8KtrIhD8LNwqkpi1rnbssI7lYts1Ig8BN9q7ssbTtNPaEbxN2CdggFBe8grolxy49J+ZfgV3cM9hPn00xIyYyGLmFBjCnHR9iHWEiPyeJ5bykPdtXJWnzRYkPUrQk5v1aTaUhnLJdTz0XKcm+wcwST+Q6Y8K0IGAfXIx2g32QrjLyMWUhzEdby/BGg32RmnCH/BBVJNImzN/qJwrqI9dJhbGVUj0cn4jzmJ+K0e0hr8RSJOCcIYng3+kpt7SmUnj+IwPB9FU8Sl/9ROJExe/5WYLJnQjR5t9jDhrgVOQd55dZJfg7gUP2VCSocS75iQitS4PMjaLVxpHzJv3GIStiHNjiM5SWATEuzfh7ZhImxBgkhzX+QlswhokDRYqSzikX1hyNUv0VWfvGFYL6YAAAAASUVORK5CYII=\"","import React from \"react\";\nimport { useDropzone, DropzoneOptions, DropEvent } from \"react-dropzone\";\n\n// Icons\nimport UploadIcon from \"../../images/Icon_Upload.png\";\nimport WarningIcon from \"../../images/Icon_Warning.png\";\n\ntype DropzoneProps = {\n  children?(isDragActive: boolean): React.ReactNode;\n  uploadedFile?: File;\n  onDrop<T extends File>(\n    acceptedFiles: T[],\n    rejectedFiles: T[],\n    event: DropEvent\n  ): void;\n  fileType?: string;\n  dropzoneOptions?: DropzoneOptions;\n  readOnly: boolean;\n  dropzoneText?: string;\n  uploadIcon?: string;\n  warningIcon?: string;\n  showWarningMessage?: string | null;\n  hasUploadedImage?: boolean;\n  uploadedImageUrl?: string;\n  fileName?: string;\n  acceptedTypes?: string[] | null;\n};\n\nfunction Dropzone<T>(props: DropzoneProps) {\n  const [imageBase64, setImageBase64] = React.useState<string>(\"\");\n\n  if (props.uploadedFile && props.uploadedFile.type) {\n    const reader = new FileReader();\n    reader.onloadend = () => {\n      const imageBase64 = reader.result;\n      setImageBase64(imageBase64 as string);\n    };\n    reader.readAsDataURL(props.uploadedFile);\n  }\n\n  const dropzoneOptObj = {\n    ...props.dropzoneOptions,\n    onDrop: props.onDrop,\n    disabled: props.readOnly,\n  };\n  \n  if(props.acceptedTypes){\n    dropzoneOptObj.accept = props.acceptedTypes;\n  }\n\n  const { getRootProps, getInputProps, isDragActive } = useDropzone(dropzoneOptObj);\n\n  return (\n    <div\n      className={\n        props.uploadedFile || props.hasUploadedImage\n          ? \"Dropzone Disabled\"\n          : \"Dropzone\"\n      }\n      {...getRootProps()}\n    >\n      {/* If no files uploaded */}\n      {!props.uploadedFile && (\n        <>\n          <input\n            {...getInputProps({\n              multiple: false,\n            })}\n          />\n\n          {props.children ? (\n            props.children(isDragActive)\n          ) : props.hasUploadedImage ? (\n            <>\n              <img src={props.uploadedImageUrl} alt=\"Upload\" />\n            </>\n          ) : (\n            <>\n              {!props.showWarningMessage ? (\n                <div className=\"NoImgPlaceholder\">\n                  {props.uploadIcon ? (\n                    <img className=\"Icon\" src={props.uploadIcon} alt=\"Upload\" />\n                  ) : (\n                    <img className=\"Icon\" src={UploadIcon} alt=\"Upload\" />\n                  )}\n\n                  {props.dropzoneText && <p>{props.dropzoneText}</p>}\n                </div>\n              ) : (\n                <span className=\"WarningMessage NoImage\">\n                  {props.warningIcon ? (\n                    <img\n                      className=\"Icon\"\n                      src={props.warningIcon}\n                      alt=\"Upload\"\n                    />\n                  ) : (\n                    <img className=\"Icon\" src={WarningIcon} alt=\"Upload\" />\n                  )}\n\n                  <div>{props.showWarningMessage}</div>\n                </span>\n              )}\n            </>\n          )}\n        </>\n      )}\n\n      {/* If file uploaded, display it */}\n      {props.uploadedFile && (\n        <>\n          {props.fileName !== \"\" && props.fileName !== undefined ? (\n            <img\n              className=\"UploadedImage\"\n              src={props.uploadedImageUrl}\n              alt={props.fileName}\n            />\n          ) : (\n            <>\n              {props.fileType && props.fileType === \"image\" ? (\n                <img\n                  className=\"UploadedImage\"\n                  src={imageBase64}\n                  alt={props.uploadedFile.name}\n                />\n              ) : (\n                <p>{props.uploadedFile.name || props.fileName}</p>\n              )}\n            </>\n          )}\n        </>\n      )}\n    </div>\n  );\n}\n\nexport { Dropzone };\n","import React, { useEffect, useState } from \"react\";\nimport { useFormikContext } from \"formik\";\nimport { ErrorM } from '../../components/formComponents/ErrorM';\nimport { Dropzone } from \"./Dropzone\";\n\nexport interface FormDropzoneFieldProps {\n  field: any;\n  label: string;\n  readOnly?: boolean;\n  onFileUploadEnd(file: File): void;\n  file: any;\n  fileInstructions?: string;\n  maximumFileSizeInMB?: number;\n  maximumNoOfFiles?: number;\n  fileType?: string;\n  dropzoneText?: string;\n  uploadIcon?: string;\n  warningIcon?: string;\n  showUploadedImage?: any;\n  uploadedImageUrl?: string;\n  fileName?: string;\n  acceptedTypes?: string[] | null;\n}\n\nfunction FileUploadPanel<T>(props: FormDropzoneFieldProps) {\n  const formikContext = useFormikContext();\n  const [hasUploadedImage, setHasUploadedImage] = useState<boolean>(false);\n  const [showWarningMessage, setShowWarningMessage] = React.useState<\n    string | null\n  >();\n\n  useEffect(() => {\n    props.showUploadedImage && props.showUploadedImage();\n    props.uploadedImageUrl && setHasUploadedImage(true);\n  }, [props.showUploadedImage, props.uploadedImageUrl]);\n\n  function setFileType(chosen_file: File) {\n    if (chosen_file) {\n      if (!props.fileType) {\n        if (isImage(chosen_file)) {\n          return \"image\";\n        } else if (isVideo(chosen_file)) {\n          return \"video\";\n        } else if (isDoc(chosen_file)) {\n          return \"document\";\n        }\n      } else {\n        return props.fileType.toLowerCase();\n      }\n    }\n  }\n\n  const onDrop = (acceptedFiles: File[]) => {\n    validateFiles(acceptedFiles);\n  };\n\n  function validateFiles(acceptedFiles: File[]) {\n    let filesValPassed = true;\n\n    if (filesValPassed && !acceptedFiles[0]) {\n      setDropzoneWarningMsg(\"An error occured, please try again\");\n      filesValPassed = false;\n    }\n\n    if(setFileType(acceptedFiles[0]) === \"video\"){\n      if(fileExt(acceptedFiles[0]) !== \"mp4\"){\n        setDropzoneWarningMsg(\"Please only upload an mp4 video\");\n        filesValPassed = false;\n      }\n    }\n\n    if (\n      filesValPassed &&\n      props.maximumNoOfFiles &&\n      acceptedFiles.length > props.maximumNoOfFiles\n    ) {\n      const pluralTxtMsg =\n        props.maximumNoOfFiles > 1\n          ? \"Please only upload up to \" + props.maximumNoOfFiles + \" files\"\n          : \"Please only upload one file\";\n      setDropzoneWarningMsg(pluralTxtMsg);\n      filesValPassed = false;\n    }\n\n    if (filesValPassed && props.fileType) {\n      let isFileTypeAllowed =\n        setFileType(acceptedFiles[0]) === \"image\"\n          ? isImage\n          : setFileType(acceptedFiles[0]) === \"video\"\n          ? isVideo\n          : isDoc;\n\n      if (!isFileTypeAllowed(acceptedFiles[0])) {\n        setDropzoneWarningMsg(\n          \"Please upload only \" + props.fileType?.toLocaleLowerCase() + \" files\"\n        );\n        filesValPassed = false;\n      }\n    }\n\n    if (\n      filesValPassed &&\n      props.maximumFileSizeInMB &&\n      acceptedFiles[0].size / 1000000 >= props.maximumFileSizeInMB\n    ) {\n      setDropzoneWarningMsg(\n        \"File exceeds \" + props.maximumFileSizeInMB + \"MB size limit\"\n      );\n      filesValPassed = false;\n    }\n\n    completeFileValidation(filesValPassed, acceptedFiles);\n  }\n\n  const setDropzoneWarningMsg = (warning_str: string) => {\n    setShowWarningMessage(warning_str);\n    setTimeout(() => {\n      setShowWarningMessage(null);\n    }, 2500);\n  };\n\n  function completeFileValidation(\n    file_validated: boolean,\n    acceptedFiles: File[]\n  ) {\n    if (file_validated) {\n      props.onFileUploadEnd(acceptedFiles[0]);\n    } else {\n      return;\n    }\n  }\n\n  return (\n    <div className=\"FormBox FormSideBySide\">\n      <div className=\"FormLabel\">\n        <label>{props.label}</label>\n      </div>\n      <div className=\"FormField\">\n        <Dropzone\n          uploadedFile={props.file}\n          onDrop={onDrop}\n          fileType={setFileType(props.file)}\n          readOnly={props.readOnly ?? false}\n          dropzoneText={props.dropzoneText}\n          uploadIcon={props.uploadIcon}\n          warningIcon={props.warningIcon}\n          showWarningMessage={showWarningMessage}\n          hasUploadedImage={hasUploadedImage}\n          uploadedImageUrl={props.uploadedImageUrl}\n          fileName={setFileType(props.file) === \"video\" ? props.file.videoName + props.file.videoExtension : props.fileName}\n          acceptedTypes={props.acceptedTypes}\n        />\n        {props.fileInstructions && (\n          <span className=\"FileInstructions\">{props.fileInstructions}</span>\n        )}\n        <ErrorM name={props.field} />\n      </div>\n    </div>\n  );\n}\n\nexport default FileUploadPanel;\n\nconst isImage = (file: File) => file.type.search(\"image\") > -1;\nconst isVideo = (file: File) => file.type.search(\"video\") > -1;\nconst fileExt = (file: File) => file.name.split('.')[1];\nconst isDoc = (file: File) => {\n  if (\n    file.type === \"application/pdf\" ||\n    file.type ===\n      \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" ||\n    file.type ===\n      \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\" ||\n    file.type === \"application/msword\" ||\n    file.type === \"text/csv\"\n  ) {\n    return true;\n  } else {\n    return false;\n  }\n};\n","import React, { useEffect, useState } from 'react';\nimport { Form } from 'formik';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport LanguageSearchDropdown from 'components/languageSearchDropdown/languageSearchDropdown';\nimport { useFormikContext } from 'formik';\nimport { ErrorM } from 'components/formComponents/ErrorM';\nimport FileUploadPanel from '../../helpers//FileUploadPanel/FileUploadPanel';\n\nexport const UpdateSchoolForm = (props:  any) => {\n  const formikContext = useFormikContext();\n\n  const languageList = [\n    { value: 'english', label: 'English' },\n    { value: 'french', label: 'French' },\n    { value: 'italian', label: 'Italian' },\n    { value: 'german', label: 'German' },\n  ];\n\n  const [languageOption, setLanguageOption] = useState<any>({\n    value: '',\n    label: '',\n  });\n\n  const [langDropdownToggle, setLangDropdownToggle] = useState<boolean>(false);\n  function toggleLanguageDropdown() {\n    setLangDropdownToggle((prevState) => !prevState);\n  }\n\n  useEffect(() => {\n    const langOpt = languageList.filter(\n      (langItem) =>\n        langItem.value === formikContext.getFieldProps('country').value\n    )[0];\n\n    langOpt\n      ? setLanguageOption(langOpt)\n      : setLanguageOption({ value: 'english', label: 'English' });\n  }, []);\n\n  return (\n    <Form>\n      <FormTextField\n        label=\"School name\"\n        field=\"schoolName\"\n        required={true}\n        labelPosition=\"left\"\n        value={formikContext.getFieldProps('schoolName').value}\n      />\n      <FormTextField\n        label=\"School phone number\"\n        field=\"schoolPhoneNumber\"\n        required={true}\n        labelPosition=\"left\"\n        value={formikContext.getFieldProps('schoolPhoneNumber').value}\n      />\n\n      <h4 className=\"SpaceTopBtm\">School Address</h4>\n\n      <FormTextField\n        label=\"Address line 1\"\n        field=\"addressLine1\"\n        required={true}\n        labelPosition=\"left\"\n        value={formikContext.getFieldProps('addressLine1').value}\n      />\n      <FormTextField\n        label=\"Address line 2\"\n        field=\"addressLine2\"\n        labelPosition=\"left\"\n        required={false}\n        optionalTag={'optional'}\n        value={formikContext.getFieldProps('addressLine2').value}\n      />\n      <FormTextField\n        label=\"Address line 3\"\n        field=\"addressLine3\"\n        labelPosition=\"left\"\n        required={false}\n        optionalTag={'optional'}\n        value={formikContext.getFieldProps('addressLine3').value}\n      />\n      <FormTextField\n        label=\"Town/City\"\n        field=\"townCity\"\n        required={true}\n        labelPosition=\"left\"\n        value={formikContext.getFieldProps('townCity').value}\n      />\n      <FormTextField\n        label=\"County\"\n        field=\"county\"\n        labelPosition=\"left\"\n        required={false}\n        optionalTag={'optional'}\n        value={formikContext.getFieldProps('county').value}\n      />\n      <FormTextField\n        label=\"Postcode/Zipcode\"\n        field=\"postcodeZipcode\"\n        required={true}\n        labelPosition=\"left\"\n        value={formikContext.getFieldProps('postcodeZipcode').value}\n      />\n      <FormTextField\n        label=\"Country\"\n        field=\"country\"\n        required={true}\n        labelPosition=\"left\"\n        value={formikContext.getFieldProps('country').value}\n      />\n      <FormTextField\n        label=\"Finance email\"\n        field=\"financeEmail\"\n        required={true}\n        labelPosition=\"left\"\n        value={formikContext.getFieldProps('financeEmail').value}\n      />\n      <FileUploadPanel \n        label=\"School logo\"\n        field=\"schoolLogo\"\n        dropzoneText=\"Upload logo\"\n        onFileUploadEnd={(file) => {\n          props.setSchoolLogoFile(file);\n          props.setSchoolLogoUrl(null);\n          props.setSchoolLogoUpdated(true);\n        }}\n        fileType={\"image\"}\n        file={props.schoolLogoUrl ? props.schoolLogoUrl : props.schoolLogoFile}\n        uploadedImageUrl={props.schoolLogoUrl}\n        fileName={props.schoolLogoUrl ? \"saved_school_logo\" + props.schoolLogoExt : \"\"}\n        acceptedTypes={['.png', '.jpg', '.jpeg']}\n      />\n      <p className=\"MinusMarginTop\">Upload only .png, .jpg and .jpeg images</p>\n      <div className=\"LineSpacer3\"></div>\n      {(props.schoolLogoFile || props.schoolLogoUrl) &&\n        <div className=\"Checkbox\">\n          <input\n            type=\"checkbox\"\n            id=\"RemoveSchoolLogo\"\n            checked={props.removeSchoolLogo}\n            onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n              props.setRemoveSchoolLogo(e.target.checked)\n            }\n          />\n          <label className=\"CustomInput\" htmlFor=\"RemoveSchoolLogo\">\n            Remove Logo\n          </label>\n        </div>\n      }           \n      {/* <div className=\"FormBox FormSideBySide left\">\n        <div className=\"FormLabel\">Country</div>\n        <div className=\"FormField\">\n          <LanguageSearchDropdown\n            isOpen={langDropdownToggle}\n            options={languageList}\n            value={languageOption}\n            onChange={(e) => {\n              formikContext.setFieldValue('country', e.value);\n              setLanguageOption(e);\n              toggleLanguageDropdown();\n            }}\n            toggleDropdown={() => {\n              toggleLanguageDropdown();\n            }}\n          />\n          <ErrorM name={'country'} />\n        </div>\n      </div> */}\n    </Form>\n  );\n};\n","import React, { useState } from 'react';\nimport { Formik, FormikHelpers } from 'formik';\nimport * as Yup from 'yup';\nimport { ISchool } from './models';\nimport { SchoolApi } from 'api/schoolApi';\nimport { PopupOrPanel } from '../../components/popupsAndPanels/PopupAndPanels';\nimport { UpdateSchoolForm } from './UpdateSchoolForm';\n\nconst validationSchemaUpdateSchool = Yup.object({\n  schoolName: Yup.string().required('A school name is required').nullable(),\n  schoolPhoneNumber: Yup.string().required('A school phone number is required').nullable(),\n  addressLine1: Yup.string().required('An address is required').nullable(),\n  addressLine2: Yup.string().nullable(),\n  addressLine3: Yup.string().nullable(),\n  townCity: Yup.string().required('A town or city is required').nullable(),\n  postcodeZipcode: Yup.string().required('A postcode is required').nullable(),\n  county: Yup.string().nullable(),\n  country: Yup.string().required('A country is required').nullable(),\n  financeEmail: Yup.string().email('Please enter a valid email').required('A finance email is required').nullable(),\n});\n\ntype Props = {\n  panelOpen: boolean;\n  togglePanelOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  schoolDetails: ISchool | null;\n  setSchoolDetails: React.Dispatch<React.SetStateAction<ISchool | null>>;\n};\n\nexport const UpdateSchool: React.FC<Props> = ({\n  panelOpen,\n  togglePanelOpen,\n  schoolDetails,\n  setSchoolDetails,\n}) => {\n  const [error, setError] = useState<string>('');\n  const [schoolLogoUrl, setSchoolLogoUrl] = useState<any>(schoolDetails && schoolDetails.logoUrl && schoolDetails.logoExtension ? schoolDetails.logoUrl : null);  \n  const [schoolLogoFile, setSchoolLogoFile] = useState<any>(null);\n  const [schoolLogoUpdated, setSchoolLogoUpdated] = useState<boolean>(false); \n  const [schoolLogoExt, setSchoolLogoExt] = useState<any>(schoolDetails && schoolDetails.logoUrl && schoolDetails.logoExtension ? schoolDetails.logoExtension : null); \n  const [removeSchoolLogo, setRemoveSchoolLogo] = useState<boolean>(false);    \n\n  const handleSubmitUpdateSchool = async (\n    values: any,\n    { setSubmitting }: FormikHelpers<ISchool>\n  ) => {\n    const formData = new FormData();\n    let valuesObj: any = Object.keys(values).map((key: any) => [key, values[key]]);\n    valuesObj = valuesObj.filter((item: any) => item[0] !== \"logoExtension\");\n    valuesObj.map((item: any) => formData.append(item[0], item[1]));\n\n    formData.append(\"Logo\", schoolLogoUpdated ? schoolLogoFile : null);\n    formData.append(\"logoExtension\", schoolLogoExt === null ? \"\" : schoolLogoExt);\n    formData.append(\"bDeleteLogo\", removeSchoolLogo ? \"true\" : \"false\");\n\n    setSubmitting(true);\n    const result = await SchoolApi.submitSchoolDetailsIForm(formData);\n    if (result.data) {\n      setSchoolDetails(result.data);\n      setSubmitting(false);\n      togglePanelOpen(false);\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n      setError(error);\n      setSubmitting(false);\n    }\n  };\n\n  return (\n    <React.Fragment>\n      {schoolDetails && (\n        <Formik\n          initialValues={schoolDetails}\n          onSubmit={(values, formikHelpers) =>\n            handleSubmitUpdateSchool(values, formikHelpers)\n          }\n          validationSchema={validationSchemaUpdateSchool}\n          validateOnBlur={false}\n        >\n          {({ submitForm, isSubmitting }) => (\n            <PopupOrPanel\n              isPopup={false}\n              isOpen={panelOpen}\n              isSubmitting={isSubmitting}\n              position=\"right\"\n              hdrTitle=\"Update school\"\n              primaryBtnTxt=\"Save\"\n              secondaryBtnTxt=\"Cancel\"\n              givenClass=\"ManageSchoolPopoutMenu\"\n              handleClose={() => togglePanelOpen(false)}\n              handlePrimaryBtn={submitForm}\n              handleSecondaryBtn={() => togglePanelOpen(false)}\n              width={560}\n            >\n              <UpdateSchoolForm \n                schoolDetails={schoolDetails}\n                schoolLogoFile={schoolLogoFile}\n                setSchoolLogoFile={setSchoolLogoFile}\n                schoolLogoUrl={schoolLogoUrl}\n                setSchoolLogoUrl={setSchoolLogoUrl}\n                schoolLogoExt={schoolLogoExt}\n                removeSchoolLogo={removeSchoolLogo}\n                setRemoveSchoolLogo={setRemoveSchoolLogo}\n                setSchoolLogoUpdated={setSchoolLogoUpdated}\n              />\n            </PopupOrPanel>\n          )}\n        </Formik>\n      )}\n    </React.Fragment>\n  );\n};\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAMAAADW3miqAAAAqFBMVEVHcEzthobthobujo7thobthobthobthobthobuiYnthobthobthobthobuj4/thobthobthobthobthobthobthobthobthobthobthobthob////thob+9vb3x8f85+f//v7zsLD63NzvlZX97+/ujIz//Pz3ysr40dH75OT2wsLwmpr51tb63t7wnZ3ypKT1urryp6f1vr71vLz2xMTuiYnvkpL0tbWd1dtbAAAAG3RSTlMA1dn6FuY4JU/yAwt8mP3G/sLzO6CQaGMwrLDgmQuCAAABNklEQVQYGcXB13aCUBAF0EFAmr0uc+ZSBAuKXZP//7NQFKICeUv2pn+mq6pOv1CMMDQUqtc+A+c21dI6AhAdjep8rBBbfVCNob9EbOkPqVo3QirqUiV97yLl7nWqYDZ2uNs1TCo3OQHY2fYcwGlCpSzVAbBgvgFwVIvKtDzEPpk7iHktKqEYAWJ75i1igaHQu/YFiRPzAYlLm95oskDCY/aQELJGr2Y2UkfmL6TsGb1o+kukNsxnpJZ+k57118ismG1k1n16om9dZCLmNTLuVqcfTGmOO7GyBe7mkkmF6QGlDlPKWaqDB8e2Qzw4qkUPLQ+5BfMNOa9Fd4oRIMcx5AJDocz4iMKCeYHCcUwpTRYoOJtNiIKQNUqMrqhxHVFiIFBDDCjRiFxUcqMGJZpSjyv1pCH9tW/uez432OLw8QAAAABJRU5ErkJggg==\"","import React from 'react';\nimport { Form } from 'formik';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport WarningIcon from 'images/Icon_Warning_01.png';\nimport { Options } from './UpdateArchiveDate';\n\nexport const UpdateArchiveDateForm = () => {\n  return (\n    <Form>\n      <p className=\"ArchiveNowPanelText\">\n        To organise your classes for next year you will need to archive.\n      </p>\n      <p>\n        Please note, by archiving now this will archive data across all subjects\n        within your Get Set 4 Education curriculum.\n      </p>\n      <div className=\"Warning\">\n        <img src={WarningIcon} alt=\"Warning\" />\n        <p>This action cannot be undone</p>\n      </div>\n      <div className=\"LineSpacer5\"></div>\n      <div className=\"UpdateArchiveDatePassword\">\n        <FormTextField\n          label=\"Enter your password\"\n          field=\"password\"\n          type=\"password\"\n          required={true}\n          labelPosition=\"left\"\n        />\n      </div>\n    </Form>\n  );\n};\n","import FormGeneralError from 'components/formComponents/FormGeneralError';\nimport { PopupOrPanel } from 'components/popupsAndPanels/PopupAndPanels';\nimport React from 'react';\n\ntype Props = {\n  panelOpen: boolean;\n  togglePanelOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  archive: () => void;\n  error: string;\n};\n\nconst ArchiveInstantly: React.FC<Props> = ({\n  panelOpen,\n  togglePanelOpen,\n  archive,\n  error,\n}) => {\n  return (\n    <PopupOrPanel\n      isPopup={true}\n      isOpen={panelOpen}\n      hdrTitle={'Archive now'}\n      position=\"right\"\n      primaryBtnTxt=\"Archive\"\n      secondaryBtnTxt=\"Cancel\"\n      givenClass=\"DeleteManagedUser\"\n      primaryBtnColor=\"BtnRed\"\n      handleClose={() => togglePanelOpen(false)}\n      handlePrimaryBtn={archive}\n      handleSecondaryBtn={() => togglePanelOpen(false)}\n      width={400}\n      zIndexVal={25}\n    >\n      <FormGeneralError message={error} />\n      <p>This action will archive all subjects you are subscribe to.</p>\n      <p>Are you sure you want to continue?</p>\n    </PopupOrPanel>\n  );\n};\n\nexport default ArchiveInstantly;\n","import React, { useState } from 'react';\nimport { isDate, parse } from 'date-fns';\nimport { Formik, FormikHelpers } from 'formik';\nimport * as Yup from 'yup';\nimport { IArchivingInfo, ISchool, SchoolParser } from './models';\nimport { SchoolApi } from 'api/schoolApi';\nimport { PopupOrPanel } from '../../components/popupsAndPanels/PopupAndPanels';\nimport { UpdateArchiveDateForm } from './UpdateArchiveDateForm';\nimport FormGeneralError from 'components/formComponents/FormGeneralError';\nimport ArchiveInstantly from './ArchiveInstantly';\n\nconst validationSchemaArchivingDate = Yup.object({\n  password: Yup.string().required('A password is required'),\n  yearlyArchivingDate: Yup.date()\n    .required('An archiving date is required')\n    .typeError('Date of birth is invalid. Format is dd/mm/yyyy')\n    .transform(parseDateString),\n});\n\nfunction parseDateString(value: any, originalValue: any) {\n  const parsedDate = isDate(originalValue)\n    ? originalValue\n    : parse(originalValue, 'dd/MM/yyyy', new Date());\n  return parsedDate;\n}\n\nexport type Options = 'archiveNow' | 'updateDate';\n\ntype Props = {\n  panelOpen: boolean;\n  togglePanelOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  setSchoolDetails: React.Dispatch<React.SetStateAction<ISchool | null>>;\n};\n\nexport const UpdateArchive: React.FC<Props> = ({\n  panelOpen,\n  togglePanelOpen,\n  setSchoolDetails,\n}) => {\n  const [error, setError] = useState<string>('');\n\n  const [openArchivePopup, setOpenArchivePopup] = useState<boolean>(false);\n  const [archiveNowError, setArchiveNowError] = useState<string>('');\n  const [loading, setLoading] = useState<boolean>(false);\n\n  const handleSubmitArchivingDate = async (\n    values: IArchivingInfo,\n    { setSubmitting }: FormikHelpers<IArchivingInfo>\n  ) => {\n    setSubmitting(true);\n    const result = await SchoolApi.submitArchiveDate(values);\n    if (result.data) {\n      setSchoolDetails(result.data);\n      togglePanelOpen(false);\n      setSubmitting(false);\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n      setError(error);\n      setSubmitting(false);\n    }\n  };\n\n  const submitArchiveNow = async (\n    setSchoolDetails: React.Dispatch<React.SetStateAction<ISchool | null>>,\n    setError: React.Dispatch<React.SetStateAction<string>>,\n    values: any,\n    setLoading: (isSubmitting: boolean) => void,\n    closePanel: () => void\n  ) => {\n    setLoading(true);\n    const result = await SchoolApi.submitArchiveNow(values);\n    if (result.data) {\n      setSchoolDetails(result.data);\n      setLoading(false);\n      setOpenArchivePopup(false);\n      closePanel();\n      document.body.style.overflowY = '';\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n      setError(error);\n      setLoading(false);\n    }\n  };\n  \n  const handleArchiveNow = (values: any) => {\n    submitArchiveNow(\n      setSchoolDetails,\n      setArchiveNowError,\n      values,\n      setLoading,\n      () => togglePanelOpen(false)\n    );\n  };  \n\n  return (\n    <Formik\n      initialValues={SchoolParser.createEmptyArchivingInfo()}\n      onSubmit={(values, formikHelpers) =>\n        handleSubmitArchivingDate(values, formikHelpers)\n      }\n      validationSchema={validationSchemaArchivingDate}\n      validateOnBlur={false}\n    >\n      {({ values, isSubmitting }) => (\n        <>\n          {openArchivePopup && (\n            <ArchiveInstantly\n              panelOpen={openArchivePopup}\n              togglePanelOpen={setOpenArchivePopup}\n              archive={() => handleArchiveNow(values)}\n              error={archiveNowError}\n            />\n          )} \n\n          <PopupOrPanel\n            isPopup={false}\n            isOpen={panelOpen}\n            isSubmitting={isSubmitting}\n            position=\"right\"\n            hdrTitle=\"Archive Now\"\n            primaryBtnTxt={`${'Archive Now'}`}\n            secondaryBtnTxt=\"Cancel\"\n            givenClass=\"ManageSchoolPopoutMenu\"\n            handleClose={() => togglePanelOpen(false)}\n            handlePrimaryBtn={\n              () => {\n                setOpenArchivePopup(true);\n              }\n            }\n            handleSecondaryBtn={() => {\n              togglePanelOpen(false);\n            }}\n            width={560}\n          >\n            <FormGeneralError message={error} />\n            <UpdateArchiveDateForm />\n          </PopupOrPanel>         \n        </>\n      )}\n    </Formik>\n  );\n};\n","import { useCallback, useEffect } from 'react';\nimport { SchoolApi } from 'api/schoolApi';\nimport { ISchool } from 'pages/manageSchool/models';\n\nexport const useFetchSchoolDetails = (\n  setSchoolDetails: React.Dispatch<React.SetStateAction<ISchool | null>>\n) => {\n  const fetchUserDetails = useCallback(async () => {\n    const result = await SchoolApi.getSchoolDetails();\n    if (result.data) {\n      const data = result.data;\n      setSchoolDetails(data);\n    }\n\n    if (result.error) {\n      const error = result.error.message;\n    }\n  }, []);\n\n  useEffect(() => {\n    fetchUserDetails();\n  }, []);\n};\n\nexport default useFetchSchoolDetails;\n","export default __webpack_public_path__ + \"static/media/Wonde_Logo.8a681cb2.png\";","export default \"data:image/gif;base64,R0lGODlhSABHAMQfAHJycvr6+r29vd/f37Ozs5ycnI6Ojqenp5aWloGBgYODg4WFheLi4m9vb62trX5+foaGhnh4eHV1dcvLy8jIyLKysp2dndXV1cLCwnFxcb+/v3Nzc5+fn7y8vNzc3P///yH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NUVENTczOUY2RUI2MTFFNkI2QUZFOEMxMjRCNEY4OTAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NUVENTczQTA2RUI2MTFFNkI2QUZFOEMxMjRCNEY4OTAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1RUQ1NzM5RDZFQjYxMUU2QjZBRkU4QzEyNEI0Rjg5MCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1RUQ1NzM5RTZFQjYxMUU2QjZBRkU4QzEyNEI0Rjg5MCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0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\"","export class WondeLinkStatusError {\n  public static parseError = (errors: any) => {\n    let error: string;\n    switch (errors[0].messageCode) {\n      case 'Invalid_Access':\n        error = 'Invalid access';\n        break;\n      case 'Required':\n        error = 'This is required';\n        break;        \n      default:\n        error = 'Sorry something went wrong. Please try again.';\n    }\n    return error;\n  };\n};\n\nexport class WonderParser {};\n\nexport type SyncWondeDataResponse = {\n  nonConformingPupils: string[];\n  nonConformingSchoolUsers: string[];\n};\n","import instance from 'api';\nimport { AxiosError, AxiosResponse } from 'axios';\nimport { ApiResponse, BaseApi, Response } from 'baseApi';\nimport { endpoints } from 'endpoints.config';\nimport { SyncWondeDataResponse, WondeLinkStatusError } from 'pages/wondeIntegration/models';\n\nconst UNKNOWN_ERROR_MESSAGE = 'Sorry, something went wrong. Please try again.';\n\nexport class WondeApi extends BaseApi {\n  //check access/link status\n  public static checkLinkStatus = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.wondeIntegration.checkLinkStatus\n      );\n\n      if (WondeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return WondeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        }\n      }\n      return WondeApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n\n  //get school list to select from for linkage\n  public static getSchoolLinkList = async (educationNumber: string): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.wondeIntegration.getSchoolLinkList + `?urn=${educationNumber}`\n      );\n\n      if (WondeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return WondeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        }\n      }\n      return WondeApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n\n  //request access from selected school\n  public static requestAccessFromSelectedSchool = async (selectedSchoolId: string | null, schoolAddress: string | null): Promise<any> => {\n    try {\n      const payload = { \n        wondeSchoolId: selectedSchoolId,\n        SchoolUsersEmailAddress: schoolAddress,\n      };\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.wondeIntegration.requestAccess,\n        payload\n      );\n\n      if (WondeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return WondeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        }\n      }\n      return WondeApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n\n  //sync wonde data\n  public static syncWondeData = async (\n    wondeSchoolId: string | null,\n    selectedSyncType: string\n  ): Promise<Response<SyncWondeDataResponse | null>> => {\n    try {\n      const payload = { \n        wondeSchoolId: wondeSchoolId,\n        dataType: selectedSyncType,\n      };\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.wondeIntegration.syncData,\n        payload\n      );\n\n      if (WondeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return WondeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        }\n      }\n      return WondeApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  }; \n  \n  //get list of pupil records\n  public static wondePupilRecords = async (): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.wondeIntegration.compareAcademicYears\n      );\n\n      if (WondeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return WondeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        }\n      }\n      return WondeApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n\n  //submit selected pupil records\n  public static submitSelectedWondePupilRecords = async (wondeSchoolId: any, selectedSyncType: string): Promise<any> => {\n    try {\n      const payload = {\n        wondeSchoolId: wondeSchoolId,\n        dataType: selectedSyncType,\n      };\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        endpoints.wondeIntegration.syncMatchedData,\n        payload\n      );\n\n      if (WondeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return WondeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        }\n      }\n      return WondeApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };  \n\n  //submit selected wonde exact matches\n  public static submitSelectedWondeExactMatches = async (selectedIds: any, url: string): Promise<any> => {\n    try {\n      const payload = { matchedPairs: selectedIds };\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        url,\n        payload\n      );\n\n      if (WondeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return WondeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        }\n      }\n      return WondeApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n  \n  //get list of wonde unmatched records\n  public static getWondeUnmatchedRecords = async (url: string): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        url\n      );\n\n      if (WondeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return WondeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        }\n      }\n      return WondeApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n\n  //submit selected matched wonde records\n  public static submitSelectedMatchedWondeRecords = async (selectedRecords: any, url: string): Promise<any> => {\n    try {\n      const payload = { matchedPairs: selectedRecords };\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        url,\n        payload\n      );\n\n      if (WondeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return WondeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        }\n      }\n      return WondeApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };   \n\n  //submit selected remaining wonde records\n  public static submitSelectedWondeRecords = async (selectedIds: any, url: string): Promise<Response<any>> => {\n    try {\n      const payload = selectedIds;\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        url,\n        payload\n      );\n\n      if (WondeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return WondeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error?.response?.data?.errors) {\n        const errors = error.response.data.errors;\n          return WondeApi.errorResponse('FormError', errors);\n      } \n      return WondeApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n  \n  //delete remaining get set records\n  public static deleteRemainingGetSetRecords = async (selectedIds: any, url: string): Promise<any> => {\n    try {\n      const payload = { idsToDelete: selectedIds };\n\n      const result: AxiosResponse<ApiResponse<any>> = await instance.post(\n        url,\n        payload\n      );\n\n      if (WondeApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details;\n        return WondeApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = WondeLinkStatusError.parseError(errors);\n          return WondeApi.errorResponse(message);\n        }\n      }\n      return WondeApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };  \n};","import React, { Dispatch, SetStateAction, useEffect, useState, useRef } from 'react';\nimport { RouteComponentProps } from '@reach/router';\nimport WondeImg from '../../images/Wonde_Logo.png';\nimport ProgressIndicator from '../../images/Progress_Indicator.gif';\nimport BlueTick from '../../images/Blue_Tick.png';\nimport { WondeApi } from 'api/wondeApi';\nimport { SyncWondeDataResponse } from './models';\n\nexport type wondeAccessDetails = {\n  accessRequested: boolean;\n  accessApproved: boolean;\n  wondeSchoolId: string | null;\n  schoolName: string | null;\n  schoolAddress: string | null;\n  schoolUsersEmailAddress: string | null;\n};\n\ntype wondeENSchoolsList = {\n  id: string;\n  name: string;\n  address: wondeENSchoolAddress;\n};\n\ntype wondeENSchoolAddress = {\n  address_line_1: string | null;\n  address_line_2: string | null;\n  address_town: string | null;\n  address_postcode: string | null;\n  address_country: wondeENSchoolAddressCountry;\n};\n\ntype wondeENSchoolAddressCountry = {\n  code: string | null;\n  name: string | null;\n};\n\ntype WondeLinkProps = {\n  setWondeIntegration: Dispatch<SetStateAction<boolean>>;\n  selectedSyncType: string;\n  setSelectedSyncType: Dispatch<SetStateAction<string>>;\n  wondeIntegration: boolean;\n  setWondeSchoolId: any;\n  setSyncResponse: Dispatch<React.SetStateAction<SyncWondeDataResponse | null>>\n};\n\ntype Props = WondeLinkProps & RouteComponentProps;\n\nexport const WondeLink: React.FC<Props> = ({ \n  setWondeIntegration,\n  selectedSyncType,\n  setSelectedSyncType,\n  wondeIntegration,\n  setWondeSchoolId,\n  setSyncResponse,\n}) => {\n  const [linkStatusLoading, setLinkStatusLoading] = useState<boolean>(true);\n  const [linkStatusLoadingError, setLinkStatusLoadingError] = useState<boolean>(false);\n  const [wondeAccessDetails, setWondeAccessDetails] = useState<wondeAccessDetails>({\n    accessRequested: false,\n    accessApproved: false,\n    wondeSchoolId: null,\n    schoolName: null,\n    schoolAddress: null,\n    schoolUsersEmailAddress: null,\n  });\n  const [educationNumber, setEducationNumber] = useState<string>(\"\");\n  const [findSchoolLoading, setFindSchoolLoading] = useState<boolean>(false);\n  const [findSchoolLoadingError, setFindSchoolLoadingError] = useState<string | null>(null);\n  const [syncLoadingError, setSyncLoadingError] = useState<string | null>(null);  \n  const [schoolsList, setSchoolsList] = useState<wondeENSchoolsList[]>([]);\n  const [selectSchoolLoading, setSelectSchoolLoading] = useState<boolean>(false);\n  const [selectedSchoolId, setSelectedSchoolId] = useState<string | null>(null);\n  const [selectedSchoolError, setSelectedSchoolError] = useState<string | null>(null);\n\n  const savedCallback = useRef<any>();\n\n  useEffect(() => {\n    checkLinkStatus();\n  }, []);\n\n  useEffect(() => {\n    function wondeTimer() {\n      savedCallback.current();\n    }\n\n    let id = setInterval(wondeTimer, 30000);\n    return () => clearInterval(id);\n  }, [savedCallback]);   \n  \n  const checkLinkStatus = async () => {\n    const result = await WondeApi.checkLinkStatus();\n\n    if (!result.error) {\n      updateWondeDetails(result);\n    }\n    \n    if (result.error) {\n      setLinkStatusLoadingError(true);\n    }\n\n    setLinkStatusLoading(false);\n\n    savedCallback.current = function() {\n      followUpCheckLinkStatus();\n    };\n  };\n\n  const followUpCheckLinkStatus = async () => {\n    const result = await WondeApi.checkLinkStatus();\n\n    if (!result.error) {\n      if(\n        !wondeIntegration\n        &&\n        (wondeAccessDetails.accessRequested !== result.data.bWondeAccessRequested\n        ||\n        wondeAccessDetails.accessApproved !== result.data.bWondeAccessApproved)\n      ){\n        updateWondeDetails(result);\n      }\n    } \n  };\n\n  const updateWondeDetails = (result: any) => {\n    let schoolAddressStr = \"\";\n    schoolAddressStr += result.data.addressLine1 ? result.data.addressLine1 + \", \" : \"\";\n    schoolAddressStr += result.data.addressLine2 ? result.data.addressLine2 + \", \" : \"\";\n    schoolAddressStr += result.data.addressLine3 ? result.data.addressLine3 + \", \" : \"\";\n    schoolAddressStr += result.data.townCity ? result.data.townCity + \", \" : \"\";\n    schoolAddressStr += result.data.zipPostCode ? result.data.zipPostCode : \"\";\n\n    setWondeAccessDetails({\n      accessRequested: result.data.bWondeAccessRequested,\n      accessApproved: result.data.bWondeAccessApproved,\n      wondeSchoolId: result.data.wondeSchoolId,\n      schoolName: result.data.schoolName,\n      schoolAddress: schoolAddressStr,\n      schoolUsersEmailAddress: result.data.schoolUsersEmailAddress\n    });\n\n    setEducationNumber(\"\");\n    setFindSchoolLoading(false);\n    setFindSchoolLoadingError(null);\n    setSchoolsList([]);\n    setSelectSchoolLoading(false);\n    setSelectedSchoolId(null);\n    setSelectedSchoolError(null);\n  };\n\n  const findSchoolsList = async () => {\n    setFindSchoolLoading(true);\n    setFindSchoolLoadingError(\"\");\n\n    const result = await WondeApi.getSchoolLinkList(educationNumber);\n\n    if (!result.error) {\n      if(result.data.length){\n        setSchoolsList(result.data);\n      } else {\n        setFindSchoolLoadingError(\"There are no schools with this education number.\");\n      }\n    }\n    \n    if (result.error) {\n      setFindSchoolLoadingError(result.error.message);\n    }\n\n    setFindSchoolLoading(false);\n  };\n\n  const generateSchoolAddress = (school_address: wondeENSchoolAddress) => {\n    let schoolAddressStr = \"\";\n    schoolAddressStr += school_address.address_line_1 ? school_address.address_line_1 + \", \" : \"\";\n    schoolAddressStr += school_address.address_postcode ? school_address.address_postcode + \", \" : \"\";\n    schoolAddressStr += school_address.address_country && school_address.address_country.name ? school_address.address_country.name : \"\";\n\n    return schoolAddressStr;\n  };\n\n  const confirmSchoolSelection = async () => {\n    setSelectSchoolLoading(true);\n    setSelectedSchoolError(\"\");\n\n    if(!selectedSchoolId){\n      setSelectedSchoolError(\"Please select a school.\");\n    } else {\n      const result = await WondeApi.requestAccessFromSelectedSchool(selectedSchoolId, wondeAccessDetails.schoolUsersEmailAddress);\n  \n      if (!result.error) {\n        followUpCheckLinkStatus();\n      }\n      \n      if (result.error) {\n        setSelectedSchoolError(result.error.message);\n      }\n    }\n\n    setSelectSchoolLoading(false);\n  };\n\n  const sendAnotherRequest = () => {\n    setWondeAccessDetails({\n      accessRequested: false,\n      accessApproved: false,\n      wondeSchoolId: null,\n      schoolName: null,\n      schoolAddress: null,\n      schoolUsersEmailAddress: null,\n    });\n  };\n\n  const submitSelectedSyncType = async () => {\n    setLinkStatusLoading(true);\n\n    const result = await WondeApi.syncWondeData(wondeAccessDetails.wondeSchoolId, \"ClassAndPupil\");\n\n    if (!result.error) {\n      document.body.style.overflowY = '';\n      window.scrollTo(0, 0);\n      setWondeSchoolId(wondeAccessDetails.wondeSchoolId);\n      setWondeIntegration(true);\n      setSyncResponse(result.data);\n    }\n    \n    if (result.error) {\n      setSyncLoadingError(\"An error occurred whilst syncing, please try again.\");\n      setSyncResponse(null);\n      setLinkStatusLoading(false);\n      window.scrollTo(0, document.body.scrollHeight);\n    }\n  };  \n\n\n  return (\n    <div className=\"WondeLinkPanel\">\n      {linkStatusLoading && \n        <div className=\"LoadingLinkStatus\">\n          <img src={WondeImg} alt=\"Wonde Logo\" className=\"WondeLogo\" />\n          <div className=\"LoadingLabel\">Loading...</div>\n          <img src={ProgressIndicator} alt=\"Loading Wonde link status\" className=\"LoadingIndicator\" />\n        </div>\n      }\n\n      {!linkStatusLoading && linkStatusLoadingError &&\n        <div className=\"ErrorLinkStatus\">\n          <img src={WondeImg} alt=\"Wonde Logo\" className=\"WondeLogo\" />\n          <div>An error occurred loading your Wonde details. Please try again later.</div>\n        </div>\n      }\n\n      {!linkStatusLoading && syncLoadingError && \n        <div className=\"ErrorLinkStatus SyncError\">\n          <div>An error occurred whilst syncing. Please try again later.</div>\n        </div>\n      }\n\n      {!linkStatusLoading && !linkStatusLoadingError && \n        <>\n          <img src={WondeImg} alt=\"Wonde Logo\" className=\"WondeLogo\" />\n\n          <div className=\"PanelInfo\">\n            <div className=\"Cell First\">\n              {!wondeAccessDetails.accessRequested && !wondeAccessDetails.accessApproved && \n                <div className=\"InfoTxt\">\n                  <p>If your school uses Wonde, connect your MIS to Get Set 4 Education to easily sync your class and pupil data.</p>\n                  <p>Once you have linked your Wonde and Get Set 4 Education accounts, we will request access to the below information. You can select which information you wish to provide via your Wonde account and change these access rights at any time:</p>\n                  <ul className=\"WondePointsList\">\n                    <li>Class names, key stage and year groups</li>\n                    <li>Pupil name, class, year group, demographics and photo</li>\n                  </ul>\n                  <p>If you have profile photos they will be synced but this can take up to 2 hours.</p>\n                </div>\n              }\n\n              {wondeAccessDetails.accessRequested && !wondeAccessDetails.accessApproved && \n                <div className=\"InfoTxt\">\n                  <p>Sign in to your <a href=\"https://edu.wonde.com/login\" target=\"_blank\" rel=\"noreferrer\">Wonde account</a> to approve your Get Set 4 Education request. Once approved, Wonde may take up to four hours to authorise the connection. Once authorised, this page will say 'Sync now'.</p>\n                </div>\n              }\n\n              {wondeAccessDetails.accessRequested && wondeAccessDetails.accessApproved && \n                <div className=\"InfoTxt\">\n                  <p>Woohoo! Well done on approving your link between Wonde and Get Set 4 Education. We can now access your chosen data.</p>\n                </div>\n              }\n            </div>\n            <div className=\"Cell Second\">\n              {wondeAccessDetails.accessRequested && wondeAccessDetails.accessApproved &&\n                <>\n                  <div className=\"SchoolApprovedPanel\">\n                    <div className=\"Inner\">\n                      <div className=\"TickIcon\">\n                        <img src={BlueTick} alt=\"Link approved\" />\n                      </div>\n                      <div className=\"SchoolDetails\">\n                        <div className=\"SchoolName\">{wondeAccessDetails.schoolName ? wondeAccessDetails.schoolName : \"\"}</div>\n                        <div className=\"SchoolAddress\">{wondeAccessDetails.schoolAddress ? wondeAccessDetails.schoolAddress : \"\"}</div>\n                      </div>\n                    </div>\n                  </div>\n\n                  <div className=\"SchoolApprovedDetailsPanel\">\n                    <div className=\"Hdr\">Sync data between Get set 4 education and wonde</div>\n                    <div className=\"Btn BtnDarkBlue FindSchoolBtn\" onClick={() => {submitSelectedSyncType()}}>\n                      <span>Sync now</span>\n                    </div> \n                  </div>\n                </>\n              }\n\n              {wondeAccessDetails.accessRequested && !wondeAccessDetails.accessApproved &&\n                <>\n                  <div className=\"SchoolPendingPanel\">\n                    <div className=\"Txt\">{(wondeAccessDetails.schoolName ? wondeAccessDetails.schoolName : \"\") + \" - Pending\"}</div>\n                  </div>\n\n                  <div className=\"Btn BtnWhiteBlue FindSchoolBtn\" onClick={() => {sendAnotherRequest()}}>\n                    <span>Send another request</span>\n                  </div>                  \n                </>\n              }\n\n              {!wondeAccessDetails.accessRequested && !wondeAccessDetails.accessApproved &&\n                <>\n                  <div className={\"FindSchoolForm\" + (selectSchoolLoading ? \" Disable\" : \"\")}>\n                    <div className=\"ErrorMsg\">{findSchoolLoadingError ? <span>{findSchoolLoadingError}</span> : \"\"}</div>\n                    <div className=\"FormBox\">\n                      <div className=\"FormLabel\">\n                        <label htmlFor=\"Education_Number\">URN</label>\n                      </div>\n                      <div className=\"FormField\">\n                        <input\n                          id=\"Education_Number\"\n                          name=\"Education_Number\"\n                          className=\"EditBox\"\n                          disabled={findSchoolLoading}\n                          value={educationNumber}\n                          onChange={(e) => {\n                            setEducationNumber(e.target.value);\n                          }}\n                        />\n                      </div>\n                    </div>\n\n                    <div className={\"Btn BtnWhiteBlue FindSchoolBtn\" + (findSchoolLoading ? \" Loading\" : \"\")} onClick={() => {findSchoolsList()}}>\n                      {!findSchoolLoading && <span>Find my school</span>}\n                      {findSchoolLoading && <img src={ProgressIndicator} alt=\"Loading schools list\" className=\"LoadSchoolsIndicator\" />}\n                    </div>\n                  </div>\n\n                  {schoolsList && schoolsList.length > 0 &&\n                    <>\n                      <div className={\"SchoolSelectionList\" + (selectSchoolLoading ? \" Disable\" : \"\")}>\n                        <div className=\"Hdr\">Select School</div>\n                        <div className=\"ErrorMsg\">{selectedSchoolError ? <span>{selectedSchoolError}</span> : \"\"}</div>\n\n                        <div className=\"SchoolOptionsList\">\n                          {schoolsList.map((item: wondeENSchoolsList, index: number) => {\n                            const schoolAddressStr = generateSchoolAddress(item.address);\n\n                            return (\n                              <div className={\"SchoolOption\" + (item.id === selectedSchoolId ? \" Active\" : \"\")} onClick={() => {setSelectedSchoolId(item.id)}}>\n                                <div className=\"Inner\">\n                                  <div className=\"RadioBtn\">\n                                    <div className=\"Radio\">\n                                      <input id={\"Wonde_Select_School_\" + index} type=\"radio\" name=\"Wonde_Select_School\" value={item.id} />\n                                      <label className=\"CustomInput\" htmlFor=\"Wonde_Select_School_1\"><span className=\"Txt\">School Option {index}</span></label>\n                                    </div>                        \n                                  </div>\n                                  <div className=\"SchoolsDetails\">\n                                    <div className=\"SchoolName\">{item.name}</div>\n                                    <div className=\"SchoolAddress\">{schoolAddressStr}</div>\n                                  </div>\n                                </div>\n                              </div>\n                            );\n                          })}\n                        </div>                    \n                      </div>\n\n                      <div className={\"Btn BtnDarkBlue FindSchoolBtn\" + (selectSchoolLoading ? \" Loading\" : \"\")} onClick={() => {confirmSchoolSelection()}}>\n                        {!selectSchoolLoading && <span>Confirm</span>}\n                        {selectSchoolLoading && <img src={ProgressIndicator} alt=\"Confirming school selection\" className=\"LoadSchoolsIndicator\" />}\n                      </div>\n                    </>\n                  }               \n                </>\n              }\n             \n            </div>\n          </div>\n        </>\n      }   \n    </div>\n  );\n};","export default \"data:image/png;base64,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\"","import React, { useEffect, useState } from 'react';\nimport { endpoints } from 'endpoints.config';\nimport { InfoTable } from 'components/infoTable/infoTable';\nimport WarningIcon from '../../../images/Icon_Warning.png';\n\ntype Props = {\n  currentSynOpt: string;\n};\n\nexport const PreviouslyMatchedRecords: React.FC<Props> = ({ currentSynOpt }) => {\n  const [listUrl, setListUrl] = useState<string>(\"\");\n  const [isPanelClosed, setIsPanelClosed] = useState<boolean>(true);\n  const [tableError, setTableError] = useState<boolean>(false);\n  const [tableData, setTableData] = useState<any>(null);\n  const [toggleRecordsShow, setToggleRecordsShow] = useState<boolean>(false);\n  \n  useEffect(() => {\n    if(currentSynOpt){\n      loadData();\n    }\n  }, [currentSynOpt]);\n\n  const loadData = async () => {\n    const currentListUrl = currentSynOpt === \"Class\" ?\n      endpoints.wondeIntegration.prevMatchedRecordsClass :\n      endpoints.wondeIntegration.prevMatchedRecordsPupil;\n\n    setListUrl(currentListUrl);\n  };  \n\n  return (\n    <>\n      <div className=\"Btn BtnOrange RightBtn\" onClick={() => setToggleRecordsShow(!toggleRecordsShow)}>{toggleRecordsShow ? \"Hide\" : \"Show\"} Previously Matched Records</div>\n\n      <div className=\"PrevMatchedRecords\" style={{ display: toggleRecordsShow ? \"block\" : \"none\" }}>\n        <h2>Previously Matched Records</h2>\n\n        {listUrl && !tableError && \n          <InfoTable\n            listUrl={listUrl}\n            firstColWidth={215}\n            firstColWidthSm={110}\n            updateListStatus={true}\n            setIsPanelClosed={setIsPanelClosed}\n            isPanelClosed={isPanelClosed}\n            allowSelectAll={false}\n            filterTable={false}\n            hideSideMenu={true}\n            rowHighlight={false}\n            hideChkboxCol={true}\n            setTableData={setTableData}\n            setTableError={setTableError}\n          >\n          </InfoTable>\n        }\n\n        {tableData && tableData.length <= 0 &&\n          <p>You have no matched Wonde - Get Set records.</p>\n        }\n\n        {tableError &&\n          <div className=\"ListTableMsgContainer\">\n            <div className=\"Msg\">\n              <div className=\"MsgContainer\">\n                <div className=\"Img\"><img src={WarningIcon} alt=\"Warning\" /></div>\n                <div className=\"Txt\">An error occurred loading previously matched records.</div>\n              </div>\n            </div>\n          </div>\n        }\n      </div>\n    </>\n  );  \n};","import React, { useState, useEffect, Dispatch, SetStateAction } from 'react';\nimport { PageHero } from '../../../components/pageHero/PageHero';\nimport { endpoints } from 'endpoints.config';\nimport { InfoTable } from 'components/infoTable/infoTable';\nimport { Spinner } from 'components/spinner/Spinner';\nimport { WondeApi } from 'api/wondeApi';\nimport { useToast } from 'hooks/useToast';\nimport { PreviouslyMatchedRecords } from '../wIFeatures/PreviouslyMatchedRecords';\n\ntype WIStep1Props = {\n  setCurrentStep: Dispatch<SetStateAction<number>>;\n  setWondeIntegration: Dispatch<SetStateAction<boolean>>;\n  currentSynOpt: string;\n};\n\nexport const WIStep1: React.FC<WIStep1Props> = ({ \n  setCurrentStep, \n  setWondeIntegration,\n  currentSynOpt,\n}) => {\n  const [checkTableLoading, setCheckTableLoading] = useState<any>(false);\n  const [listUrl, setListUrl] = useState<string>(\"\");\n  const [submitUrl, setSubmitUrl] = useState<string>(\"\");\n  const [pageName, setPageName] = useState<string | null>(null);\n  const [isPanelClosed, setIsPanelClosed] = useState<boolean>(true);\n  const [matchesSelected, setMatchesSelected] = useState<any>([]);\n  const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n  const [error, setError] = useState<string>('');\n  const [tableData, setTableData] = useState<any>([]);\n\n  const successToast = useToast(\"Successfully submitted\");\n\n  useEffect(() => {\n    document.body.style.overflowY = '';\n  }, []);  \n\n  useEffect(() => {\n    if(currentSynOpt){\n      loadData();\n    }\n  }, [currentSynOpt]);\n\n  const loadData = async () => {\n    setPageName(`Sync ${currentSynOpt} Records`);\n\n    const currentListUrl = currentSynOpt === \"Class\" ?\n      endpoints.wondeIntegration.classStep1List :\n      endpoints.wondeIntegration.pupilStep1List;\n\n    setListUrl(currentListUrl);\n\n    const currentSubmitUrl = currentSynOpt === \"Class\" ?\n      endpoints.wondeIntegration.classStep1NameMatch :\n      endpoints.wondeIntegration.pupilStep1NameMatch;\n\n    setSubmitUrl(currentSubmitUrl);\n  };\n\n  const submitMatchOpts = async () => {\n    setIsSubmitting(true);\n\n    const selectedIds = matchesSelected.map((item: any) => {\n      return currentSynOpt === \"Class\" ?\n        { \"classID\": item.classes__id, \"wondeClassID\": item.wondeclasses__id } :\n        currentSynOpt === \"Pupil\" ?\n        { \"pupilID\": item.pupils__id, \"wondePupilID\": item.wondepupils__id } :\n        { \"schoolUserID\": item.schoolusers__id, \"wondeSchoolUserID\": item.wondeSchoolusers__id }\n    });\n\n    if(selectedIds.length > 0){\n      const result = await WondeApi.submitSelectedWondeExactMatches(selectedIds, submitUrl);\n\n      if (!result.error) {\n        successToast();\n        window.scrollTo(0, 0);\n        setCurrentStep(2);\n      }\n      \n      if (result.error) {\n        setError(\"An error occurred, please try again.\");\n        setIsSubmitting(false);\n      }\n    } else {\n      window.scrollTo(0, 0);\n      setCurrentStep(2);\n    }\n  };\n\n  return (\n    <div className={\"PageContent WondeIntegrationPage Step1 \" + currentSynOpt}>\n      <PageHero title={pageName ?? ''} />\n      <div className=\"WidthContent\">\n        {isSubmitting &&\n          <div className=\"WILoadingPanel\">\n            <Spinner color={'#f59e16'} />\n          </div>\n        }\n\n        <div className=\"TopInfoRow\">\n          <div className=\"LeftSide\">\n            <h2>Exact Matches</h2>\n          </div>\n          <div className=\"RightSide\">\n            <p>Step 1 of 4</p>\n          </div>\n        </div>\n        <p>Here are exact matches we have identified between your Wonde and Get Set records. {currentSynOpt === \"Pupil\" ? \"Match the Wonde records with your Get Set records.\" : \"Select the Wonde records that match your Get Set records and confirm.\"}</p>\n\n        {error &&\n          <div className=\"ErrorTxt\">{error}</div>\n        }\n\n        {listUrl &&\n          <InfoTable\n            listUrl={listUrl}\n            firstColWidth={215}\n            firstColWidthSm={110}\n            updateListStatus={true}\n            setIsPanelClosed={setIsPanelClosed}\n            isPanelClosed={isPanelClosed}\n            allowSelectAll={true}\n            filterTable={false}\n            setCheckTableLoading={setCheckTableLoading}\n            hideSideMenu={true}\n            getSelectedOpts={{ \n              \"getOpts\": setMatchesSelected, \n              \"id\": currentSynOpt === \"Class\" ? \n                \"classes__id\" :\n                currentSynOpt === \"Pupil\" ?\n                \"pupils__id\" :\n                \"schoolusers__id\"\n            }}\n            rowHighlight={true}\n            wondeRow={true}\n            wondeRowType={currentSynOpt}\n            hideBtmCtrls={true}\n            setTableData={setTableData}\n          >\n          </InfoTable>\n        }\n\n        <PreviouslyMatchedRecords currentSynOpt={currentSynOpt} />\n\n        <div className=\"BtmBtns\">\n          <div className=\"Btn BtnWhite LeftBtn\" onClick={() => {\n            window.scrollTo(0, 0);\n            setWondeIntegration(false);\n          }}>Cancel</div>\n          {!checkTableLoading &&\n            <div className=\"Btn BtnOrange RightBtn\" onClick={() => submitMatchOpts()}>Confirm</div>\n          }\n        </div>\n      </div>\n    </div>\n  );\n};","import React, { useState, useEffect, Dispatch, SetStateAction } from 'react';\nimport { PageHero } from '../../../components/pageHero/PageHero';\nimport { endpoints } from 'endpoints.config';\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\nimport { FixedSizeList, areEqual } from \"react-window\";\nimport DandD_Icon from \"../../../images/DandD_Icon.png\";\nimport { Spinner } from 'components/spinner/Spinner';\nimport { WondeApi } from 'api/wondeApi';\nimport WarningIcon from '../../../images/Icon_Warning.png';\nimport { useToast } from 'hooks/useToast';\nimport { PreviouslyMatchedRecords } from '../wIFeatures/PreviouslyMatchedRecords';\n\ntype WIStep2Props = {\n  setCurrentStep: Dispatch<SetStateAction<number>>;\n  setWondeIntegration: Dispatch<SetStateAction<boolean>>;\n  currentSynOpt: string;\n};\n\ninterface ItemProps {\n  provided: any;\n  item: any;\n  style: any;\n  isDragging: any;\n}\n\ninterface getStyleProps {\n  draggableStyle: any;\n  virtualStyle: any;\n  isDragging: any;\n};\n\nexport const WIStep2: React.FC<WIStep2Props> = ({ \n  setCurrentStep, \n  setWondeIntegration,\n  currentSynOpt, \n}) => {\n  const [loading, setLoading] = useState<boolean>(true);\n  const [submitUrl, setSubmitUrl] = useState<string>(\"\");\n  const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n  const [generalError, setGeneralError] = useState<string>('');\n  const [error, setError] = useState<string>('');\n  const [pageName, setPageName] = useState<string | null>(null);\n  const [originalRecordsData, setOriginalRecordsData] = useState<any>([]);\n  const [recordsData, setRecordsData] = useState<any>(null);\n  const [selectedWondeItem, setSelectedWondeItem] = useState<any>(null); \n  const [selectedGetSetItem, setSelectedGetSetItem] = useState<any>(null); \n  const [matchedRecordsData, setMatchedRecordsData] = useState<any>([]);\n  const [updatingRecords, setUpdatingRecords] = useState<boolean>(false);\n\n  const successToast = useToast(\"Successfully submitted\");\n\n  useEffect(() => {\n    document.body.style.overflowY = '';\n  }, []);  \n\n  useEffect(() => {\n    if(currentSynOpt){\n      loadData();\n    }\n  }, [currentSynOpt]);\n\n  useEffect(() => {\n    if(selectedWondeItem && selectedGetSetItem){\n      matchSelectedRecords();\n    }\n  }, [selectedWondeItem, selectedGetSetItem]);\n\n  useEffect(() => {\n    if(updatingRecords){\n      setRecordsData(recordsData);\n      setMatchedRecordsData(matchedRecordsData);\n      setUpdatingRecords(false);\n    }\n  }, [updatingRecords, recordsData, matchedRecordsData]);   \n\n  const loadData = async () => {\n    setPageName(`Sync ${currentSynOpt} Records`);\n\n    const currentListUrl = currentSynOpt === \"Class\" ?\n      endpoints.wondeIntegration.classStep2ManualMatchList :\n      endpoints.wondeIntegration.pupilStep2ManualMatchList;\n\n    const currentSubmitUrl = currentSynOpt === \"Class\" ?\n      endpoints.wondeIntegration.classStep2ManualMatch :\n      endpoints.wondeIntegration.pupilStep2ManualMatch;\n\n    setSubmitUrl(currentSubmitUrl);    \n\n    const result = await WondeApi.getWondeUnmatchedRecords(currentListUrl);\n\n    if (!result.error) {\n      let wondeRecordsTypeList = currentSynOpt === \"Class\" ?\n        result.data.unmatchedWondeClasses :\n        result.data.unmatchedWondePupils;\n\n      wondeRecordsTypeList = wondeRecordsTypeList === null ? [] : wondeRecordsTypeList;\n\n      let getSetRecordsTypeList = currentSynOpt === \"Class\" ?\n        result.data.unmatchedClasses :\n        result.data.unmatchedPupils;\n\n      getSetRecordsTypeList = getSetRecordsTypeList === null ? [] : getSetRecordsTypeList;\n\n      const wondeRecords = wondeRecordsTypeList.map((item: any) => {\n        return { \n          \"id\": item.id, \n          \"recordClassName\": item.name, \n          \"recordYearGroup\": item.applicableYear,\n          \"recordKeyStage\": currentSynOpt === \"Class\" ? item.keyStage : null,\n          \"recordEmail\": null,\n          \"recordsType\": \"wonde\",\n        }\n      });      \n\n      const getSetRecords = getSetRecordsTypeList.map((item: any) => {\n        return { \n          \"id\": item.id, \n          \"recordClassName\": item.name, \n          \"recordYearGroup\": item.applicableYear,\n          \"recordKeyStage\": currentSynOpt === \"Class\" ? item.keyStage : null,\n          \"recordEmail\": null,\n          \"recordsType\": \"getset\",\n        }\n      });\n\n      const inititalData = [\n        {\n          recordsType: \"wonde\",\n          columnName: \"Unmatched Wonde Records\",\n          records: wondeRecords\n        },\n        {\n          recordsType: \"getset\",\n          columnName: \"Unmatched Get Set 4 Education records\",\n          records: getSetRecords\n        }      \n      ];\n      \n      setOriginalRecordsData(JSON.parse(JSON.stringify(inititalData)));\n      setRecordsData(JSON.parse(JSON.stringify(inititalData)));\n    }\n    \n    if (result.error) {\n      setGeneralError(\"An error occurred, please try again.\");\n    }\n\n    setLoading(false);\n  };\n  \n  const onDragEnd = (results: any) => {\n    if(results && results.destination && results.destination.droppableId === \"droppable_container_0\"){\n      setSelectedWondeItem(null);\n      setSelectedGetSetItem(null);\n    } else {\n      setSelectedWondeItem(parseInt(results.draggableId));\n    }\n  } \n\n  const onDragUpdate = (results: any) => {\n    let recordsDataCopy = recordsData;\n\n    if(results && results.destination && results.destination.droppableId === \"droppable_container_0\"){\n      setSelectedWondeItem(null);\n      setSelectedGetSetItem(null);\n    } else if (results && results.destination) {\n      recordsDataCopy[1].records.map((item: any, index: number) => {   \n        if(index === results.destination.index){\n          setSelectedGetSetItem(item.id);\n        }\n\n        return item;\n      });\n    }\n  }\n\n  const matchSelectedRecords = () => {\n    let recordsDataCopy = recordsData;\n    let matchedRecordsDataCopy = matchedRecordsData;\n    let wondeRecordMatchIndex = 0;\n    let getSetRecordMatchIndex = 0;\n    let selectedWondeItemObj = recordsDataCopy[0].records.filter((item: any, index: number) => {\n      if(item.id === selectedWondeItem){\n        wondeRecordMatchIndex = index;\n      }\n      \n      return item.id === selectedWondeItem;\n    });\n    let selectedGetSetItemObj = recordsDataCopy[1].records.filter((item: any, index: number) => {\n      if(item.id === selectedGetSetItem){\n        getSetRecordMatchIndex = index;\n      }\n\n      return item.id === selectedGetSetItem; \n    });\n\n    matchedRecordsDataCopy.push({\n      \"wondeRecord\": selectedWondeItemObj[0],\n      \"getSetRecord\": selectedGetSetItemObj[0],\n    });\n\n    recordsDataCopy[0].records.splice(wondeRecordMatchIndex, 1);\n    recordsDataCopy[1].records.splice(getSetRecordMatchIndex, 1);\n\n    setRecordsData(recordsDataCopy);\n    setMatchedRecordsData(matchedRecordsDataCopy);\n    setSelectedWondeItem(null);\n    setSelectedGetSetItem(null);\n  };\n\n  const unmatchRecord = (item: any, item_index: number) => {\n    let recordsDataCopy = recordsData;\n    let wondeRecordUnmatchIndex = 0;\n    let getSetRecordUnmatchIndex = 0;    \n    let matchedRecordsDataCopy = matchedRecordsData;\n\n    matchedRecordsDataCopy.splice(item_index, 1);\n\n    originalRecordsData[0].records.map((original_item: any, index: number) => {\n      if(original_item.id === item.wondeRecord.id){\n        wondeRecordUnmatchIndex = index;\n      }\n      return original_item;\n    });\n\n    originalRecordsData[1].records.map((original_item: any, index: number) => {\n      if(original_item.id === item.getSetRecord.id){\n        getSetRecordUnmatchIndex = index;\n      }\n      return original_item;\n    });\n\n    recordsDataCopy[0].records.splice(wondeRecordUnmatchIndex, 0, item.wondeRecord);\n    recordsDataCopy[1].records.splice(getSetRecordUnmatchIndex, 0, item.getSetRecord);\n\n    setRecordsData(recordsDataCopy);\n    setMatchedRecordsData(matchedRecordsDataCopy);\n    setUpdatingRecords(true);\n  };\n\n  const submitSelectedRecords = async () => {\n    if(matchedRecordsData.length > 0){\n      setIsSubmitting(true);\n\n      const matchedRecordsDataCopy = matchedRecordsData;\n  \n      const selectedRecords = matchedRecordsDataCopy.map((item: any) => {\n        return currentSynOpt === \"Class\" ?\n          { \"classID\": item.getSetRecord.id, \"wondeClassID\": item.wondeRecord.id, } :\n          currentSynOpt === \"Pupil\" ?\n          { \"pupilID\": item.getSetRecord.id, \"wondePupilID\": item.wondeRecord.id, } :\n          { \"schoolUserID\": item.getSetRecord.id, \"wondeSchoolUserID\": item.wondeRecord.id, };\n      });\n  \n      const result = await WondeApi.submitSelectedMatchedWondeRecords(selectedRecords, submitUrl);\n  \n      if (!result.error) {\n        successToast();\n        window.scrollTo(0, 0);\n        setCurrentStep(3);\n      }\n  \n      if (result.error) {\n        setError(\"An error occurred, please try again.\");\n        setIsSubmitting(false);\n        window.scrollTo(0, 0);\n      }\n    } else {\n      window.scrollTo(0, 0);\n      setCurrentStep(3);\n    }\n  };\n\n  function getStyle({ draggableStyle, virtualStyle, isDragging }: getStyleProps) {\n    const combined = {\n      ...virtualStyle,\n      ...draggableStyle\n    };\n\n    const grid = 5;\n\n    const result = {\n      ...combined,\n      height: isDragging ? combined.height : combined.height - grid,\n      width: isDragging\n        ? draggableStyle.width\n        : `calc(${combined.width} - ${grid * 2}px)`,\n      marginBottom: grid\n    };\n  \n    return result;\n  }  \n\n  const Item = ({ provided, item, style, isDragging }: ItemProps) => {\n    return (\n      <div \n        className={\"RecordBlock\" + (isDragging || selectedGetSetItem === item.id ? \" Highlight\" : \"\")} \n        {...provided.draggableProps} \n        {...provided.dragHandleProps} \n        ref={provided.innerRef}\n        style={getStyle({\n          draggableStyle: provided.draggableProps.style,\n          virtualStyle: style,\n          isDragging\n        })}          \n      >\n        <div className=\"Inner\">\n          <div className=\"RBCol Col1\">\n            {item.recordsType === \"wonde\" ?\n              <div className=\"IconAndTxt\">\n                <div className=\"RBIcon\"><img src={DandD_Icon} alt={item.recordClassName} /></div>\n                <div className=\"RBTxt\">{item.recordClassName}</div>\n              </div>\n              :\n              item.recordClassName\n            }\n          </div>\n          <div className=\"RBCol Col2\">\n            {item.recordYearGroup}\n          </div>\n          {currentSynOpt === \"Class\" &&\n            <div className=\"RBCol Col3\">{item.recordKeyStage}</div>\n          }\n        </div>\n      </div>\n    );\n  };\n\n  const Row = React.memo(function Row(props: any) {\n    const { data: items, index, style } = props;\n    const item = items[index];\n\n    if (!item) {\n      return null;\n    }\n  \n    return (\n      <Draggable key={\"draggable_container_key_\" + item.id.toString()} draggableId={item.id.toString()} index={index} isDragDisabled={item.recordsType === \"getset\"}>\n        {(provided, snapshot) => (<Item provided={provided} item={item} style={style} isDragging={snapshot.isDragging} />\n      )}\n      </Draggable>\n    );\n  }, areEqual);\n\n  return (\n    <div className=\"PageContent WondeIntegrationPage Step2\">\n      <PageHero title={pageName ?? ''} />\n      <div className=\"WidthContent\">\n        <div className=\"TopInfoRow\">\n          <div className=\"LeftSide\">\n            <h2>Unmatched Records</h2>\n          </div>\n          <div className=\"RightSide\">\n            <p>Step 2 of 4</p>\n          </div>\n        </div>\n        <p>Here are unmatched records between your Wonde and Get Set records. Drag the Wonde {currentSynOpt === \"Class\" ? \"class\" : \"pupil\"} records and drop them with the Get Set records you would like to link them to.</p>\n\n        {error &&\n          <div className=\"ErrorTxt\">{error}</div>\n        }\n\n        {loading ? \n          <Spinner color={'#f59e16'} />\n          :\n          <>\n            {generalError ?\n              <div className=\"ErrorPageStatus\">\n                <img src={WarningIcon} alt=\"Wonde Logo\" className=\"WondeLogo\" />\n                <div className=\"Txt\">{generalError}</div>\n              </div>\n              :\n              <>\n                {recordsData && recordsData.length > 0 &&\n                  <>\n                    {isSubmitting &&\n                      <div className=\"WILoadingPanel\">\n                        <Spinner color={'#f59e16'} />\n                      </div>\n                    }\n\n                    <div className=\"RecordListColumns\">\n                      <DragDropContext onDragEnd={onDragEnd} onDragUpdate={onDragUpdate}>\n                        {recordsData.map((item: any, list_col_index: number) => {\n                          return (\n                            <div className=\"ListCol\" key={list_col_index}>\n                              {item.records && item.records.length > 0 &&\n                                <>\n                                  <h4>{item.columnName}</h4>\n\n                                  <div className={\"LCHdrRow \" + (list_col_index === 0 ? \" FirstCol\" : \"\")}>\n                                    <div className=\"LCHdr Col1\">\n                                      {currentSynOpt === \"Pupil\" ? \"Pupil name\" : \"Class name\"}\n                                    </div>\n                                    <div className={\"LCHdr Col2\" + (currentSynOpt === \"Class\" ? \" ClassBlock\" : \"\")}>\n                                      Year group\n                                    </div>\n                                    {currentSynOpt === \"Class\" &&\n                                      <div className=\"LCHdr Col3\">Key stage</div>\n                                    }\n                                  </div>\n\n                                  <div className=\"RecordsListContainer\">\n                                    <Droppable \n                                      droppableId={\"droppable_container_\" + list_col_index}\n                                      mode=\"virtual\"\n                                      renderClone={(provided, snapshot, rubric) => (\n                                        <Item\n                                          provided={provided}\n                                          isDragging={snapshot.isDragging}\n                                          item={item.records[rubric.source.index]}\n                                          style={null}\n                                        />\n                                      )}                                      \n                                    >\n                                      {(provided: any, snapshot: any) => {\n                                        const itemCount = snapshot.isUsingPlaceholder ? item.records.length + 1 : item.records.length;\n\n                                        return (\n                                          <FixedSizeList\n                                            height={440}\n                                            itemCount={itemCount}\n                                            itemSize={45}\n                                            width={\"100%\"}\n                                            outerRef={provided.innerRef}\n                                            itemData={item.records}\n                                            className=\"task-list\"\n                                          >\n                                            {Row}\n                                          </FixedSizeList>\n                                        );\n                                      }}\n                                    </Droppable>\n                                  </div>\n                                </>\n                              }\n\n                              {(!item.records || item.records.length <= 0) && \n                                <>\n                                  <h4>{item.columnName}</h4>\n                                  <p>There are no records.</p>                                \n                                </>\n                              }                \n                            </div>\n                          );\n                        })}\n                      </DragDropContext>\n                    </div>\n\n                    <div className=\"LineSpacer4\"></div>\n                    <div className=\"LineSpacer5\"></div>\n\n                    <h4>Matched Records</h4>\n                    {matchedRecordsData.length <= 0 &&\n                      <div className=\"NoMatchedRecordsPanel\">\n                        <div className=\"EmptyMsgBlock\">\n                          <div className=\"Inner\">\n                            <p>No records matched</p>\n                          </div>\n                        </div>\n                      </div>\n                    }\n\n                    {matchedRecordsData.length > 0 &&\n                      <div className=\"MatchedRecordsPanel\">\n                        <div className=\"SelectedRecordRow TopRow\">\n                          <div className=\"SRCol Col1\">\n                            <div className=\"RRDetails\">\n                              <div className=\"LCHdrRow\">\n                                <div className=\"LCHdr Col1\">\n                                  {currentSynOpt === \"Pupil\" ? \"Pupil name\" : \"Class name\"}\n                                </div>\n                                <div className=\"LCHdr Col2\">\n                                  Year group\n                                </div>\n                                {currentSynOpt === \"Class\" && <div className=\"LCHdr Col3\">Key stage</div>}\n                              </div>                       \n                            </div>\n                          </div>\n                          <div className=\"SRCol Col2\"></div>\n                          <div className=\"SRCol Col3\">\n                            <div className=\"RRDetails\">\n                              <div className=\"LCHdrRow\">\n                                <div className=\"LCHdr Col1\">\n                                  {currentSynOpt === \"Pupil\" ? \"Pupil name\" : \"Class name\"}\n                                </div>\n                                <div className=\"LCHdr Col2\">\n                                  Year group\n                                </div>\n                                {currentSynOpt === \"Class\" && <div className=\"LCHdr Col3\">Key stage</div>}\n                              </div>                         \n                            </div>\n                          </div>\n                          <div className=\"SRCol Col4\"></div>                                                                        \n                        </div>\n\n                        <div className=\"MRInner\">\n                          {matchedRecordsData.map((item: any, index: number) => {\n                            return (\n                              <div className=\"SelectedRecordRow\" key={index}>\n                                <div className=\"SRCol Col1\">\n                                  <div className=\"RRDetails\">\n                                    <div className=\"RecordBlock\">\n                                      <div className=\"Inner\">\n                                        <div className=\"RBCol Col1\">{item.wondeRecord.recordClassName}</div>\n                                        <div className=\"RBCol Col2\">\n                                          {item.wondeRecord.recordYearGroup}\n                                        </div>\n                                        {currentSynOpt === \"Class\" && <div className=\"RBCol Col3\">{item.wondeRecord.recordKeyStage}</div>}\n                                      </div>\n                                    </div>                        \n                                  </div>\n                                </div>\n                                <div className=\"SRCol Col2\"></div>\n                                <div className=\"SRCol Col3\">\n                                  <div className=\"RRDetails\">\n                                    <div className=\"RecordBlock\">\n                                      <div className=\"Inner\">\n                                        <div className=\"RBCol Col1\">{item.getSetRecord.recordClassName}</div>\n                                        <div className=\"RBCol Col2\">\n                                          {item.getSetRecord.recordYearGroup}\n                                        </div>\n                                        {currentSynOpt === \"Class\" && <div className=\"RBCol Col3\">{item.getSetRecord.recordKeyStage}</div>}\n                                      </div>\n                                    </div>                         \n                                  </div>\n                                </div>\n                                <div className=\"SRCol Col4\">\n                                  <div className=\"Btn BtnWhiteOrange\" onClick={() => unmatchRecord(item, index)}>Unmatch</div>\n                                </div>                                                                        \n                              </div>\n                            );\n                          })}\n                        </div>\n                      </div>\n                    }\n                  </>\n                }\n\n                <PreviouslyMatchedRecords currentSynOpt={currentSynOpt} />\n\n                <div className=\"BtmBtns\">\n                  <div className=\"Btn BtnWhite LeftBtn\" onClick={() => {\n                    window.scrollTo(0, 0);\n                    setWondeIntegration(false);\n                  }}>Cancel</div>\n                  <div className=\"Btn BtnOrange RightBtn\" onClick={() => submitSelectedRecords()}>Confirm</div>\n                </div> \n              </>\n            }         \n          </>\n        }\n      </div>\n    </div>\n  );\n};","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAVCAIAAAD5O0jeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABhSURBVDhPtZDBDQAhCASv/8JsAPrhbhGSS9gHxDgvHechPNYGqaqu5DvvhyqRhki8JPJe+v+WiHhJJNImw7TuhcrhWHFLvDxP616oRNpkmNa9UDkcK26Jl+dp3QuVSFuYvfIXDmjAGxQKAAAAAElFTkSuQmCC\"","import React, { Dispatch, SetStateAction, useState } from 'react';\nimport { PopupOrPanel } from '../../../components/popupsAndPanels/PopupAndPanels';\nimport { Spinner } from 'components/spinner/Spinner';\nimport { WondeApi } from 'api/wondeApi';\nimport { useToast } from 'hooks/useToast';\nimport { EMAIL_ERROR_MSG } from '../wISteps/WIStep3';\n\nexport type SelectedRecord = {\n  dynamicFilters: null;\n  howManyResults: number;\n  wondeschoolusers__emailaddress: string;\n  wondeschoolusers__id: number;\n  wondeschoolusers__name: string;\n};\n\ntype Props = {\n  panelOpen: boolean;\n  togglePanelOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  recordsSelected: SelectedRecord[];\n  setCurrentStep: Dispatch<SetStateAction<number>>;\n  currentSubmitUrl: string;\n  currentSynOpt: string;\n  tableData: any;\n  setCreateErrors: React.Dispatch<React.SetStateAction<number[] | null>>\n};\n\nexport const CreateRecordsPopup: React.FC<Props> = ({\n  panelOpen,\n  togglePanelOpen,\n  recordsSelected,\n  setCurrentStep,\n  currentSubmitUrl,\n  currentSynOpt,\n  tableData,\n  setCreateErrors\n}) => {\n  const [error, setError] = useState<string>('');\n  const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n\n  const successToast = useToast(\"Successfully submitted\");\n\n  const closeModal = () => {\n    setError('')\n    togglePanelOpen(false)\n  };\n\n  const submitRecordOpts = async (selected_items: SelectedRecord[]) => {\n    setIsSubmitting(true);\n\n    const selectedIds = currentSynOpt === \"Class\" ? \n      { unmatchedClasses: selected_items.map((item: any) => item.wondeclasses__id) } : \n      { unmatchedPupils: selected_items.map((item: any) => item.wondepupils__id) };\n\n    const result = await WondeApi.submitSelectedWondeRecords(selectedIds, currentSubmitUrl);\n\n    if (!result.error) {\n      successToast();\n      window.scrollTo(0, 0);\n      setCurrentStep(4);\n    }\n    if (result.error) {\n      if (\n        result.error.formErrors &&\n        result.error.formErrors.length > 0 &&\n        result.error.formErrors.find(\n          (err) => err.messageCode === 'Invalid_EmailAddresses'\n        )\n      ) {\n        const errorsIndexs: (number|null)[] = result.error.formErrors.map(err => {\n          const match = err.fieldName.match(/\\[(\\d+)\\]/);\n          return match ? parseInt(match[1]) : null;\n        }).filter(num => typeof num === 'number')\n        const errorIds = selected_items.filter((_, i) => errorsIndexs.includes(i)).map(item=>item.wondeschoolusers__id);\n        setCreateErrors(errorIds);\n        setIsSubmitting(false);\n        setError(`${EMAIL_ERROR_MSG}`);\n      } else {\n        setError('An error occurred, please try again.');\n        setIsSubmitting(false);\n      }\n    }  \n  };  \n\n  const isEmailError = error === `${EMAIL_ERROR_MSG}`;\n\n  return (\n    <PopupOrPanel\n      isPopup={true}\n      isOpen={panelOpen}\n      hdrTitle={\"Create Records\"}\n      position=\"right\"\n      givenClass=\"WondeCreateRecords\"\n      noFooter={false}\n      primaryBtnTxt={isEmailError ? 'Close' : \"Confirm\"}\n      secondaryBtnTxt=\"Cancel\"      \n      handleClose={closeModal}\n      handlePrimaryBtn={() => {\n        if (isEmailError) {\n          closeModal();\n        } else if(recordsSelected.length > 0){\n          submitRecordOpts(recordsSelected);\n        } else {\n          window.scrollTo(0, 0);\n          setCurrentStep(4);\n        }\n      }}\n      handleSecondaryBtn={closeModal}\n      width={460}\n      isSubmitting={isSubmitting}\n    >\n      {error && <p className=\"GeneralError2\">{error}</p>}\n\n      {(!tableData || tableData.length <= 0) && <p>There are no records to create in Get Set.</p>}\n\n      {tableData && tableData.length > 0 && recordsSelected.length <= 0 && <p>Are you sure you do not wish to create any additional records in Get Set?</p>}\n\n      {recordsSelected.length > 0 && <p>Are you sure you want to create these records in Get Set?</p>}\n\n      <div className=\"PopupRecordsList\">\n        {recordsSelected.map((item: any, index: number) => {\n          return (\n            <div className=\"RLItem\" key={index}>- {currentSynOpt === \"Class\" ? \n                item.wondeclasses__classname :\n                currentSynOpt === \"Pupil\" ?\n                item.wondepupils__name :\n                item.wondeschoolusers__name}\n            </div>\n          );\n        })}\n      </div>\n\n      {isSubmitting && <Spinner color={'#f59e16'} /> }          \n    </PopupOrPanel>\n  );  \n};","import React, { useState, useEffect, Dispatch, SetStateAction } from 'react';\nimport { PageHero } from '../../../components/pageHero/PageHero';\nimport { endpoints } from 'endpoints.config';\nimport { InfoTable } from 'components/infoTable/infoTable';\nimport { CreateRecordsPopup, SelectedRecord } from '../../../pages/wondeIntegration/wIPopups/CreateRecordsPopup';\nimport { PreviouslyMatchedRecords } from '../wIFeatures/PreviouslyMatchedRecords';\nimport { SyncDataOption } from '../WondeIntegration';\n\ntype WIStep3Props = {\n  setCurrentStep: Dispatch<SetStateAction<number>>;\n  setWondeIntegration: Dispatch<SetStateAction<boolean>>;\n  currentSynOpt: SyncDataOption;\n};\n\nexport const EMAIL_ERROR_MSG = `One or more of the records you have selected to create either already exists in Get Set or has no associated email address in your MIS and cannot be created.`;\nconst DEFAULT_STRING = 'Here are the records that exist in Wonde but not in Get Set. Please select the records you wish to create in Get Set.';\n\nexport const WIStep3: React.FC<WIStep3Props> = ({ \n  setCurrentStep, \n  setWondeIntegration,\n  currentSynOpt, \n}) => {\n  const [checkTableLoading, setCheckTableLoading] = useState<any>(false);\n  const [listUrl, setListUrl] = useState<string>(\"\");\n  const [submitUrl, setSubmitUrl] = useState<string>(\"\");  \n  const [pageName, setPageName] = useState<string | null>(null);\n  const [recordsSelected, setRecordsSelected] = useState<any>([]);\n  const [isPanelClosed, setIsPanelClosed] = useState<boolean>(true);\n  const [createRecordsPopupOpen, setCreateRecordsPopupOpen] = useState<boolean>(false);\n  const [tableData, setTableData] = useState<any>([]);\n\n  const [createErrors, setCreateErrors] = useState<number[] | null>(null);\n\n  useEffect(() => {\n    document.body.style.overflowY = '';\n  }, []);   \n\n  useEffect(() => {\n    if(currentSynOpt){\n      loadData();\n    }\n  }, [currentSynOpt]);\n\n  const loadData = async () => {\n    setPageName(`Sync ${currentSynOpt} Records`);\n\n    const currentListUrl = currentSynOpt === \"Class\" ?\n      endpoints.wondeIntegration.classStep3List :\n      endpoints.wondeIntegration.pupilStep3List;\n\n    setListUrl(currentListUrl);\n\n    const currentSubmitUrl = currentSynOpt === \"Class\" ?\n      endpoints.wondeIntegration.classStep3UnmatchedWondeClasses :\n      endpoints.wondeIntegration.pupilStep3UnmatchedWondeClasses;\n\n    setSubmitUrl(currentSubmitUrl);\n  };\n\n  return (\n    <div className=\"PageContent WondeIntegrationPage Step3\">\n      <PageHero title={pageName ?? ''} />\n      <div className=\"WidthContent\">\n        <div className=\"TopInfoRow\">\n          <div className=\"LeftSide\">\n            <h2>Wonde Records</h2>\n          </div>\n          <div className=\"RightSide\">\n            <p>Step 3 of 4</p>\n          </div>\n        </div>\n        <h4>Select records to be created in get set 4 education</h4>\n\n        <p className='OnlyCreateText'>{DEFAULT_STRING}</p>\n\n        {(createErrors ?? [])?.length > 0 && (\n          <>\n            <p className=\"GeneralError2 NoMarginBottom\">{EMAIL_ERROR_MSG}</p>\n          </>\n        )}\n\n        {listUrl &&\n          <InfoTable\n            listUrl={listUrl}\n            firstColWidth={215}\n            firstColWidthSm={110}\n            updateListStatus={true}\n            setIsPanelClosed={setIsPanelClosed}\n            isPanelClosed={isPanelClosed}\n            allowSelectAll={true}\n            filterTable={false}\n            setCheckTableLoading={setCheckTableLoading}\n            hideSideMenu={true}\n            getSelectedOpts={{ \n              \"getOpts\": setRecordsSelected, \n              \"id\": currentSynOpt === \"Class\" ? \n                \"wondeclasses__id\" :\n                currentSynOpt === \"Pupil\" ?\n                \"wondepupils__id\" :\n                \"wondeschoolusers__id\"\n            }}\n            rowHighlight={true}\n            hideBtmCtrls={true}\n            setTableData={setTableData}\n            rowClassname={(data: SelectedRecord) => createErrors?.includes(data.wondeschoolusers__id) ? 'ErrorRow' : ''}\n          >\n          </InfoTable>\n        }\n\n        {(createErrors ?? [])?.length > 0 && (\n          <>\n            <p className=\"GeneralError2 NoMarginBottom\">{EMAIL_ERROR_MSG}</p>\n          </>\n        )}\n\n        <PreviouslyMatchedRecords currentSynOpt={currentSynOpt} />\n\n        <div className=\"BtmBtns\">\n          <div className=\"Btn BtnWhite LeftBtn\" onClick={() => {\n            window.scrollTo(0, 0);\n            setWondeIntegration(false);\n          }}>Cancel</div>\n          {!checkTableLoading &&\n            <div className=\"Btn BtnOrange RightBtn\" onClick={() => {\n              setCreateRecordsPopupOpen(true);\n              setCreateErrors(null);\n            }}>Confirm</div>\n          }\n        </div>\n      </div>\n\n      {createRecordsPopupOpen && (\n        <CreateRecordsPopup\n          panelOpen={createRecordsPopupOpen}\n          togglePanelOpen={setCreateRecordsPopupOpen}\n          recordsSelected={recordsSelected}\n          setCurrentStep={setCurrentStep}\n          currentSubmitUrl={submitUrl}\n          currentSynOpt={currentSynOpt}\n          tableData={tableData}\n          setCreateErrors={setCreateErrors}\n        />        \n      )}       \n    </div>\n  );\n};","import React, { Dispatch, SetStateAction, useState } from 'react';\nimport { PopupOrPanel } from '../../../components/popupsAndPanels/PopupAndPanels';\nimport { Spinner } from 'components/spinner/Spinner';\nimport { WondeApi } from 'api/wondeApi';\nimport WarningIcon from 'images/Icon_Warning_01.png';\nimport { useToast } from 'hooks/useToast';\nimport { SyncDataOption } from '../WondeIntegration';\n\ntype Props = {\n  panelOpen: boolean;\n  togglePanelOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  recordsSelected: any;\n  setWondeIntegration: Dispatch<SetStateAction<boolean>>;\n  setCurrentStep: Dispatch<SetStateAction<number>>;\n  syncDataOpts: SyncDataOption[];\n  setSyncDataOpts: Dispatch<SetStateAction<SyncDataOption[]>>;\n  submitUrl: string;\n  currentSynOpt: string;\n  tableData: any;\n};\n\nexport const DeleteRecordsPopup: React.FC<Props> = ({\n  panelOpen,\n  togglePanelOpen,\n  recordsSelected,\n  setWondeIntegration,\n  setCurrentStep,\n  syncDataOpts,\n  setSyncDataOpts,\n  submitUrl,\n  currentSynOpt,\n  tableData,\n}) => {\n  const [error, setError] = useState<string>('');\n  const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n\n  const successToast = useToast(\"Successfully submitted\");\n\n  const handleDataSyncNextStep = () => {\n    const updatedSyncDataOpts = syncDataOpts.slice(1);\n\n    window.scrollTo(0, 0);\n    togglePanelOpen(false);          \n\n    if(updatedSyncDataOpts.length > 0){            \n      setSyncDataOpts(updatedSyncDataOpts);\n      setCurrentStep(1);\n    } else {\n      setWondeIntegration(false);\n    }\n  };  \n\n  const submitRecordOpts = async (selected_items: any) => {\n    setIsSubmitting(true);\n    \n    const selectedIds = currentSynOpt === \"Class\" ? \n      selected_items.map((item: any) => item.classes__id) :\n      currentSynOpt === \"Pupil\" ?\n      selected_items.map((item: any) => item.pupils__id) :\n      selected_items.map((item: any) => item.schoolusers__id);\n\n    const result = await WondeApi.deleteRemainingGetSetRecords(selectedIds, submitUrl);\n\n    if (!result.error) {\n      successToast();\n      handleDataSyncNextStep();\n    }\n    \n    if (result.error) {\n      setError(\"An error occurred, please try again.\");\n      setIsSubmitting(false);\n    }    \n  };\n\n  return (\n    <PopupOrPanel\n      isPopup={true}\n      isOpen={panelOpen}\n      hdrTitle={\"Delete Records\"}\n      position=\"right\"\n      givenClass=\"WondeDeleteRecords\"\n      noFooter={false}\n      primaryBtnTxt=\"Confirm\"\n      secondaryBtnTxt=\"Cancel\"       \n      handleClose={() => togglePanelOpen(false)}\n      handlePrimaryBtn={() => {\n        if(recordsSelected.length > 0){\n          submitRecordOpts(recordsSelected);\n        } else {\n          handleDataSyncNextStep();\n        }\n      }}      \n      handleSecondaryBtn={() => togglePanelOpen(false)}\n      width={460}\n      isSubmitting={isSubmitting}\n    >\n      {error && <p className=\"GeneralError2\">{error}</p>}\n\n      {(!tableData || tableData.length <= 0) && <p>There are no records to delete in Get Set.</p>}\n\n      {tableData && tableData.length > 0 && recordsSelected.length <= 0 && <p>Are you sure you do not wish to delete any additional records in Get Set?</p>}\n\n      {recordsSelected.length > 0 &&\n        <>\n          <p>Are you sure you want to permanently delete these records?</p>\n          <div className=\"LineSpacer3\"></div>\n          <p><strong>You’ll permanently delete all associated data in this academic year for:</strong></p>\n\n          <div className=\"PopupRecordsList\">\n            {recordsSelected.map((item: any, index: number) => {\n              return (\n                <div className=\"RLItem\" key={index}>- {currentSynOpt === \"Class\" ? \n                item.classes__classname :\n                currentSynOpt === \"Pupil\" ?\n                item.pupils__name :\n                item.contactdetails__name}</div>\n              );\n            })}\n          </div>\n\n          <div className=\"Warning RedBack\">\n            <img src={WarningIcon} alt=\"Warning\" />\n            <p>This action cannot be undone</p>\n          </div>\n        </>\n      }\n\n      {isSubmitting && <Spinner color={'#f59e16'} /> }          \n    </PopupOrPanel>\n  );  \n};","import React, { useState, useEffect, Dispatch, SetStateAction } from 'react';\nimport { PageHero } from '../../../components/pageHero/PageHero';\nimport { endpoints } from 'endpoints.config';\nimport { InfoTable } from 'components/infoTable/infoTable';\nimport { DeleteRecordsPopup } from '../../../pages/wondeIntegration/wIPopups/DeleteRecordsPopup';\nimport { PreviouslyMatchedRecords } from '../wIFeatures/PreviouslyMatchedRecords';\nimport { SyncDataOption } from '../WondeIntegration';\n\ntype WIStep4Props = {\n  setWondeIntegration: Dispatch<SetStateAction<boolean>>;\n  currentSynOpt: string;\n  setCurrentStep: Dispatch<SetStateAction<number>>;\n  syncDataOpts: SyncDataOption[];\n  setSyncDataOpts: Dispatch<SetStateAction<SyncDataOption[]>>;\n};\n\nexport const WIStep4: React.FC<WIStep4Props> = ({ \n  setWondeIntegration,\n  currentSynOpt,\n  setCurrentStep,\n  syncDataOpts,\n  setSyncDataOpts,\n}) => {\n  const [checkTableLoading, setCheckTableLoading] = useState<any>(false);\n  const [listUrl, setListUrl] = useState<string>(\"\");\n  const [submitUrl, setSubmitUrl] = useState<string>(\"\");   \n  const [pageName, setPageName] = useState<string | null>(null);\n  const [recordsSelected, setRecordsSelected] = useState<any>([]);\n  const [isPanelClosed, setIsPanelClosed] = useState<boolean>(true);\n  const [deleteRecordsPopupOpen, setDeleteRecordsPopupOpen] = useState<boolean>(false);\n  const [tableData, setTableData] = useState<any>([]);\n\n  useEffect(() => {\n    document.body.style.overflowY = '';\n  }, []); \n\n  useEffect(() => {\n    if(currentSynOpt){\n      loadData();\n    }\n  }, [currentSynOpt]);\n\n  const loadData = async () => {\n    setPageName(`Sync ${currentSynOpt} Records`);\n\n    const currentListUrl = currentSynOpt === \"Class\" ?\n      endpoints.wondeIntegration.classStep4List :\n      endpoints.wondeIntegration.pupilStep4List;\n\n    setListUrl(currentListUrl);\n\n    const currentSubmitUrl = currentSynOpt === \"Class\" ?\n      endpoints.wondeIntegration.classStep4UnmatchedClassesDelete :\n      endpoints.wondeIntegration.pupilStep4UnmatchedClassesDelete;\n\n    setSubmitUrl(currentSubmitUrl);\n  };\n\n  return (\n    <div className=\"PageContent WondeIntegrationPage Step4\">\n      <PageHero title={pageName ?? ''} />\n      <div className=\"WidthContent\">\n        <div className=\"TopInfoRow\">\n          <div className=\"LeftSide\">\n            <h2>Remaining Get Set 4 Education Records</h2>\n          </div>\n          <div className=\"RightSide\">\n            <p>Step 4 of 4</p>\n          </div>\n        </div>\n        <p>Here are the remaining records that have not been linked to a record in Wonde and do not have a Wonde ID. Select the records you wish to delete. The records you keep will be stored without a Wonde ID.</p>\n\n        <div className=\"LineSpacer5\"></div>\n\n        <h4>Select record to delete and click confirm OR click confirm without selecting any to keep these records</h4>\n\n        {listUrl &&\n          <InfoTable\n            listUrl={listUrl}\n            firstColWidth={215}\n            firstColWidthSm={110}\n            updateListStatus={true}\n            setIsPanelClosed={setIsPanelClosed}\n            isPanelClosed={isPanelClosed}\n            allowSelectAll={true}\n            filterTable={false}\n            setCheckTableLoading={setCheckTableLoading}\n            hideSideMenu={true}\n            getSelectedOpts={{ \n              \"getOpts\": setRecordsSelected, \n              \"id\": currentSynOpt === \"Class\" ? \n                \"classes__id\" :\n                currentSynOpt === \"Pupil\" ?\n                \"pupils__id\" :\n                \"schoolusers__id\"\n            }}\n            rowHighlight={true}\n            hideBtmCtrls={true}\n            setTableData={setTableData}\n          >\n          </InfoTable>\n        }\n\n        <PreviouslyMatchedRecords currentSynOpt={currentSynOpt} />        \n\n        <div className=\"BtmBtns\">\n          <div className=\"Btn BtnWhite LeftBtn\" onClick={() => {\n            window.scrollTo(0, 0);\n            setWondeIntegration(false);\n          }}>Cancel</div>\n          {!checkTableLoading &&\n            <div className=\"Btn BtnOrange RightBtn\" onClick={() => setDeleteRecordsPopupOpen(true)}>Confirm</div>\n          }\n        </div>\n      </div>\n\n      {deleteRecordsPopupOpen && (\n        <DeleteRecordsPopup\n          panelOpen={deleteRecordsPopupOpen}\n          togglePanelOpen={setDeleteRecordsPopupOpen}\n          recordsSelected={recordsSelected}\n          setWondeIntegration={setWondeIntegration}\n          setCurrentStep={setCurrentStep}\n          syncDataOpts={syncDataOpts}\n          setSyncDataOpts={setSyncDataOpts}\n          submitUrl={submitUrl}\n          currentSynOpt={currentSynOpt}\n          tableData={tableData}\n        />        \n      )}      \n    </div>\n  );\n};","import React from 'react';\nimport { PopupOrPanel } from '../../../components/popupsAndPanels/PopupAndPanels';\n\ntype Props = {\n  panelOpen: boolean;\n  backToProfilePage: any;\n  unableToSyncMsg: string;\n};\n\nexport const UnableToSyncDataPopup: React.FC<Props> = ({\n  panelOpen,\n  backToProfilePage,\n  unableToSyncMsg,\n}) => {\n  return (\n    <PopupOrPanel\n      isPopup={true}\n      isOpen={panelOpen}\n      hdrTitle={\"Unable to Sync\"}\n      position=\"right\"\n      givenClass=\"WondeSyncData\"\n      noFooter={false}\n      primaryBtnTxt=\"Close\"     \n      handleClose={() => backToProfilePage()}\n      handlePrimaryBtn={() => backToProfilePage()}\n      width={460}\n    >\n      <p>{unableToSyncMsg}</p>\n    </PopupOrPanel>\n  );  \n};","import { useState } from 'react';\n\nconst SEE_MORE_LIMIT = 10;\n\ntype Props = {\n  data: string[] | null;\n  title: string;\n  errorMsg: string;\n};\n\nexport const SimpleTableSyncError: React.FC<Props> = ({ data, title, errorMsg }) => {\n  const [seeMore, setSeeMore] = useState(false);\n  const handleToggleSeeMore = () => {\n    setSeeMore((prev) => !prev);\n  };\n\n  const dataLength = (data ?? []).length;\n\n  if (!data || data.length === 0) return null;\n\n  return (\n    <div className=\"SyncResponseWrapper\">\n      <h4>{title}</h4>\n      <p>{errorMsg}</p>\n      <div className=\"InfoTableContainer StaticTable SyncResponse\">\n        <div className=\"LTContainer\">\n          <div className=\"InfoTable HideChkboxCol\">\n            <div className=\"MiddleTable\">\n              <div className=\"Head\">\n                <div className=\"Cell\">\n                  <span className=\"Txt\">Name</span>\n                </div>\n              </div>\n              <div className=\"TableBody\">\n                {data\n                  .slice(0, seeMore ? undefined : SEE_MORE_LIMIT)\n                  .map((name, index) => (\n                    <div className=\"Row\" key={index}>\n                      <div className=\"Cell\">\n                        <span className=\"Txt\">{name}</span>\n                      </div>\n                    </div>\n                  ))}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      {dataLength > SEE_MORE_LIMIT && (\n        <button\n          type=\"button\"\n          className=\"SeeMoreButton\"\n          onClick={handleToggleSeeMore}\n        >\n          Show {seeMore ? 'less' : 'more'}...\n        </button>\n      )}\n    </div>\n  );\n};\n","import React, { useState, useEffect, Dispatch, SetStateAction } from 'react';\nimport { PageHero } from '../../components/pageHero/PageHero';\nimport { Spinner } from 'components/spinner/Spinner';\nimport { WondeApi } from 'api/wondeApi';\nimport { UnableToSyncDataPopup } from '../../pages/wondeIntegration/wIPopups/UnableToSyncDataPopup';\nimport WarningIcon from '../../images/Icon_Warning.png';\nimport { SyncWondeDataResponse } from './models';\nimport { SimpleTableSyncError } from './SimpleTableSyncError';\n\ntype WondeYearSinkProps = {\n  setCurrentStep: Dispatch<SetStateAction<number>>;\n  setWondeIntegration: Dispatch<SetStateAction<boolean>>;\n  selectedSyncType: string;\n  wondeSchoolId: any;\n  syncResponse: SyncWondeDataResponse | null;\n};\n\n\nexport const WondeYearSink: React.FC<WondeYearSinkProps> = ({ \n  setCurrentStep, \n  setWondeIntegration,\n  selectedSyncType,\n  wondeSchoolId,\n  syncResponse\n}) => {\n  const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n  const [recordData, setRecordData] = useState<any>(null);\n  const [error, setError] = useState<string>('');\n  const [unableToSyncPopupOpen, setUnableToSyncPopupOpen] = useState<boolean>(false);\n  const [unableToSyncMsg, setUnableToSyncMsg] = useState<string>(\"\");\n\n  useEffect(() => {\n    loadData();\n  }, []);\n\n  const loadData = async () => {\n    const result = await WondeApi.wondePupilRecords();\n\n    if (!result.error) {\n      setRecordData(result.data);\n    }\n    \n    if (result.error) {\n      setError(\"An error occurred, please try again.\");\n      setIsSubmitting(false);\n    }\n  };  \n\n  const submitYearSync = async (years_to_sync: string) => {\n    const yearSelected = parseInt(years_to_sync.split('/')[0]);\n\n    if(recordData.currentAcademicStartYear > yearSelected){\n      setUnableToSyncMsg(\"Your MIS has not yet moved to the new academic year. Once your MIS updates to the new academic year, you will be able to sync your data into Get Set 4 Education.\");\n      setUnableToSyncPopupOpen(true);\n    } else if (recordData.currentAcademicStartYear < yearSelected){\n      setUnableToSyncMsg(\"Woohoo, your MIS has moved to the new academic year. Once you have archived your data in Get Set 4 Education, you will be able to update your data with your Wonde connection.\");\n      setUnableToSyncPopupOpen(true);\n    } else {\n      setIsSubmitting(true);\n\n      const result = await WondeApi.submitSelectedWondePupilRecords(wondeSchoolId, selectedSyncType);\n\n      if (!result.error) {\n        setCurrentStep(1);\n      }\n      \n      if (result.error) {\n        setError(\"An error occurred, please try again.\");\n        setIsSubmitting(false);\n      }      \n    }\n  };\n\n  \n  return (\n    <div className=\"PageContent WondeIntegrationPage Step1\">\n      <PageHero title=\"Calibrate Pupil Records\" />\n      <div className=\"WidthContent\">\n        {isSubmitting &&\n          <div className=\"WILoadingPanel\">\n            <Spinner color={'#f59e16'} />\n          </div>\n        }\n\n        <SimpleTableSyncError\n          title='Failed to import all pupils'\n          errorMsg=\"Failed to import all pupils. Please contact Get Set on admin@getset4education.co.uk for further support.\"\n          data={syncResponse?.nonConformingPupils ?? []}\n        />\n\n        {!recordData || recordData.samplePupils.length > 0 ?\n          <>\n            <div className=\"TopInfoRow\">\n              <div className=\"LeftSide\">\n                <h2>Year Syncing</h2>\n              </div>\n              <div className=\"RightSide\"></div>\n            </div>\n\n            {recordData && !error &&\n              <p>Your Get Set 4 Education is in {recordData.currentAcademicStartYear}/{recordData.currentAcademicStartYear + 1}. Before we can sync, we need to confirm what academic year your registration system is in. Here are five pupil records we have pulled from Wonde:</p>\n            }\n\n            <div className=\"LineSpacer3\"></div>\n\n            {error &&\n              <div className=\"ErrorTxt\">{error}</div>\n            }\n\n            <div className=\"LineSpacer4\"></div>\n\n            {!recordData && !error &&\n              <div style={{ textAlign: \"center\", marginBottom: \"40px\" }}>\n                <Spinner color={'#f59e16'} />\n              </div>\n            }\n\n            {recordData && !error &&\n              <>\n                <h4>Wonde Records</h4>\n\n                <div className=\"InfoTableContainer StaticTable\">\n                  <div className=\"LTContainer\">\n                    <div className=\"InfoTable HideChkboxCol\">\n                      <div className=\"MiddleTable\">\n                        <div className=\"Head\">\n                          <div className=\"Cell CheckboxCell\"></div>\n                          <div className=\"Cell\"><span className=\"Txt\">Name</span></div>\n                          <div className=\"Cell\"><span className=\"Txt\">ID</span></div>\n                          <div className=\"Cell\"><span className=\"Txt\">Class</span></div>\n                          <div className=\"Cell\"><span className=\"Txt\">Wonde Year</span></div>\n                        </div>\n                        <div className=\"TableBody\">\n                          {recordData.samplePupils.map((item: any, index: number) => {\n                            return (\n                              <div className=\"Row\" key={index}>\n                                <div className=\"Cell CheckboxCell\"></div>\n                                <div className=\"Cell\"><span className=\"Txt\">{item.fullName}</span></div>\n                                <div className=\"Cell\"><span className=\"Txt\">{item.wondeId}</span></div>\n                                <div className=\"Cell\"><span className=\"Txt\">{item.wondeClassName}</span></div>\n                                <div className=\"Cell\"><span className=\"Txt\">{item.wondeApplicableYears}</span></div>\n                              </div>\n                            );\n                          })}\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n\n                <p>In what academic year were these pupils in this year group?</p>\n\n                <div className=\"BtmBtns FullWidth\">\n                  <div className=\"Btn BtnWhite LeftBtn\" onClick={() => {\n                    window.scrollTo(0, 0);\n                    setWondeIntegration(false);\n                  }}>Cancel</div>\n                  <div className=\"Btn BtnOrange RightBtn\" onClick={() => submitYearSync(recordData.currentAcademicYear)}>{recordData.currentAcademicYear}</div>\n                  <div className=\"Btn BtnOrange RightBtn\" onClick={() => submitYearSync(recordData.nextAcademicYear)}>{recordData.nextAcademicYear}</div>\n                </div>\n              </>\n            }\n\n            {error &&\n              <div className=\"BtmBtns\">\n                <div className=\"Btn BtnWhite LeftBtn\" onClick={() => {\n                  window.scrollTo(0, 0);\n                  setWondeIntegration(false);\n                }}>Cancel</div>\n              </div>\n            } \n          </>\n        :\n          <>\n            <div className=\"NoWondeDataError\">\n              <img src={WarningIcon} alt=\"No Wonde data error\" />\n              <h2>It looks like you don't have any data in Wonde. Add your school data into Wonde, then we'll be able to sync your records!</h2>\n              <div className=\"BtmBtns\">\n                <div className=\"Btn BtnWhite LeftBtn\" onClick={() => {\n                  window.scrollTo(0, 0);\n                  setWondeIntegration(false);\n                }}>Back to Manage School</div>\n              </div>              \n            </div>\n          </>\n        }       \n      </div>\n\n      {unableToSyncPopupOpen && (\n        <UnableToSyncDataPopup\n          panelOpen={unableToSyncPopupOpen}\n          backToProfilePage={() => {\n            window.scrollTo(0, 0);\n            setWondeIntegration(false);\n          }}\n          unableToSyncMsg={unableToSyncMsg}\n        />        \n      )}       \n    </div>\n  );\n};","import React, { Dispatch, SetStateAction, useState, useEffect } from 'react';\nimport { WIStep1 } from './wISteps/WIStep1';\nimport { WIStep2 } from './wISteps/WIStep2';\nimport { WIStep3 } from './wISteps/WIStep3';\nimport { WIStep4 } from './wISteps/WIStep4';\nimport { WondeYearSink } from './WondeYearSink';\nimport { SyncWondeDataResponse } from './models';\n\ntype WondeIntegrationProps = {\n  setWondeIntegration: Dispatch<SetStateAction<boolean>>;\n  selectedSyncType: string;\n  wondeSchoolId: any; \n  syncResponse: SyncWondeDataResponse | null;\n};\nexport type SyncDataOption = (\"Class\" | \"Pupil\");\n\nexport const WondeIntegration: React.FC<WondeIntegrationProps> = ({ \n  setWondeIntegration,\n  selectedSyncType,\n  wondeSchoolId,\n  syncResponse\n}) => {\n  const [currentStep, setCurrentStep] = useState<number>(0);\n  const [syncDataOpts, setSyncDataOpts] = useState<SyncDataOption[]>([]);\n\n  useEffect(() => {\n    const syncOptList: SyncDataOption[] = [\"Class\", \"Pupil\"];\n\n    setSyncDataOpts(syncOptList);\n  }, [selectedSyncType]);\n\n  const currentStepPage = () => {\n    switch(currentStep) {\n      case 0:\n        return (\n          <WondeYearSink \n            setCurrentStep={setCurrentStep}\n            setWondeIntegration={setWondeIntegration}\n            selectedSyncType={selectedSyncType}\n            wondeSchoolId={wondeSchoolId}\n            syncResponse={syncResponse}\n          />\n        );\n      case 1:\n        return (\n          <WIStep1 \n            setCurrentStep={setCurrentStep}\n            setWondeIntegration={setWondeIntegration}\n            currentSynOpt={syncDataOpts[0]}\n          />\n        );\n      case 2:\n        return (\n          <WIStep2 \n            setCurrentStep={setCurrentStep}\n            setWondeIntegration={setWondeIntegration}\n            currentSynOpt={syncDataOpts[0]}\n          />\n        );\n      case 3:\n        return (\n          <WIStep3 \n            setCurrentStep={setCurrentStep}\n            setWondeIntegration={setWondeIntegration}\n            currentSynOpt={syncDataOpts[0]}\n          />\n        );\n      case 4:\n        return (\n          <WIStep4 \n            setWondeIntegration={setWondeIntegration}\n            currentSynOpt={syncDataOpts[0]}\n            setCurrentStep={setCurrentStep}\n            syncDataOpts={syncDataOpts}\n            setSyncDataOpts={setSyncDataOpts}\n          />\n        );\n      default:\n        setWondeIntegration(false);\n    } \n  };\n\n  return (\n    <>\n      {currentStepPage()}\n    </>\n  );\n};","import { RouteComponentProps } from '@reach/router';\nimport { PageHero } from '../../components/pageHero/PageHero';\nimport Page from '../../components/shared/Page';\nimport { UpdateSchool } from './UpdateSchool';\nimport { UpdateArchive } from './UpdateArchiveDate';\nimport placeholderMSAddImage from '../../images/Icon_ManageSchool_01.png';\nimport placeholderMSArchiveDateImage from '../../images/Icon_ManageSchool_02.png';\nimport React, { useEffect, useState } from 'react';\nimport useFetchSchoolDetails from 'hooks/useFetchSchoolDetails';\nimport { ISchool } from './models';\nimport Tooltip from 'components/tooltip/Tooltip';\nimport { WondeLink } from '../../pages/wondeIntegration/WondeLink';\nimport { WondeIntegration } from '../../pages/wondeIntegration/WondeIntegration';\nimport { SyncWondeDataResponse } from '../wondeIntegration/models';\nimport { url } from 'inspector';\n\nexport const ManageSchool: React.FC<RouteComponentProps> = () => {\n  const [updateIsOpen, setUpdateIsOpen] = useState(false);\n  const [dateIsOpen, setDateIsOpen] = useState(false);\n  const [schoolDetails, setSchoolDetails] = useState<ISchool | null>(null);\n  const [wondeIntegration, setWondeIntegration] = useState<boolean>(false);\n  const [selectedSyncType, setSelectedSyncType] = useState<string>(\"ClassAndPupil\");\n  const [wondeSchoolId, setWondeSchoolId] = useState<any>(null);\n  const [syncResponse, setSyncResponse] = useState<SyncWondeDataResponse | null>(null);\n\n  useEffect(() => {\n    if(!wondeIntegration && !updateIsOpen && !dateIsOpen){\n      document.body.style.overflowY = '';\n    }\n  }, [wondeIntegration, updateIsOpen]);\n\n  useFetchSchoolDetails(setSchoolDetails);\n\n  useEffect(() => {\n    // If the wonde integration is cancelled reset the sync response\n    !wondeIntegration && setSyncResponse(null);\n  }, [wondeIntegration]);\n\n  return (\n    <Page>\n      {wondeIntegration ? \n        <WondeIntegration \n          setWondeIntegration={setWondeIntegration}\n          selectedSyncType={selectedSyncType}\n          wondeSchoolId={wondeSchoolId}\n          syncResponse={syncResponse}\n        />\n        :\n        <div className=\"PageContent ManageSchoolPage\">\n          <PageHero title={schoolDetails?.schoolName ?? ''} />\n          <div className=\"WidthContent\">\n            <div className=\"ManageSchoolSection Top ManageSchool\">\n              <div className=\"FlexLeft\">\n                <div className=\"PIColumn\">              \n                  {schoolDetails && schoolDetails.logoUrl ?\n                    <div \n                      className=\"ProfileSchooLogo\"\n                      style={{\n                        backgroundImage: `url(${schoolDetails.logoUrl})`,\n                        backgroundSize: \"contain\",\n                        backgroundPosition: \"center center\",\n                        backgroundRepeat: \"no-repeat\"\n                      }}\n                    />\n                  :\n                    <div className=\"ProfileImageContainer\">\n                      <img src={placeholderMSAddImage} alt=\"Profile\" />\n                    </div>                  \n                  }\n                  {schoolDetails && !schoolDetails.logoUrl && \n                    <button\n                      className={`Btn BtnLightOrange UploadSchoolLogo`}\n                      onClick={() => {\n                        setUpdateIsOpen(true);\n                      }}\n                      disabled={schoolDetails ? false : true}\n                    >\n                      Upload school logo\n                    </button>\n                  }                 \n                </div>\n                <div className=\"ProfileInfo\">\n                  <div className=\"AddressLine1\">\n                    {schoolDetails?.addressLine1 ?? ''}\n                  </div>\n                  <div className=\"AddressLine2\">\n                    {`${schoolDetails?.addressLine2 ?? ''}\n                    ${\n                      schoolDetails?.addressLine2 && schoolDetails?.addressLine3\n                        ? ', '\n                        : ''\n                    }\n                    ${schoolDetails?.addressLine3 ?? ''}\n                    ${\n                      schoolDetails?.addressLine3 &&\n                      schoolDetails?.postcodeZipcode\n                        ? ', '\n                        : ''\n                    }\n                    ${schoolDetails?.postcodeZipcode ?? ''}\n                    ${\n                      schoolDetails?.postcodeZipcode && schoolDetails?.country\n                        ? ', '\n                        : ''\n                    }\n                      ${schoolDetails?.country ?? ''}`}\n                  </div>\n                </div>\n              </div>\n              <button\n                className={`Btn BtnLightOrange UpdateButton`}\n                onClick={() => {\n                  setUpdateIsOpen(true);\n                }}\n                disabled={schoolDetails ? false : true}\n              >\n                Update school\n              </button>\n            </div>\n            <div className=\"ManageSchoolSection Top ManageSchool LastBlock\">\n              <div className=\"FlexLeft\">\n                <div className=\"ProfileImageContainer\">\n                  <img src={placeholderMSArchiveDateImage} alt=\"Profile\" />\n                </div>\n                <div className=\"ProfileInfo\">\n                  <div className=\"ArchiveDateLine\">\n                    <div className=\"ArchiveDateLine1\">\n                      Your data will archive on:\n                    </div>\n                    <Tooltip text=\"Archiving will move your assessment tables, pupil profile pages and your current curriculum map into your archive. Once archived, you can move and organise your classes for the next academic year. NB: do not move your classes before archiving to ensure no changes are made to your assessments.\" />\n                  </div>\n\n                  <div className=\"ArchiveDateLine2\">\n                    {schoolDetails?.yearlyArchivingDate ?? ''}\n                  </div>\n                </div>\n              </div>\n              <button\n                className={`Btn BtnLightOrange UpdateButton`}\n                onClick={() => {\n                  setDateIsOpen(true);\n                }}\n                disabled={schoolDetails ? false : true}\n              >\n                Or archive now\n              </button>\n            </div>\n\n            <WondeLink\n              setWondeIntegration={setWondeIntegration}\n              selectedSyncType={selectedSyncType}\n              setSelectedSyncType={setSelectedSyncType}\n              wondeIntegration={wondeIntegration} \n              setWondeSchoolId={setWondeSchoolId}\n              setSyncResponse={setSyncResponse}\n            />\n          </div>\n\n          {/* update school form */}\n          {updateIsOpen && (\n            <UpdateSchool\n              panelOpen={updateIsOpen}\n              togglePanelOpen={setUpdateIsOpen}\n              schoolDetails={schoolDetails}\n              setSchoolDetails={setSchoolDetails}\n            />\n          )}\n\n          {/* update archiving date form */}\n          {dateIsOpen && (\n            <UpdateArchive\n              panelOpen={dateIsOpen}\n              togglePanelOpen={setDateIsOpen}\n              setSchoolDetails={setSchoolDetails}\n            />\n          )}\n        </div>\n      }\n    </Page>\n  );\n};\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgCAMAAAC8EZcfAAAARVBMVEVHcExldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhRl+jHAAAAFnRSTlMAxxT6LtpG8VJ+liCwA7mJZKTmCXI5/cGUoQAAAghJREFUeNrt2Fm24jAMBNCyHY+ZB7T/pfZH4HWal4YABzsfdVdQybEkywAREREREREREREREREREREREVFp2sXGGvEq1qfLVofYTfLDjJfTRGur0HdeflGhPUG2IamdbFd2mMtlmy9DUkae8L0uUgrLaOUgk6rsZSov6lyecJd/yvQldshRL17eZmSK3z+MzsonfPp6856j/yiiNF9v3vX4WcIMzfuiPoxow7eHxzB9lnD6/gzpzduF0kWXo+HUzVvx+owz5bWW47veeZGAjNrlYMux41C1a5vPGhDQ6dlRNKoPGkCLIgGBqntQq81yme8GZfaAQNg9iiqFzVSrqjIB67A3/XwX3d8fN7vYeYllAlaiqnX6mU05bD8gXYdOsYAiSQNAvYxd0zu92QaWZjNuCgYUv9zPBR36+02lZEAR67Yr3u6qUjagiAoa0G53NT5FQBExD6dKBIBgRPpiAR+LACojkvkXvhawX/fP8wZM63E9b0AnIiJL1lF3OOACQIuISN4XucNX1grAsF6p895kDuYbAWDdEWzeu1Y8tgnPANpro8z8FjccuPWneVtRua+sTx8alLvu0re9Lv/Tefr/XzTNz0Ui3R5nSjxTu7RXz9M4bA7c7b3EogztltQo670YP9lujKHeb0ke59S6ZhIxUxNAREREREREREREREREREREREREp/cHSnySRlDUVM4AAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgCAMAAAC8EZcfAAAALVBMVEVHcExldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhldHhZTHsJAAAADnRSTlMA0IBRsPDgwXAvPw4dlMkuo2AAAAFrSURBVHja7drLcoMgGEBh7kRF3v9xa2KFptWOLMpvk/PtGFycYTSMEqUAAAAAAAAAAAAAAEB/NuRgD+am2WeXhPvy3bg/6e5zYRINjI9AtzuXHnPZigaGR4PenRvXQEPgPw1MN1MCffzBlkB9E3mQzbpua+AOUwKXfoFFdLkh8Ogx/0NzbgvMc9++IbcG5qH/Amb/W+D8LXAW+HHJVqnDQD89B4augVuEPQ7MMT0FZonAJfE4MOfg5QMbEEgggVcL9OY0LxKoz1+upQJtMSplb4VSYx0kwcC6U+jt/e7zdjN1YAkkkEACXzcw6o1TyrhCKVsHg2Dg5be6oVoGdeO7TKD/+lLp6m03EUgggQS+SWDwm2Uwl31PXybw8lsdga8d2PDROXQPDE0HC0P/j+jrSfV47uIx9D9rsu1f3zofa8fWvti3T6XQ1he6n8impjWMEifG1vlzdd7J/q0CAAAAAAAAAAAAAAAAAj4AK1tcouhXXUsAAAAASUVORK5CYII=\"","import instance from '../api';\n\nexport async function downloadFile(url: string, displayName: string) {\n  try {\n    const { data } = await instance.get(url, {\n      responseType: 'blob',\n      headers: {\n        'Cache-Control': 'max-age=0',\n      },\n    });\n\n    let fileExtention;\n    if (data.type === 'application/pdf') fileExtention = '.pdf';\n    if (\n      data.type ===\n      'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n    )\n      fileExtention = '.docx';\n    if (data.type === 'application/msword') fileExtention = '.doc';\n\n    const downloadUrl = window.URL.createObjectURL(new Blob([data]));\n    const link = document.createElement('a');\n    link.href = downloadUrl;\n    link.setAttribute('download', `${displayName}${fileExtention}`);\n    document.body.appendChild(link);\n\n    link.click();\n    setTimeout(function () {\n      link.remove();\n      window.URL.revokeObjectURL(downloadUrl);\n    }, 100);\n  } catch (err) {\n    throw err;\n  }\n}\n","const UNKNOWN_ERROR_MESSAGE = 'Sorry, something went wrong. Please try again.';\nexport class InvoicesParser {\n  public static parseError = (errors: any) => {\n    let error: string;\n    switch (errors[0].messageCode) {\n      default:\n        error = UNKNOWN_ERROR_MESSAGE;\n    }\n    return error;\n  };\n}\n","import instance from 'api';\nimport { AxiosError, AxiosResponse } from 'axios';\nimport { ApiResponse, BaseApi } from 'baseApi';\nimport { endpoints } from 'endpoints.config';\nimport { InvoicesParser } from 'pages/invoices/models';\n\nconst UNKNOWN_ERROR_MESSAGE = 'Sorry, something went wrong. Please try again.';\n\nexport class InvoicesApi extends BaseApi {\n  public static getViewInvoiceUrl = async (id: number): Promise<any> => {\n    try {\n      const result: AxiosResponse<ApiResponse<any>> = await instance.get(\n        endpoints.invoices.viewInvoice + '?subscriptionHistoriesID=' + id\n      );\n\n      if (InvoicesApi.isResponseSuccessful(result.data)) {\n        const data = result.data.details.url;\n        return InvoicesApi.successResponse(data);\n      } else {\n        const errors = result.data.errors;\n        if (errors) {\n          const message = InvoicesParser.parseError(errors);\n          return InvoicesApi.errorResponse(message);\n        } else {\n          throw new Error(); // Caught below to trigger unknown error\n        }\n      }\n    } catch (error: AxiosError | any) {\n      if (error.response) {\n        const errors = error.response.data.errors;\n        if (errors) {\n          const message = InvoicesParser.parseError(errors);\n          return InvoicesApi.errorResponse(message);\n        }\n      }\n      return InvoicesApi.errorResponse(UNKNOWN_ERROR_MESSAGE);\n    }\n  };\n}\n","import { InvoicesApi } from 'api/invoicesApi';\n\nexport const openFile = async (id: number) => {\n  const result = await InvoicesApi.getViewInvoiceUrl(id);\n  if (result.data) {\n    const url = result.data;\n    window.open(url, '_blank');\n  }\n  if (result.error) {\n    //TODO: handle error\n  }\n};\n","import React from 'react';\nimport { endpoints } from 'endpoints.config';\nimport { downloadFile } from 'helpers/downloadFile';\nimport { openFile } from 'helpers/openFile';\n\ntype Props = {\n  openCloseState?: string;\n  checkboxList?: Array<number>;\n  name?: string;\n};\n\nexport const InvoicesMenuOptions: React.FC<Props> = ({\n  openCloseState,\n  checkboxList,\n  name,\n}) => {\n  const downloadInvoice = () => {\n    if (!checkboxList) return;\n    downloadFile(\n      endpoints.invoices.downloadInvoice +\n        '?subscriptionHistoriesID=' +\n        checkboxList[0],\n      name ?? 'invoice' + checkboxList[0]\n    );\n  };\n\n  return (\n    <React.Fragment>\n      <div className={`RightMenu ${openCloseState}`}>\n        {checkboxList && checkboxList.length > 0 && (\n          <div className=\"ItemsContainer\">\n            <div className=\"Item\" onClick={() => openFile(checkboxList[0])}>\n              <span>View Invoice</span>\n            </div>\n            <div className=\"Item\" onClick={downloadInvoice}>\n              <span>Download Invoice</span>\n            </div>\n          </div>\n        )}\n      </div>\n    </React.Fragment>\n  );\n};\n","import React from 'react';\nimport { endpoints } from 'endpoints.config';\nimport { downloadFile } from 'helpers/downloadFile';\nimport { openFile } from 'helpers/openFile';\n\ntype Props = {\n  closeMenu?: () => void;\n  rowId?: number;\n  openCloseState: { open: boolean; id: number | null };\n  name: string;\n};\n\nexport const InvoiceDropdownOptions: React.FC<Props> = ({\n  closeMenu,\n  rowId,\n  openCloseState,\n  name,\n}) => {\n  const downloadInvoice = () => {\n    if (!rowId) return;\n    downloadFile(\n      endpoints.invoices.downloadInvoice + '?subscriptionHistoriesID=' + rowId,\n      name,\n    );\n  };\n  return (\n    <React.Fragment>\n      {openCloseState.open && openCloseState.id === rowId && (\n        <div className=\"RowOptionsMenuContainer\">\n          {rowId && closeMenu && (\n            <div className=\"ItemsContainer\">\n              {/* View Invoice */}\n              <div\n                className=\"Item\"\n                onClick={() => {\n                  closeMenu();\n                  openFile(rowId);\n                }}\n              >\n                <span>View Invoice</span>\n              </div>\n              {/* Download Invoice */}\n              <div\n                className=\"Item\"\n                onClick={() => {\n                  closeMenu();\n                  downloadInvoice();\n                }}\n              >\n                <span>Download Invoice</span>\n              </div>\n            </div>\n          )}\n        </div>\n      )}\n    </React.Fragment>\n  );\n};\n","import { RouteComponentProps } from '@reach/router';\nimport Page from 'components/shared/Page';\nimport React, { useState } from 'react';\nimport { endpoints } from '../../endpoints.config';\nimport { InfoTable } from 'components/infoTable/infoTable';\nimport { InvoicesMenuOptions } from './InvoicesMenuOptions';\nimport { InvoiceDropdownOptions } from './InvoiceDropdownOptions';\n\nconst dropdrownMenuOptions = (\n  id: number,\n  name: string,\n  closeMenu: () => void,\n  openCloseState: { open: boolean; id: number | null }\n) => (\n  <InvoiceDropdownOptions\n    rowId={id}\n    closeMenu={closeMenu}\n    openCloseState={openCloseState}\n    name={name}\n  />\n);\n\nexport const Invoices: React.FC<RouteComponentProps> = () => {\n  const [isPanelClosed, setIsPanelClosed] = useState<boolean>(true);\n  return (\n    <Page>\n      <div className=\"PageContent InvoicesPage WidthContent\">\n        <InfoTable\n          title=\"Invoices\"\n          listUrl={endpoints.invoices.list}\n          dropdrownMenuOptions={dropdrownMenuOptions}\n          firstColWidth={215}\n          firstColWidthSm={110}\n          updateListStatus={true}\n          setIsPanelClosed={setIsPanelClosed}\n          isPanelClosed={isPanelClosed}\n          allowSelectAll={false}\n          filterTable={false}\n        >\n          <InvoicesMenuOptions />\n        </InfoTable>\n      </div>\n    </Page>\n  );\n};\n","export function deepGet(obj: any, path: string) {\n    const segments = [path]\n    let i = 0;\n    let val = obj;\n    for (; i < segments.length; i++) {\n      if (val === undefined) {\n        return val;\n      }\n      val = val[segments[i]];\n    }\n    return val;\n  }","import { Link } from '@reach/router';\nimport { useFormikContext } from 'formik';\nimport React from 'react';\nimport { deepGet } from 'utils/form';\nimport { ErrorM } from './ErrorM';\n\ninterface FormCheckboxFieldProps {\n  field: string;\n  label?: string;\n  labelLinkText?: string;\n  labelLinkHref?: string;\n  onlyOneOptionSelected?: () => void;\n}\n\nconst FormCheckboxField = function <T>({\n  field,\n  label,\n  labelLinkText,\n  labelLinkHref,\n  onlyOneOptionSelected,\n}: FormCheckboxFieldProps) {\n  const formikContext = useFormikContext<T>();\n  return (\n    <div className=\"FormBox\">\n      <div className=\"Checkbox\">\n        <input\n          name={field}\n          type=\"checkbox\"\n          id={field}\n          checked={deepGet(formikContext.values, field)}\n          onChange={(e) => {\n            formikContext.setFieldValue(\n              field as any,\n              !deepGet(formikContext.values, field)\n            );\n            onlyOneOptionSelected && onlyOneOptionSelected();\n          }}\n        />\n        {label && (\n          <label className=\"CustomInput\" htmlFor={field}>\n            {labelLinkText && labelLinkHref ? (\n              <Link to={labelLinkHref}>{label}</Link>\n            ) : (\n              label\n            )}\n          </label>\n        )}\n        <ErrorM name={field} />\n      </div>\n    </div>\n  );\n};\n\nexport { FormCheckboxField };\n","import React, { useState } from 'react';\nimport { Formik, Form } from 'formik';\nimport * as Yup from 'yup';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport { FormCheckboxField } from 'components/formComponents/FormCheckBoxField';\nimport { Link, useNavigate } from '@reach/router';\nimport { AppPath } from 'appConstants';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n  signIn,\n  SignInAttempt,\n  selectAuthMessage,\n  selectAuthStatus,\n  autoSignIn,\n} from 'reducers/auth';\nimport { Spinner } from 'components/spinner/Spinner';\n\nconst SignInForm = () => {\n  const dispatch = useDispatch();\n  const navigate = useNavigate();\n  const message = useSelector(selectAuthMessage);\n  const authStatus = useSelector(selectAuthStatus);\n\n  const [submitError, setSubmitError] = useState('');\n  const initialValues: SignInAttempt = {\n    emailAddress: '',\n    password: '',\n    rememberMe: false,\n  };\n  const validationSchema = Yup.object({\n    emailAddress: Yup.string()\n      .required('An email address is required')\n      .email('Must be a valid email address'),\n    password: Yup.string().required('You must provide a password'),\n    rememberMe: Yup.boolean(),\n  });\n\n  const getURLToken = new URLSearchParams(window.location.search).get('token');\n  const authQuery = new URLSearchParams(window.location.search).get('auth');\n\n  if (authQuery === 'sign-out') navigate(AppPath.SIGN_IN);\n\n  const handleSubmitForm = (\n    payload: SignInAttempt,\n    setSubmitting: any,\n    resetForm: any\n  ) => {\n    setSubmitError('');\n    dispatch(signIn(payload));\n  };\n\n  if (getURLToken) {\n    dispatch(autoSignIn({ token: encodeURIComponent(getURLToken) }));\n\n    if (message) {\n      navigate(AppPath.SIGN_IN);\n    }\n    return (\n      <div className=\"PageSpinner\">\n        <Spinner />\n      </div>\n    );\n  }\n  return (\n    <div className=\"Form\">\n      <Formik\n        initialValues={initialValues}\n        onSubmit={(values: any, { setSubmitting, resetForm }: any) => {\n          handleSubmitForm(values, setSubmitting, resetForm);\n        }}\n        validationSchema={validationSchema}\n      >\n        {({ isSubmitting }) => (\n          <Form>\n            <h1>Sign in</h1>\n            <p className=\"SubTitle\">Enter your details below</p>\n            {message && <p className=\"SignInErrorMessage\">{message}</p>}\n            <div className=\"UserCredentialsSection\">\n              <FormTextField\n                field={'emailAddress'}\n                label={'Email address'}\n                required={true}\n              />\n              <FormTextField\n                field={'password'}\n                label={'Password'}\n                type={'password'}\n                required={true}\n              />\n            </div>\n            <div className=\"RememberMeSection\">\n              <FormCheckboxField field={'rememberMe'} label={'Remember me'} />\n              <Link to={AppPath.FORGOTTEN_PASSWORD}>\n                <p>Forgotten password?</p>\n              </Link>\n            </div>\n            {submitError && <div className=\"GeneralError\">{submitError}</div>}\n            <button\n              className=\"Btn BtnOrange\"\n              type=\"submit\"\n              disabled={authStatus === 'pending'}\n            >\n              {authStatus === 'pending' ? (\n                <Spinner color=\"#ffffff\" />\n              ) : (\n                'Sign In'\n              )}\n            </button>\n            <div className=\"Redirect\">\n              No account?{' '}\n              <Link to={AppPath.SUBSCRIBE}>\n                <p>Subscribe</p>\n              </Link>\n            </div>\n          </Form>\n        )}\n      </Formik>\n    </div>\n  );\n};\n\nexport default SignInForm;\n","// When setting a default route component sometimes you will land on it without\n// the path matching the one desired for that page. Use this hook to redirect to\n// the desired route. It should only be used inside of whichever component is intended\n// to be the default fallback.\n\nimport { useLocation, useNavigate } from '@reach/router';\n\n// to be the default component in reach-router.\nexport const useDefaultRoute = (path: string) => {\n  const { pathname } = useLocation();\n  const navigate = useNavigate();\n\n  if (pathname !== path) {\n    navigate(path);\n  }\n};\n","import { RouteComponentProps } from '@reach/router';\nimport { AppPath } from 'appConstants';\nimport SignInForm from 'components/signInForm/SignInForm';\nimport { useDefaultRoute } from 'hooks/useDefaultRoute';\nimport React from 'react';\nimport Page from '../components/shared/Page';\n\nexport const SignIn: React.FC<RouteComponentProps> = () => {\n  useDefaultRoute(AppPath.SIGN_IN);\n\n  const getURLArea = new URLSearchParams(window.location.search).get('area');\n\n  return (\n    <Page isPublic redirectPath={getURLArea ? getURLArea : ''}>\n      <div className=\"SignInPage\">\n        <div className=\"Content HeightContent\">\n          <SignInForm />\n        </div>\n      </div>\n    </Page>\n  );\n};\n","import React, { useState } from 'react';\nimport { navigate, RouteComponentProps } from '@reach/router';\nimport { Formik, Form } from 'formik';\nimport * as Yup from 'yup';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport { PostForgottenPassword } from './forgottenPasswordApi';\nimport { ForgottenPasswordPost } from './models';\nimport { Spinner } from 'components/spinner/Spinner';\nimport ConfirmationBox from 'components/confirmationBox/ConfirmationBox';\nimport { AppPath } from 'appConstants';\n\nconst SUCCESS_MESSAGE = {\n  title: 'Congratulations',\n  message: 'Your new password will be sent to your email address.',\n  buttonText: 'Retry sign in',\n};\n\nconst ForgottenPasswordForm: React.FC<RouteComponentProps> = () => {\n  const [submitError, setSubmitError] = useState('');\n  const [formIsPosted, setFormIsPosted] = useState(false);\n\n  const initialValues: ForgottenPasswordPost = {\n    emailAddress: '',\n  };\n\n  const handleSubmitForm = async (values: ForgottenPasswordPost) => {\n    setSubmitError('');\n\n    PostForgottenPassword(values).then((response) => {\n      if (!response.errors) {\n        setFormIsPosted(true);\n        setSubmitError('');\n      } else {\n        setFormIsPosted(false);\n        setSubmitError('Request failed, please try again');\n      }\n    });\n  };\n\n  const validationSchema = Yup.object({\n    emailAddress: Yup.string()\n      .required('An email address is required')\n      .email('Must be a valid email address'),\n  });\n\n  return (\n    <div className=\"Form\">\n      {!formIsPosted ? (\n        <Formik\n          initialValues={initialValues}\n          onSubmit={handleSubmitForm}\n          validationSchema={validationSchema}\n        >\n          {({ isSubmitting }) => (\n            <Form>\n              <h1>Forgotten Password</h1>\n              <p className=\"SubTitle\">Enter your e-mail below</p>\n              <div className=\"UserCredentialsSection\">\n                <FormTextField\n                  field={'emailAddress'}\n                  label={'Email address'}\n                  required={true}\n                />\n              </div>\n              {submitError && <div className=\"GeneralError\">{submitError}</div>}\n              <button\n                className=\"Btn BtnOrange\"\n                type=\"submit\"\n                disabled={isSubmitting}\n              >\n                {isSubmitting ? (\n                  <Spinner color={'#ffffff'} />\n                ) : (\n                  'Request E-mail'\n                )}\n              </button>\n            </Form>\n          )}\n        </Formik>\n      ) : (\n        <div className=\"Success\">\n          <div className=\"ConfirmationBoxContainer\">\n            <ConfirmationBox\n              {...SUCCESS_MESSAGE}\n              buttonOnClick={() => navigate(AppPath.SIGN_IN)}\n            />\n          </div>\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default ForgottenPasswordForm;\n","import { endpoints } from 'endpoints.config';\nimport { ForgottenPasswordPost } from './models';\nimport instance from 'api';\n\nexport type ApiReturn<T = any> = {\n  response: T | null;\n  errors: Error[] | null;\n};\n\nexport const PostForgottenPassword = async (\n  payload: ForgottenPasswordPost\n): Promise<ApiReturn> => {\n  try {\n    const res = await instance.post(\n      endpoints.forgottenPassword.requestPasswordReset,\n      payload\n    );\n    if (res.data.status === '1') {\n      return {\n        response: res.data.details,\n        errors: null,\n      };\n    } else {\n      return {\n        response: res.data.details,\n        errors: res.data.errors,\n      };\n    }\n  } catch (err: any) {\n    return {\n      response: null,\n      errors: err,\n    };\n  }\n};\n","import { RouteComponentProps } from '@reach/router';\nimport ForgottenPasswordForm from 'components/forgottenPasswordForm/ForgottenPasswordForm';\nimport React from 'react';\nimport Page from '../components/shared/Page';\n\nexport const ForgottenPassword: React.FC<RouteComponentProps> = () => {\n  return (\n    <Page isPublic>\n      <div className=\"ForgottenPasswordPage\">\n        <div className=\"Content HeightContent\">\n          <ForgottenPasswordForm />\n        </div>\n      </div>\n    </Page>\n  );\n};\n","import React, { useState } from 'react';\nimport { navigate, RouteComponentProps } from '@reach/router';\nimport { Formik, Form } from 'formik';\nimport * as Yup from 'yup';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport { PostResetPassword } from './resetPasswordApi';\nimport { ResetPasswordPost } from './models';\nimport {\n  AppPath,\n  PASSWORD_MATCH_POLICY_ERROR_MESSAGE,\n  PASSWORD_REGEX,\n} from 'appConstants';\nimport { Spinner } from 'components/spinner/Spinner';\nimport ConfirmationBox from 'components/confirmationBox/ConfirmationBox';\n\nconst SUCCESS_MESSAGE = {\n  title: 'Congratulations',\n  message: 'Your password has been reset.',\n  buttonText: 'Sign in',\n};\n\nconst ForgottenPasswordForm: React.FC<RouteComponentProps> = () => {\n  const [submitError, setSubmitError] = useState('');\n  const [formIsPosted, setFormIsPosted] = useState(false);\n\n  const initialValues: ResetPasswordPost = {\n    passwordResetToken: '',\n    newPassword: '',\n    confirmNewPassword: '',\n  };\n\n  const handleSubmitForm = async (values: ResetPasswordPost) => {\n    setSubmitError('');\n\n    const getURLToken = new URLSearchParams(window.location.search).get(\n      'token'\n    );\n    const tokenVal = getURLToken === null ? '' : getURLToken;\n\n    values.passwordResetToken = encodeURIComponent(tokenVal);\n\n    PostResetPassword(values).then((response) => {\n      if (!response.errors) {\n        setFormIsPosted(true);\n        setSubmitError('');\n      } else {\n        setFormIsPosted(false);\n        setSubmitError('Reset failed, please try again');\n      }\n    });\n  };\n\n  const validationSchema = Yup.object({\n    newPassword: Yup.string()\n      .required('You must provide a password')\n      .min(8, PASSWORD_MATCH_POLICY_ERROR_MESSAGE)\n      .max(20, PASSWORD_MATCH_POLICY_ERROR_MESSAGE)\n      .matches(PASSWORD_REGEX, PASSWORD_MATCH_POLICY_ERROR_MESSAGE),\n    confirmNewPassword: Yup.string()\n      .required('You must confirm your new password')\n      .oneOf([Yup.ref('newPassword'), null], 'Passwords must match'),\n  });\n\n  return (\n    <div className=\"Form\">\n      {!formIsPosted ? (\n        <Formik\n          initialValues={initialValues}\n          onSubmit={handleSubmitForm}\n          validationSchema={validationSchema}\n        >\n          {({ isSubmitting }) => (\n            <Form>\n              <h1>Reset Password</h1>\n              <p className=\"SubTitle\">Enter your new password below</p>\n              <div className=\"UserCredentialsSection\">\n                <FormTextField\n                  field={'newPassword'}\n                  label={'Password'}\n                  type={'password'}\n                  required={true}\n                />\n                <FormTextField\n                  field={'confirmNewPassword'}\n                  label={'Confirm Password'}\n                  type={'password'}\n                  required={true}\n                />\n              </div>\n              {submitError && <div className=\"GeneralError\">{submitError}</div>}\n              <button\n                className=\"Btn BtnOrange\"\n                type=\"submit\"\n                disabled={isSubmitting}\n              >\n                {isSubmitting ? (\n                  <Spinner color={'#ffffff'} />\n                ) : (\n                  'Request Password'\n                )}\n              </button>\n            </Form>\n          )}\n        </Formik>\n      ) : (\n        <div className=\"Success\">\n          <div className=\"ConfirmationBoxContainer\">\n            <ConfirmationBox\n              {...SUCCESS_MESSAGE}\n              buttonOnClick={() => navigate(AppPath.SIGN_IN)}\n            />\n          </div>\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default ForgottenPasswordForm;\n","import { endpoints } from 'endpoints.config';\nimport axios from 'api';\n\nimport { ResetPasswordPost } from './models';\n\nexport type ApiReturn<T = any> = {\n  response: T | null;\n  errors: Error[] | null;\n};\n\nexport const PostResetPassword = async (\n  payload: ResetPasswordPost\n): Promise<ApiReturn> => {\n  try {\n    const res = await axios.post(\n      endpoints.forgottenPassword.resetPassword,\n      payload\n    );\n    if (res.data.status === '1') {\n      return {\n        response: res.data.details,\n        errors: null,\n      };\n    } else {\n      return {\n        response: res.data.details,\n        errors: res.data.errors,\n      };\n    }\n  } catch (err: any) {\n    return {\n      response: null,\n      errors: err,\n    };\n  }\n};\n","import { RouteComponentProps } from '@reach/router';\nimport ResetPasswordForm from 'components/resetPasswordForm/ResetPasswordForm';\nimport React from 'react';\nimport Page from '../components/shared/Page';\n\nexport const ResetPassword: React.FC<RouteComponentProps> = () => {\n  return (\n    <Page isPublic autoLogin={false}>\n      <div className=\"ResetPasswordPage\">\n        <div className=\"Content HeightContent\">\n          <ResetPasswordForm />\n        </div>\n      </div>\n    </Page>\n  );\n};\n","import React, { useState } from 'react';\nimport { Link, useLocation } from '@reach/router';\nimport * as Yup from 'yup';\nimport { Form, Formik, FormikHelpers } from 'formik';\nimport { SubscribeApi } from 'api/subscribeApi';\nimport { SubscribeParser } from 'pages/subscribe/models';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport FormGeneralError from 'components/formComponents/FormGeneralError';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n  selectSelectedPackages,\n  selectShoolDetails,\n  setRegistrationToken,\n} from 'reducers/misc';\nimport {\n  AppPath,\n  PASSWORD_MATCH_POLICY_ERROR_MESSAGE,\n  PASSWORD_REGEX,\n  PUBLIC_SITE_URL,\n} from 'appConstants';\nimport { FreeTrialSubscriptionApi } from 'api/freeTrialSubscriptionApi';\nimport { ErrorM } from 'components/formComponents/ErrorM';\n\ntype ProfileDetailsFormProps = {\n  onSubmit: () => void;\n};\n\nconst ProfileDetailsForm: React.FC<ProfileDetailsFormProps> = ({\n  onSubmit,\n}) => {\n  const dispatch = useDispatch();\n  const schoolDetails = useSelector(selectShoolDetails);\n  const selectedPackages = useSelector(selectSelectedPackages);\n\n  const location = useLocation();\n  const pathName = location.pathname;\n\n  const [freeTrialPage, setFreeTrialPage] = useState<boolean>(window.location.pathname === \"/free-trial\");\n  const [error, setError] = useState<string>('');\n\n  const validationSchema = !freeTrialPage ? \n    Yup.object({\n      firstName: Yup.string().required('Please enter your first name'),\n      lastName: Yup.string().required('Please enter your last name'),\n      emailAddress: Yup.string()\n        .required('Please enter your email')\n        .email('Please enter a valid email'),\n      password: Yup.string()\n        .required('Password is required')\n        .min(8, PASSWORD_MATCH_POLICY_ERROR_MESSAGE)\n        .max(20, PASSWORD_MATCH_POLICY_ERROR_MESSAGE)\n        .matches(PASSWORD_REGEX, PASSWORD_MATCH_POLICY_ERROR_MESSAGE),\n      confirmPassword: Yup.string().test(\n        'equal',\n        `Passwords don't match`,\n        function (v) {\n          return v === this.resolve(Yup.ref('password'));\n        }\n      ),\n      schoolOfficeFirstName: Yup.string().required('Please enter your school office first name'),\n      schoolOfficeLastName: Yup.string().required('Please enter your school office last name'),\n      schoolOfficeEmailAddress: Yup.string()\n        .required('Please enter your school office email')\n        .email('Please enter a valid school office email')\n        .test(\n          'equal',\n          `School office email cannot be the same as your regular email`,\n          function (v) {\n            return v !== this.resolve(Yup.ref('emailAddress'));\n          }\n        ),    \n      bAcceptedTermsAndConditions: Yup.bool().oneOf([true], 'You need to accept the terms and conditions'),     \n    })\n  :\n    Yup.object({\n      firstName: Yup.string().required('Please enter your first name'),\n      lastName: Yup.string().required('Please enter your last name'),\n      emailAddress: Yup.string()\n        .required('Please enter your email')\n        .email('Please enter a valid email'),\n      password: Yup.string()\n        .required('Password is required')\n        .min(8, PASSWORD_MATCH_POLICY_ERROR_MESSAGE)\n        .max(20, PASSWORD_MATCH_POLICY_ERROR_MESSAGE)\n        .matches(PASSWORD_REGEX, PASSWORD_MATCH_POLICY_ERROR_MESSAGE),\n      confirmPassword: Yup.string().test(\n        'equal',\n        `Passwords don't match`,\n        function (v) {\n          return v === this.resolve(Yup.ref('password'));\n        }\n      ),\n      bAcceptedTermsAndConditions: Yup.bool().oneOf([true], 'You need to accept the terms and conditions'),     \n    })\n  ;\n\n  const handleSubmitForm = async (\n    values: any,\n    { setSubmitting }: FormikHelpers<any>\n  ) => {\n    if (!schoolDetails) {\n      setError('Sorry, something went wrong. Please try again.');\n      setSubmitting(false);\n      return;\n    }\n\n    const result = !freeTrialPage ? await SubscribeApi.createSchoolUser(values, schoolDetails) : await SubscribeApi.createSchoolUserFreeTrial(values, schoolDetails);\n    \n    if (result.data) {\n      const registrationToken = result.data.registartionToken;\n      if (pathName === AppPath.SUBSCRIBE_FREE_TRIAL) {\n        const result1 = await FreeTrialSubscriptionApi.submitFreeTrialPackages(\n          selectedPackages,\n          registrationToken\n        );\n\n        if (result1.error) {\n          setError(result.error.message);\n          return;\n        }\n        onSubmit();\n      }\n      if (pathName === AppPath.SUBSCRIBE) {\n        dispatch(setRegistrationToken(registrationToken));\n        onSubmit();\n      }\n    }\n    if (result.error) {\n      setError(result.error.message);\n    }\n    setSubmitting(false);\n  };\n\n  return (\n    <div className=\"Form\">\n      <FormGeneralError message={error} />\n      <Formik\n        initialValues={!freeTrialPage ? SubscribeParser.createEmptySchoolUser() : SubscribeParser.createEmptySchoolUserFreeTrial()}\n        onSubmit={(values, formikHelpers) =>\n          handleSubmitForm(values, formikHelpers)\n        }\n        validationSchema={validationSchema}\n      >\n        {({ \n          setFieldValue,\n          values,\n          isSubmitting \n        }) => {\n          return (\n            <Form>\n              <h4>Lead contact</h4>\n              <div className=\"SideBySide\">\n                <FormTextField\n                  field={'firstName'}\n                  label={'First name'}\n                  required={true}\n                />\n                <FormTextField\n                  field={'lastName'}\n                  label={'Last name'}\n                  required={true}\n                />\n              </div>\n              <FormTextField\n                field={'emailAddress'}\n                label={'Email address'}\n                required={true}\n              />\n              <FormTextField\n                field={'password'}\n                label={'Password'}\n                required={true}\n                type={'password'}\n              />\n              <FormTextField\n                field={'confirmPassword'}\n                label={'Confirm Password'}\n                required={true}\n                type={'password'}\n              />\n              {!freeTrialPage &&\n                <>\n                  <br />\n                  <h4>Second contact</h4>\n                  <FormTextField\n                    field={'schoolOfficeFirstName'}\n                    label={'First name'}\n                    required={true}\n                  />\n                  <FormTextField\n                    field={'schoolOfficeLastName'}\n                    label={'Last name'}\n                    required={true}\n                  />\n                  <FormTextField\n                    field={'schoolOfficeEmailAddress'}\n                    label={'Email address'}\n                    required={true}\n                  />\n                </>\n              }             \n              <div className=\"TandCBoxRow\">\n                <div className=\"CheckboxBlock\">\n                  <input \n                    id=\"bAcceptedTermsAndConditions\"\n                    name=\"bAcceptedTermsAndConditions\"\n                    type=\"checkbox\"\n                    checked={values.bAcceptedTermsAndConditions}\n                    onChange={() => {\n                      setFieldValue(\"bAcceptedTermsAndConditions\", !values.bAcceptedTermsAndConditions);\n                    }}\n                  />\n                  <label className=\"CustomInput\" htmlFor={\"bAcceptedTermsAndConditions\"}></label>\n                </div>\n                <div className=\"TxtBlock\">\n                  Accept <a href={`${PUBLIC_SITE_URL}/info/terms-and-conditions`} aria-label=\"Go to Terms and conditions page\" target=\"_blank\">Terms and Conditions</a> for your school\n                </div>\n              </div>\n              <ErrorM name={\"bAcceptedTermsAndConditions\"} />\n              <div style={{ marginBottom: \"20px\" }}></div>\n              <button\n                className=\"Btn BtnOrange\"\n                type=\"submit\"\n                disabled={isSubmitting}\n              >\n                Save and continue\n              </button>\n            </Form>\n          );\n        }}\n      </Formik>\n    </div>\n  );\n};\n\nexport default ProfileDetailsForm;\n","import { SubscriptionsApi } from 'api/subscriptionsApi';\nimport { ISchoolInfo } from 'pages/upgradeSubscription/models';\nimport { useState, useCallback, useEffect } from 'react';\n\nexport const useFetchSchoolInfo = () => {\n  const [schoolInfo, setSchoolInfo] = useState<ISchoolInfo | null>(null);\n  const [error, setError] = useState<string>('');\n\n  const getSchoolInfo = useCallback(async () => {\n    const result = await SubscriptionsApi.getSchoolInfo();\n\n    if (result.data) {\n      setSchoolInfo(result.data);\n    }\n\n    if (result.error) {\n      setError(result.error);\n    }\n  }, []);\n\n  useEffect(() => {\n    getSchoolInfo();\n  }, [getSchoolInfo]);\n\n  return { schoolInfo, error };\n};\n","export const onlyDigitsBracketsSpacesDashesPluses = /^[0-9\\+\\(\\)\\ \\-]+$/;\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useLocation } from '@reach/router';\nimport { Form, Formik, FormikHelpers } from 'formik';\nimport * as Yup from 'yup';\nimport { setSchoolDetails } from 'reducers/misc';\nimport { useFetchSchoolInfo } from 'hooks/useFetchSchoolInfo';\nimport { onlyDigitsBracketsSpacesDashesPluses } from 'utils/regex';\nimport { SubscribeApi } from 'api/subscribeApi';\nimport { ISchoolDetails, SubscribeParser } from 'pages/subscribe/models';\nimport FormGeneralError from 'components/formComponents/FormGeneralError';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport { AppPath } from 'appConstants';\nimport { Spinner } from 'components/spinner/Spinner';\nimport { SubscriptionsApi } from 'api/subscriptionsApi';\n\ntype SchoolDetailsFormProps = {\n  onSubmit: () => void;\n};\n\nconst SchoolDetailsForm: React.FC<SchoolDetailsFormProps> = ({ onSubmit }) => {\n  const dispatch = useDispatch();\n  const location = useLocation();\n\n  const pathname = location.pathname;\n\n  const { schoolInfo, error: schoolDetailsError } =\n    pathname === AppPath.UPGRADE_SUBSCRIPTION\n      ? // eslint-disable-next-line react-hooks/rules-of-hooks\n        useFetchSchoolInfo()\n      : { schoolInfo: null, error: null };\n\n  const [error, setError] = useState('');\n\n  const validationSchema = Yup.object({\n    schoolname: Yup.string().required('Please enter the school name'),\n    phoneNumber: Yup.string()\n      .required('Please enter the school phone number')\n      .matches(\n        onlyDigitsBracketsSpacesDashesPluses,\n        'Please enter a valid phone number'\n      ),\n    addressLine1: Yup.string().required('Please enter the school address'),\n    addressLine2: Yup.string(),\n    addressLine3: Yup.string(),\n    townCity: Yup.string().required('Please enter the school town/city'),\n    county: Yup.string(),\n    postcodeZipcode: Yup.string().required(\n      'Please enter the school postcode/zipcode'\n    ),\n    country: Yup.string().required('Please enter the school country'),\n  });\n\n  const handleSubmitForm = async (\n    values: ISchoolDetails,\n    { setSubmitting }: FormikHelpers<ISchoolDetails>\n  ) => {\n    const result =\n      pathname === AppPath.UPGRADE_SUBSCRIPTION\n        ? await SubscriptionsApi.updateSchoolInfo(values)\n        : await SubscribeApi.validateSchoolInfo(values);\n\n    if (result.error) {\n      setError(result.error.message);\n      setSubmitting(false);\n      return;\n    }\n    dispatch(setSchoolDetails(values));\n    onSubmit();\n    setSubmitting(false);\n  };\n\n  return (\n    <div className=\"Form\">\n      <FormGeneralError message={error} />\n      {(pathname === AppPath.UPGRADE_SUBSCRIPTION &&\n        (schoolInfo || schoolDetailsError)) ||\n      pathname !== AppPath.UPGRADE_SUBSCRIPTION ? (\n        <Formik\n          initialValues={SubscribeParser.createEmptySchoolDetails(schoolInfo)}\n          onSubmit={(values, formikHelpers) =>\n            handleSubmitForm(values, formikHelpers)\n          }\n          validationSchema={validationSchema}\n        >\n          {({ values, isSubmitting }) => (\n            <Form>\n              <FormTextField\n                field={'schoolname'}\n                label={'School name'}\n                required={true}\n                value={values.schoolname}\n              />\n              <FormTextField\n                field={'phoneNumber'}\n                label={'School phone number'}\n                required={true}\n                value={values.phoneNumber}\n              />\n              <h4>School Address</h4>\n              <FormTextField\n                field={'addressLine1'}\n                label={'Address line 1'}\n                required={true}\n                value={values.addressLine1}\n              />\n              <FormTextField\n                field={'addressLine2'}\n                label={'Address line 2'}\n                required={false}\n                optionalTag={'optional'}\n                value={values.addressLine2}\n              />\n              <FormTextField\n                field={'addressLine3'}\n                label={'Address line 3'}\n                required={false}\n                optionalTag={'optional'}\n                value={values.addressLine3}\n              />\n              <div className=\"SideBySide\">\n                <FormTextField\n                  field={'townCity'}\n                  label={'Town/City'}\n                  required={true}\n                  value={values.townCity}\n                />\n                <FormTextField\n                  field={'county'}\n                  label={'County'}\n                  required={false}\n                  optionalTag={'optional'}\n                  value={values.county}\n                />\n              </div>\n              <div className=\"SideBySide\">\n                <FormTextField\n                  field={'postcodeZipcode'}\n                  label={'Postcode / zipcode'}\n                  required={true}\n                  value={values.postcodeZipcode}\n                />\n                <FormTextField\n                  field={'country'}\n                  label={'Country'}\n                  required={true}\n                  value={values.country}\n                />\n              </div>\n              <button\n                className=\"Btn BtnOrange\"\n                type=\"submit\"\n                disabled={isSubmitting}\n              >\n                Save and continue\n              </button>\n            </Form>\n          )}\n        </Formik>\n      ) : (\n        <div\n          style={{\n            minHeight: ' calc(100vh - 300px)',\n            display: 'flex',\n            justifyContent: 'center',\n            alignItems: 'center',\n          }}\n        >\n          <Spinner />\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default SchoolDetailsForm;\n","import { RouteComponentProps, useNavigate } from '@reach/router';\nimport { AppPath, PUBLIC_SITE_URL } from 'appConstants';\nimport { ChoosePackageForm } from 'components/choosePackageForm/ChoosePackageForm';\nimport ConfirmationBox from 'components/confirmationBox/ConfirmationBox';\nimport FormHeader from 'components/formHeader/FormHeader';\nimport PaymentDetailsForm from 'components/paymentDetailsForm/PaymentDetailsForm';\nimport { PaymentTypeForm } from 'components/paymentTypeForm/PaymentTypeForm';\nimport ProfileDetailsForm from 'components/profileDetailsForm/ProfileDetailsForm';\nimport SchoolDetailsForm from 'components/schoolDetailsForm/SchoolDetailsForm';\nimport Page from 'components/shared/Page';\nimport React, { useEffect, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport {\n  clearPackageForm,\n  clearPoNumber,\n  clearSchoolDetails,\n  setRegistrationToken,\n  setValidPromoCode,\n} from 'reducers/misc';\nimport { SubscribeParser, SubscriptionStep } from './models';\n\nconst SUCCESS_MESSAGE = {\n  title: 'Congratulations',\n  message:\n    'Your school account has been created successfully. You will shortly receive an email to confirm that your account has been made live',\n  buttonText: 'Sign in',\n};\n\nconst INVOICE_SUCCESS_MESSAGE = {\n  title: 'Congratulations',\n  message:\n    'Your school account has been created successfully. You will shortly receive an email to confirm that your account has been made live',\n  buttonText: 'Sign in',\n};\n\nexport const Subscribe: React.FC<RouteComponentProps> = () => {\n  const navigate = useNavigate();\n  const dispatch = useDispatch();\n\n  const [subscriptionStep, setSubscriptionStep] = useState<SubscriptionStep>(\n    SubscriptionStep.CHOOSE_PACKAGE\n  );\n  const [subscriptionIsComplete, setSubscriptionIsComplete] = useState(false);\n\n  useEffect(() => {\n    return () => {\n      dispatch(clearSchoolDetails());\n      dispatch(setRegistrationToken(''));\n      dispatch(clearPackageForm());\n      dispatch(setValidPromoCode(''));\n      dispatch(clearPoNumber());\n    };\n  }, []);\n\n  return (\n    <Page isPublic className={'SubscribePage'}>\n      {subscriptionIsComplete ? (\n        <div className=\"Success\">\n          <div className=\"ConfirmationBoxContainer\">\n            <ConfirmationBox\n              {...SUCCESS_MESSAGE}\n              buttonOnClick={() => navigate(AppPath.SIGN_IN)}\n            />\n          </div>\n        </div>\n      ) : (\n        <div className=\"Content WidthContent HeightContent\">\n          <div className=\"SubscriptionPageHead\">\n            {subscriptionStep === 0 &&\n              <div className=\"WhatsIncludedBtn\">\n                <a\n                  aria-current=\"page\"\n                  className=\"Btn BtnOrange\"\n                  href={`${PUBLIC_SITE_URL}/pricing`}\n                >\n                  What's included?\n                </a>\n              </div>            \n            }\n            <FormHeader\n              activeStep={subscriptionStep < 5 ? subscriptionStep + 1 : 5}\n              numOfSteps={5}\n              title={SubscribeParser.getPageHeaderInfo(subscriptionStep).title}\n              nextStep={\n                SubscribeParser.getPageHeaderInfo(subscriptionStep).nextStep\n              }\n            />\n          </div>\n          {subscriptionStep === SubscriptionStep.CHOOSE_PACKAGE ? (\n            <ChoosePackageForm\n              onSubmit={() =>\n                setSubscriptionStep(SubscriptionStep.SCHOOL_DETAILS)\n              }\n            />\n          ) : subscriptionStep === SubscriptionStep.SCHOOL_DETAILS ? (\n            <SchoolDetailsForm\n              onSubmit={() =>\n                setSubscriptionStep(SubscriptionStep.PROFILE_DETAILS)\n              }\n            />\n          ) : subscriptionStep === SubscriptionStep.PROFILE_DETAILS ? (\n            <ProfileDetailsForm\n              onSubmit={() =>\n                setSubscriptionStep(SubscriptionStep.PAYMENT_TYPE)\n              }\n            />\n          ) : subscriptionStep === SubscriptionStep.PAYMENT_TYPE ? (\n            <PaymentTypeForm\n              onSubmit={(typeOfPayment: 'card' | 'invoice') => {\n                if (typeOfPayment === 'card') {\n                  setSubscriptionStep(SubscriptionStep.PAYMENT_DETAILS);\n                } else {\n                  setSubscriptionStep(SubscriptionStep.CONFIRMATION);\n                }\n              }}\n            />\n          ) : subscriptionStep === SubscriptionStep.PAYMENT_DETAILS ? (\n            <PaymentDetailsForm\n              onSubmit={() => {\n                setSubscriptionIsComplete(true);\n              }}\n            />\n          ) : subscriptionStep === SubscriptionStep.CONFIRMATION ? (\n            <div className=\"Success\">\n              <div className=\"ConfirmationBoxContainer\">\n                <ConfirmationBox\n                  {...INVOICE_SUCCESS_MESSAGE}\n                  buttonOnClick={() => navigate(AppPath.SIGN_IN)}\n                />\n              </div>\n            </div>\n          ) : null}\n        </div>\n      )}\n    </Page>\n  );\n};\n","import { NewSubscriptionApi } from 'api/newSubscriptionApi';\nimport { PaymentTypes } from 'appConstants';\nimport FormGeneralError from 'components/formComponents/FormGeneralError';\nimport FormStripeCardField from 'components/formComponents/FormStripeCardField';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport { useFormikContext } from 'formik';\n\nimport { useEffect, useState } from 'react';\nimport { formatNumber } from 'utils/formating';\nimport { UpgradePackageInfo, UpgradeSubscriptionFormValues } from './models';\n\ntype Props = {\n  selectedPackage: UpgradePackageInfo;\n  vatRate: number | null;\n};\n\nexport const UpgradeSubscriptionsForm: React.FC<Props> = ({\n  selectedPackage,\n  vatRate,\n}) => {\n  const formikContext = useFormikContext<UpgradeSubscriptionFormValues>();\n\n  const [promoCode, setPromoCode] = useState({ value: '', error: '' });\n\n  const [priceInfo, setPriceInfo] = useState({ price: 0, vat: 0, total: 0 });\n\n  const applyPromoCode = async () => {\n    const result = await NewSubscriptionApi.checkPromoCode(promoCode.value);\n    if (result.data) {\n      const packages = result.data.generalPackages\n        .map((i: any) => i.subjects.map((j: any) => j.subscriptions))\n        .flat()\n        .flat();\n\n      const selectedPackage = packages.find(\n        (p: any) =>\n          p.packageID === formikContext.getFieldProps('package').value.packageId\n      );\n\n      const discountedTotalPriceWithoutVAT =\n        selectedPackage.price - selectedPackage.promoCodeDiscount;\n\n      const discountedTotalPriceWithVAT =\n        discountedTotalPriceWithoutVAT +\n        discountedTotalPriceWithoutVAT * (result.data.vatRate / 100);\n\n      const discount = selectedPackage.price - discountedTotalPriceWithoutVAT;\n\n      const vatValue =\n        discountedTotalPriceWithVAT - discountedTotalPriceWithoutVAT;\n\n      setPriceInfo({\n        price: formatNumber(selectedPackage.price),\n        vat: formatNumber(vatValue),\n        total: formatNumber(discountedTotalPriceWithVAT),\n      });\n\n      formikContext.setFieldValue('validPromoCode', promoCode.value);\n      formikContext.setFieldValue('validDiscount', discount);\n      setPromoCode({\n        value: '',\n        error: '',\n      });\n\n      formikContext.setFieldValue('total', discountedTotalPriceWithVAT);\n    }\n    if (result.error) {\n      setPromoCode({ value: '', error: result.error.message });\n      formikContext.setFieldValue('validPromoCode', '');\n      formikContext.setFieldValue('validDiscount', 0);\n    }\n  };\n\n  const calculatePrice = () => {\n    if (!vatRate) return;\n    const price = selectedPackage.price;\n\n    const vat = price * (vatRate / 100);\n\n    const total = price + vat;\n\n    setPriceInfo({ price, vat, total });\n  };\n\n  useEffect(() => {\n    calculatePrice();\n  }, [vatRate]);\n\n  useEffect(() => {\n    if (!priceInfo.total) return;\n    formikContext.setFieldValue('total', priceInfo.total);\n  }, [priceInfo.total]);\n\n  return (\n    <>\n      <label className=\"SubscriptionOption Selected\" style={{ cursor: 'none' }}>\n        <div className=\"Left\">\n          <input\n            type=\"radio\"\n            name=\"subscription-type\"\n            className=\"HiddenInput\"\n            checked={true}\n            onChange={() => {}}\n          />\n          <label className=\"CustomInput\" />\n          <div className=\"Text\">\n            <h2>{selectedPackage.subscription}</h2>\n            <p>{`Accessible for ${\n              selectedPackage.type === 'Standard' ? 1 : 3\n            } years`}</p>\n          </div>\n        </div>\n        <h2>£{formatNumber(selectedPackage.price)}</h2>\n      </label>\n      <div className=\"UpgradePaymentType\">\n        <div\n          className={`PaymentType ${\n            formikContext.values.paymentType === PaymentTypes.PAY_BY_CARD\n              ? 'Selected'\n              : ''\n          }`}\n          onClick={() =>\n            formikContext.setFieldValue('paymentType', PaymentTypes.PAY_BY_CARD)\n          }\n        >\n          {PaymentTypes.PAY_BY_CARD}\n        </div>\n        <div\n          className={`PaymentType ${\n            formikContext.values.paymentType === PaymentTypes.PAY_BY_INVOICE\n              ? 'Selected'\n              : ''\n          }`}\n          onClick={() =>\n            formikContext.setFieldValue(\n              'paymentType',\n              PaymentTypes.PAY_BY_INVOICE\n            )\n          }\n        >\n          {PaymentTypes.PAY_BY_INVOICE}\n        </div>\n      </div>\n      <div className=\"DiscoundContainer\">\n        <input\n          className=\"Discount\"\n          type=\"text\"\n          onChange={(e) =>\n            setPromoCode((prevState) => ({\n              ...prevState,\n              value: e.target.value,\n            }))\n          }\n          value={promoCode.value}\n          placeholder=\"Enter promo code (optional)\"\n        />\n\n        <button\n          className=\"Btn BtnOrange\"\n          type=\"button\"\n          disabled={promoCode.value ? false : true}\n          onClick={applyPromoCode}\n        >\n          Apply\n        </button>\n      </div>\n\n      <FormGeneralError message={promoCode.error} />\n      {formikContext.values.paymentType === PaymentTypes.PAY_BY_CARD && (\n        <>\n          <h4 className=\"SpaceTopBtm\">Payment details </h4>\n          <div className=\"CardPaymetFields\">\n            <FormTextField\n              field={'cardholderName'}\n              label={\"Cardholder's name\"}\n              labelPosition={'left'}\n              required={true}\n            />\n\n            <FormStripeCardField\n              field={'card'}\n              label={'Card '}\n              required={true}\n              labelPosition={'left'}\n            />\n          </div>\n        </>\n      )}\n\n      <div\n        className=\"TotalDetails\"\n        style={{ width: '100%', paddingTop: '30px' }}\n      >\n        <div className=\"DetailsItem\">\n          <p>Price</p>\n          <span>£ {formatNumber(priceInfo.price)}</span>\n        </div>\n        {formikContext.getFieldProps('validDiscount').value > 0 && (\n          <div className=\"DetailsItem\">\n            <p>Discount</p>\n            <span>\n              -£\n              {formatNumber(formikContext.getFieldProps('validDiscount').value)}\n            </span>\n          </div>\n        )}\n        <div className=\"DetailsItem\">\n          <p>VAT ({vatRate}%)</p>\n          <span>£ {formatNumber(priceInfo.vat)}</span>\n        </div>\n        <div className=\"DetailsItem\">\n          <p>Total price</p>\n          <span>\n            £ {formatNumber(formikContext.getFieldProps('total').value)}\n          </span>\n        </div>\n      </div>\n    </>\n  );\n};\n","import React, { useEffect, useState } from 'react';\nimport { Form, Formik, FormikHelpers } from 'formik';\nimport * as Yup from 'yup';\nimport { Elements, injectStripe } from 'react-stripe-elements';\nimport { SubscriptionsApi } from 'api/subscriptionsApi';\nimport { formatNumber } from 'utils/formating';\nimport { PaymentTypes, SubscriptionTypes } from 'appConstants';\nimport { useFetchUpgradeSubscriptionsList } from 'hooks/useFetchUpgradeSubscriptionsList';\nimport { SubscriptionsParser, UpgradeSubscriptionFormValues } from './models';\nimport { UpgradeSubscriptionsForm } from './UpgradeSubscriptionsForm';\nimport { PopoutMenu } from '../../components/popupsAndPanels/PopoutMenu';\nimport { PopoutMenuFooter } from '../../components/popupsAndPanels/PopoutMenuFooter';\nimport { PopoutMenuHeader } from '../../components/popupsAndPanels/PopoutMenuHeader';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport { useToast } from 'hooks/useToast';\nimport FormGeneralError from 'components/formComponents/FormGeneralError';\n\nconst FORM_FIELD_PLACEHOLDER = 'Enter PO number (optional)';\n\nenum UpgradeStep {\n  SELECT_TYPE,\n  PAY,\n}\n\ntype Props = {\n  panelOpen: boolean;\n  togglePanelOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  menuTitle: string;\n  id: number;\n  stripe?: any;\n  setUpdateList: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport const InnerUpgradeSubscriptions: React.FC<Props> = ({\n  panelOpen,\n  togglePanelOpen,\n  menuTitle,\n  id,\n  stripe,\n  setUpdateList,\n}) => {\n  const [upgradeStep, setUpgradeStep] = useState(UpgradeStep.SELECT_TYPE);\n  const [error, setError] = useState<string>('');\n  const [financeEmail, setFinanceEmail] = useState<any>('');\n\n  const handlePayByCardToast = useToast('Your payment was successful');\n  const handlePayByInvoiceToast = useToast(\n    'You will shortly be contacted by email'\n  );\n\n  const { subscriptionsListInfo, errors } =\n    useFetchUpgradeSubscriptionsList(id);\n\n  useEffect(() => {\n    if (!subscriptionsListInfo) return;\n    setFinanceEmail(subscriptionsListInfo.financeEmail);\n  }, [subscriptionsListInfo]);  \n\n  const handleMenuClose = () => {\n    togglePanelOpen(false);\n  };\n\n  const validationSchema = Yup.object({\n    FinanceEmail: Yup.string().email('Please enter a valid email').required('A finance email is required').nullable(),\n  });\n\n  const upgradeByInvoice = async (\n    values: UpgradeSubscriptionFormValues,\n    setSubmitting: (status: boolean) => void\n  ) => {\n    const result = await SubscriptionsApi.upgradeByInvoice(values);\n    if (result.data) {\n      setSubmitting(false);\n      handlePayByInvoiceToast();\n      setUpdateList(true);\n      handleMenuClose();\n    }\n\n    if (result.error) {\n      setSubmitting(false);\n      setError(result.error.message);\n    }\n  };\n\n  const createStripeToken = (\n    values: UpgradeSubscriptionFormValues,\n    setSubmitting: (status: boolean) => void\n  ) =>\n    stripe\n      .createToken({ name: values.cardholderName })\n      .then(({ token, error }: any) => {\n        if (token) {\n          upgradeByCard(token, values, setSubmitting);\n        }\n        if (error) {\n          setSubmitting(false);\n          setError('Sorry, something went wrong. Please try again.');\n        }\n      });\n\n  const upgradeByCard = async (\n    token: any,\n    values: UpgradeSubscriptionFormValues,\n    setSubmitting: (status: boolean) => void\n  ) => {\n    const result = await SubscriptionsApi.upgradeByCard(values, token);\n    if (result.data) {\n      const status = result.data.status;\n      if (status === 'succeeded') {\n        handlePayByCardToast();\n        setUpdateList(true);\n        handleMenuClose();\n      }\n\n      if (status === 'requires_action') {\n        const clientSecret = result.data.clientSecret;\n        const tid = result.data.tid;\n        handleCardAction(clientSecret, setSubmitting, tid);\n      }\n    }\n    if (result.error) {\n      setError(result.error.message);\n      setSubmitting(false);\n    }\n  };\n\n  const handleCardAction = (\n    clientSecret: string,\n    setSubmitting: (status: boolean) => void,\n    tid: string\n  ) => {\n    stripe.handleCardAction(clientSecret).then((res: any) => {\n      if (res.error) {\n        setSubmitting(false);\n      }\n      updateAfter3DSecure(res, tid, setSubmitting);\n    });\n  };\n\n  const updateAfter3DSecure = async (\n    values: any,\n    tid: string,\n    setSubmitting: (status: boolean) => void\n  ) => {\n    const result = await SubscriptionsApi.updateAfter3DSecureUpgrade({\n      ...values,\n      tid,\n    });\n\n    if (result.error) {\n      setError(result.error.message);\n      setSubmitting(false);\n    } else {\n      handlePayByCardToast();\n      setUpdateList(true);\n      handleMenuClose();\n    }\n  };\n\n  const handleFormSubmission = (\n    values: UpgradeSubscriptionFormValues,\n    {\n      setSubmitting,\n      setFieldError,\n    }: FormikHelpers<UpgradeSubscriptionFormValues>\n  ) => {\n    if (upgradeStep === UpgradeStep.SELECT_TYPE) {\n      if (!values.package?.packageId) {\n        setSubmitting(false);\n\n        setError('Please select a package');\n        return;\n      }\n      setUpgradeStep(UpgradeStep.PAY);\n      setSubmitting(false);\n    }\n    if (upgradeStep === UpgradeStep.PAY) {\n      if (values.paymentType === PaymentTypes.PAY_BY_CARD) {\n        if (!values.cardholderName) {\n          setFieldError('cardholderName', 'Please provide the cardholder name');\n          setSubmitting(false);\n          return;\n        }\n        if (!values.paymentType) {\n          setFieldError('paymentType', 'Please provide a type of payment');\n          setSubmitting(false);\n          return;\n        }\n        createStripeToken(values, setSubmitting);\n      }\n      if (values.paymentType === PaymentTypes.PAY_BY_INVOICE) {\n        upgradeByInvoice(values, setSubmitting);\n      }\n    }\n  };\n\n  return (\n    <Formik\n      initialValues={SubscriptionsParser.createEmptyUpgradePackages(financeEmail)}\n      onSubmit={(values, formikHelpers) =>\n        handleFormSubmission(values, formikHelpers)\n      }\n      validationSchema={validationSchema}\n      enableReinitialize={true}\n    >\n      {({ values, submitForm, isSubmitting, setFieldValue }) => (\n        <Form>\n          <PopoutMenu\n            isPopup={false}\n            isOpen={panelOpen}\n            handleClose={handleMenuClose}\n            className=\"SubscriptionsPopoutMenu\"\n            position=\"right\"\n            loading={!subscriptionsListInfo && !errors}\n            error={!!errors}\n          >\n            <PopoutMenuHeader title={menuTitle} handleClose={handleMenuClose} />\n            <div className=\"PopoutMenuContent\">\n              <FormGeneralError message={error} />\n              <FormTextField\n                field={'poNumber'}\n                placeholder={FORM_FIELD_PLACEHOLDER}\n                required={false}\n              />\n              <div className=\"LineSpacer3\"></div>\n              <p>Enter email address to send card receipt / invoice to:</p>\n              <FormTextField\n                field={'FinanceEmail'}\n                placeholder={'Email address'}\n                required={true}\n                value={values.FinanceEmail}\n              />              \n              {upgradeStep === UpgradeStep.SELECT_TYPE ? (\n                <>\n                  {subscriptionsListInfo &&\n                    subscriptionsListInfo.upgradeList &&\n                    subscriptionsListInfo.upgradeList.map(\n                      (subscription, index) => (\n                        <label\n                          className={`SubscriptionOption ${\n                            values.package?.packageId === subscription.packageId\n                              ? 'Selected'\n                              : ''\n                          }`}\n                          key={index}\n                        >\n                          <div className=\"Left\">\n                            <input\n                              type=\"radio\"\n                              name=\"subscription-type\"\n                              className=\"HiddenInput\"\n                              checked={\n                                values.package?.packageId ===\n                                subscription.packageId\n                              }\n                              onChange={(e) => {\n                                if (\n                                  values.package?.packageId ===\n                                  subscription.packageId\n                                ) {\n                                  setFieldValue('package', null);\n                                } else setFieldValue('package', subscription);\n                              }}\n                            />\n                            <label className=\"CustomInput\" />\n                            <div className=\"Text\">\n                              <h2>{subscription.subscription}</h2>\n                              <p>\n                                Accessible for\n                                {SubscriptionTypes.STANDARD ===\n                                subscription.type\n                                  ? ' 1 year'\n                                  : SubscriptionTypes.INVESTEMENT ===\n                                    subscription.type\n                                  ? ' 3 years'\n                                  : null}\n                              </p>\n                            </div>\n                          </div>\n                          <h2>£{formatNumber(subscription.price)}</h2>\n                        </label>\n                      )\n                    )}\n                </>\n              ) : upgradeStep === UpgradeStep.PAY && values.package ? (\n                <UpgradeSubscriptionsForm\n                  selectedPackage={values.package}\n                  vatRate={\n                    subscriptionsListInfo?.vatRate\n                      ? parseInt(subscriptionsListInfo.vatRate)\n                      : null\n                  }\n                />\n              ) : null}\n            </div>\n            <PopoutMenuFooter\n              primaryButtonText=\"Upgrade\"\n              secondaryButtonText=\"Cancel\"\n              handlePrimaryButtonClick={submitForm}\n              handleSecondaryButtonClick={handleMenuClose}\n              isSubmitting={isSubmitting}\n            />\n          </PopoutMenu>\n        </Form>\n      )}\n    </Formik>\n  );\n};\n\nconst UpgradeSubscriptionsWithStripe = injectStripe(InnerUpgradeSubscriptions);\n\nexport const UpgradeSubscriptions: React.FC<Props> = (props) => {\n  return (\n    <Elements>\n      <UpgradeSubscriptionsWithStripe {...props} />\n    </Elements>\n  );\n};\n","import { SubscriptionsApi } from 'api/subscriptionsApi';\nimport { UpgradeSubscriptionsList } from 'pages/subscriptions/models';\nimport { useState, useCallback, useEffect } from 'react';\n\nexport const useFetchUpgradeSubscriptionsList = (id: number) => {\n  const [subscriptionsListInfo, setSubscriptionsListInfo] = useState<{\n    vatRate: string | null;\n    upgradeList: UpgradeSubscriptionsList;\n    financeEmail: string;\n  } | null>(null);\n  const [errors, setErrors] = useState<string>('');\n\n  const getSubscriptionsList = useCallback(async () => {\n    const result = await SubscriptionsApi.getUpgradeSubscriptionsList(id);\n\n    if (result) {\n      if (!result.data && !result.error)\n        setSubscriptionsListInfo({ vatRate: null, upgradeList: [], financeEmail: '' });\n      if (result.data) setSubscriptionsListInfo(result.data);\n    }\n\n    if (result.error) {\n      setErrors(result.errors);\n    }\n  }, []);\n\n  useEffect(() => {\n    getSubscriptionsList();\n  }, [getSubscriptionsList]);\n\n  return { subscriptionsListInfo, errors };\n};\n","import { useEffect, useState } from 'react';\nimport { Form, Formik, FormikHelpers } from 'formik';\nimport * as Yup from 'yup';\nimport { NewSubscriptionApi } from 'api/newSubscriptionApi';\nimport { Elements, injectStripe } from 'react-stripe-elements';\nimport { PaymentTypes } from 'appConstants';\nimport { formatNumber } from 'utils/formating';\nimport { RenewSubscriptionFormValues, SubscriptionsParser } from './models';\nimport { PopoutMenu } from 'components/popupsAndPanels/PopoutMenu';\nimport { PopoutMenuFooter } from 'components/popupsAndPanels/PopoutMenuFooter';\nimport { PopoutMenuHeader } from 'components/popupsAndPanels/PopoutMenuHeader';\nimport FormGeneralError from 'components/formComponents/FormGeneralError';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport FormStripeCardField from 'components/formComponents/FormStripeCardField';\nimport { useFetchRenewalSubscription } from 'hooks/useFetchRenewalSubscription';\nimport { SubscriptionsApi } from 'api/subscriptionsApi';\nimport { useToast } from 'hooks/useToast';\n\ntype Props = {\n  panelOpen: boolean;\n  togglePanelOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  menuTitle: string;\n  id: number;\n  packageId: number;\n  stripe?: any;\n  setUpdateList: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\ninterface PriceInfo {\n  price: number;\n  vat: number;\n  total: number;\n}\n\nconst FORM_FIELD_PLACEHOLDER = 'Enter PO number (optional)';\n\nconst InnerRenewSubscriptions: React.FC<Props> = ({\n  panelOpen,\n  togglePanelOpen,\n  menuTitle,\n  id,\n  packageId,\n  stripe,\n  setUpdateList,\n}) => {\n  const handlePayByCardToast = useToast('Your payment was successful');\n  const handlePayByInvoiceToast = useToast(\n    'You will shortly be contacted by email'\n  );\n\n  const [promoCode, setPromoCode] = useState({ value: '', error: '' });\n  const [promoCodeList, setPromoCodeList] = useState<any>([]);\n  const [priceInfo, setPriceInfo] = useState<PriceInfo>({\n    price: 0,\n    vat: 0,\n    total: 0,\n  });\n  const [vatRate, setVatRate] = useState<number>(0);\n  const [error, setError] = useState<string>('');\n  const [packageIdState, setPackageIdState] = useState<number>(0);\n  const [financeEmail, setFinanceEmail] = useState<any>('');\n\n  // This is the state for the initial subscription option, the fetch over rides this and then formik handle colouring of cells.\n  const [subscriptionOption, setSubscriptionOption] = useState('');\n\n  // This gets the subscription information of the user\n  // The fetched object will contain the subscriptionDurationOptions[]\n  const { subscription, error: subscriptionError } =\n    useFetchRenewalSubscription(id);\n\n  useEffect(() => {\n    if (!subscription) return;\n    setVatRate(subscription.details.vatRate);\n    const [vat, total] = calculatePrice(\n      subscription.details.price,\n      subscription.details.vatRate\n    );\n\n    setPriceInfo({ price: subscription.details.price, vat, total });\n    setSubscriptionOption(subscription.details.type);\n    setPackageIdState(subscription.details.packageId);\n    setFinanceEmail(subscription.details.financeEmail);\n  }, [subscription]);\n\n  // When a user selects a subscription type, update the price.\n  const handlePriceChange = (PackageId: number) => {\n    let newPrice = 0;\n\n    subscription.details.subscriptionTypes.forEach((obj: any) => {\n      if (obj.packageId === PackageId) {\n        newPrice = obj.price;\n      }\n    });\n\n    // Recalculate pricing information.\n    const [vat, newTotal] = calculatePrice(\n      newPrice,\n      subscription.details.vatRate\n    );\n\n    setPriceInfo({ price: newPrice, vat, total: newTotal });\n  };\n\n  const calculatePrice = (price: number, vatRate: number) => {\n    const vat = price * (vatRate / 100);\n\n    const total = price + vat;\n\n    return [vat, total];\n  };\n\n  const handleMenuClose = () => {\n    togglePanelOpen(false);\n  };\n\n  const applyPromoCode = async (\n    values: RenewSubscriptionFormValues,\n    setFieldValue: (fieldName: string, value: any) => void,\n    promoCodeVal: string,\n    packageId: number\n  ) => {\n    const result = await NewSubscriptionApi.checkPromoCode(promoCodeVal);\n    if (result.data) {\n      const packages = result.data.generalPackages\n        .map((i: any) => i.subjects.map((j: any) => j.subscriptions))\n        .flat()\n        .flat();\n\n      const selectedPackage = packages.find(\n        (p: any) => p.packageID === packageId\n      );\n\n      const discountedTotalPriceWithoutVAT =\n        selectedPackage.price - selectedPackage.promoCodeDiscount;\n        \n      const discountedTotalPriceWithVAT =\n        discountedTotalPriceWithoutVAT +\n        discountedTotalPriceWithoutVAT * (result.data.vatRate / 100);\n\n      const discount = selectedPackage.price - discountedTotalPriceWithoutVAT;\n\n      const vatValue =\n        discountedTotalPriceWithVAT - discountedTotalPriceWithoutVAT;\n\n      const completeTotal = discountedTotalPriceWithoutVAT + vatValue;\n\n      setPriceInfo({\n        price: formatNumber(selectedPackage.price),\n        vat: formatNumber(vatValue),\n        total: formatNumber(completeTotal),\n      });\n\n      setFieldValue('validPromoCode', promoCodeVal);\n\n      setFieldValue('validDiscount', discount);\n      setPromoCode({\n        value: '',\n        error: '',\n      });\n      const promoCodeListCopy = promoCodeList;\n      let addCodeToList = true;\n      for(let i = 0; i < promoCodeList.length; i++){\n        if(promoCodeList[i] === promoCodeVal){\n          addCodeToList = false;\n        }\n      }\n      if(addCodeToList){\n        promoCodeListCopy.push(promoCodeVal);\n        setPromoCodeList(promoCodeListCopy);\n      }\n    }\n\n    if (result.error) {\n      setPromoCode({ value: '', error: result.error.message });\n      setFieldValue('validPromoCode', '');\n      setFieldValue('validDiscount', 0);\n    }\n  };\n\n  const renewByInvoice = async (\n    values: RenewSubscriptionFormValues,\n    setSubmitting: (status: boolean) => void\n  ) => {\n    const result = await SubscriptionsApi.renewByInvoice(\n      values,\n      // [subscription.details.packageId],\n      [packageIdState],\n      priceInfo.total\n    );\n    if (result.data) {\n      setSubmitting(false);\n      handlePayByInvoiceToast();\n      setUpdateList(true);\n      handleMenuClose();\n    }\n\n    if (result.error) {\n      setSubmitting(false);\n      setError(result.error.message);\n    }\n  };\n\n  const createStripeToken = (\n    values: RenewSubscriptionFormValues,\n    setSubmitting: (status: boolean) => void\n  ) =>\n    stripe\n      .createToken({ name: values.cardholderName })\n      .then(({ token, error }: any) => {\n        if (token) {\n          renewByCard(token, values, setSubmitting);\n        }\n        if (error) {\n          setSubmitting(false);\n          setError('Sorry, something went wrong. Please try again.');\n        }\n      });\n\n  const renewByCard = async (\n    token: any,\n    values: RenewSubscriptionFormValues,\n    setSubmitting: (status: boolean) => void\n  ) => {\n    const result = await SubscriptionsApi.renewByCard(\n      values,\n      token,\n      priceInfo.total,\n      // [subscription.details.packageId]\n      [packageIdState]\n    );\n    if (result.data) {\n      const status = result.data.status;\n      if (status === 'succeeded') {\n        handlePayByCardToast();\n        setUpdateList(true);\n        handleMenuClose();\n      }\n\n      if (status === 'requires_action') {\n        const clientSecret = result.data.clientSecret;\n        const tid = result.data.tid;\n        handleCardAction(clientSecret, setSubmitting, tid);\n      }\n    }\n    if (result.error) {\n      setError(result.error.message);\n      setSubmitting(false);\n    }\n  };\n\n  const handleCardAction = (\n    clientSecret: string,\n    setSubmitting: (status: boolean) => void,\n    tid: string\n  ) => {\n    stripe.handleCardAction(clientSecret).then((res: any) => {\n      if (res.error) {\n        setSubmitting(false);\n      }\n      renewAfter3DSecure(res, tid, setSubmitting);\n    });\n  };\n\n  const renewAfter3DSecure = async (\n    values: any,\n    tid: string,\n    setSubmitting: (status: boolean) => void\n  ) => {\n    const result = await SubscriptionsApi.renewAfter3DSecureUpgrade({\n      ...values,\n      tid,\n    });\n\n    if (result.error) {\n      setError(result.error.message);\n      setSubmitting(false);\n    } else {\n      handlePayByCardToast();\n      setUpdateList(true);\n      handleMenuClose();\n    }\n  };\n\n  const handleFormSubmission = (\n    values: RenewSubscriptionFormValues,\n    { setFieldError, setSubmitting }: FormikHelpers<RenewSubscriptionFormValues>\n  ) => {\n    if (values.paymentType === PaymentTypes.PAY_BY_CARD) {\n      if (!values.cardholderName) {\n        setFieldError('cardholderName', 'Please provide the cardholder name');\n        setSubmitting(false);\n        return;\n      }\n      if (!values.paymentType) {\n        setFieldError('paymentType', 'Please provide a type of payment');\n        setSubmitting(false);\n        return;\n      }\n      createStripeToken(values, setSubmitting);\n    }\n    if (values.paymentType === PaymentTypes.PAY_BY_INVOICE) {\n      renewByInvoice(values, setSubmitting);\n    }\n  };\n  \n  return (\n    <Formik\n      initialValues={SubscriptionsParser.createEmptyRenewPackages(\n        subscriptionOption,\n        financeEmail\n      )}\n      onSubmit={(values, formikHelpers) =>\n        handleFormSubmission(values, formikHelpers)\n      }\n      validationSchema={Yup.object({\n        FinanceEmail: Yup.string().email('Please enter a valid email').required('A finance email is required').nullable(),\n      })}\n      enableReinitialize={true}\n    >\n      {({ values, submitForm, isSubmitting, setFieldValue }) => (\n        <Form>\n          <PopoutMenu\n            isPopup={false}\n            isOpen={panelOpen}\n            handleClose={handleMenuClose}\n            className=\"SubscriptionsPopoutMenu\"\n            position=\"right\"\n            loading={!subscription && !subscriptionError}\n          >\n            <PopoutMenuHeader title={menuTitle} handleClose={handleMenuClose} />\n            <div className=\"PopoutMenuContent\">\n              <FormGeneralError message={error} />\n              <FormTextField\n                field={'poNumber'}\n                placeholder={FORM_FIELD_PLACEHOLDER}\n                required={false}\n              />\n\n              {subscription && (\n                <>\n                  {/* values.subDuration is the user's pre-existing tarrig (See: createEmptyRenewPackages).\n                  The below section allows instant update of the subDuration onClick */}\n                  <div className=\"UpdateSubDurType\">\n                    {subscription.details.subscriptionTypes.map((obj: any) => {\n                      return (\n                        <div\n                          className={`SubDurType ${\n                            values.subDuration === obj.type ? 'Selected' : ''\n                          }\n                         ${subscriptionOption === obj.type ? 'Selected' : ''}`}\n                          onClick={() => {\n                            setSubscriptionOption('');\n                            setFieldValue('subDuration', obj.type);\n                            setPackageIdState(obj.packageId);\n                            handlePriceChange(obj.packageId);\n\n                            if(values.validDiscount > 0){\n                              for(let i = 0; i < promoCodeList.length; i++){\n                                applyPromoCode(values, setFieldValue, promoCodeList[i], obj.packageId);\n                              }\n                            }\n                          }}\n                        >\n                          {obj.type}\n                        </div>\n                      );\n                    })}\n                  </div>\n                  <div className=\"UpdatePaymentType\">\n                    <div\n                      className={`PaymentType ${\n                        values.paymentType === PaymentTypes.PAY_BY_CARD\n                          ? 'Selected'\n                          : ''\n                      }`}\n                      onClick={() =>\n                        setFieldValue('paymentType', PaymentTypes.PAY_BY_CARD)\n                      }\n                    >\n                      {PaymentTypes.PAY_BY_CARD}\n                    </div>\n                    <div\n                      className={`PaymentType ${\n                        values.paymentType === PaymentTypes.PAY_BY_INVOICE\n                          ? 'Selected'\n                          : ''\n                      }`}\n                      onClick={() =>\n                        setFieldValue(\n                          'paymentType',\n                          PaymentTypes.PAY_BY_INVOICE\n                        )\n                      }\n                    >\n                      {PaymentTypes.PAY_BY_INVOICE}\n                    </div>\n                  </div>\n                  <div className=\"DiscoundContainer\">\n                    <input\n                      className=\"Discount\"\n                      type=\"text\"\n                      onChange={(e) =>\n                        setPromoCode((prevState) => ({\n                          ...prevState,\n                          value: e.target.value,\n                        }))\n                      }\n                      value={promoCode.value}\n                      placeholder=\"Enter promo code (optional)\"\n                    />\n\n                    <button\n                      className=\"Btn BtnOrange\"\n                      type=\"button\"\n                      disabled={promoCode.value ? false : true}\n                      onClick={() => applyPromoCode(values, setFieldValue, promoCode.value, packageIdState)}\n                    >\n                      Apply\n                    </button>\n                  </div>\n                  <p>Enter email address to send card receipt / invoice to:</p>\n                  <FormTextField\n                    field={'FinanceEmail'}\n                    placeholder={'Email address'}\n                    required={true}\n                    value={values.FinanceEmail}\n                  />\n                  <FormGeneralError message={promoCode.error} />\n                  {values.paymentType === PaymentTypes.PAY_BY_CARD && (\n                    <>\n                      <h4 className=\"SpaceTopBtm\">Payment details </h4>\n                      <div className=\"CardPaymetFields\">\n                        <FormTextField\n                          field={'cardholderName'}\n                          label={\"Cardholder's name\"}\n                          labelPosition={'left'}\n                          required={true}\n                        />\n\n                        <FormStripeCardField\n                          field={'card'}\n                          label={'Card '}\n                          required={true}\n                          labelPosition={'left'}\n                        />\n                      </div>\n                    </>\n                  )}\n                  <div\n                    className=\"TotalDetails\"\n                    style={{ width: '100%', paddingTop: '30px' }}\n                  >\n                    <div className=\"DetailsItem\">\n                      <p>Price</p>\n                      <span>£ {formatNumber(priceInfo.price)}</span>\n                    </div>\n\n                    {values.validDiscount > 0 && (\n                      <div className=\"DetailsItem\">\n                        <p>Discount</p>\n                        <span>\n                          -£\n                          {formatNumber(values.validDiscount)}\n                        </span>\n                      </div>\n                    )}\n                    {values.validDiscount > 0 && (\n                      <div className=\"DetailsItem\">\n                        <p>Discounted price</p>\n                        <span>\n                          £\n                          {formatNumber(priceInfo.price - values.validDiscount)}\n                        </span>\n                      </div>\n                    )}\n                    <div className=\"DetailsItem\">\n                      <p>VAT ({vatRate}%)</p>\n                      <span>£ {formatNumber(priceInfo.vat)}</span>\n                    </div>\n\n                    <div className=\"DetailsItem\">\n                      <p>Total price</p>\n                      <span>£ {formatNumber(priceInfo.total)}</span>\n                    </div>\n                  </div>\n                </>\n              )}\n            </div>\n\n            <PopoutMenuFooter\n              primaryButtonText=\"Renew\"\n              secondaryButtonText=\"Cancel\"\n              handlePrimaryButtonClick={submitForm}\n              handleSecondaryButtonClick={handleMenuClose}\n              isSubmitting={isSubmitting}\n            />\n          </PopoutMenu>\n        </Form>\n      )}\n    </Formik>\n  );\n};\n\nconst RenewSubscriptionsWithStripe = injectStripe(InnerRenewSubscriptions);\n\nexport const RenewSubscriptionsForm: React.FC<Props> = (props) => {\n  return (\n    <Elements>\n      <RenewSubscriptionsWithStripe {...props} />\n    </Elements>\n  );\n};\n","import { SubscriptionsApi } from 'api/subscriptionsApi';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport const useFetchRenewalSubscription = (id: number) => {\n  const [subscription, setSubscription] = useState<any>(null);\n  const [error, setError] = useState<string>('');\n\n  const getRenewalSubscription = useCallback(async () => {\n    const result = await SubscriptionsApi.getRenewalSubscription(id);\n\n    if (result.data) {\n      setSubscription(result.data);\n    }\n\n    if (result.error) {\n      setError(result.error);\n    }\n  }, []);\n\n  useEffect(() => {\n    getRenewalSubscription();\n  }, [getRenewalSubscription]);\n\n  return { subscription, error };\n};\n","import { navigate, RouteComponentProps } from '@reach/router';\nimport { AppPath } from 'appConstants';\nimport React, { useEffect, useState } from 'react';\nimport { accessInformation, ISubscription, SubscriptionsList } from './models';\nimport Page from 'components/shared/Page';\nimport { UpgradeSubscriptions } from './UpgradeSubscriptions';\nimport { Spinner } from 'components/spinner/Spinner';\nimport { SubscriptionsApi } from 'api/subscriptionsApi';\nimport { RenewSubscriptionsForm } from './RenewSubscriptionsForm';\n\nexport const Subscriptions: React.FC<RouteComponentProps> = () => {\n  const [isUpgradeMenuOpen, setIsUpgradeMenuOpen] = useState<boolean>(false);\n  const [isRenewMenuOpen, setIsRenewMenuOpen] = useState<boolean>(false);\n\n  const [selectedSubscription, setSelectedSubscription] = useState<\n    number | null\n  >(null);\n  const [selectedSubject, setSelectedSubject] = useState<number | null>(null);\n  const [sideMenuTitle, setSideMenuTitle] = useState('');\n  const [updateList, setUpdateList] = useState(true);\n  const [accessInfo, setAccessInfo] = useState<accessInformation | null>(null);\n  const [subscriptionsListInfo, setSubscriptionsListInfo] =\n    useState<SubscriptionsList | null>(null);\n  const [error, setError] = useState<string>('');\n\n  const fetchSubscriptionsList = async () => {\n    const result = await SubscriptionsApi.getSubscriptionsList();\n\n    if (result.data) {\n      const { listSubscriptions, bCanAddFreeTrial, bCanAddSubscription } =\n        result.data;\n      setSubscriptionsListInfo(listSubscriptions ? listSubscriptions : []);\n      setAccessInfo({ bCanAddFreeTrial, bCanAddSubscription });\n    }\n\n    if (result.error) {\n      setError(result.error);\n    }\n  };\n\n  useEffect(() => {\n    if (!updateList) return;\n    fetchSubscriptionsList();\n    setUpdateList(false);\n  }, [updateList]);\n\n  const handleNewSubscription = () => {\n    navigate(AppPath.NEW_SUBSCRIPTION);\n  };\n\n  const handleNewFreeTrial = () => {\n    navigate(AppPath.NEW_FREE_TRIAL);\n  };\n\n  const handleUpgradeMenuOpen = (title: string, id: number) => {\n    setSideMenuTitle(title);\n    setSelectedSubscription(id);\n    setIsUpgradeMenuOpen(true);\n  };\n\n  const handleRenewMenuOpen = (\n    title: string,\n    id: number,\n    packageID: number\n  ) => {\n    setSideMenuTitle(title);\n    setSelectedSubject(id);\n    setIsRenewMenuOpen(true);\n    setSelectedSubscription(packageID);\n  };\n\n  return (\n    <Page>\n      <div className=\"PageContent SubscriptionsPage WidthContent\">\n        <div className=\"TitleBar\">\n          <h1 className=\"PageTitle\">Subscriptions</h1>\n          <div className=\"SubscriptionsButtonContainer\">\n            {subscriptionsListInfo &&\n              subscriptionsListInfo?.length !== 0 &&\n              accessInfo?.bCanAddFreeTrial && (\n                <button\n                  className=\"Btn BtnLightOrange NewSubscriptionButton\"\n                  onClick={handleNewFreeTrial}\n                >\n                  <span className=\"Plus\">+</span>\n                  <span className=\"Text\">Add a free trial</span>\n                </button>\n              )}\n            {subscriptionsListInfo &&\n              subscriptionsListInfo?.length !== 0 &&\n              accessInfo?.bCanAddSubscription && (\n                <button\n                  className=\"Btn BtnLightOrange NewFreeTrial\"\n                  onClick={handleNewSubscription}\n                >\n                  <span className=\"Plus\">+</span>\n                  <span className=\"Text\">Add a new subscription</span>\n                </button>\n              )}\n          </div>\n        </div>\n        {!subscriptionsListInfo && !error && (\n          <div className=\"PageSpinner\">\n            <Spinner />\n          </div>\n        )}\n        {subscriptionsListInfo && subscriptionsListInfo?.length === 0 && (\n          <div className=\"MsgContainer\">\n            <div className=\"Txt\">Ready to get started?</div>\n            <div className=\"MsgContainerButtons\">\n              {accessInfo?.bCanAddFreeTrial && (\n                <button\n                  className=\"Btn BtnLightOrange NewSubscriptionButton\"\n                  onClick={handleNewFreeTrial}\n                >\n                  <span className=\"Plus\">+</span>\n                  <span className=\"Text\">Add a free trial</span>\n                </button>\n              )}\n              {accessInfo?.bCanAddSubscription && (\n                <button\n                  className=\"Btn BtnLightOrange NewFreeTrial\"\n                  onClick={handleNewSubscription}\n                >\n                  <span className=\"Plus\">+</span>\n                  <span className=\"Text\">Add a new subscription</span>\n                </button>\n              )}\n            </div>\n          </div>\n        )}\n        <div className=\"GridSection\">\n          {subscriptionsListInfo &&\n            subscriptionsListInfo.map((sub: ISubscription) => (\n              <div\n                className=\"GridTile GridImageTile\"\n                key={sub.subject + sub.subscription}\n              >\n                <div className=\"TileBody\">\n                  <div className=\"TileTitleBar\">\n                    <h2 className=\"TileTitle\">{sub.subject}</h2>\n                    {/*<p className=\"Price\">£{sub.price}</p>*/}\n                  </div>\n                  <p className=\"TileSubtitle\">{sub.subscription}</p>\n                  <div className=\"TileSmallTextContainer\">\n                    <p className=\"TileSmallText\">\n                      From {sub.fromDate} to {sub.toDate}\n                    </p>\n                    <p className=\"TileSmallText\">\n                      Renewal date {sub.renewalDate}\n                    </p>\n                  </div>\n                  {/*Client requested the upgrade process to be hidden*/}\n                  {/* {sub.isUpgradable && (\n                    <button\n                      onClick={() =>\n                        handleUpgradeMenuOpen(\n                          'Upgrade subscription',\n                          sub.subjectId\n                        )\n                      }\n                      className=\"Btn BtnOrange TileButton\"\n                    >\n                      Upgrade subscription\n                    </button>\n                  )} */}\n                  {sub.isRenewable && (\n                    <button\n                      onClick={() =>\n                        handleRenewMenuOpen(\n                          'Renew subscription',\n                          sub.subjectId,\n                          sub.id\n                        )\n                      }\n                      className=\"Btn BtnOrange TileButton\"\n                    >\n                      Renew subscription\n                    </button>\n                  )}\n                </div>\n              </div>\n            ))}\n        </div>\n        {/* Upgrade subscription */}\n        {isUpgradeMenuOpen && selectedSubscription && (\n          <UpgradeSubscriptions\n            panelOpen={isUpgradeMenuOpen}\n            togglePanelOpen={setIsUpgradeMenuOpen}\n            menuTitle={sideMenuTitle}\n            id={selectedSubscription}\n            setUpdateList={setUpdateList}\n          />\n        )}\n        {/* Renew subscription */}\n        {isRenewMenuOpen && selectedSubject && selectedSubscription && (\n          <RenewSubscriptionsForm\n            panelOpen={isRenewMenuOpen}\n            togglePanelOpen={setIsRenewMenuOpen}\n            menuTitle={sideMenuTitle}\n            id={selectedSubject}\n            setUpdateList={setUpdateList}\n            packageId={selectedSubscription}\n          />\n        )}\n      </div>\n    </Page>\n  );\n};\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { selectToastStatus } from 'reducers/misc';\n\nconst Toast = () => {\n  const toastStatus = useSelector(selectToastStatus);\n  if (!toastStatus.open) return null;\n  return (\n    <div className={`Toast ${toastStatus.message ? 'Show' : 'Hide'}`}>\n      <p className=\"Message\">{toastStatus.message}</p>\n    </div>\n  );\n};\n\nexport default Toast;\n","export default __webpack_public_path__ + \"static/media/Paid_Stamp.59f02775.jpg\";","import { useState } from 'react';\nimport { RouteComponentProps } from '@reach/router';\nimport { useLocation } from '@reach/router';\nimport { parse } from 'query-string';\nimport { Spinner } from 'components/spinner/Spinner';\nimport PaidImage from '../../images/Paid_Stamp.jpg';\nimport Logo from '../../images/Logo.png';\n\nconst InvoicePage = (props: RouteComponentProps) => {\n  const [data, setData] = useState<any | null>(null);\n  const [loading, setLoading] = useState<boolean>(false);\n  const [generalErrors, setGeneralErrors] = useState<string[]>([]);\n\n  const location = useLocation();\n  const searchParams = parse(location.search);\n\n  const { invoice_id, token } = searchParams;\n\n  return (\n    <>\n      {/* {loading && <Spinner />}\n      {data && ( */}\n      <>\n        <form>\n          <div className=\"InvoiceContainer\">\n            <div className=\"PageContentBox\">\n              <div className=\"HeaderContainer\">\n                <div className=\"LeftSide\">\n                  <h1>INVOICE</h1>\n                  <div className=\"SubTitle\">Get Set 4 Education</div>\n                  <div className=\"Info\">\n                    <span>Invoice date:</span> 20 Mar 2020\n                  </div>\n                  <div className=\"Info\">\n                    <span>Invoice number:</span> INV-0047\n                  </div>\n                  <img src={PaidImage} alt=\"Paid\" />\n                </div>\n\n                <div className=\"RightSide\">\n                  <img src={Logo} alt=\"Get Set 4 Education Logo\" />\n                </div>\n              </div>\n\n              <div className=\"SummaryContainer\">\n                <div className=\"TableContainer\">\n                  <table>\n                    <thead>\n                      <tr>\n                        <th className=\"Left\">Description</th>\n                        <th className=\"Middle\">Price</th>\n                        <th className=\"Middle\">VAT(20%)</th>\n                        <th className=\"Right\">Amount</th>\n                      </tr>\n                    </thead>\n                    <tbody>\n                      <tr>\n                        <td className=\"Left\">Get Set 4 PE</td>\n                        <td className=\"Middle\">£370.00</td>\n                        <td className=\"Middle\">£74.00</td>\n                        <td className=\"Right\">£444.00</td>\n                      </tr>\n                    </tbody>\n                  </table>\n                </div>\n                <div className=\"PriceSummary\">\n                  <div className=\"Total\">\n                    TOTAL PRICE:\n                    <span>£444.00</span>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </form>\n      </>\n      {/* )} */}\n      {generalErrors.length > 0 && (\n        <div className=\"InvoiceErrors\">\n          <div className=\"Img\">\n            {/* <img src={Icon_Error} alt=\"Error\" /> */}\n          </div>\n          {generalErrors.map((e: string, key: number) => (\n            <p key={key}>{e}</p>\n          ))}\n        </div>\n      )}\n    </>\n  );\n};\n\nexport default InvoicePage;\n","import { useEffect, useState } from 'react';\nimport { RouteComponentProps, useNavigate } from '@reach/router';\nimport { useDispatch } from 'react-redux';\nimport {\n  clearPackageForm,\n  clearPoNumber,\n  setValidPromoCode,\n} from 'reducers/misc';\nimport {\n  UpgradeFreeSubscriptionStep,\n  UpgradeSubscriptionParser,\n} from './models';\nimport FormHeader from 'components/formHeader/FormHeader';\nimport Page from 'components/shared/Page';\nimport { ChoosePackageForm } from 'components/choosePackageForm/ChoosePackageForm';\nimport { PaymentTypeForm } from 'components/paymentTypeForm/PaymentTypeForm';\nimport PaymentDetailsForm from 'components/paymentDetailsForm/PaymentDetailsForm';\nimport SchoolDetailsForm from 'components/schoolDetailsForm/SchoolDetailsForm';\nimport ConfirmationBox from 'components/confirmationBox/ConfirmationBox';\nimport { AppPath } from 'appConstants';\n\nconst INVOICE_SUCCESS_MESSAGE = {\n  title: 'Congratulations',\n  message: 'You will shortly be contacted by email',\n  buttonText: 'Dashboard',\n};\n\nconst UpgradeFreeSubscriptions: React.FC<RouteComponentProps> = () => {\n  const dispatch = useDispatch();\n  const navigate = useNavigate();\n\n  const [activeStep, setActiveSet] = useState<UpgradeFreeSubscriptionStep>(\n    UpgradeFreeSubscriptionStep.CHOOSE_PACKAGE\n  );\n\n  useEffect(() => {\n    return () => {\n      //clear choose free trial package form\n      dispatch(clearPackageForm());\n      dispatch(clearPoNumber());\n      dispatch(setValidPromoCode(''));\n    };\n  }, []);\n\n  return (\n    <Page>\n      <div className=\"PageContent WidthContent NewSubscriptionPage\">\n        <FormHeader\n          activeStep={activeStep < 4 ? activeStep + 1 : 4}\n          numOfSteps={4}\n          title={UpgradeSubscriptionParser.getPageHeaderInfo(activeStep).title}\n          nextStep={\n            UpgradeSubscriptionParser.getPageHeaderInfo(activeStep).nextStep\n          }\n        />\n        {activeStep === UpgradeFreeSubscriptionStep.CHOOSE_PACKAGE && (\n          <ChoosePackageForm\n            onSubmit={() =>\n              setActiveSet(UpgradeFreeSubscriptionStep.SCHOOL_DETAILS)\n            }\n          />\n        )}\n        {activeStep === UpgradeFreeSubscriptionStep.SCHOOL_DETAILS && (\n          <SchoolDetailsForm\n            onSubmit={() =>\n              setActiveSet(UpgradeFreeSubscriptionStep.PAYMENT_TYPE)\n            }\n          />\n        )}\n\n        {activeStep === UpgradeFreeSubscriptionStep.PAYMENT_TYPE && (\n          <PaymentTypeForm\n            onSubmit={(typeOfPayment: 'card' | 'invoice') =>\n              typeOfPayment === 'invoice'\n                ? setActiveSet(UpgradeFreeSubscriptionStep.CONFIRMATION)\n                : setActiveSet(UpgradeFreeSubscriptionStep.PAYMENT_DETAILS)\n            }\n          />\n        )}\n\n        {activeStep === UpgradeFreeSubscriptionStep.PAYMENT_DETAILS && (\n          <PaymentDetailsForm onSubmit={() => {}} />\n        )}\n\n        {activeStep === UpgradeFreeSubscriptionStep.CONFIRMATION && (\n          <div className=\"Success\">\n            <div className=\"ConfirmationBoxContainer\">\n              <ConfirmationBox\n                {...INVOICE_SUCCESS_MESSAGE}\n                buttonOnClick={() => navigate(AppPath.DASHBOARD)}\n              />\n            </div>\n          </div>\n        )}\n      </div>\n    </Page>\n  );\n};\n\nexport default UpgradeFreeSubscriptions;\n\n\n","import React, { useEffect, useState } from 'react';\nimport { Package, Subjects } from 'pages/newSubscription/models';\nimport { AppPath } from 'appConstants';\nimport { useLocation } from '@reach/router';\n\ntype Props = {\n  subjectInfo: Subjects;\n  selectPackage: (p: Package) => void;\n  selectedPackages: Package[];\n  ageGroup: string;\n};\n\nconst PackageCard: React.FC<Props> = ({\n  subjectInfo,\n  selectPackage,\n  selectedPackages,\n  ageGroup,\n}) => {\n  const location = useLocation();\n  const pathname = location.pathname;\n\n  const [isChecked, setIsChecked] = useState<boolean>(false);\n\n  const { isAvailableForSchool } = subjectInfo.subscriptions[0];\n\n  useEffect(() => {\n    const packageCardSelected = selectedPackages.find(\n      (p: Package) => p.ageGroup === ageGroup && p.subject === subjectInfo.name\n    );\n    setIsChecked(packageCardSelected ? true : false);\n  }, [selectedPackages]);\n\n  const togglePackageCard = () => {\n    setIsChecked((prevState) => !prevState);\n    const selectedPackage = subjectInfo.subscriptions[0];\n    selectedPackage &&\n      selectPackage({\n        ...selectedPackage,\n        ageGroup,\n        subject: subjectInfo.name,\n      });\n  };\n\n  return (\n    <div\n      className={`PackageCard ${isChecked ? 'Checked' : 'Unchecked'} ${\n        pathname === AppPath.NEW_FREE_TRIAL &&\n        !isAvailableForSchool &&\n        'Disabled'\n      }`}\n    >\n      <div\n        className=\"FreeTrialCardContent\"\n        onClick={\n          pathname === AppPath.NEW_FREE_TRIAL\n            ? isAvailableForSchool\n              ? togglePackageCard\n              : () => {}\n            : togglePackageCard\n        }\n      >\n        <span className=\"Checkbox\"></span>\n\n        <div className=\"Details\">\n          <h3>{subjectInfo.name}</h3>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default PackageCard;\n","import React, { useEffect, useState } from 'react';\nimport { Link, useLocation } from '@reach/router';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { selectSelectedPackages, updateSelectedPackages } from 'reducers/misc';\nimport {\n  Package,\n  PackageGroup,\n  PackagesList,\n  Subjects,\n} from 'pages/newSubscription/models';\nimport FreeTrialPackageCard from './FreeTrialPackageCard';\nimport { Spinner } from 'components/spinner/Spinner';\nimport { useFetchPackages } from 'hooks/useFetchPackages';\nimport { AppPath, PUBLIC_SITE_URL } from 'appConstants';\nimport { AddFreeTrialApi } from 'api/addFreeTrialApi';\nimport { useToast } from 'hooks/useToast';\nimport FormGeneralError from 'components/formComponents/FormGeneralError';\n\ntype ChoosePackageFormProps = {\n  onSubmit: () => void;\n};\n\nexport const ChooseFreeTrialPackageForm: React.FC<ChoosePackageFormProps> = ({\n  onSubmit,\n}) => {\n  const dispatch = useDispatch();\n  const location = useLocation();\n  const pathname = location.pathname;\n\n  const selectedPackages = useSelector(selectSelectedPackages);\n\n  const handleToast = useToast('Your free trial has been set up successfully.');\n\n  const [allPackages, setAllPackages] = useState<PackagesList>([]);\n  const [submitError, setSubmitError] = useState<string>('');\n\n  const { packages, error } = useFetchPackages(pathname);\n\n  useEffect(() => {\n    if (!packages) return;\n    setAllPackages(packages);\n  }, [packages]);\n\n  const selectPackage = (p: Package) => {\n    const packageList = selectedPackages;\n    const includesPackage = packageList.find(\n      (i: Package) => i.packageID === p.packageID\n    );\n\n    if (includesPackage) {\n      /*Clear unselected packages*/\n      const filteredPackageList = packageList.filter(\n        (i: Package) => i.packageID !== p.packageID\n      );\n      dispatch(updateSelectedPackages(filteredPackageList));\n    } else {\n      /*Clear packages of the same subject and different age group of the selected package*/\n      const filteredPackageList = packageList.filter(\n        (i: Package) => i.subject !== p.subject\n      );\n\n      dispatch(updateSelectedPackages([...filteredPackageList, p]));\n    }\n  };\n\n  const isAgeGroupSelected = (ageGroup: string) => {\n    /*To define the age group container styles*/\n    const ageGroupPackage = selectedPackages.find(\n      (i: Package) => i.ageGroup === ageGroup\n    );\n    return ageGroupPackage ? true : false;\n  };\n\n  const onContinue = async () => {\n    if (selectedPackages.length === 0) return;\n\n    const pathname = location.pathname;\n    if (pathname === AppPath.NEW_FREE_TRIAL) {\n      setSubmitError('');\n      const selectedPackagesIds = selectedPackages.map(\n        (p: Package) => p.packageID\n      );\n\n      const result = await AddFreeTrialApi.submitFreeTrialPackages(\n        selectedPackagesIds\n      );\n\n      if (!result.error) {\n        const scopes: string | null = localStorage.getItem('SCOPES');\n        const parsedScopes = scopes && JSON.parse(scopes);\n        const updatedScopes = [\n          ...parsedScopes,\n          {\n            childElements: [],\n            displayName: 'Upgrade Subscription',\n            path: 'upgradesubscription',\n          },\n        ];\n        localStorage.setItem('SCOPES', JSON.stringify(updatedScopes));\n        handleToast();\n        onSubmit();\n      }\n      if (result.error) {\n        setSubmitError(result.error.message);\n      }\n    } else {\n      onSubmit();\n    }\n  };\n\n  if (allPackages.length === 0) {\n    return (\n      <div\n        style={{\n          minHeight: ' calc(100vh - 300px)',\n          display: 'flex',\n          justifyContent: 'center',\n          alignItems: 'center',\n        }}\n      >\n        <Spinner />\n      </div>\n    );\n  }\n\n  return (\n    <>\n      <FormGeneralError message={submitError} />\n      <div className=\"ChoosePackageForm\">\n        <div className=\"PackagesContainer\">\n          {allPackages.map((packageGroup: PackageGroup, i: number) => (\n            <div\n              key={i}\n              className={`PackageOptions ${\n                isAgeGroupSelected(packageGroup.name)\n                  ? 'Selected'\n                  : 'Unselected'\n              }\n              `}\n            >\n              <h2>{packageGroup.name}</h2>\n              <p>{packageGroup.description + ' '}</p>\n              {packageGroup &&\n                packageGroup.subjects.map(\n                  (subjectInfo: Subjects, index: number) => (\n                    <FreeTrialPackageCard\n                      key={index}\n                      subjectInfo={subjectInfo}\n                      selectPackage={selectPackage}\n                      selectedPackages={selectedPackages}\n                      ageGroup={packageGroup.name}\n                    />\n                  )\n                )}\n            </div>\n          ))}\n        </div>\n        <div className=\"TotalDetails\">\n          <button\n            className=\"Btn BtnOrange\"\n            type=\"submit\"\n            onClick={onContinue}\n            disabled={selectedPackages.length === 0}\n          >\n            {AppPath.NEW_FREE_TRIAL ? 'Submit' : 'Continue'}\n          </button>\n        </div>\n      </div>\n    </>\n  );\n};\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAMAAAANIilAAAADc2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDUgNzkuMTY0NTkwLCAyMDIwLzEyLzA5LTExOjU3OjQ0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjQwNjcyODg5LTZkODctNWI0NS1hZmY4LTc0NzM2YjdlMTliYyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCODRBNzk3RTZEMUExMUVCQTAwNThBMTdCNEI3NkU0OSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCODRBNzk3RDZEMUExMUVCQTAwNThBMTdCNEI3NkU0OSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDplYmJkNGZkYy1hMjNmLTU1NDctOTA0Mi0xZGI2Yjg5ODAwNWIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDA2NzI4ODktNmQ4Ny01YjQ1LWFmZjgtNzQ3MzZiN2UxOWJjIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VtiyhwAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABmUExURUdwTP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////26W6sgAAAAhdFJOUwADygbdTvYcCvrmQle71BQk8r53nWY5zpAxh7JFaa2oD5tHICoAAACgSURBVBgZ7cFJEoIwFAXAJ2RkEAVUcH73v6T1Q1lukyytdKMoiuLvrReLXIeGyiKPVSSbA3IMe4oLMriK4rgiXd1TmDPS7Z4U/o4MMwONaPVisbky6BDN9VQWYmLwQDQ3klQWwInBhHg9hbLoGFyRoPMUzclTLEiiPX9mJNKeX68dUmnDza1GutZQjA45WkOycsjTHrl/I9e5GlAURfHHPrhSEihgeGtGAAAAAElFTkSuQmCC\"","import { useEffect, useState } from 'react';\nimport { RouteComponentProps, useNavigate } from '@reach/router';\nimport { useDispatch } from 'react-redux';\nimport { clearPackageForm } from 'reducers/misc';\nimport { FreeTrialSubscriptionParser } from './models';\nimport FormHeader from 'components/formHeader/FormHeader';\nimport Page from 'components/shared/Page';\nimport SchoolDetailsForm from 'components/schoolDetailsForm/SchoolDetailsForm';\nimport ProfileDetailsForm from 'components/profileDetailsForm/ProfileDetailsForm';\nimport { ChooseFreeTrialPackageForm } from 'components/chooseFreeTrialPackageForm/ChooseFreeTrialPackage';\nimport ConfirmationBox from 'components/confirmationBox/ConfirmationBox';\nimport { AppPath } from 'appConstants';\nimport CheckMark from 'images/Icon_Complete.png';\n\nconst SUCCESS_MESSAGE = {\n  title: 'Congratulations',\n  message:\n    'Your free trial has been set up successfully. You will shortly receive an email to confirm that your account has been made live.',\n  buttonText: 'Sign in',\n};\n\nconst SubscribeFreeTrial: React.FC<RouteComponentProps> = () => {\n  const dispatch = useDispatch();\n  const navigate = useNavigate();\n  const [activeStep, setActiveSet] = useState<number>(1);\n\n  const [subscriptionIsComplete, setSubscriptionIsComplete] = useState(false);\n\n  useEffect(() => {\n    return () => {\n      //clear choose free trial package form\n      dispatch(clearPackageForm());\n    };\n  }, []);\n\n  return (\n    <Page\n      isPublic\n      className={'SubscribePage'}\n      redirectPath={AppPath.NEW_FREE_TRIAL}\n      redirectParams={false}\n    >\n      {subscriptionIsComplete ? (\n        <div className=\"Success\">\n          <div className=\"ConfirmationBoxContainer\">\n            <ConfirmationBox\n              {...SUCCESS_MESSAGE}\n              buttonOnClick={() => navigate(AppPath.SIGN_IN)}\n            />\n          </div>\n        </div>\n      ) : (\n        <div>\n          <div className=\"SubcriptionAdditionalHeaderWrapper\">\n            <div className=\"SubcriptionAdditionalHeader WidthContent HeightContent\">\n              <h2>Get Set to explore your school trial...</h2>\n\n              <ul>\n                <li>\n                  <img src={CheckMark} /> 14 day free trial\n                </li>\n                <li>\n                  <img src={CheckMark} /> Access for all staff\n                </li>\n                <li>\n                  <img src={CheckMark} /> Access to 2 lesson plans and SoW for\n                  each unit\n                </li>\n                <li>\n                  <img src={CheckMark} /> Access to curriculum mapping and\n                  assessment tools\n                </li>\n                <li>\n                  <img src={CheckMark} /> No obligation\n                </li>\n              </ul>\n            </div>\n          </div>\n          <div className=\"PageContent WidthContent NewSubscriptionPage SubscriptionFreeTrial\">\n            <FormHeader\n              activeStep={activeStep}\n              numOfSteps={3}\n              title={\n                FreeTrialSubscriptionParser.getPageHeaderInfo(activeStep).title\n              }\n              nextStep={\n                FreeTrialSubscriptionParser.getPageHeaderInfo(activeStep)\n                  .nextStep\n              }\n            />\n            {activeStep === 1 && (\n              <ChooseFreeTrialPackageForm onSubmit={() => setActiveSet(2)} />\n            )}\n            {activeStep === 2 && (\n              <SchoolDetailsForm onSubmit={() => setActiveSet(3)} />\n            )}\n            {activeStep === 3 && (\n              <ProfileDetailsForm\n                onSubmit={() => {\n                  setSubscriptionIsComplete(true);\n                }}\n              />\n            )}\n          </div>\n        </div>\n      )}\n    </Page>\n  );\n};\n\nexport default SubscribeFreeTrial;\n","import instance from 'api';\nimport { endpoints } from 'endpoints.config';\nimport { SetPasswordPost } from './models';\n\nexport type ApiReturn<T = any> = {\n  response: T | null;\n  errors: Error[] | null;\n};\n\nexport const PostSetPassword = async (\n  payload: SetPasswordPost\n): Promise<ApiReturn> => {\n  try {\n    const res = await instance.post(endpoints.auth.createPassword, payload);\n    if (res.data.status === '1') {\n      return {\n        response: res.data.details,\n        errors: null,\n      };\n    } else {\n      return {\n        response: res.data.details,\n        errors: res.data.errors,\n      };\n    }\n  } catch (err: any) {\n    return {\n      response: null,\n      errors: err,\n    };\n  }\n};\n","import React, { useState } from 'react';\nimport { navigate, RouteComponentProps } from '@reach/router';\nimport { Formik, Form } from 'formik';\nimport * as Yup from 'yup';\nimport FormTextField from 'components/formComponents/FormTextField';\nimport { PostSetPassword } from './setPasswordApi';\nimport { SetPasswordPost } from './models';\nimport {\n  AppPath,\n  PASSWORD_MATCH_POLICY_ERROR_MESSAGE,\n  PASSWORD_REGEX,\n} from 'appConstants';\nimport { Spinner } from 'components/spinner/Spinner';\nimport ConfirmationBox from 'components/confirmationBox/ConfirmationBox';\n\nconst SUCCESS_MESSAGE = {\n  title: 'Congratulations',\n  message: 'Your password has been set.',\n  buttonText: 'Sign in',\n};\n\nconst SetPasswordForm: React.FC<RouteComponentProps> = () => {\n  const [submitError, setSubmitError] = useState('');\n  const [formIsPosted, setFormIsPosted] = useState(false);\n\n  const initialValues: SetPasswordPost = {\n    passwordResetToken: '',\n    newPassword: '',\n    confirmNewPassword: '',\n  };\n\n  const handleSubmitForm = async (values: SetPasswordPost) => {\n    setSubmitError('');\n\n    const getURLToken = new URLSearchParams(window.location.search).get(\n      'token'\n    );\n    const tokenVal = getURLToken === null ? '' : getURLToken;\n\n    values.passwordResetToken = encodeURIComponent(tokenVal);\n\n    PostSetPassword(values).then((response) => {\n      if (!response.errors) {\n        setFormIsPosted(true);\n        setSubmitError('');\n      } else {\n        setFormIsPosted(false);\n        setSubmitError('Set password failed, please try again');\n      }\n    });\n  };\n\n  const validationSchema = Yup.object({\n    newPassword: Yup.string()\n      .required('You must provide a password')\n      .min(8, PASSWORD_MATCH_POLICY_ERROR_MESSAGE)\n      .max(20, PASSWORD_MATCH_POLICY_ERROR_MESSAGE)\n      .matches(PASSWORD_REGEX, PASSWORD_MATCH_POLICY_ERROR_MESSAGE),\n    confirmNewPassword: Yup.string()\n      .required('You must confirm your new password')\n      .oneOf([Yup.ref('newPassword'), null], 'Passwords must match'),\n  });\n\n  return (\n    <div className=\"Form\">\n      {!formIsPosted ? (\n        <Formik\n          initialValues={initialValues}\n          onSubmit={handleSubmitForm}\n          validationSchema={validationSchema}\n        >\n          {({ isSubmitting }) => (\n            <Form>\n              <h1>Set Password</h1>\n              <p className=\"SubTitle\">Enter your password below</p>\n              <div className=\"UserCredentialsSection\">\n                <FormTextField\n                  field={'newPassword'}\n                  label={'Password'}\n                  type={'password'}\n                  required={true}\n                />\n                <FormTextField\n                  field={'confirmNewPassword'}\n                  label={'Confirm Password'}\n                  type={'password'}\n                  required={true}\n                />\n              </div>\n              {submitError && <div className=\"GeneralError\">{submitError}</div>}\n              <button\n                className=\"Btn BtnOrange\"\n                type=\"submit\"\n                disabled={isSubmitting}\n              >\n                {isSubmitting ? <Spinner color={'#ffffff'} /> : 'Set Password'}\n              </button>\n            </Form>\n          )}\n        </Formik>\n      ) : (\n        <div className=\"Success\">\n          <div className=\"ConfirmationBoxContainer\">\n            <ConfirmationBox\n              {...SUCCESS_MESSAGE}\n              buttonOnClick={() => navigate(AppPath.SIGN_IN)}\n            />\n          </div>\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default SetPasswordForm;\n","import { RouteComponentProps } from '@reach/router';\nimport SetPasswordForm from 'components/setPasswordForm.tsx/SetPasswordForm';\nimport React from 'react';\nimport Page from '../components/shared/Page';\n\nexport const SetPassword: React.FC<RouteComponentProps> = () => {\n  return (\n    <Page isPublic autoLogin={false}>\n      <div className=\"SetPasswordPage\">\n        <div className=\"Content HeightContent\">\n          <SetPasswordForm />\n        </div>\n      </div>\n    </Page>\n  );\n};\n","import { RouteComponentProps } from '@reach/router';\nimport { NOT_FOUND_PAGE } from 'appConstants';\nimport ErrorMessage from 'components/errorMessage/ErrorMessage';\n\nimport Page from 'components/shared/Page';\nimport { useSelector } from 'react-redux';\nimport { selectSignedIn } from 'reducers/auth';\n\ntype Props = RouteComponentProps;\n\nconst NotFound: React.FC<Props> = () => {\n  const isSignedIn = useSelector(selectSignedIn);\n  return isSignedIn ? (\n    <Page isNotFound />\n  ) : (\n    <Page isPublic isNotFound>\n      <ErrorMessage message={NOT_FOUND_PAGE} />\n    </Page>\n  );\n};\n\nexport default NotFound;\n","import React, { ErrorInfo } from 'react';\nimport { isRedirect } from '@reach/router';\n\ntype State = { hasError: boolean };\ntype Props = { fallback: React.ReactNode; children: React.ReactNode };\n\nexport default class ErrorBoundary extends React.Component<Props, State> {\n  static defaultProps = {\n    fallback: null,\n  };\n\n  constructor(props: Props) {\n    super(props);\n    this.state = { hasError: false };\n  }\n\n  static getDerivedStateFromError() {\n    return { hasError: true };\n  }\n\n  componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n    if (isRedirect(error)) {\n      throw error;\n    } else {\n    }\n  }\n\n  render() {\n    if (this.state.hasError) return this.props.fallback;\n\n    return this.props.children;\n  }\n}\n","import { FALLBACK_ERROR_MESSAGE } from 'appConstants';\nimport ErrorMessage from 'components/errorMessage/ErrorMessage';\nimport React from 'react';\n\nconst ErrorFallback: React.FC = () => {\n  return <ErrorMessage message={FALLBACK_ERROR_MESSAGE} />;\n};\n\nexport default ErrorFallback;\n","export class AddFreeTrialParser {\n  public static getPageHeaderInfo = (step: number) => {\n    switch (step) {\n      case 1:\n        return {\n          title: 'Choose your package',\n          nextStep: '',\n        };\n      default:\n        return { title: '', nextStep: '' };\n    }\n  };\n}\n","import { RouteComponentProps, useNavigate } from '@reach/router';\nimport FormHeader from 'components/formHeader/FormHeader';\nimport Page from 'components/shared/Page';\nimport { ChooseFreeTrialPackageForm } from 'components/chooseFreeTrialPackageForm/ChooseFreeTrialPackage';\nimport { AppPath } from 'appConstants';\nimport { AddFreeTrialParser } from './models';\nimport { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { clearPackageForm } from 'reducers/misc';\n\nconst SubscribeFreeTrial: React.FC<RouteComponentProps> = () => {\n  const dispatch = useDispatch();\n  const navigate = useNavigate();\n\n  useEffect(() => {\n    return () => {\n      //clear choose free trial package form\n      dispatch(clearPackageForm());\n    };\n  }, []);\n\n  return (\n    <Page isPublic={false} className={'SubscribePage'}>\n      <div className=\"PageContent WidthContent NewSubscriptionPage\">\n        <FormHeader\n          activeStep={1}\n          numOfSteps={1}\n          title={AddFreeTrialParser.getPageHeaderInfo(1).title}\n          nextStep={AddFreeTrialParser.getPageHeaderInfo(1).nextStep}\n        />\n        <ChooseFreeTrialPackageForm\n          onSubmit={() => navigate(AppPath.DASHBOARD)}\n        />\n      </div>\n    </Page>\n  );\n};\n\nexport default SubscribeFreeTrial;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoAQMAAAC2MCouAAAABlBMVEVHcEwmMzkIhFM7AAAAAXRSTlMAQObYZgAAABpJREFUCNdjYEABNjQl7f////8HC0lre5EAAGitGGHcN/3dAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoAQMAAAC2MCouAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAZQTFRFAAAAJjM5MslupQAAAAJ0Uk5TAP9bkSK1AAAAGElEQVR4nGNkAAFG+pD2BxgY/mIh6egGAMnlCBlb+ua9AAAAAElFTkSuQmCC\"","import React from 'react';\n\ntype ToggleSwitchProps = {\n  onChange: (e: any) => void;\n  value: boolean;\n  readOnly?: boolean;\n  htmlId?: string;\n  disable?: boolean;\n};\n\nconst ToggleSwitch: React.FC<ToggleSwitchProps> = ({ \n    onChange, \n    value, \n    readOnly, \n    htmlId,\n    disable\n}) => {\n    return (\n        <label className={\"ToggleSwitch\" + (disable ? \" Disable\" : \"\")}>\n            <input\n                type=\"checkbox\"\n                onChange={onChange}\n                checked={value}\n                readOnly={readOnly}\n                disabled={readOnly}\n                id={htmlId}\n            />\n            <span></span>\n        </label>\n    );\n};\n\nexport default ToggleSwitch;\n","import React, { SetStateAction, useEffect, useState } from 'react';\nimport { Link } from '@reach/router';\nimport { Dispatch } from 'react';\nimport CrossIcon from '../../images/Icon_Cross_01.png';\nimport MinusIcon from '../../images/Icon_Minus_01.png';\nimport ToggleSwitch from \"./ToggleSwitch\";\nimport Cookies from 'universal-cookie';\nimport { DOMAIN } from '../../endpoints.config';\nimport { PopupOrPanel } from '../../components/popupsAndPanels/PopupAndPanels';\n\ntype CookieSettingsPopupProps = {\n  toggleCookieSettings: boolean;\n  setToggleCookieSettings: Dispatch<SetStateAction<boolean>>;\n};\n\ntype CookiesListDescProps = {\n  category: string;\n  open: boolean;\n  name: string;\n  description: string;\n};\n\ntype CookiesListProps = {\n  category: string;\n  name: string;\n};\n\nconst CookieSettingsPopup: React.FC<CookieSettingsPopupProps> = ({\n  toggleCookieSettings,\n  setToggleCookieSettings\n}) => {\n  const [cookiesList, setCookiesList] = useState<CookiesListDescProps[]>(getCookieDescriptions());\n  const [cookiesListUpdated, setCookiesListUpdated] = useState<boolean>(false);\n  const [functionalCookiesOn, setFunctionalCookiesOn] = useState<boolean>(true);\n  const [marketingCookiesOn, setMarketingCookiesOn] = useState<boolean>(true);\n\n\n  const acceptSiteCookies = () => {\n    const cookies = new Cookies();\n    const date = new Date();\n    date.setMonth(date.getMonth() + 1);\n\n    cookies.set('cookie_settings', \"all_cookies\", {\n      expires: date,\n      domain: DOMAIN,\n      sameSite: \"none\",\n      secure: true\n    }); \n\n    window.location.reload();\n  };\n\n  const rejectSelectedSiteCookies = () => {\n    let cookieValStr = \"\";\n    \n    if (!functionalCookiesOn && !marketingCookiesOn) {\n      cookieValStr = \"functional_and_marketing\";\n    } else if (!functionalCookiesOn) {\n      cookieValStr = \"functional\";\n    } else if (!marketingCookiesOn) {\n      cookieValStr = \"marketing\";\n    }                        \n\n    const cookies = new Cookies();\n    const date = new Date();\n    date.setMonth(date.getMonth() + 1);\n\n    cookies.set('cookie_settings', cookieValStr, {\n      expires: date,\n      domain: DOMAIN,\n      sameSite: \"none\",\n      secure: true\n    });\n\n    window.location.reload();\n  };\n\n  const rejectSiteCookies = () => {\n    const cookies = new Cookies();\n    const date = new Date();\n    date.setMonth(date.getMonth() + 1);\n\n    cookies.set('cookie_settings', \"functional_and_marketing\", {\n      expires: date,\n      domain: DOMAIN,\n      sameSite: \"none\",\n      secure: true\n    });\n\n    window.location.reload();\n  };  \n\n\n  useEffect(() => {\n    if(cookiesListUpdated){\n      setCookiesListUpdated(false);\n    }\n  }, [cookiesListUpdated]);\n\n  const toggleCookieShow = (cookie_index: number) => {\n    let cookiesListCopy = cookiesList;\n    cookiesListCopy[cookie_index].open = !cookiesListCopy[cookie_index].open;\n    setCookiesList(cookiesListCopy);\n    setCookiesListUpdated(true);\n  };\n\n\n  const submitSelectedCookies = () => {\n    if(functionalCookiesOn && marketingCookiesOn){\n      acceptSiteCookies();\n    } else {\n      rejectSelectedSiteCookies();\n    }\n\n    window.location.reload();\n  };\n\n\n  return (\n    <PopupOrPanel\n      isPopup={true}\n      isOpen={toggleCookieSettings}\n      hdrTitle={'Cookie settings'}\n      position=\"right\"\n      primaryBtnTxt=\"Accept selected\"\n      givenClass=\"CookieSettingsPopup\"\n      primaryBtnColor=\"BtnRed\"\n      handleClose={() => setToggleCookieSettings(false)}\n      handlePrimaryBtn={() => submitSelectedCookies()}\n      width={460}\n    >\n      <>\n        <p>\n          We use cookies to give you the best online experience. By using our\n          website you agree to our use of cookies in accordance with our cookie\n          policy. <a href=\"https://getset4education.co.uk/info/cookie-policy\" target=\"_blank\" rel=\"noreferrer\">Learn more here</a>\n        </p>\n\n        <div className=\"AcceptCookieBtnRow\">\n          <div className=\"Btn AcceptBtn\" onClick={() => { acceptSiteCookies(); setToggleCookieSettings(false); }}>Accept all</div>\n          <div className=\"Btn RejectBtn\" onClick={() => { rejectSiteCookies(); setToggleCookieSettings(false); }}>Reject All Non-Essential</div>\n        </div>\n\n        <div className=\"CookieCategoryList\">\n          <div className=\"CategoryBlock\">\n            <div className=\"CBInner\">\n              <div className=\"BtnCol\">\n                <ToggleSwitch\n                  onChange={(e) => { }}\n                  value={true}\n                  disable={true}\n                />\n              </div>\n              <div className=\"InfoCol\">\n                <div className=\"CategoryHdr\">Necessary cookies</div>\n                <p>Cookies that are used by the website to function properly, without which the site would not work.</p>\n\n                <div className=\"CookiesList\">\n                  {cookiesList.map((item, index) => {\n                    if(item.category === \"necessary\"){\n                      return (\n                        <div className=\"CookieDetailsRow\" key={\"Necessary_Cookie_Detail_Row_\" + index}>\n                          <div className=\"CDInner\">\n                            <div \n                              className=\"ToggleIconCol\"\n                              onClick={() => toggleCookieShow(index)}\n                            >\n                              <img src={item.open ? MinusIcon : CrossIcon} alt={(item.open ? \"Close\" : \"Open\") + \" cookie \" + item.name} />\n                            </div>\n                            <div className=\"InfoTxtCol\">\n                              <div className=\"CookieLabel\">{item.name}</div>\n                              {item.open &&\n                                <div className=\"CookieDesc\">\n                                  <p>{item.description}</p>\n                                </div>\n                              }\n                            </div>\n                          </div>\n                        </div>\n                      );\n                    } else {\n                      return null;\n                    }\n                  })}\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <div className=\"CategoryBlock\">\n            <div className=\"CBInner\">\n              <div className=\"BtnCol\">\n                <ToggleSwitch\n                  onChange={(e) => setFunctionalCookiesOn(!functionalCookiesOn)}\n                  value={functionalCookiesOn}\n                />\n              </div>\n              <div className=\"InfoCol\">\n                <div className=\"CategoryHdr\">Functional cookies</div>\n                <p>Cookies that help enhance a website's performance and functionality.</p>\n\n                <div className=\"CookiesList\">\n                  {cookiesList.map((item, index) => {\n                    if(item.category === \"functional\"){\n                      return (\n                        <div className=\"CookieDetailsRow\" key={\"Functional_Cookie_Detail_Row_\" + index}>\n                          <div className=\"CDInner\">\n                            <div \n                              className=\"ToggleIconCol\"\n                              onClick={() => toggleCookieShow(index)}\n                            >\n                              <img src={item.open ? MinusIcon : CrossIcon} alt={(item.open ? \"Close\" : \"Open\") + \" cookie \" + item.name} />\n                            </div>\n                            <div className=\"InfoTxtCol\">\n                              <div className=\"CookieLabel\">{item.name}</div>\n                              {item.open &&\n                                <div className=\"CookieDesc\">\n                                  <p>{item.description}</p>\n                                </div>\n                              }\n                            </div>\n                          </div>\n                        </div>\n                      );\n                    } else {\n                      return null;\n                    }\n                  })}\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <div className=\"CategoryBlock\">\n            <div className=\"CBInner\">\n              <div className=\"BtnCol\">\n                <ToggleSwitch\n                  onChange={(e) => setMarketingCookiesOn(!marketingCookiesOn)}\n                  value={marketingCookiesOn}\n                />\n              </div>\n              <div className=\"InfoCol\">\n                <div className=\"CategoryHdr\">Marketing cookies</div>\n                <p>Cookies used to track users' online behavior for marketing purposes.</p>\n\n                <div className=\"CookiesList\">\n                  {cookiesList.map((item, index) => {\n                    if(item.category === \"marketing\"){\n                      return (\n                        <div className=\"CookieDetailsRow\" key={\"Marketing_Cookie_Detail_Row_\" + index}>\n                          <div className=\"CDInner\">\n                            <div \n                              className=\"ToggleIconCol\"\n                              onClick={() => toggleCookieShow(index)}\n                            >\n                              <img src={item.open ? MinusIcon : CrossIcon} alt={(item.open ? \"Close\" : \"Open\") + \" cookie \" + item.name} />\n                            </div>\n                            <div className=\"InfoTxtCol\">\n                              <div className=\"CookieLabel\">{item.name}</div>\n                              {item.open &&\n                                <div className=\"CookieDesc\">\n                                  <p>{item.description}</p>\n                                </div>\n                              }\n                            </div>\n                          </div>\n                        </div>\n                      );\n                    } else {\n                      return null;\n                    }\n                  })}\n                </div>\n              </div>\n            </div>\n          </div>                        \n        </div>\n      </>\n    </PopupOrPanel>\n  );\n};\n\n\nconst getCookieDescriptions = () => {\n  return [\n    { category: \"necessary\", open: false, name: \"AT\", description: \"Holds access token allowing access to user session.\" },\n    { category: \"necessary\", open: false, name: \"ATE\", description: \"Holds access token expiry date for when the user session ends.\" },\n    { category: \"necessary\", open: false, name: \"RT\", description: \"Holds token to refresh the access token to keep existing user session.\" },\n    { category: \"necessary\", open: false, name: \"RTE\", description: \"Holds refresh token expiry date.\" },\n    { category: \"necessary\", open: false, name: \"lastExternalReferrer\", description: \"Used to store the last external referrer for a user. It is set by the Google Analytics JavaScript library. This cookie is created after a user initially clicks a client's ad, and is used to track user clicks and interactions on the website with a user ID.\" },\n    { category: \"necessary\", open: false, name: \"lastExternalReferrerTime\", description: \"Detects how the user reached the website by registering their last URL-address.\" },\n    { category: \"necessary\", open: false, name: \"__RequestVerificationToken_Lw__\", description: \"An anti-forgery cookie set by web applications built using ASP.NET MVC technologies. It is designed to stop unauthorized posting of content to the website, known as Cross-Site Request Forgery.\" },\n    { category: \"necessary\", open: false, name: \"ASP.NET_SessionId\", description: \"An asp.net cookie that is automatically generated to identify the users session on the server.\" },\n    { category: \"necessary\", open: false, name: \"GETSET_SchoolUser / SchoolUser\", description: \"Holds the login session detail for the user, storing the info of who is logged in and what they have access to.\" },\n    { category: \"necessary\", open: false, name: \"__stripe_mid / __stripe_sid\", description: \"To remember who a user is and to enable the website to process payments without storing any credit card information on its servers.\" },\n    { category: \"functional\", open: false, name: \"UI\", description: \"Provides user initials for display on logged in user menu.\" },\n    { category: \"functional\", open: false, name: \"Accessibility mode\", description: \"Tailors the site for accessible users.\" },    \n    { category: \"marketing\", open: false, name: \"_clck\", description: \"Installed by Microsoft Clarity to store information of how visitors use a website and help in creating an analytics report of how the website is doing. The data collected includes the number of visitors, the source where they have come from, and the pages visited in an anonymous form.\" },\n    { category: \"marketing\", open: false, name: \"_clsk\", description: \"A first-party cookie developed and installed by Microsoft Clarity. Its primary job is to store and collect pageviews to compile into a single Clarity session recording, creating valuable insights for the site owner.\" },\n    { category: \"marketing\", open: false, name: \"_fbp\", description: \"A Facebook cookie used to distinguish and keep track of unique users. When the Facebook pixel is installed on a website, and the pixel uses first-party cookies, the pixel automatically saves a unique identifier to an _fbp cookie for the website domain if one does not already exist.\" },\n    { category: \"marketing\", open: false, name: \"_ga\", description: \"This cookie is used by Google Analytics to distinguish between users. It calculates visitor, session, campaign data and keeps track of site usage for the site's analytics report. It stores information anonymously and assigns a randomly generated number to identify unique visitors.\" },\n    { category: \"marketing\", open: false, name: \"_gcl_au\", description: \"Used by Google AdSense for experimenting with advertisement efficiency across websites using their services.\" },\n    { category: \"marketing\", open: false, name: \"_gid\", description: \"This cookie is used by Google Analytics for user identification. It stores information on how visitors use a website and helps in creating an analytics report of how the website is doing. The data collected includes the number of visitors, the source where they have come from, and the pages visited in an anonymous form.\" }\n  ];\n};\n\n\nexport default CookieSettingsPopup;\n","import React, { useState } from 'react';\nimport { Link } from '@reach/router';\nimport Cookies from 'universal-cookie';\nimport { DOMAIN } from '../../endpoints.config';\nimport CookieSettingsPopup from './CookieSettingsPopup';\n\nconst CookieBanner = () => {\n  const [toggleCookieSettings, setToggleCookieSettings] = useState<boolean>(false);\n\n  const acceptSiteCookies = () => {\n    const cookies = new Cookies();\n    const date = new Date();\n    date.setMonth(date.getMonth() + 1);\n\n    cookies.set('cookie_settings', \"all_cookies\", {\n      expires: date,\n      domain: DOMAIN,\n      sameSite: \"none\",\n      secure: true\n    }); \n\n    window.location.reload();\n  };\n\n  const rejectSiteCookies = () => {\n    const cookies = new Cookies();\n    const date = new Date();\n    date.setMonth(date.getMonth() + 1);\n\n    cookies.set('cookie_settings', \"functional_and_marketing\", {\n      expires: date,\n      domain: DOMAIN,\n      sameSite: \"none\",\n      secure: true\n    });\n\n    window.location.reload();\n  };\n\n\n  return (\n    <>\n      {!toggleCookieSettings &&\n        <div className=\"CookieBanner\">\n          <div className=\"CookieBannerContent\">\n            <div className=\"InfoTxt\">\n              <p>\n                We use cookies to give you the best online experience. By using our\n                website you agree to our use of cookies in accordance with our cookie\n                policy. <a href=\"https://getset4education.co.uk/info/cookie-policy\" target=\"_blank\" rel=\"noreferrer\">Learn more here</a>\n              </p>\n            </div>\n            <button className=\"Btn AcceptBtn\" onClick={acceptSiteCookies}>\n              Accept All\n            </button>\n            <button className=\"Btn RejectBtn\" onClick={rejectSiteCookies}>\n              Reject All Non-Essential\n            </button>\n            <button className=\"Btn SettingsBtn\" onClick={() => setToggleCookieSettings(true)}>\n              Cookie settings\n            </button>        \n          </div>    \n        </div>      \n      }\n\n      {toggleCookieSettings &&\n        <CookieSettingsPopup \n          toggleCookieSettings={toggleCookieSettings}\n          setToggleCookieSettings={setToggleCookieSettings}\n        />\n      }\n    </>\n  );\n};\n\nexport default CookieBanner;\n","import { useState, useEffect } from 'react';\nimport { Router } from '@reach/router';\nimport { AppPath } from 'appConstants';\nimport { Dashboard } from 'pages/dashboard/Dashboard';\nimport { NewSubscription } from 'pages/newSubscription/NewSubscription';\nimport { Profile } from 'pages/profile/Profile';\nimport { ManageUsers } from 'pages/manageUsers/ManageUsers';\nimport { ManageSchool } from 'pages/manageSchool/ManageSchool';\nimport { Invoices } from 'pages/invoices/Invoices';\nimport { SignIn } from 'pages/SignIn';\nimport { ForgottenPassword } from 'pages/ForgottenPassword';\nimport { ResetPassword } from 'pages/ResetPassword';\nimport { Subscribe } from 'pages/subscribe/Subscribe';\nimport { Subscriptions } from 'pages/subscriptions/Subscriptions';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { checkSignedIn, selectAppVisible } from 'reducers/auth';\nimport { selectAccessibilityMode } from 'reducers/misc';\nimport Toast from 'components/toast/Toast';\nimport InvoicePage from 'pages/invoices/InvoicePage';\nimport UpgradeFreeSubscriptions from 'pages/upgradeSubscription/UpgradeFreeSubscriptions';\nimport SubscribeFreeTrial from 'pages/subscribeFreeTrial/SubscribeFreeTrial';\nimport { SetPassword } from 'pages/SetPassword';\nimport NotFound from 'pages/NotFound';\nimport ErrorBoundary from 'components/errorBoundary/ErrorBoundary';\nimport ErrorFallback from 'components/errorFallback/ErrorFallback';\nimport AddFreeTrial from 'pages/addFreeTrial/AddFreeTrial';\nimport { BlockCopyandPaste } from 'helpers/blockCopyandPaste';\nimport CookieBanner from './components/shared/CookieBanner';\nimport Cookies from 'universal-cookie';\n\nconst App = () => {\n  const dispatch = useDispatch();\n  const accessibilityMode = useSelector(selectAccessibilityMode);\n  const [cookieSettingsSelection, setCookieSettingsSelection] = useState<string>('');\n\n  dispatch(checkSignedIn());\n  const showApp = useSelector(selectAppVisible);\n\n  useEffect(() => {\n    BlockCopyandPaste();\n  }, []);\n\n  useEffect(() => {\n    let cookieSettingFlag = new Cookies();\n    setCookieSettingsSelection(cookieSettingFlag.get('cookie_settings') ? cookieSettingFlag.get('cookie_settings') : \"\");\n  }, []);\n\n  if (!showApp) {\n    return null;\n  }\n\n  return (\n    <ErrorBoundary fallback={<ErrorFallback />}>\n      <div className={'App' + (accessibilityMode ? ' accessible' : '')}>\n        <Router>\n          {[AppPath.SIGN_IN, AppPath.ROOT].map((path: string, i: number) => (\n            <SignIn path={path} key={i} />\n          ))}\n          <SignIn path={AppPath.SIGN_IN} />\n          <ForgottenPassword path={AppPath.FORGOTTEN_PASSWORD} />\n          <ResetPassword path={AppPath.RESET_PASSWORD} />\n          <SetPassword path={AppPath.SET_PASSWORD} />\n          <Subscribe path={AppPath.SUBSCRIBE} />\n          <SubscribeFreeTrial path={AppPath.SUBSCRIBE_FREE_TRIAL} />\n          <Dashboard path={AppPath.DASHBOARD} />\n          <Subscriptions path={AppPath.SUBSCRIPTIONS} />\n          <NewSubscription path={AppPath.NEW_SUBSCRIPTION} />\n          <AddFreeTrial path={AppPath.NEW_FREE_TRIAL} />\n          <UpgradeFreeSubscriptions path={AppPath.UPGRADE_SUBSCRIPTION} />\n          <Profile path={AppPath.PROFILE} />\n          <ManageUsers path={AppPath.MANAGEUSERS} />\n          <ManageSchool path={AppPath.MANAGESCHOOL} />\n          <Invoices path={AppPath.INVOICES} />\n          <InvoicePage path={AppPath.INVOICE_PAGE} />\n          <NotFound default />\n        </Router>\n        <Toast />\n        {!cookieSettingsSelection && <CookieBanner />}\n      </div>\n    </ErrorBoundary>\n  );\n};\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport { rootEpic, rootReducer } from 'reducers/rootReducer';\nimport { composeWithDevTools } from 'redux-devtools-extension';\nimport { applyMiddleware, createStore } from 'redux';\nimport { createEpicMiddleware } from 'redux-observable';\nimport App from './App';\nimport './styles/Main.scss';\nimport 'react-datepicker/dist/react-datepicker.css';\nimport { StripeProvider } from 'react-stripe-elements';\nimport { STRIPE_KEY } from 'appConstants';\n\nconst epicMiddleware = createEpicMiddleware();\n\nconst configureStore = () => {\n  const store = createStore(\n    rootReducer,\n    composeWithDevTools(applyMiddleware(epicMiddleware))\n  );\n  epicMiddleware.run(rootEpic);\n  return store;\n};\n\nexport const store = configureStore();\n\nReactDOM.render(\n  <StripeProvider apiKey={STRIPE_KEY}>\n    <Provider store={store}>\n      <App />\n    </Provider>\n  </StripeProvider>,\n  document.getElementById('root')\n);\n"],"sourceRoot":""}