{"version":3,"sources":["components/Layout/Layout.module.scss","components/CalculationResults/CalculationSummary.module.scss","components/CalculationPage/CalculationStepper.module.scss","theme/theme.module.scss","components/Header/Header.module.scss","components/NewsItem/NewsItemBanner.module.scss","theme/overrides.module.scss","components/ConstructionTypeSelection/ConstructionTypeSelection.module.scss","components/Calculation/Calculation.module.scss","helpers/routeHelper.ts","store/account/account.action-types.ts","store/account/account.actions.ts","types/application/response-code.types.ts","store/account/account.action-creators.ts","store/authentication/authentication.action-creators.ts","config/config.ts","store/component-state/component-state.selectors.ts","store/component-state/component-state.actions.ts","store/component-state/component-state.action-types.ts","authentication/authProvider.ts","i18n.ts","components/Header/CultureSelect/useSupportedCultures.ts","helpers/memory-helper.ts","components/Header/CultureSelect/CultureSelect.mobile.tsx","components/Header/CultureSelect/CultureSelect.desktop.tsx","components/Header/CultureSelect/CultureSelect.tsx","components/Header/Navigation/Navigation.mobile.tsx","types/domain/navigation-item.types.ts","components/Header/Navigation/Navigation.tablet.tsx","components/Header/Navigation/Navigation.desktop.tsx","store/authentication/authentication.selectors.ts","store/account/account.selectors.ts","components/Header/Navigation/Navigation.tsx","components/Header/Header.tsx","types/domain/construction-data.types.ts","store/current-calculation-data/current-calculation-data.action-types.ts","store/current-calculation-data/current-calculation-data.actions.ts","store/current-calculation-data/current-calculation-data.reducer.ts","store/current-calculation-data/current-calculation-data.selectors.ts","helpers/calculation-response-helper.ts","store/current-calculation-data/current-calculation-data.action-creators.ts","components/Layout/ErrorBar.tsx","components/Footer/Address/Address.tsx","components/Footer/Contact/Contact.tsx","components/Footer/TechSupportBar/TechSupportBar.tsx","common/links.ts","components/Footer/FooterLinks.tsx","components/Footer/Footer.tsx","components/Layout/Layout.tsx","components/Layout/LayoutMinimal.tsx","store/construction-data/construction-data.action-types.ts","store/construction-data/construction-data.reducer.ts","store/component-state/component-state.reducer.ts","store/authentication/authentication.reducer.ts","store/account/account.reducer.ts","store/calculations/calculations.reducer.ts","store/news-item/news-item.reducer.ts","store/store.ts","store/calculations/calculations.action-types.ts","store/news-item/news-item.action-types.ts","theme/theme.ts","store/construction-data/construction-data.selectors.ts","components/ConstructionTypeSelection/SignInDialog.tsx","components/ConstructionTypeSelection/ConstructionTypeSelection.tsx","store/news-item/news-item.actions.ts","store/news-item/news-item.selectors.ts","components/NewsItem/NewsItemBanner.tsx","store/news-item/news-item.action-creators.ts","components/CalculationProjectDetails/PerimeterAndArea/perimeter-area.types.ts","components/CalculationProjectDetails/PerimeterAndArea/PerimeterAndArea.tsx","components/CalculationProjectDetails/CalculationProjectDetails.tsx","components/CalculationLayer/MaterialDropDown.tsx","components/CalculationLayer/ThicknessSlider.tsx","components/CalculationLayer/NoSlider.tsx","components/CalculationLayer/MaterialParametersAux.tsx","components/CalculationLayer/MaterialParameters.tsx","components/CalculationLayer/AnchorParameters.tsx","components/CalculationLayer/AnchorPreCalculatedParameters.tsx","components/CalculationLayer/WoodPercentage.tsx","components/CalculationLayer/AirCavityThickness.tsx","components/CalculationLayer/AirCavity.tsx","components/Calculation/hyphenSuggestion.ts","components/Calculation/LayerName.tsx","components/CalculationLayer/CalculationLayer.tsx","components/FormatNumber/FormatNumber.tsx","components/RcValue/RcValue.tsx","components/Calculation/CalculationWizardControls.tsx","components/Calculation/Calculation.tsx","store/construction-data/construction-data.actions.ts","store/construction-data/construction-data.action-creators.ts","store/calculations/calculations.selectors.ts","components/EmailDialogs/EmailDialog.tsx","common/pdf.ts","store/calculations/calculations.action-creators.ts","store/calculations/calculations.actions.ts","components/CalculationResults/ThicknessBuildUp.tsx","components/CalculationResults/ThicknessComparison.tsx","components/CalculationResults/CalculationSummary.tsx","helpers/toast-helpers.ts","components/CalculationResults/CalculationResults.tsx","components/CalculationPage/CalculationStepper.tsx","components/CalculationPage/calculation-page.types.ts","components/CalculationPage/CalculationPage.tsx","store/component-state/component-state.action-creators.ts","components/ChooseCountry/ChooseCountry.tsx","components/App/CountryRoute.tsx","components/AccountDetails/PersonalInformation.tsx","components/AccountDetails/BusinessInformation.tsx","components/AccountDetails/AccountDetails.tsx","components/PasswordReset/PasswordReset.tsx","types/domain/calculation-data.types.ts","components/MyCalculations/MyCalculations.desktop.tsx","components/MyCalculations/MyCalculations.mobile.tsx","components/MyCalculations/MyCalculations.tsx","interceptors/interceptors.ts","components/App/CountriesProvider.tsx","components/App/App.tsx","index.tsx","isUnsupportedBrowser.ts","components/CalculationProjectDetails/PerimeterAndArea/PerimeterAndArea.module.scss","components/ChooseCountry/ChooseCountry.module.scss","assets/images/kingspan-logo.svg"],"names":["module","exports","buildRoute","store","relativeRoute","countryId","componentState","selectedCountry","buildRouteWithCountry","route","isEmpty","toLowerCase","startsWith","fetchUserSuccess","data","isNewUser","type","payload","user","ResponseCode","authenticationActionCreatorOverrides","console","log","debouncedFetchUser","debounce","async","dispatch","status","axios","post","withCredentials","CREATED","error","fetchUserFailure","fetchUser","AuthenticationActionCreators","loginSuccessful","AuthenticationActions","LoginSuccess","appConfig","getAppConfig","activeConstructionLayerSelector","constructionData","layers","activeConstructionTypeId","filter","l","constructionLayerId","activeConstructionLayerId","activeConstructionTypeIdSelector","activeConstructionTypeSelector","types","find","ct","id","countriesSelector","countries","isLoadingCountriesSelector","countrySelector","countryIdSelector","calculationResultLoadingStateSelector","isCalculationResultLoading","isLoadingSelector","isLoading","isLoadingConstructionTypesSelector","isLoadingConstructionTypes","errorSelector","calculationResultErrorSelector","calculationResultError","selectedCultureSelector","selectedCulture","downloadingCalculationIdSelector","downloadingCalculationId","getIsGtmContainerSet","isGtmContainerSet","projectConfigSelector","projectConfig","countiesSelector","counties","fieldDataSelector","fieldData","setActiveConstructionType","constructionType","setActiveConstructionLayer","setCountries","setSelectedCulture","setProjectConfig","config","setCounties","setFieldData","currentLocale","undefined","baseAuthConfig","auth","clientId","azureB2CConfig","postLogoutRedirectUri","window","location","origin","redirectUri","validateAuthority","navigateToLoginRequestUrl","cache","cacheLocation","storeAuthStateInCookie","getAuthority","policyName","authority","policies","buildAuthenticationParameters","extraQueryParameters","launchRedirectToPasswordReset","myMSALObj","UserAgentApplication","setTimeout","loginRedirect","toast","info","i18n","t","autoClose","checkAndRedirectIfIsForgotPasswordError","errorMessage","indexOf","err","authProviderInternal","authProviderFactory","MsalAuthProvider","scopes","loginType","useRedirectLoginType","LoginType","Redirect","Popup","tokenRefreshUri","registerErrorHandler","handleRedirectCallback","response","use","Backend","LanguageDetector","initReactI18next","init","fallbackLng","debug","react","useSuspense","wait","interpolation","escapeValue","supportedCulturesPerCountry","useSelector","supportedCultures","setSupportedCultures","useState","useDispatch","useEffect","newSupportedCultures","toUpperCase","culture","some","supportedCulture","language","changeLanguage","locale","authProvider","authParams","getAuthenticationParameters","setAuthenticationParameters","changeAuthProviderLocale","localStorage","setItem","setCulture","newCulture","CultureSelectMobile","props","useTranslation","handleCultureSelection","anchorElement","handleMenuButtonClick","handleClose","ListItem","button","aria-controls","aria-haspopup","onClick","ListItemIcon","Avatar","ListItemText","primary","anchorEl","keepMounted","open","onClose","map","MenuItem","key","CultureSelectDesktop","Button","Grid","container","spacing","data-qa-id","item","CultureSelect","useSupportedCultures","isTablet","useMediaQuery","theme","breakpoints","between","isMobile","down","setAnchorElement","event","currentTarget","useStyles","makeStyles","createStyles","signedInAvatar","color","palette","getContrastText","deepPurple","backgroundColor","drawerList","minWidth","link","textDecoration","NavigationMobile","isAuthenticated","navigationItems","handleSignInClick","handleSignOutClick","classes","drawerOpen","setDrawerOpen","Box","IconButton","Drawer","anchor","className","List","dense","navigationItem","show","to","icon","translationKey","ListItemAvatar","src","getInitials","secondary","getUserName","name","givenName","familyName","NavigationItemId","NavigationTablet","justify","alignItems","MY_ACCOUNT","Link","component","variant","signInLinkContainer","marginRight","signedInWelcome","NavigationDesktop","marginBottom","Divider","style","float","isAuthenticatedSelector","authenticationState","initialized","state","AuthenticationState","Authenticated","isAuthenticationInitialized","loggedInUserSelector","accountData","loggedInUser","uploadCompanyLogoSelector","uploadCompanyLogoState","isConfirmedGuestSelector","isConfirmedGuest","Navigation","navigationProps","NEW_CALCULATION","MY_CALCULATIONS","login","logout","Header","styles","header","href","logo","alt","Category","LayerType","Complexity","ConstructionTypeAdditionalParameters","setThickness","thicknessMillimetres","isLinkedLayer","setAnchorDiameter","diameterOfAnchorsMillimetres","setAnchorAmountPerSquareMetre","numberOfAnchorsPerMetreSquare","setAnchorPenetration","anchorPenetrationDepthMillimetres","setNetAreaPerMetreSquare","netAreaOfAnchorsPerMetreSquareMillimetresSqrd","setWoodPercentage","percentage","initialState","calculationLayers","getCalculationLayerKey","toString","currentCalculationResultSelector","currentCalculationData","calculationResult","currentCalculationDataSelector","currentSelectedMaterialSelector","isLinkedMaterial","material","currentSelectedAirCavityGradingSelector","airCavityGrading","currentSelectedThicknessSelector","previousInsulationCalculationLayerSelector","constructionLayers","insluationLayerIndexes","cl","index","layer","layerType","Insulation","layerId","length","currentAnchorPropertiesSelector","projectDetailsSelector","projectDetails","additionalParametersSelector","additionalParameters","mapApiResponseToCalculcation","calc","result","startDate","parseISO","createdOn","updatedOn","reduce","obj","getDefaultMaterial","materials","m","isDefaultLayerMaterial","getDefaultLinkedMaterial","parentMaterial","linkedMaterials","getDefaultAirCavityGrading","airCavityGradings","ac","isDefaultLayerAirCavityGrading","mapToCalculationLayers","mappingFunction","bridgedInsulationLayerId","isWithinBridgingFrame","bridgingLayerId","Bridging","bridgedAirCavityLayerId","AirCavity","insulationLayer","airLayer","availableGradings","noAirLayerGrading","a","airCavityGradingId","defaultAirCavityGradingId","g","applyAutomaticBridgedInsulationAndAirCavityScenario","forEach","defaultMaterial","defaultLinkedMaterial","defaultThicknessMillimetres","buildCalculationLayersFromSaved","calculation","savedReferenceLayer","Object","values","calculationLayer","materialId","WoodPercentage","woodPercentage","Anchors","defaultDiameterOfAnchorsMillimetres","defaultNumberOfAnchorsPerMetreSquare","defaultAnchorPenetrationMillimetres","AnchorsPreCalculated","siteArea","county","size","ribaStatus","buildingUse","postcode","linkedLayer","setAirCavityGrading","getState","setAirCavityGradingInternal","setMaterialParameter","debouncedDispatchCalculationAttempt","setMaterial","setMaterialInternal","optionalDispatch","currentValue","options","action","optionsForNumberOfAnchorsPerMetreSquare","optionsForDiameterOfAnchorsMillimetres","optionsForAnchorPenetrationMillimetres","nextAirLayer","constructionTypeId","airLayers","insulationLayerIndex","i","getNextAirCavityLayer","defaultGrading","value","complexity","Simple","Complex","bridgingLayer","airCavityLayer","dispatchCalculationAttempt","dispatchCalculationAttemptInternal","buildCalculationData","fetchCalculationResultsSuccess","isNaN","fetchCalculationResultsFailure","message","constructionTypeLayers","pseudoLayers","isPseudoLayer","woodPercentageLayerId","entries","kvp","calculationId","calculationAccessCode","clientTimestamp","Date","getTime","cultureOfUser","formatDate","areaMetresSquared","perimeterMetres","date","getFullYear","appendLeadingZero","getMonth","getDate","n","ErrorBar","warn","my","Alert","severity","address","fontStyle","Address","Typography","parse","text","Contact","label1","contactNumber1","label2","contactNumber2","padding","iconContainer","justifyContent","display","contactInfo","fontSize","typography","caption","paddingLeft","techSupportContainer","grey","techLink","TechSupportBar","xs","textAlign","p","getLinks","previouslySelectedCountryId","getItem","i18nextLng","defaultLinks","cookiePolicy","privacyPolicy","marketingConsent","termsAndConditions","footerLinks","links","linkDatas","i18nKey","defaultName","width","paddingBottom","linkData","sm","target","rel","Trans","CookieControl","title","up","h1","h2","h3","h6","paddedGrid","Footer","md","paddingTop","Layout","children","script","document","createElement","body","appendChild","removeChild","Container","disableGutters","page","content","LayoutMinimal","getPreviouslySelectedCulture","navigator","initializing","Unauthenticated","calculations","deletingCalculations","middleware","thunk","createStore","combineReducers","newState","cloneDeep","latestNames","nameLocalized","he","constructionTypeNameLocalized","airLayerThickness","Math","max","currentGrading","keys","Initializing","Initialized","AcquiredIdTokenSuccess","idToken","AcquiredAccessTokenSuccess","accessToken","AcquiredAccessTokenError","account","LoginError","AcquiredIdTokenError","LogoutSuccess","AuthenticatedStateChanged","gdprConsent","OK","ok","c","newsItem","composeWithDevTools","applyMiddleware","themeOptions","lg","xl","direction","mixins","toolbar","minHeight","overrides","common","black","white","main","themeStyles","colorSecondaryGreyDarkest","light","dark","contrastText","colorHighlightGold","colorError","A100","A200","A400","A700","contrastThreshold","tonalOffset","colorTextBase","disabled","hint","divider","background","paper","default","colorSecondaryGreyLightest","active","hover","hoverOpacity","selected","disabledBackground","shadows","htmlFontSize","parseInt","fontSizeBase","fontFamily","fontWeightLight","fontWeightRegular","fontWeightMedium","fontWeightBold","fontWeight","fontSizeH1","lineHeight","letterSpacing","headerLetterSpacing","fontSizeH2","fontSizeH3","h4","fontSizeH4","h5","fontSizeH5","fontSizeH6","subtitle1","subtitle2","fontSizeSmall","body1","body2","textTransform","overline","shape","borderRadius","transitions","easing","easeInOut","easeOut","easeIn","sharp","duration","shortest","shorter","short","standard","complex","enteringScreen","leavingScreen","zIndex","mobileStepper","speedDial","appBar","drawer","modal","snackbar","tooltip","createMuiTheme","constructionDataSelector","constructionTypesSelector","constructionCategoriesSelector","sort","b","category","localeCompare","self","constructionTypeNameSelector","root","margin","closeButton","position","right","top","fullWidthButton","marginTop","SignInDialog","isMobileView","useStore","reasons","closeWindow","cont","setIsConfirmedGuest","Dialog","fullWidth","maxWidth","DialogTitle","disableTypography","aria-label","DialogContent","reason","DialogActions","provider","reduxStore","flexGrow","media","height","backgroundSize","backgroundPosition","ConstructionTypeSelection","history","useHistory","apiUrl","constructionTypes","categories","country","countryIdUpper","setOpen","React","selectedType","setSelectedType","resultType","calculationResultType","resultTypePlural","calculationStandardName","CircularProgress","Card","CardActionArea","selectedConstructionType","push","CardMedia","image","CardContent","gutterBottom","fetchNewsItemFailure","newsItemContentSelector","NewsItemBanner","get","params","currentConstructionType","oldConstructionType","fetchNewsItem","stopPropagation","url","newsItemBanner","AlertTitle","newsItemBannerText","subject","PerimeterAreaConstants","defaultPerimeter","defaultArea","PerimeterAndArea","getHelperText","maxValue","gte","maxPerimeter","InputLabel","htmlFor","paLabel","TextField","paTextFieldShort","inputProps","inputMode","min","defaultMinimum","perimeter","gt","helperText","onChange","perimeterValue","Number","setPerimeter","updatePerimeter","paUnits","paLabelShort","maxArea","area","areaValue","setArea","updateArea","paRatio","toFixed","formControl","CalculationProjectDetails","handleContinue","activeConstructionType","constructionTypeName","projectName","setProjectName","setStartDate","countiesFiltered","countyName","setCountyName","sizes","fieldName","statuses","uses","siteAreas","fieldNames","includes","projectSize","setProjectSize","projectType","setProjectType","projectRibaStatus","setRIBAStatus","projectBuidingUse","setBuildingUse","projectPostcode","setPostcode","setSiteArea","onContinueClick","isValid","validate","setProjectDetails","setAdditionalParameters","mx","label","utils","DateFnsUtils","localeCode","locales","Locales","replace","substring","getLocale","disableToolbar","format","inputVariant","FormControl","Select","labelId","code","FormHelperText","MaterialDropDown","currentSelectedMaterial","parentSelectedMaterial","useStyle","depthDropdownContainer","ThicknessSlider","labelKey","handleChange","selectedThickness","marks","defaultValue","units","isValueFixed","setValue","Slider","newValue","onChangeCommitted","aria-labelledby","valueLabelDisplay","step","thicknesses","displayEmpty","mark","NoSlider","MaterialParametersAux","currentSelectedThickness","isFixedLayer","optionsForThicknessMillimetres","MaterialParameters","currentSelectedMatrial","AnchorParameters","previousInsulationLayer","setOptionsForAnchorPenetrationMillimetres","o","defaultMarks","areaMarks","currentWoodPercentage","round","defaultWoodPercentage","AirCavityThickness","currentSelectedAcg","handleThicknessChange","softHyphenChar","String","fromCharCode","insertSuggestedHyphenation","layerName","split","word","slice","join","getText","insertSuggestedHyphenationIfRequired","userAgent","LayerName","renderControls","selectedMaterial","CalculationLayer","layerTooltipText","Tooltip","enterTouchDelay","renderLayerHeader","FormatNumber","toFormat","toLocaleString","minimumFractionDigits","maximumFractionDigits","wrapper","resultProgress","left","marginLeft","loadingClass","opacity","RcValue","resultValue","resultUnits","totalThicknessMillimetres","CalculationWizardControls","activeStepIndex","steps","handleBackClick","handleNextClick","startIcon","renderLabel","endIcon","Calculation","handleNextStep","handlePreviousStep","hasSteps","fetchConstructionLayersForTypeSuccess","fetchConstructionLayersForTypeFailure","fetchConstructionLayersForType","refetch","headers","dataWithPseudoLayers","constructPseudoLayers","newCalculationStarted","defaultAirCavityGrading","startNewCalculation","fetchConstructionLayersForCalculation","copy","copyCalculationStarted","startCopyCalculation","editCalculationStarted","startEditCalculation","Error","pseudoLayer","calculationArraySelector","compareDesc","deletingCalculationsSelector","buttonWrapper","buttonProgress","checkboxLabel","checkbox","EmailDialog","handleSend","sending","guestEmail","setGuestEmail","sendingState","setSendingState","gdprConsentGiven","setGdprConsentChecked","directMarketingConsentLink","privacyPolicyLink","FormControlLabel","control","Checkbox","checked","defaults","components","anchorlinkMarketing","anchorlinkPrivacy","labelPlacement","fetchCalculation","fetchCalculationSuccess","mapApiResponseArrayToCalculcationObjectCollection","fetchCalculationFailure","downloadCalculation","emailAddress","downloadCalculationAttempt","downloadCalculationSuccess","downloadCalculationFailure","directDownloadCalculation","downloadPdfCalculationAttempt","responseType","filename","blob","Blob","download","URL","createObjectURL","click","downloadPdf","downloadPdfCalculationSuccess","downloadPdfCalculationFailure","materialName","buildUpContainer","buildUpMaterial","borderColor","buildUpMaterialInsulation","borderTopRightRadius","borderBottomRightRadius","buildUpMaterialInnerWall","borderTopLeftRadius","borderBottomLeftRadius","constructionThicknessBracket","thicknessLabel","kingSpan","ThicknessBuildUp","border","isKingspanProduct","layerThicknessPercentageNormalised","borderRight","borderLeft","borderBottom","totalConstructionThicknessMillimetres","tagLine","ThicknessComparison","thicknessComparison","sourceMaterialName","sourceTotalConstructionThicknessMillimetres","comparisonMaterialName","comparisonTotalConstructionThicknessMillimetres","layerThicknessSavingPercentage","summaryContainer","summary","panelsContainer","panel","verticalAlign","compliant","nonCompliant","CalculationSummary","results","layerList","resultLayer","constructionLayer","getAvailableMaterials","calculationLayerKey","layerProperties","x","layerPropertiesChevron","isBengCompliant","align","displayPdfDownloadToast","success","CalculationResults","handleBack","guestDialogOpen","setGuestDialogOpen","downloadingState","setDownloadingState","TagManager","dataLayer","isInitialised","useRef","current","handleDownloadClick","calculationName","handleDirectDownloadClick","hyphens","CalculationStepper","isTabletView","handleBreadcrumbStepChange","toNumber","Stepper","nonLinear","alternativeLabel","activeStep","Step","StepButton","StepLabel","StepIconComponent","StepIcon","stepIcon","circle","CalculationStep","constructor","CalculationStage","CalculationPage","useParams","search","useLocation","constructionLayerSelector","calculationSelector","isCopy","setActiveStepIndex","setSteps","selectStep","stepToSelect","urlParts","calculationStage","setCalculationStage","INITIALIZING","layerSteps","finishStep","isResultsStep","searchParams","URLSearchParams","has","parseSearch","layerIndex","findIndex","CALCULATION","RESULTS","PROJECT_DETAILS","stepper","newStepIndex","ChooseCountry","kingspanLogo","prompt","countryList","localizedName","longName","footer","disclaimer","CountryRoute","match","useRouteMatch","isAnalyticalCookiesAccepted","cookieControl","cookies","cookie","trim","decodeURIComponent","getCookies","optionalCookies","JSON","AnalyticalCookies","getIsAnalyticalCookiesAccepted","setPreviouslySelectedCountryId","gtmTrackingIds","gtmTrackingId","tagManagerArgs","gtmId","initialize","initialiseGTMContainer","setSelectedCountry","closeOnClick","fetchProjectConfig","PersonalInformation","phone","companyLogo","BusinessInformation","uploadSuccessful","companyLogoBase64","file","fileName","files","formData","FormData","append","uploadCompanyLogoSuccess","BAD_REQUEST","uploadCompanyLogoBadRequest","errorCode","args","uploadCompanyLogoFailure","accept","companyName","streetAddress","city","postalCode","AccountDetails","PasswordReset","accountInfo","CalculationResultType","table","progressContainer","MyCalculationsDesktop","handleDeleteClick","isDeleting","isDownloading","isCalculationDownloading","only","TableContainer","Paper","Table","TableHead","TableRow","TableCell","RValue","TableBody","scope","nested","MyCalculationsMobile","displayableCalculations","setDisplayableCalculations","opens","setOpens","groupBy","acc","getProjectStartDate","subheader","ListSubheader","handleItemClick","Collapse","in","timeout","unmountOnExit","disablePadding","ListItemSecondaryAction","edge","MyCalculations","isAuthInitialized","deletingCalculationsStore","deletingCalculationIds","setDeletingCalclationIds","deleteCalculationAttempt","delete","deleteCalculationSuccess","deleteCalculationFailure","deleteCalculation","axiosDefault","baseURL","interceptors","request","Promise","reject","getIdToken","rawIdToken","CountriesProvider","isLoadingCountries","showAllCountries","fetchConstructionTypesSuccess","fetchConstructionTypesFailure","fetchConstructionTypes","fetchConstructionTypeNamesSuccess","fetchConstructionTypeNames","Loader","App","registerReduxStore","ThemeProvider","I18nextProvider","CssBaseline","fallback","exact","path","forceLogin","render","Msal","browser","cmp","version","isUnsupportedBrowser","detect","unsupportedBrowserBannerEl","getElementById","clientConfig","fetch","json","configData","ReactDOM","e"],"mappings":"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","file":"static/js/main.3c359e59.chunk.js","sourcesContent":["// extracted by mini-css-extract-plugin\nmodule.exports = {\"spacing\":\"8px\",\"maxWidth\":\"1280px\",\"fontSizeBase\":\"1em\",\"fontSizeSmall\":\".875em\",\"fontSizeSmallest\":\".75em\",\"fontSizeH1\":\"2.5em\",\"fontSizeH2\":\"2em\",\"fontSizeH3\":\"1.75em\",\"fontSizeH4\":\"1.5em\",\"fontSizeH5\":\"1.25em\",\"fontSizeH6\":\"1em\",\"headerLetterSpacing\":\"-.05em\",\"fontFamily\":\"\\\"Montserrat\\\",sans-serif\",\"fontWeightLight\":\"300\",\"fontWeightRegular\":\"500\",\"fontWeightMedium\":\"600\",\"fontWeightBold\":\"800\",\"colorPrimaryBlue\":\"#004289\",\"colorBackgroundWhite\":\"#fff\",\"colorSecondaryGreyDarkest\":\"#3c3c3b\",\"colorSecondaryGreyDark\":\"#8c8c8c\",\"colorSecondaryGreyLight\":\"#b3b3b3\",\"colorSecondaryGreyLightest\":\"#e6e6e6\",\"colorHighlightOrange\":\"#f7a42d\",\"colorHighlightBlue\":\"#138dc6\",\"colorHighlightGreen\":\"#0fa042\",\"colorHighlightGold\":\"#c09a5d\",\"colorError\":\"#d63031\",\"colorTextBase\":\"rgba(0,0,0,0.87)\",\"borderRadius\":\"4px\",\"page\":\"Layout_page__3uP2v\",\"content\":\"Layout_content__3nMgS\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spacing\":\"8px\",\"maxWidth\":\"1280px\",\"fontSizeBase\":\"1em\",\"fontSizeSmall\":\".875em\",\"fontSizeSmallest\":\".75em\",\"fontSizeH1\":\"2.5em\",\"fontSizeH2\":\"2em\",\"fontSizeH3\":\"1.75em\",\"fontSizeH4\":\"1.5em\",\"fontSizeH5\":\"1.25em\",\"fontSizeH6\":\"1em\",\"headerLetterSpacing\":\"-.05em\",\"fontFamily\":\"\\\"Montserrat\\\",sans-serif\",\"fontWeightLight\":\"300\",\"fontWeightRegular\":\"500\",\"fontWeightMedium\":\"600\",\"fontWeightBold\":\"800\",\"colorPrimaryBlue\":\"#004289\",\"colorBackgroundWhite\":\"#fff\",\"colorSecondaryGreyDarkest\":\"#3c3c3b\",\"colorSecondaryGreyDark\":\"#8c8c8c\",\"colorSecondaryGreyLight\":\"#b3b3b3\",\"colorSecondaryGreyLightest\":\"#e6e6e6\",\"colorHighlightOrange\":\"#f7a42d\",\"colorHighlightBlue\":\"#138dc6\",\"colorHighlightGreen\":\"#0fa042\",\"colorHighlightGold\":\"#c09a5d\",\"colorError\":\"#d63031\",\"colorTextBase\":\"rgba(0,0,0,0.87)\",\"borderRadius\":\"4px\",\"layerList\":\"CalculationSummary_layerList__B54mt\",\"layerProperties\":\"CalculationSummary_layerProperties__2p-Dj\",\"layerPropertiesChevron\":\"CalculationSummary_layerPropertiesChevron__1-JCd\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spacing\":\"8px\",\"maxWidth\":\"1280px\",\"fontSizeBase\":\"1em\",\"fontSizeSmall\":\".875em\",\"fontSizeSmallest\":\".75em\",\"fontSizeH1\":\"2.5em\",\"fontSizeH2\":\"2em\",\"fontSizeH3\":\"1.75em\",\"fontSizeH4\":\"1.5em\",\"fontSizeH5\":\"1.25em\",\"fontSizeH6\":\"1em\",\"headerLetterSpacing\":\"-.05em\",\"fontFamily\":\"\\\"Montserrat\\\",sans-serif\",\"fontWeightLight\":\"300\",\"fontWeightRegular\":\"500\",\"fontWeightMedium\":\"600\",\"fontWeightBold\":\"800\",\"colorPrimaryBlue\":\"#004289\",\"colorBackgroundWhite\":\"#fff\",\"colorSecondaryGreyDarkest\":\"#3c3c3b\",\"colorSecondaryGreyDark\":\"#8c8c8c\",\"colorSecondaryGreyLight\":\"#b3b3b3\",\"colorSecondaryGreyLightest\":\"#e6e6e6\",\"colorHighlightOrange\":\"#f7a42d\",\"colorHighlightBlue\":\"#138dc6\",\"colorHighlightGreen\":\"#0fa042\",\"colorHighlightGold\":\"#c09a5d\",\"colorError\":\"#d63031\",\"colorTextBase\":\"rgba(0,0,0,0.87)\",\"borderRadius\":\"4px\",\"page\":\"CalculationStepper_page__2qVvh\",\"content\":\"CalculationStepper_content__1hvOJ\",\"header\":\"CalculationStepper_header__2iPkh\",\"logo\":\"CalculationStepper_logo__Db9uv\",\"myaccount_menu_container\":\"CalculationStepper_myaccount_menu_container__h7fLZ\",\"circle\":\"CalculationStepper_circle__Zkl5m\",\"active\":\"CalculationStepper_active__29xFx\",\"completed\":\"CalculationStepper_completed__Slk_D\",\"stepIcon\":\"CalculationStepper_stepIcon__3-FX6\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spacing\":\"8px\",\"maxWidth\":\"1280px\",\"fontSizeBase\":\"1em\",\"fontSizeSmall\":\".875em\",\"fontSizeSmallest\":\".75em\",\"fontSizeH1\":\"2.5em\",\"fontSizeH2\":\"2em\",\"fontSizeH3\":\"1.75em\",\"fontSizeH4\":\"1.5em\",\"fontSizeH5\":\"1.25em\",\"fontSizeH6\":\"1em\",\"headerLetterSpacing\":\"-.05em\",\"fontFamily\":\"\\\"Montserrat\\\",sans-serif\",\"fontWeightLight\":\"300\",\"fontWeightRegular\":\"500\",\"fontWeightMedium\":\"600\",\"fontWeightBold\":\"800\",\"colorPrimaryBlue\":\"#004289\",\"colorBackgroundWhite\":\"#fff\",\"colorSecondaryGreyDarkest\":\"#3c3c3b\",\"colorSecondaryGreyDark\":\"#8c8c8c\",\"colorSecondaryGreyLight\":\"#b3b3b3\",\"colorSecondaryGreyLightest\":\"#e6e6e6\",\"colorHighlightOrange\":\"#f7a42d\",\"colorHighlightBlue\":\"#138dc6\",\"colorHighlightGreen\":\"#0fa042\",\"colorHighlightGold\":\"#c09a5d\",\"colorError\":\"#d63031\",\"colorTextBase\":\"rgba(0,0,0,0.87)\",\"borderRadius\":\"4px\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spacing\":\"8px\",\"maxWidth\":\"1280px\",\"fontSizeBase\":\"1em\",\"fontSizeSmall\":\".875em\",\"fontSizeSmallest\":\".75em\",\"fontSizeH1\":\"2.5em\",\"fontSizeH2\":\"2em\",\"fontSizeH3\":\"1.75em\",\"fontSizeH4\":\"1.5em\",\"fontSizeH5\":\"1.25em\",\"fontSizeH6\":\"1em\",\"headerLetterSpacing\":\"-.05em\",\"fontFamily\":\"\\\"Montserrat\\\",sans-serif\",\"fontWeightLight\":\"300\",\"fontWeightRegular\":\"500\",\"fontWeightMedium\":\"600\",\"fontWeightBold\":\"800\",\"colorPrimaryBlue\":\"#004289\",\"colorBackgroundWhite\":\"#fff\",\"colorSecondaryGreyDarkest\":\"#3c3c3b\",\"colorSecondaryGreyDark\":\"#8c8c8c\",\"colorSecondaryGreyLight\":\"#b3b3b3\",\"colorSecondaryGreyLightest\":\"#e6e6e6\",\"colorHighlightOrange\":\"#f7a42d\",\"colorHighlightBlue\":\"#138dc6\",\"colorHighlightGreen\":\"#0fa042\",\"colorHighlightGold\":\"#c09a5d\",\"colorError\":\"#d63031\",\"colorTextBase\":\"rgba(0,0,0,0.87)\",\"borderRadius\":\"4px\",\"header\":\"Header_header__1v0yI\",\"logo\":\"Header_logo__3T0lc\",\"myaccount_menu_container\":\"Header_myaccount_menu_container__wDe2H\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spacing\":\"8px\",\"maxWidth\":\"1280px\",\"fontSizeBase\":\"1em\",\"fontSizeSmall\":\".875em\",\"fontSizeSmallest\":\".75em\",\"fontSizeH1\":\"2.5em\",\"fontSizeH2\":\"2em\",\"fontSizeH3\":\"1.75em\",\"fontSizeH4\":\"1.5em\",\"fontSizeH5\":\"1.25em\",\"fontSizeH6\":\"1em\",\"headerLetterSpacing\":\"-.05em\",\"fontFamily\":\"\\\"Montserrat\\\",sans-serif\",\"fontWeightLight\":\"300\",\"fontWeightRegular\":\"500\",\"fontWeightMedium\":\"600\",\"fontWeightBold\":\"800\",\"colorPrimaryBlue\":\"#004289\",\"colorBackgroundWhite\":\"#fff\",\"colorSecondaryGreyDarkest\":\"#3c3c3b\",\"colorSecondaryGreyDark\":\"#8c8c8c\",\"colorSecondaryGreyLight\":\"#b3b3b3\",\"colorSecondaryGreyLightest\":\"#e6e6e6\",\"colorHighlightOrange\":\"#f7a42d\",\"colorHighlightBlue\":\"#138dc6\",\"colorHighlightGreen\":\"#0fa042\",\"colorHighlightGold\":\"#c09a5d\",\"colorError\":\"#d63031\",\"colorTextBase\":\"rgba(0,0,0,0.87)\",\"borderRadius\":\"4px\",\"newsItemBanner\":\"NewsItemBanner_newsItemBanner__3MmgZ\",\"newsItemBannerText\":\"NewsItemBanner_newsItemBannerText__2yOyi\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spacing\":\"8px\",\"maxWidth\":\"1280px\",\"fontSizeBase\":\"1em\",\"fontSizeSmall\":\".875em\",\"fontSizeSmallest\":\".75em\",\"fontSizeH1\":\"2.5em\",\"fontSizeH2\":\"2em\",\"fontSizeH3\":\"1.75em\",\"fontSizeH4\":\"1.5em\",\"fontSizeH5\":\"1.25em\",\"fontSizeH6\":\"1em\",\"headerLetterSpacing\":\"-.05em\",\"fontFamily\":\"\\\"Montserrat\\\",sans-serif\",\"fontWeightLight\":\"300\",\"fontWeightRegular\":\"500\",\"fontWeightMedium\":\"600\",\"fontWeightBold\":\"800\",\"colorPrimaryBlue\":\"#004289\",\"colorBackgroundWhite\":\"#fff\",\"colorSecondaryGreyDarkest\":\"#3c3c3b\",\"colorSecondaryGreyDark\":\"#8c8c8c\",\"colorSecondaryGreyLight\":\"#b3b3b3\",\"colorSecondaryGreyLightest\":\"#e6e6e6\",\"colorHighlightOrange\":\"#f7a42d\",\"colorHighlightBlue\":\"#138dc6\",\"colorHighlightGreen\":\"#0fa042\",\"colorHighlightGold\":\"#c09a5d\",\"colorError\":\"#d63031\",\"colorTextBase\":\"rgba(0,0,0,0.87)\",\"borderRadius\":\"4px\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spacing\":\"8px\",\"maxWidth\":\"1280px\",\"fontSizeBase\":\"1em\",\"fontSizeSmall\":\".875em\",\"fontSizeSmallest\":\".75em\",\"fontSizeH1\":\"2.5em\",\"fontSizeH2\":\"2em\",\"fontSizeH3\":\"1.75em\",\"fontSizeH4\":\"1.5em\",\"fontSizeH5\":\"1.25em\",\"fontSizeH6\":\"1em\",\"headerLetterSpacing\":\"-.05em\",\"fontFamily\":\"\\\"Montserrat\\\",sans-serif\",\"fontWeightLight\":\"300\",\"fontWeightRegular\":\"500\",\"fontWeightMedium\":\"600\",\"fontWeightBold\":\"800\",\"colorPrimaryBlue\":\"#004289\",\"colorBackgroundWhite\":\"#fff\",\"colorSecondaryGreyDarkest\":\"#3c3c3b\",\"colorSecondaryGreyDark\":\"#8c8c8c\",\"colorSecondaryGreyLight\":\"#b3b3b3\",\"colorSecondaryGreyLightest\":\"#e6e6e6\",\"colorHighlightOrange\":\"#f7a42d\",\"colorHighlightBlue\":\"#138dc6\",\"colorHighlightGreen\":\"#0fa042\",\"colorHighlightGold\":\"#c09a5d\",\"colorError\":\"#d63031\",\"colorTextBase\":\"rgba(0,0,0,0.87)\",\"borderRadius\":\"4px\",\"page\":\"ConstructionTypeSelection_page__3-Lgn\",\"content\":\"ConstructionTypeSelection_content__esxr6\",\"header\":\"ConstructionTypeSelection_header__QpN7i\",\"logo\":\"ConstructionTypeSelection_logo__1m40a\",\"myaccount_menu_container\":\"ConstructionTypeSelection_myaccount_menu_container__gW0vv\",\"divider\":\"ConstructionTypeSelection_divider__fAWY1\",\"constructionButtons\":\"ConstructionTypeSelection_constructionButtons__2wjQF\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spacing\":\"8px\",\"maxWidth\":\"1280px\",\"fontSizeBase\":\"1em\",\"fontSizeSmall\":\".875em\",\"fontSizeSmallest\":\".75em\",\"fontSizeH1\":\"2.5em\",\"fontSizeH2\":\"2em\",\"fontSizeH3\":\"1.75em\",\"fontSizeH4\":\"1.5em\",\"fontSizeH5\":\"1.25em\",\"fontSizeH6\":\"1em\",\"headerLetterSpacing\":\"-.05em\",\"fontFamily\":\"\\\"Montserrat\\\",sans-serif\",\"fontWeightLight\":\"300\",\"fontWeightRegular\":\"500\",\"fontWeightMedium\":\"600\",\"fontWeightBold\":\"800\",\"colorPrimaryBlue\":\"#004289\",\"colorBackgroundWhite\":\"#fff\",\"colorSecondaryGreyDarkest\":\"#3c3c3b\",\"colorSecondaryGreyDark\":\"#8c8c8c\",\"colorSecondaryGreyLight\":\"#b3b3b3\",\"colorSecondaryGreyLightest\":\"#e6e6e6\",\"colorHighlightOrange\":\"#f7a42d\",\"colorHighlightBlue\":\"#138dc6\",\"colorHighlightGreen\":\"#0fa042\",\"colorHighlightGold\":\"#c09a5d\",\"colorError\":\"#d63031\",\"colorTextBase\":\"rgba(0,0,0,0.87)\",\"borderRadius\":\"4px\",\"page\":\"Calculation_page__t9FEW\",\"content\":\"Calculation_content__2uEWn\",\"header\":\"Calculation_header__1rTf8\",\"logo\":\"Calculation_logo__2QQ1c\",\"myaccount_menu_container\":\"Calculation_myaccount_menu_container__Kayqd\"};","import { StoreModel } from '../store/store.model';\nimport { isEmpty } from 'lodash';\n\nexport const buildRoute = (store: StoreModel, relativeRoute: string): string => {\n const countryId = store.componentState.selectedCountry?.countryId ?? '';\n return buildRouteWithCountry(countryId, relativeRoute);\n};\n\nexport const buildRouteWithCountry = (countryId: string, route: string): string => {\n if (isEmpty(countryId)) {\n return '/';\n }\n\n return `/${countryId?.toLowerCase()}${route.startsWith('/') ? '' : '/'}${route}`;\n};\n","import { User } from '../../types/domain/account.types';\n\nexport const FETCH_USER_ATTEMPT = '[Account] Fetch User Attempt';\nexport const FETCH_USER_SUCCESS = '[Account] Fetch User Success';\nexport const FETCH_USER_FAILURE = '[Account] Fetch User Failure';\nexport const UPLOAD_COMPANY_LOGO_ATTEMPT = '[Account] Upload Company Logo Attempt';\nexport const UPLOAD_COMPANY_LOGO_SUCCESS = '[Account] Upload Company Logo Success';\nexport const UPLOAD_COMPANY_LOGO_BAD_REQUEST = '[Account] Upload Company Logo Bad Request';\nexport const UPLOAD_COMPANY_LOGO_FAILURE = '[Account] Upload Company Logo Attempt Failure';\nexport const GDPR_CONSENT_RESPONSE_SELECTED = '[Account] GDPR Consent response selected';\nexport const RECORD_GDPR_CONSENT_SUCCESS = '[Account] Record GDPR Consent response success';\nexport const RECORD_GDPR_CONSENT_FAILURE = '[Account] Record GDPR Consent response failure';\nexport const RECORD_GDPR_CONSENT_ATTEMPT = '[Account] Record GDPR Consent response attempt';\nexport const SET_IS_CONFIRMED_GUEST = '[Account] Set IsConfirmedGuest';\n\nexport interface FetchUserAttempt {\n type: typeof FETCH_USER_ATTEMPT;\n}\n\nexport interface FetchUserSuccess {\n type: typeof FETCH_USER_SUCCESS;\n payload: { user: User, isNewUser: boolean };\n}\n\nexport interface FetchUserFailure {\n type: typeof FETCH_USER_FAILURE;\n error: any;\n}\n\nexport interface GDPRConsentResponseSelected {\n type: typeof GDPR_CONSENT_RESPONSE_SELECTED;\n payload: boolean;\n}\n\nexport interface RecordGDPRConsentAttempt {\n type: typeof RECORD_GDPR_CONSENT_ATTEMPT;\n}\n\nexport interface RecordGDPRConsentSuccess {\n type: typeof RECORD_GDPR_CONSENT_SUCCESS;\n}\n\nexport interface RecordGDPRConsentFailure {\n type: typeof RECORD_GDPR_CONSENT_FAILURE;\n}\n\nexport interface UploadCompanyLogoAttempt {\n type: typeof UPLOAD_COMPANY_LOGO_ATTEMPT;\n}\n\nexport interface UploadCompanyLogoSuccess {\n type: typeof UPLOAD_COMPANY_LOGO_SUCCESS;\n payload: any;\n}\n\nexport interface UploadCompanyLogoBadRequest {\n type: typeof UPLOAD_COMPANY_LOGO_BAD_REQUEST;\n error: any;\n}\n\nexport interface UploadCompanyLogoFailure {\n type: typeof UPLOAD_COMPANY_LOGO_FAILURE;\n error: any;\n}\n\nexport interface SetIsConfirmedGuest {\n type: typeof SET_IS_CONFIRMED_GUEST;\n payload: boolean;\n}\n\n\nexport type AccountActionTypes =\n | FetchUserAttempt\n | FetchUserSuccess\n | FetchUserFailure\n | GDPRConsentResponseSelected\n | UploadCompanyLogoAttempt\n | UploadCompanyLogoBadRequest\n | UploadCompanyLogoFailure\n | UploadCompanyLogoSuccess\n | SetIsConfirmedGuest;","import {\n FETCH_USER_ATTEMPT,\n FETCH_USER_SUCCESS,\n FETCH_USER_FAILURE,\n UPLOAD_COMPANY_LOGO_ATTEMPT,\n UPLOAD_COMPANY_LOGO_SUCCESS,\n UPLOAD_COMPANY_LOGO_BAD_REQUEST,\n UPLOAD_COMPANY_LOGO_FAILURE,\n FetchUserAttempt,\n FetchUserSuccess,\n FetchUserFailure,\n SetIsConfirmedGuest,\n UploadCompanyLogoAttempt,\n UploadCompanyLogoSuccess,\n UploadCompanyLogoBadRequest,\n UploadCompanyLogoFailure,\n GDPRConsentResponseSelected,\n GDPR_CONSENT_RESPONSE_SELECTED,\n RecordGDPRConsentSuccess,\n RECORD_GDPR_CONSENT_SUCCESS,\n RecordGDPRConsentFailure,\n RecordGDPRConsentAttempt,\n RECORD_GDPR_CONSENT_FAILURE,\n RECORD_GDPR_CONSENT_ATTEMPT,\n SET_IS_CONFIRMED_GUEST\n}\nfrom './account.action-types';\n \nimport { User } from '../../types/domain/account.types';\n\nexport const fetchUserAttempt = (): FetchUserAttempt => ({\n type: FETCH_USER_ATTEMPT,\n});\n\nexport const fetchUserSuccess = (data: User, isNewUser: boolean = false): FetchUserSuccess => ({\n type: FETCH_USER_SUCCESS,\n payload: { user: data, isNewUser },\n});\n\nexport const fetchUserFailure = (error: any): FetchUserFailure => ({\n type: FETCH_USER_FAILURE,\n error,\n});\n\nexport const recordGDPRConsentSuccess = (): RecordGDPRConsentSuccess => ({\n type: RECORD_GDPR_CONSENT_SUCCESS\n});\n\nexport const recordGDPRConsentFailure = (): RecordGDPRConsentFailure => ({\n type: RECORD_GDPR_CONSENT_FAILURE\n});\n\nexport const recordGDPRConsentAttempt = (): RecordGDPRConsentAttempt => ({\n type: RECORD_GDPR_CONSENT_ATTEMPT\n});\n\nexport const GDPRConsentResponse = (consent: boolean): GDPRConsentResponseSelected => ({\n type: GDPR_CONSENT_RESPONSE_SELECTED,\n payload: consent,\n});\n\nexport const uploadCompanyLogoAttempt = (): UploadCompanyLogoAttempt => ({\n type: UPLOAD_COMPANY_LOGO_ATTEMPT\n});\n\nexport const uploadCompanyLogoSuccess = (data: any): UploadCompanyLogoSuccess => ({\n type: UPLOAD_COMPANY_LOGO_SUCCESS,\n payload: data,\n});\n\nexport const uploadCompanyLogoBadRequest = (error: any): UploadCompanyLogoBadRequest => ({\n type: UPLOAD_COMPANY_LOGO_BAD_REQUEST,\n error,\n});\n\nexport const uploadCompanyLogoFailure = (error: any): UploadCompanyLogoFailure => ({\n type: UPLOAD_COMPANY_LOGO_FAILURE,\n error,\n});\n\nexport const setIsConfirmedGuest = (isConfirmedGuest: boolean): SetIsConfirmedGuest => ({\n type: SET_IS_CONFIRMED_GUEST,\n payload: isConfirmedGuest,\n});","export enum ResponseCode {\n BAD_REQUEST = 400,\n OK = 200,\n CREATED = 201,\n};\n","import axios from 'axios';\nimport { IAccountInfo } from 'react-aad-msal';\nimport { fetchUserAttempt, fetchUserSuccess, fetchUserFailure, uploadCompanyLogoSuccess, uploadCompanyLogoBadRequest, uploadCompanyLogoFailure, uploadCompanyLogoAttempt, recordGDPRConsentSuccess, recordGDPRConsentFailure, recordGDPRConsentAttempt } from './account.actions';\nimport { User } from '../../types/domain/account.types';\nimport { AnyAction } from 'redux';\nimport { ResponseCode } from '../../types/application/response-code.types';\n\nexport const fetchUser = (accountInfo: IAccountInfo) => (\n\n async (dispatch: (action: AnyAction) => void) => {\n\n dispatch(fetchUserAttempt());\n\n try {\n\n const { data, status } = await axios.post('/api/user', {}, {\n withCredentials: true,\n });\n\n const isNewUser = status === ResponseCode.CREATED;\n\n dispatch(fetchUserSuccess(data as User, isNewUser));\n } catch (error) {\n dispatch(fetchUserFailure(error));\n }\n\n }\n);\n\nexport const recordGDPRConsent = (consentGiven: boolean) => (\n async (dispatch: (action: AnyAction) => void) => {\n\n dispatch(recordGDPRConsentAttempt());\n\n try {\n const { data } = await axios.post('api/user/record-gdpr-consent', consentGiven, {\n withCredentials: true,\n headers: {\n 'Content-Type': 'application/json'\n }\n });\n \n dispatch(recordGDPRConsentSuccess());\n dispatch(fetchUserSuccess(data as User));\n\n } catch (error) {\n dispatch(recordGDPRConsentFailure());\n }\n }\n);\n\nexport const uploadCompanyLogo = (file: any, fileName: string) => (\n async (dispatch: (action: any) => void) => {\n\n dispatch(uploadCompanyLogoAttempt());\n\n try {\n const formData = new FormData();\n formData.append('companyLogoImage', file as string, fileName);\n\n const { data } = await axios.post('api/user/upload-company-logo', formData, {\n withCredentials: true,\n headers: {\n 'Content-Type': 'multipart/form-data'\n }\n });\n \n dispatch(uploadCompanyLogoSuccess({ ...data }));\n dispatch(fetchUserSuccess(data as User));\n\n } catch (error) {\n\n const { status, data } = error.response;\n\n if (status === ResponseCode.BAD_REQUEST) {\n dispatch(uploadCompanyLogoBadRequest({\n errorCode: data.errorCode,\n args: data.args,\n message: data.message,\n }));\n \n return;\n }\n\n dispatch(uploadCompanyLogoFailure(error.response));\n }\n }\n);\n","\nimport { AnyAction, Store } from 'redux';\nimport { AuthenticationActionCreators, IAccountInfo, AuthenticationActions } from 'react-aad-msal';\nimport { debounce } from 'lodash';\nimport { fetchUser } from '../account/account.action-creators';\n\nexport const authenticationActionCreatorOverrides = (store: Store) => {\n\n console.log('authenticationActionCreatorOverrides Loaded');\n\n const debouncedFetchUser = debounce((data: IAccountInfo) => {\n console.log('debouncedFetchUser');\n fetchUser(data)(store.dispatch);\n }, 250);\n\n AuthenticationActionCreators.loginSuccessful = (data: IAccountInfo): AnyAction => {\n console.log('onLoginSuccessful');\n debouncedFetchUser(data);\n return {\n payload: data,\n type: AuthenticationActions.LoginSuccess,\n };\n };\n};","import { AppConfig } from '../types/config/config.types';\n\nlet appConfig: AppConfig | null = null;\n\nexport function setAppConfig(newAppConfig: AppConfig) {\n appConfig = newAppConfig;\n}\n\nexport function getAppConfig() {\n return appConfig;\n}\n","import { StoreModel } from '../store.model';\nimport { ConstructionLayer, ConstructionType, Country, County, FieldData, ProjectConfig } from '../../types/domain/construction-data.types';\n\nexport const activeConstructionLayerSelector = (store: StoreModel): ConstructionLayer =>\n store.constructionData.layers[store.componentState.activeConstructionTypeId ?? '']\n ?.filter(l => l.constructionLayerId === store.componentState.activeConstructionLayerId)[0];\n\nexport const activeConstructionTypeIdSelector = (store: StoreModel): string => store.componentState.activeConstructionTypeId;\n\nexport const activeConstructionTypeSelector = (store: StoreModel): ConstructionType | undefined =>\n store.constructionData.types.find(ct => ct.id === store.componentState.activeConstructionTypeId);\n\nexport const countriesSelector = (store: StoreModel): Country[] => store.componentState.countries ?? [];\n\nexport const isLoadingCountriesSelector = (store: StoreModel): boolean => store.componentState.countries === null;\n\nexport const countrySelector = (store: StoreModel): Country | null => store.componentState.selectedCountry;\n\nexport const countryIdSelector = (store: StoreModel): string => (store.componentState.selectedCountry?.countryId ?? '').toLowerCase();\n\nexport const calculationResultLoadingStateSelector = (store: StoreModel): boolean => store.componentState.isCalculationResultLoading;\n\nexport const isLoadingSelector = (store: StoreModel): boolean => store.componentState.isLoading;\n\nexport const isLoadingConstructionTypesSelector = (store: StoreModel): boolean => store.componentState.isLoadingConstructionTypes;\n\nexport const errorSelector = (store: StoreModel): string | null => store.componentState.error;\n\nexport const calculationResultErrorSelector = (store: StoreModel): string | null => store.componentState.calculationResultError;\n\nexport const selectedCultureSelector = (store: StoreModel): string => store.componentState.selectedCulture;\n\nexport const downloadingCalculationIdSelector = (store: StoreModel): string | null => store.componentState.downloadingCalculationId;\n\nexport const getIsGtmContainerSet = (store: StoreModel): boolean => store.componentState.isGtmContainerSet;\n\nexport const projectConfigSelector = (store: StoreModel) : ProjectConfig | null => store.componentState.projectConfig;\n\nexport const countiesSelector = (store: StoreModel) : County[] => store.componentState.counties ?? [];\n\nexport const fieldDataSelector = (store: StoreModel) : FieldData[] => store.componentState.fieldData ?? [];\n","import {\n SetActiveConstructionLayer,\n SET_ACTIVE_CONSTRUCTION_LAYER,\n\n SetActiveConstructionType,\n SET_ACTIVE_CONSTRUCTION_TYPE,\n\n SetCountries,\n SET_COUNTRIES,\n\n SetSelectedCountry,\n SET_SELECTED_COUNTRY,\n\n SetSelectedCulture,\n SET_SELECTED_CULTURE,\n\n SetGTMContainer,\n SET_GTM_CONTAINER,\n SetProjectConfig,\n SET_PROJECT_CONFIG,\n SetCounties,\n SET_COUNTIES,\n SetFieldData,\n SET_FIELD_DATA\n\n}\nfrom './component-state.action-types';\nimport { Country, ProjectConfig,County,FieldData } from '../../types/domain/construction-data.types';\n\nexport const setActiveConstructionType = (constructionType: string): SetActiveConstructionType => ({\n type: SET_ACTIVE_CONSTRUCTION_TYPE,\n payload: constructionType,\n});\n\nexport const setActiveConstructionLayer = (constructionLayerId: number): SetActiveConstructionLayer => ({\n type: SET_ACTIVE_CONSTRUCTION_LAYER,\n payload: constructionLayerId,\n});\n\nexport const setCountries = (countries: Country[] | null): SetCountries => ({\n type: SET_COUNTRIES,\n payload: countries,\n});\n\nexport const setSelectedCountry = (country: Country | null): SetSelectedCountry => ({\n type: SET_SELECTED_COUNTRY,\n payload: country,\n});\n\nexport const setSelectedCulture = (selectedCulture: string): SetSelectedCulture => ({\n type: SET_SELECTED_CULTURE,\n payload: selectedCulture,\n});\n\nexport const setGTMContainer = (): SetGTMContainer => ({\n type: SET_GTM_CONTAINER\n});\n\nexport const setProjectConfig = (config: ProjectConfig | null): SetProjectConfig => ({\n type: SET_PROJECT_CONFIG,\n payload: config\n});\n\nexport const setCounties = (counties: County[] | null): SetCounties => ({\n type: SET_COUNTIES,\n payload: counties\n});\n\nexport const setFieldData = (fieldData: FieldData[] | null) : SetFieldData => ({\n type: SET_FIELD_DATA,\n payload: fieldData\n});\n\n","import { Country, ProjectConfig, County, FieldData } from '../../types/domain/construction-data.types';\n\nexport const SET_ACTIVE_CONSTRUCTION_TYPE = '[Component State] Set Active Construction Type';\nexport const SET_ACTIVE_CONSTRUCTION_LAYER = '[Component State] Set Active Construction Layer';\nexport const SET_COUNTRIES = '[Component State] Set Countries';\nexport const SET_SELECTED_COUNTRY = '[Component State] Set Selected Country';\nexport const SET_SELECTED_CULTURE = '[Component State] Set Selected Culture';\nexport const SET_GTM_CONTAINER = '[Component State] Set GTM Container';\nexport const SET_PROJECT_CONFIG = '[Component State] Set Project Config';\nexport const SET_COUNTIES = '[Component State] Set Counties';\nexport const SET_FIELD_DATA = '[Component State] Set FieldData';\n\nexport interface SetActiveConstructionType {\n type: typeof SET_ACTIVE_CONSTRUCTION_TYPE;\n payload: string;\n}\n\nexport interface SetActiveConstructionLayer {\n type: typeof SET_ACTIVE_CONSTRUCTION_LAYER;\n payload: number;\n}\n\nexport interface SetCountries {\n type: typeof SET_COUNTRIES;\n payload: Country[] | null;\n}\n\nexport interface SetSelectedCountry {\n type: typeof SET_SELECTED_COUNTRY;\n payload: Country | null;\n}\n\nexport interface SetSelectedCulture {\n type: typeof SET_SELECTED_CULTURE;\n payload: string;\n}\n\nexport interface SetGTMContainer {\n type: typeof SET_GTM_CONTAINER;\n}\n\nexport interface SetProjectConfig{\n type: typeof SET_PROJECT_CONFIG;\n payload: ProjectConfig | null;\n\n}\n\nexport interface SetCounties{\n type: typeof SET_COUNTIES;\n payload: County[] | null;\n}\n\nexport interface SetFieldData{\n type: typeof SET_FIELD_DATA;\n payload: FieldData[] | null;\n}\n\nexport type ComponentStateActionTypes =\n | SetActiveConstructionType\n | SetActiveConstructionLayer\n | SetCountries\n | SetSelectedCountry\n | SetSelectedCulture\n | SetGTMContainer\n | SetProjectConfig\n | SetCounties\n | SetFieldData;\n","import { MsalAuthProvider, LoginType } from 'react-aad-msal';\nimport { AuthResponse, AuthError, Configuration, UserAgentApplication, AuthenticationParameters } from 'msal';\nimport i18n from 'i18next';\nimport { toast } from 'react-toastify';\nimport { getAppConfig } from '../config/config';\nimport { policyKey } from '../types/config/config.types';\n\nlet currentLocale: string | undefined = undefined;\n\nconst baseAuthConfig = (): Configuration => {\n return {\n auth: {\n clientId: getAppConfig()?.azureB2CConfig.clientId ?? '',\n postLogoutRedirectUri: window.location.origin,\n redirectUri: window.location.origin,\n validateAuthority: false,\n\n // After being redirected to the 'redirectUri' page, should user\n // be redirected back to the Url where their login originated from?\n navigateToLoginRequestUrl: false,\n },\n cache: {\n cacheLocation: 'sessionStorage',\n storeAuthStateInCookie: true\n }\n } as Configuration;\n};\n\nexport function getAuthority(policyName: policyKey) {\n return `${getAppConfig()?.azureB2CConfig.authority}${getAppConfig()?.azureB2CConfig.policies[policyName]}`;\n}\n\nexport function buildAuthenticationParameters(policyName: policyKey): AuthenticationParameters {\n return {\n authority: getAuthority(policyName),\n extraQueryParameters: {\n 'ui_locales': currentLocale || 'qps-ploc'\n }\n };\n}\n\nexport const signUpSignInAuthConfig = () => ({\n ...baseAuthConfig(),\n auth: {\n ...baseAuthConfig().auth,\n authority: getAuthority('signUpSignIn'),\n }\n});\n\nexport const resetPasswordAuthConfig = () => ({\n ...baseAuthConfig(),\n auth: {\n ...baseAuthConfig().auth,\n authority: getAuthority('resetPassword'),\n redirectUri: window.location.origin + '/password-reset'\n }\n});\n\nexport const updateDetailsAuthConfig = () => ({\n ...baseAuthConfig(),\n auth: {\n ...baseAuthConfig().auth,\n authority: getAuthority('updateDetails'),\n redirectUri: window.location.origin + '/account-updated'\n }\n});\n\nexport const changeAuthProviderLocale = (locale: string) => {\n const authProvider = authProviderFactory();\n const authParams = authProvider.getAuthenticationParameters();\n\n authProvider.setAuthenticationParameters({\n ...authParams,\n extraQueryParameters: {\n ...authParams.extraQueryParameters,\n 'ui_locales': locale\n }\n });\n\n console.info(`AuthProvider locale changed to: ${locale}`);\n\n currentLocale = locale;\n};\n\nexport const launchRedirectToPasswordReset = () => {\n const myMSALObj = new UserAgentApplication(resetPasswordAuthConfig());\n setTimeout(() => myMSALObj.loginRedirect(buildAuthenticationParameters('resetPassword')), 1000);\n\n toast.info(i18n.t('navigation-ui.redirecting-ellipsis'), {autoClose: 900});\n};\n\nexport const checkAndRedirectIfIsForgotPasswordError = (error: AuthError) => {\n if (error.errorMessage.indexOf('AADB2C90118') > -1) {\n try {\n launchRedirectToPasswordReset();\n } catch (err) {\n console.log(err);\n }\n }\n};\n\n// The auth provider should be a singleton. Best practice is to only have it ever instantiated once.\n// Avoid creating an instance inside the component it will be recreated on each render.\n// If two providers are created on the same page it will cause authentication errors.\nlet authProviderInternal: MsalAuthProvider;\nexport default function authProviderFactory(): MsalAuthProvider {\n \n if (!authProviderInternal) {\n authProviderInternal = new MsalAuthProvider(\n signUpSignInAuthConfig(),\n {\n scopes: ['openid']\n },\n {\n loginType: getAppConfig()?.azureB2CConfig?.useRedirectLoginType ? LoginType.Redirect : LoginType.Popup,\n // When a token is refreshed it will be done by loading a page in an iframe.\n // Rather than reloading the same page, we can point to an empty html file which will prevent\n // site resources from being loaded twice.\n tokenRefreshUri: window.location.origin + '/auth.html'\n }\n );\n\n authProviderInternal.registerErrorHandler((error: AuthError | null) => {\n if (error) {\n console.log('authProvider errorHandler error:', error);\n\n // Check for forgot password error\n checkAndRedirectIfIsForgotPasswordError(error);\n }\n });\n\n authProviderInternal.handleRedirectCallback((error: AuthError, response?: AuthResponse) => {\n if (error) {\n console.log('authProvider handleRedirectCallback error:', error);\n\n // Check for forgot password error\n checkAndRedirectIfIsForgotPasswordError(error);\n }\n });\n }\n return authProviderInternal;\n};\n","import i18n from 'i18next';\nimport Backend from 'i18next-http-backend';\nimport LanguageDetector from 'i18next-browser-languagedetector';\nimport { initReactI18next } from 'react-i18next';\n\ni18n\n // load translation using http -> see /public/locales\n // learn more: https://github.com/i18next/i18next-http-backend\n .use(Backend)\n // detect user language\n // learn more: https://github.com/i18next/i18next-browser-languageDetector\n .use(LanguageDetector)\n // pass the i18n instance to react-i18next.\n .use(initReactI18next)\n // init i18next\n // for all options read: https://www.i18next.com/overview/configuration-options\n .init({\n fallbackLng: 'en',\n debug: false,\n\n // TODO: Remove these once the tests are fixed with Suspense\n react: {\n useSuspense: false,\n wait: false,\n },\n\n interpolation: {\n escapeValue: false, // not needed for react as it escapes by default\n },\n });\n\nexport default i18n;\n","import { useState, useEffect } from 'react';\nimport { getAppConfig } from '../../../config/config';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { countryIdSelector, selectedCultureSelector } from '../../../store/component-state/component-state.selectors';\nimport { setSelectedCulture } from '../../../store/component-state/component-state.actions';\nimport { changeAuthProviderLocale } from '../../../authentication/authProvider';\nimport { setPreviouslySelectedCulture } from '../../../helpers/memory-helper';\nimport i18n from '../../../i18n';\nimport { isEmpty } from 'lodash';\n\nexport default () => {\n\n const supportedCulturesPerCountry = getAppConfig()?.supportedCulturesPerCountry ?? {};\n\n const countryId = useSelector(countryIdSelector);\n const selectedCulture = useSelector(selectedCultureSelector);\n\n const [supportedCultures, setSupportedCultures] = useState([]);\n\n const dispatch = useDispatch();\n\n // As the country changes, load all the supported cultures for that country from the appConfig.\n // Also, handle any change in selected culture, to keep the various other components in sync.\n // But also ensure the selected culture is supported, and if not change back to default of en-GB.\n useEffect(() => {\n if (isEmpty(countryId)) {\n return;\n }\n\n const newSupportedCultures = supportedCulturesPerCountry[countryId?.toUpperCase()] ?? [];\n\n setSupportedCultures(newSupportedCultures);\n\n const isValidCulture = selectedCulture === 'en-GB' || newSupportedCultures.some(supportedCulture => supportedCulture === selectedCulture);\n\n if (!isValidCulture) {\n console.info(`Selected culture ${selectedCulture} is not valid for country ${countryId}, so changing it to en-GB...`);\n dispatch(setSelectedCulture('en-GB'));\n } else if (!isEmpty(selectedCulture) && i18n.language !== selectedCulture) {\n console.info(`Selected culture set to: ${selectedCulture}`);\n\n // Change the internationalisation language to use the selected culture\n i18n.changeLanguage(selectedCulture);\n\n // Change the authentication provider's locale to the selected culture\n changeAuthProviderLocale(selectedCulture);\n\n // Remember the selected culture, for when user's return back to the site.\n // Whether that is by an Azure B2C full page refresh, or the user visting again sometime in the future.\n setPreviouslySelectedCulture(selectedCulture);\n }\n }, [selectedCulture, supportedCulturesPerCountry, countryId, dispatch]);\n\n return {\n supportedCultures,\n culture: selectedCulture,\n setCulture: (newCulture: string) => dispatch(setSelectedCulture(newCulture)),\n };\n};\n","export const getPreviouslySelectedCountryId = (): string => {\n return window && window.localStorage\n ? window.localStorage.getItem('previouslySelectedCountryId') || ''\n : '';\n};\n\nexport const setPreviouslySelectedCountryId = (countryId: string) => {\n if (window && window.localStorage) {\n window.localStorage.setItem('previouslySelectedCountryId', countryId);\n }\n};\n\nexport const getPreviouslySelectedCulture = (): string | null => {\n const culture = window && window.localStorage\n ? window.localStorage.getItem('previouslySelectedCulture') || ''\n : '';\n\n return culture !== '' ? culture : null;\n};\n\nexport const setPreviouslySelectedCulture = (culture: string) => {\n if (window && window.localStorage) {\n window.localStorage.setItem('previouslySelectedCulture', culture);\n }\n};\n","import React from 'react';\nimport { ListItem, ListItemIcon, ListItemText, Menu, MenuItem, Avatar } from '@material-ui/core';\nimport PublicIcon from '@material-ui/icons/Public';\nimport { useTranslation } from 'react-i18next';\nimport { isEmpty } from 'lodash';\n\nexport type CultureSelectMobileProps = {\n culture: string;\n supportedCultures: string[];\n handleCultureSelection: (culture: string) => void;\n\n anchorElement: null | HTMLElement;\n handleMenuButtonClick: (event: any) => void;\n handleClose: () => void;\n}\n\nexport default function CultureSelectMobile(props: CultureSelectMobileProps) {\n\n const { t } = useTranslation();\n\n const { \n culture, supportedCultures, handleCultureSelection,\n anchorElement, handleMenuButtonClick, handleClose,\n } = props;\n\n if (isEmpty(supportedCultures)) {\n return null;\n }\n\n return (\n <>\n \n \n \n \n \n {supportedCultures.map(supportedCulture =>\n handleCultureSelection(supportedCulture)}>\n {t(`navigation-ui.${supportedCulture}`)}\n \n )}\n \n \n );\n}","import React from 'react';\nimport { Button, Menu, MenuItem, Grid } from '@material-ui/core';\nimport PublicIcon from '@material-ui/icons/Public';\nimport { isEmpty } from 'lodash';\nimport { useTranslation } from 'react-i18next';\n\nexport type CultureSelectDesktopProps = {\n culture: string;\n supportedCultures: string[];\n handleCultureSelection: (culture: string) => void;\n\n anchorElement: null | HTMLElement;\n handleMenuButtonClick: (event: any) => void;\n handleClose: () => void;\n}\n\nexport default function CultureSelectDesktop(props: CultureSelectDesktopProps) {\n\n const { t } = useTranslation();\n\n const { \n culture, supportedCultures, handleCultureSelection,\n anchorElement, handleMenuButtonClick, handleClose,\n } = props;\n\n if (isEmpty(supportedCultures)) {\n return null;\n }\n\n return (\n <>\n \n \n {supportedCultures.map(supportedCulture =>\n handleCultureSelection(supportedCulture)} data-qa-id={`cultureSelectOption-${supportedCulture}`}>\n {t(`navigation-ui.${supportedCulture}`)}\n \n )}\n \n \n );\n}","import React, { useState } from 'react';\nimport { useMediaQuery, Theme } from '@material-ui/core';\nimport useSupportedCultures from './useSupportedCultures';\nimport CultureSelectMobile from './CultureSelect.mobile';\nimport CultureSelectDesktop from './CultureSelect.desktop';\n\nexport default function CultureSelect() {\n \n const { supportedCultures, culture, setCulture } = useSupportedCultures();\n\n const isTablet = useMediaQuery((theme: Theme) => theme.breakpoints.between('xs', 'sm'));\n const isMobile = useMediaQuery((theme: Theme) => theme.breakpoints.down('xs'));\n\n const [ anchorElement, setAnchorElement ] = useState(null);\n \n const handleMenuButtonClick = (event: React.MouseEvent) => {\n setAnchorElement(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorElement(null);\n };\n\n const handleCultureSelection = (culture: string) => {\n handleClose();\n setCulture(culture);\n };\n\n if (isMobile || isTablet) {\n return ;\n }\n\n return ;\n};\n","import React, { useState } from 'react';\nimport { Box, IconButton, Drawer, makeStyles, createStyles, Theme, List, ListItem, ListItemIcon, ListItemText, ListItemAvatar, Avatar } from '@material-ui/core';\nimport MenuIcon from '@material-ui/icons/Menu';\nimport CloseIcon from '@material-ui/icons/Close';\nimport { deepPurple } from '@material-ui/core/colors';\nimport { User } from '../../../types/domain/account.types';\nimport { Link as RouterLink } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\nimport { NavigationItem } from '../../../types/domain/navigation-item.types';\nimport CultureSelect from '../CultureSelect/CultureSelect';\n\nconst useStyles = makeStyles((theme: Theme) => (\n createStyles({\n signedInAvatar: {\n color: theme.palette.getContrastText(deepPurple[500]),\n backgroundColor: deepPurple[500],\n },\n drawerList: {\n minWidth: 240,\n },\n link: {\n color: 'inherit',\n textDecoration: 'inherit'\n },\n })\n));\n\nexport type NavigationMobileProps = {\n isAuthenticated: boolean;\n user: User | undefined;\n navigationItems: NavigationItem[]; \n handleSignInClick: () => void;\n handleSignOutClick: () => void;\n};\n\nexport default function NavigationMobile(props: NavigationMobileProps) {\n\n const { isAuthenticated, user, navigationItems, handleSignInClick, handleSignOutClick } = props;\n\n const classes = useStyles();\n\n const { t } = useTranslation();\n\n const [ drawerOpen, setDrawerOpen ] = useState(false);\n\n return (\n \n setDrawerOpen(true)}>\n setDrawerOpen(false)}>\n \n \n setDrawerOpen(false)}>\n \n \n \n\n {navigationItems.map(navigationItem => {\n if (navigationItem.show) {\n return (\n setDrawerOpen(false)}>\n \n {navigationItem.icon()}\n \n \n \n );\n }\n return null;\n })}\n\n \n \n {isAuthenticated\n ? \n \n {getInitials(user)}\n \n \n :\n \n \n \n \n }\n \n \n \n \n );\n}\n\nconst getInitials = (user: User | undefined): string => {\n const name = getUserName(user);\n \n return name === '' ? name : name[0];\n};\n\nconst getUserName = (user: User | undefined): string => {\n if (user === undefined) {\n return '';\n }\n\n return `${user.givenName} ${user.familyName}`;\n};\n","\nexport enum NavigationItemId {\n NEW_CALCULATION,\n MY_CALCULATIONS,\n MY_ACCOUNT,\n}\n\nexport type NavigationItem = {\n id: NavigationItemId;\n route: string;\n translationKey: string;\n show: boolean;\n icon: () => JSX.Element;\n};","import React, { useState } from 'react';\nimport {\n Box, IconButton, Drawer, makeStyles, createStyles,\n Theme, List, ListItem, ListItemIcon, ListItemText,\n ListItemAvatar, Avatar, Grid, Link\n} from '@material-ui/core';\nimport MenuIcon from '@material-ui/icons/Menu';\nimport CloseIcon from '@material-ui/icons/Close';\nimport { deepPurple } from '@material-ui/core/colors';\nimport { User } from '../../../types/domain/account.types';\nimport { Link as RouterLink } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\nimport { NavigationItem, NavigationItemId } from '../../../types/domain/navigation-item.types';\nimport CultureSelect from '../CultureSelect/CultureSelect';\n\nconst useStyles = makeStyles((theme: Theme) => (\n createStyles({\n signedInAvatar: {\n color: theme.palette.getContrastText(deepPurple[500]),\n backgroundColor: deepPurple[500],\n },\n drawerList: {\n minWidth: 240,\n },\n link: {\n color: 'inherit',\n textDecoration: 'inherit'\n },\n })\n));\n\nexport type NavigationTabletProps = {\n isAuthenticated: boolean;\n user: User | undefined;\n navigationItems: NavigationItem[]; \n handleSignInClick: () => void;\n handleSignOutClick: () => void;\n};\n\nexport default function NavigationTablet(props: NavigationTabletProps) {\n\n const { isAuthenticated, user, navigationItems, handleSignInClick, handleSignOutClick } = props;\n\n const classes = useStyles();\n\n const { t } = useTranslation();\n\n const [ drawerOpen, setDrawerOpen ] = useState(false);\n\n return (\n \n \n {navigationItems.map(navigationItem => {\n\n // We want the My Account navigation item to go under the burger menu\n if (navigationItem.show && navigationItem.id !== NavigationItemId.MY_ACCOUNT) {\n return (\n \n \n \n {t(navigationItem.translationKey)}\n \n \n \n );\n }\n return null;\n })}\n\n \n setDrawerOpen(true)}>\n setDrawerOpen(false)}>\n \n \n setDrawerOpen(false)}>\n \n \n \n\n {navigationItems.map(navigationItem => {\n\n // We want the My Account navigation item to go under the burger menu\n if (navigationItem.show && navigationItem.id === NavigationItemId.MY_ACCOUNT) {\n return (\n setDrawerOpen(false)}>\n \n {navigationItem.icon()}\n \n \n \n );\n }\n return null;\n })}\n\n \n\n {isAuthenticated\n ? \n \n {getInitials(user)}\n \n \n :\n \n \n \n \n }\n \n \n \n \n \n \n );\n}\n\nconst getInitials = (user: User | undefined): string => {\n const name = getUserName(user);\n \n return name === '' ? name : name[0];\n};\n\nconst getUserName = (user: User | undefined): string => {\n if (user === undefined) {\n return '';\n }\n\n return `${user.givenName} ${user.familyName}`;\n};\n","import React from 'react';\nimport { User } from '../../../types/domain/account.types';\nimport { makeStyles, Theme, createStyles, Grid, Avatar, Link, Box, Divider } from '@material-ui/core';\nimport { deepPurple } from '@material-ui/core/colors';\nimport { Link as RouterLink } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\nimport { NavigationItem } from '../../../types/domain/navigation-item.types';\nimport CultureSelect from '../CultureSelect/CultureSelect';\n\nconst useStyles = makeStyles((theme: Theme) => (\n createStyles({\n signInLinkContainer: {\n marginRight: theme.spacing(2),\n },\n signedInAvatar: {\n color: theme.palette.getContrastText(deepPurple[500]),\n backgroundColor: deepPurple[500],\n },\n signedInWelcome: {\n marginRight: theme.spacing(2),\n },\n link: {\n color: 'inherit',\n textDecoration: 'inherit'\n },\n })\n));\n\nexport type NavigationDesktopProps = {\n isAuthenticated: boolean;\n user: User | undefined;\n navigationItems: NavigationItem[];\n handleSignInClick: () => void;\n handleSignOutClick: () => void;\n};\n\nexport default function NavigationDesktop(props: NavigationDesktopProps) {\n\n const { isAuthenticated, user, navigationItems, handleSignInClick, handleSignOutClick } = props;\n\n const classes = useStyles();\n\n const { t } = useTranslation();\n\n return (\n <>\n \n \n \n \n \n \n \n \n\n \n\n {navigationItems.map(navigationItem => {\n if (navigationItem.show) {\n return (\n \n \n \n {t(navigationItem.translationKey)}\n \n \n \n );\n }\n return null;\n })}\n\n \n {isAuthenticated\n ? \n \n {t('navigation-ui.welcome')}, {getUserName(user)}\n \n \n {t('navigation-ui.sign-out')}\n \n \n \n \n {getInitials(user)}\n \n \n : \n \n {t('navigation-ui.sign-in')}\n \n \n \n \n \n }\n \n \n \n );\n}\n\nconst getInitials = (user: User | undefined): string => {\n const name = getUserName(user);\n\n return name === '' ? name : name[0];\n};\n\nconst getUserName = (user: User | undefined): string => {\n if (user === undefined) {\n return '';\n }\n\n return `${user.givenName} ${user.familyName}`;\n};\n\n","import { StoreModel } from '../store.model';\nimport { AuthenticationState, IAccountInfo } from 'react-aad-msal';\n\nexport const isAuthenticatedSelector = (store: StoreModel) : boolean => store.authenticationState.initialized && store.authenticationState.state === AuthenticationState.Authenticated;\n\nexport const isAuthenticationInitialized = (store: StoreModel) : boolean => store.authenticationState.initialized;\n\nexport const aadAccountSelector = (store: StoreModel) : IAccountInfo | undefined => store.authenticationState.account;","import { StoreModel } from '../store.model';\n\nexport const loggedInUserSelector = (store: StoreModel) => store.accountData.loggedInUser;\n\nexport const uploadCompanyLogoSelector = (store: StoreModel) => store.accountData.uploadCompanyLogoState;\n\nexport const isNewUserSelector = (store: StoreModel) => store.accountData.isNewUser;\n\nexport const gdprConsentSelector = (store: StoreModel) => store.accountData.gdprConsent;\n\nexport const isConfirmedGuestSelector = (store: StoreModel) => store.accountData.isConfirmedGuest;","import React from 'react';\nimport { isEmpty } from 'lodash';\nimport NavigationMobile from './Navigation.mobile';\nimport NavigationTablet from './Navigation.tablet';\nimport NavigationDesktop from './Navigation.desktop';\nimport { useMediaQuery, Theme } from '@material-ui/core';\nimport { useSelector } from 'react-redux';\nimport { isAuthenticatedSelector } from '../../../store/authentication/authentication.selectors';\nimport authProviderFactory from '../../../authentication/authProvider';\nimport { loggedInUserSelector } from '../../../store/account/account.selectors';\nimport { countryIdSelector } from '../../../store/component-state/component-state.selectors';\n\nimport AccountCircleIcon from '@material-ui/icons/AccountCircle';\nimport AddRoundedIcon from '@material-ui/icons/AddRounded';\nimport FolderIcon from '@material-ui/icons/Folder';\nimport { buildRouteWithCountry } from '../../../helpers/routeHelper';\nimport { NavigationItemId } from '../../../types/domain/navigation-item.types';\n\nexport default function Navigation() {\n\n const isTablet = useMediaQuery((theme: Theme) => theme.breakpoints.between('xs', 'sm'));\n const isMobile = useMediaQuery((theme: Theme) => theme.breakpoints.down('xs'));\n\n const countryId = useSelector(countryIdSelector);\n const isAuthenticated = useSelector(isAuthenticatedSelector);\n\n const navigationProps = {\n isAuthenticated,\n user: useSelector(loggedInUserSelector),\n navigationItems: [\n {\n id: NavigationItemId.NEW_CALCULATION,\n route: buildRouteWithCountry(countryId, '/'),\n translationKey: 'navigation-ui.new-calculation',\n show: true,\n icon: () => ,\n },\n {\n id: NavigationItemId.MY_CALCULATIONS,\n route: buildRouteWithCountry(countryId, '/my-calculations'),\n translationKey: 'navigation-ui.my-calculations',\n show: isAuthenticated,\n icon: () => ,\n },\n {\n id: NavigationItemId.MY_ACCOUNT,\n route: buildRouteWithCountry(countryId, '/account'),\n translationKey: 'navigation-ui.my-account',\n show: isAuthenticated,\n icon: () => ,\n }\n ],\n handleSignInClick: () => {\n authProviderFactory().login();\n },\n handleSignOutClick: () => {\n authProviderFactory().logout();\n },\n };\n\n if (isEmpty(countryId)) {\n return null;\n }\n\n if (isMobile) {\n return ;\n }\n\n if (isTablet) {\n return ;\n }\n\n return ;\n}\n","import React from 'react';\nimport styles from './Header.module.scss';\nimport logo from '../../assets/images/kingspan-logo.svg';\nimport { Grid } from '@material-ui/core';\nimport Navigation from './Navigation/Navigation';\n\nexport function Header() {\n return (\n \n \n {/*\n IMPORTANT NOTE: GTM (Google Tag Management) is required to be per country, and GTM cannot be reinitalised (no possible way to clear out tracking of previous countries)\n So we intentionally redirect the whole browser here, rather than redirecting within the SPA, to force a new GTM session.\n */}\n \n \"Logo\"\n \n \n \n \n \n \n );\n}\n","import { CalculationResultType } from './calculation-data.types';\n\nexport type Country = {\n countryId: string;\n englishName: string;\n localizedName: string;\n calculationResultType: CalculationResultType;\n flagEmoji: string;\n calculationStandardName: string;\n}\n\nexport type ConstructionType = {\n id: string;\n nameLocalized: string;\n category: Category;\n complexity: Complexity;\n defaultWoodPercentage?: number;\n additionalParameters?: ConstructionTypeAdditionalParameters[]\n};\n\nexport type ConstructionLayer = {\n constructionLayerId: number;\n constructionTypeId: string;\n name: string;\n nameLocalized: string;\n materials: Material[];\n airCavityGradings: AirCavityGrading[];\n layerType: LayerType;\n isWithinBridgingFrame: boolean;\n isPseudoLayer: boolean;\n};\n\nexport type Material = {\n materialId: string;\n name: string;\n defaultThicknessMillimetres: number;\n optionsForThicknessMillimetres: number[];\n defaultNumberOfAnchorsPerMetreSquare: number;\n optionsForNumberOfAnchorsPerMetreSquare: number[];\n defaultDiameterOfAnchorsMillimetres: number;\n optionsForDiameterOfAnchorsMillimetres: number[];\n defaultAnchorPenetrationMillimetres?: number;\n optionsForAnchorPenetrationMillimetres?: number[];\n linkedMaterials: Material[];\n isLinkedMaterial: boolean;\n isDefaultLayerMaterial: boolean;\n defaultAirCavityGradingId?: string | null;\n};\n\nexport type AirCavityGrading = {\n airCavityGradingId: string;\n airCavityThicknessId: string | null;\n defaultThicknessMillimetres: number | null;\n isDefaultLayerAirCavityGrading: boolean;\n optionsForThicknessMillimetres: number[];\n};\n\nexport type ProjectConfig ={\n fieldid: string, \n country: string,\n fieldNames: string[] | undefined\n}\n\nexport type County ={\n id: number,\n code: string,\n countryId: string\n}\n\nexport type FieldData ={\n id:number, \n fieldName: string,\n code: string\n}\n\nexport enum Category {\n Floor = 'Floor',\n Roof = 'Roof',\n Wall = 'Wall',\n}\n\nexport enum LayerType {\n Other = 'Other',\n Anchors = 'Anchors',\n Insulation = 'Insulation',\n AirCavity = 'AirCavity',\n Bridging = 'Bridging',\n AnchorsPreCalculated = 'AnchorsPreCalculated',\n WoodPercentage = 'WoodPercentage',\n}\n\nexport enum Complexity {\n Simple = 'Simple',\n Complex = 'Complex',\n}\n\nexport enum ConstructionTypeAdditionalParameters {\n PerimeterAndArea = 'PerimeterAndArea',\n}","import { Material, AirCavityGrading, ConstructionLayer } from '../../types/domain/construction-data.types';\nimport { CalculationLayer, CalculationResult, ProjectDetails, Calculation, AdditionalParameters } from '../../types/domain/calculation-data.types';\n\nexport const SET_PROJECT_DETAILS = 'SET_PROJECT_DETAILS';\nexport const SET_ADDITIONAL_PARAMETERS = 'SET_ADDITIONAL_PARAMETERS';\nexport const SET_MATERIAL = 'SET_MATERIAL';\nexport const SET_AIR_CAVITY_GRADING = 'SET_AIR_CAVITY_GRADING';\nexport const SET_THICKNESS = 'SET_THICKNESS';\nexport const SET_ANCHOR_PER_SQUARE_METRE = 'SET_ANCHOR_PER_SQUARE_METRE';\nexport const SET_ANCHOR_DIAMETER = 'SET_ANCHOR_DIAMETER';\nexport const SET_ANCHOR_PENETRATION = 'SET_ANCHOR_PENETRATION';\nexport const SET_NET_AREA_PER_METRE_SQUARE = '';\nexport const SET_WOOD_PERCENTAGE = 'SET_WOOD_PERCENTAGE';\nexport const SET_CALCULATED_LAYER_VALUE = 'SET_CALCULATED_LAYER_VALUE';\nexport const NEW_CALCULATION_STARTED = 'NEW_CALCULATION_STARTED';\nexport const EDIT_CALCULATION_STARTED = 'EDIT_CALCULATION_STARTED';\nexport const COPY_CALCULATION_STARTED = 'COPY_CALCULATION_STARTED';\nexport const CREATE_LINKED_LAYER = 'CREATE_LINKED_LAYER';\nexport const REMOVE_LINKED_LAYER = 'REMOVE_LINKED_LAYER';\n\nexport const CLEAR_CURRENT_CALCULATION = 'CLEAR_CURRENT_CALCULATION';\n\nexport const FETCH_CALCULATION_RESULTS_ATTEMPT = 'FETCH_CALCULATION_RESULTS_ATTEMPT';\nexport const FETCH_CALCULATION_RESULTS_SUCCESS = 'FETCH_CALCULATION_RESULTS_SUCCESS';\nexport const FETCH_CALCULATION_RESULTS_CLIENT_ERROR = 'FETCH_CALCULATION_RESULTS_CLIENT_ERROR';\nexport const FETCH_CALCULATION_RESULTS_FAILURE = 'FETCH_CALCULATION_RESULTS_FAILURE';\n\nexport interface SetProjectDetails {\n type: typeof SET_PROJECT_DETAILS;\n payload: ProjectDetails;\n}\n\nexport interface SetAdditionalParameters {\n type: typeof SET_ADDITIONAL_PARAMETERS;\n payload: AdditionalParameters;\n}\n\nexport interface SetAirCavityGrading {\n type: typeof SET_AIR_CAVITY_GRADING;\n payload: {\n constructionLayerId: number,\n airCavityGrading: AirCavityGrading,\n }\n}\n\nexport interface SetMaterial {\n type: typeof SET_MATERIAL;\n payload: {\n constructionLayerId: number,\n material: Material,\n isLinkedLayer: boolean,\n }\n}\n\nexport interface SetThickness {\n type: typeof SET_THICKNESS;\n payload: {\n constructionLayerId: number,\n thicknessMillimetres: number,\n isLinkedLayer: boolean,\n }\n}\n\nexport interface SetAnchorDiameter {\n type: typeof SET_ANCHOR_DIAMETER;\n payload: {\n constructionLayerId: number,\n diameterOfAnchorsMillimetres: number,\n isLinkedLayer: boolean,\n }\n}\n\nexport interface SetAnchorAmountPerSquareMetre {\n type: typeof SET_ANCHOR_PER_SQUARE_METRE;\n payload: {\n constructionLayerId: number,\n numberOfAnchorsPerMetreSquare: number,\n isLinkedLayer: boolean,\n }\n}\n\nexport interface SetNetAreaPerMetreSquare {\n type: typeof SET_NET_AREA_PER_METRE_SQUARE;\n payload: {\n constructionLayerId: number,\n netAreaOfAnchorsPerMetreSquareMillimetresSqrd: number,\n isLinkedLayer: boolean,\n }\n}\n\nexport interface SetAnchorPenetration {\n type: typeof SET_ANCHOR_PENETRATION;\n payload: {\n constructionLayerId: number,\n anchorPenetrationDepthMillimetres: number | undefined,\n isLinkedLayer: boolean,\n }\n}\n\nexport interface SetWoodPercentage {\n type: typeof SET_WOOD_PERCENTAGE;\n payload: {\n constructionLayerId: number,\n percentage: number,\n isLinkedLayer: boolean,\n }\n}\n\nexport interface SetCalculatedLayerValue {\n type: typeof SET_CALCULATED_LAYER_VALUE;\n payload: {\n bridgingLayer: ConstructionLayer,\n insulationLayer: ConstructionLayer,\n airCavityLayer: ConstructionLayer,\n }\n}\nexport interface NewCalculcationStarted {\n type: typeof NEW_CALCULATION_STARTED;\n payload: {\n constructionTypeId: string,\n calculationLayers: { [key: string]: CalculationLayer }\n }\n}\n\nexport interface EditCalculcationStarted {\n type: typeof EDIT_CALCULATION_STARTED;\n payload: {\n calculationId: string,\n calculationAccessCode: string,\n constructionTypeId: string,\n calculationLayers: { [key: string]: CalculationLayer },\n projectDetails: ProjectDetails,\n calculationResult: CalculationResult,\n additionalParameters: AdditionalParameters,\n }\n}\n\nexport interface CopyCalculcationStarted {\n type: typeof COPY_CALCULATION_STARTED;\n payload: {\n constructionTypeId: string,\n calculationLayers: { [key: string]: CalculationLayer },\n projectDetails: ProjectDetails,\n additionalParameters: AdditionalParameters,\n }\n}\n\nexport interface CreateLinkedLayer {\n type: typeof CREATE_LINKED_LAYER;\n payload: {\n calculationLayer: CalculationLayer,\n }\n}\n\nexport interface RemoveLinkedLayer {\n type: typeof REMOVE_LINKED_LAYER;\n payload: {\n constructionLayerId: number,\n }\n}\n\nexport interface ClearCurrentCalculation {\n type: typeof CLEAR_CURRENT_CALCULATION;\n}\n\nexport interface FetchCalculationResultsAttempt {\n type: typeof FETCH_CALCULATION_RESULTS_ATTEMPT;\n}\n\nexport interface FetchCalculationResultsSuccess {\n type: typeof FETCH_CALCULATION_RESULTS_SUCCESS;\n payload: Calculation;\n}\n\nexport interface FetchCalculationResultsClientError {\n type: typeof FETCH_CALCULATION_RESULTS_CLIENT_ERROR;\n}\n\nexport interface FetchCalculationResultsFailure {\n type: typeof FETCH_CALCULATION_RESULTS_FAILURE;\n error: string;\n}\n\n\nexport type CurrentCalculationDataActionTypes =\n | SetProjectDetails\n | SetAdditionalParameters\n | SetAirCavityGrading\n | SetMaterial\n | SetThickness\n | SetAnchorDiameter\n | SetAnchorAmountPerSquareMetre\n | SetAnchorPenetration\n | SetNetAreaPerMetreSquare\n | SetWoodPercentage\n | NewCalculcationStarted\n | EditCalculcationStarted\n | CopyCalculcationStarted\n | SetCalculatedLayerValue\n | CreateLinkedLayer\n | RemoveLinkedLayer\n | ClearCurrentCalculation\n | FetchCalculationResultsAttempt\n | FetchCalculationResultsSuccess\n | FetchCalculationResultsClientError\n | FetchCalculationResultsFailure;\n","import {\n SET_MATERIAL,\n SET_THICKNESS,\n SetMaterial,\n SetThickness,\n NEW_CALCULATION_STARTED,\n NewCalculcationStarted,\n SET_ANCHOR_DIAMETER,\n SET_ANCHOR_PER_SQUARE_METRE,\n SetAnchorDiameter,\n SetAnchorAmountPerSquareMetre,\n FETCH_CALCULATION_RESULTS_ATTEMPT,\n FETCH_CALCULATION_RESULTS_SUCCESS,\n FETCH_CALCULATION_RESULTS_CLIENT_ERROR,\n FETCH_CALCULATION_RESULTS_FAILURE,\n FetchCalculationResultsAttempt,\n FetchCalculationResultsSuccess,\n FetchCalculationResultsClientError,\n FetchCalculationResultsFailure,\n REMOVE_LINKED_LAYER,\n CREATE_LINKED_LAYER,\n RemoveLinkedLayer,\n CreateLinkedLayer,\n SetWoodPercentage,\n SET_WOOD_PERCENTAGE,\n SET_CALCULATED_LAYER_VALUE,\n SetCalculatedLayerValue,\n SetAnchorPenetration,\n SET_ANCHOR_PENETRATION,\n SET_NET_AREA_PER_METRE_SQUARE,\n SetNetAreaPerMetreSquare,\n SetProjectDetails,\n SET_PROJECT_DETAILS,\n SetAdditionalParameters,\n SET_ADDITIONAL_PARAMETERS,\n EditCalculcationStarted,\n EDIT_CALCULATION_STARTED,\n CLEAR_CURRENT_CALCULATION,\n ClearCurrentCalculation,\n COPY_CALCULATION_STARTED,\n CopyCalculcationStarted,\n SetAirCavityGrading,\n SET_AIR_CAVITY_GRADING\n}\n from './current-calculation-data.action-types';\nimport { Material, AirCavityGrading, ConstructionLayer } from '../../types/domain/construction-data.types';\nimport { CalculationLayer, CalculationResult, ProjectDetails, Calculation, AdditionalParameters } from '../../types/domain/calculation-data.types';\n\nexport const setProjectDetails = (projectDetails: ProjectDetails): SetProjectDetails => ({\n type: SET_PROJECT_DETAILS,\n payload: projectDetails,\n});\n\nexport const setAdditionalParameters = (additionalParameters: AdditionalParameters): SetAdditionalParameters => ({\n type: SET_ADDITIONAL_PARAMETERS,\n payload: additionalParameters,\n});\n\nexport const setAirCavityGradingInternal = (airCavityGrading: AirCavityGrading, constructionLayerId: number): SetAirCavityGrading => ({\n type: SET_AIR_CAVITY_GRADING,\n payload: {\n airCavityGrading,\n constructionLayerId,\n }\n});\n\nexport const setMaterialInternal = (material: Material, constructionLayerId: number, isLinkedLayer: boolean): SetMaterial => ({\n type: SET_MATERIAL,\n payload: {\n material,\n constructionLayerId,\n isLinkedLayer,\n }\n});\n\nexport const setThickness = (thicknessMillimetres: number, constructionLayerId: number, isLinkedLayer: boolean): SetThickness => ({\n type: SET_THICKNESS,\n payload: {\n thicknessMillimetres,\n constructionLayerId,\n isLinkedLayer,\n }\n});\n\nexport const newCalculationStarted = (layers: { [key: string]: CalculationLayer }, constructionTypeId: string): NewCalculcationStarted => ({\n type: NEW_CALCULATION_STARTED,\n payload: {\n calculationLayers: layers,\n constructionTypeId\n }\n});\n\n\nexport const editCalculationStarted = (\n calculationId: string,\n calculationAccessCode: string,\n layers: { [key: string]: CalculationLayer },\n constructionTypeId: string,\n projectDetails: ProjectDetails,\n calculationResult: CalculationResult,\n additionalParameters: AdditionalParameters,\n): EditCalculcationStarted => ({\n type: EDIT_CALCULATION_STARTED,\n payload: {\n calculationId,\n calculationAccessCode,\n calculationLayers: layers,\n constructionTypeId,\n projectDetails,\n calculationResult,\n additionalParameters\n }\n});\n\n\nexport const copyCalculationStarted = (layers: { [key: string]: CalculationLayer }, constructionTypeId: string, projectDetails: ProjectDetails, additionalParameters: AdditionalParameters): CopyCalculcationStarted => ({\n type: COPY_CALCULATION_STARTED,\n payload: {\n calculationLayers: layers,\n constructionTypeId,\n projectDetails,\n additionalParameters\n }\n});\n\nexport const createLinkedLayer = (calculationLayer: CalculationLayer): CreateLinkedLayer => ({\n type: CREATE_LINKED_LAYER,\n payload: {\n calculationLayer,\n }\n});\n\nexport const removeLinkedLayer = (constructionLayerId: number): RemoveLinkedLayer => ({\n type: REMOVE_LINKED_LAYER,\n payload: {\n constructionLayerId,\n }\n});\n\nexport const setAnchorDiameter = (diameterOfAnchorsMillimetres: number, constructionLayerId: number, isLinkedLayer: boolean): SetAnchorDiameter => ({\n type: SET_ANCHOR_DIAMETER,\n payload: {\n diameterOfAnchorsMillimetres,\n constructionLayerId,\n isLinkedLayer,\n }\n});\n\nexport const setAnchorAmountPerSquareMetre = (numberOfAnchorsPerMetreSquare: number, constructionLayerId: number, isLinkedLayer: boolean): SetAnchorAmountPerSquareMetre => ({\n type: SET_ANCHOR_PER_SQUARE_METRE,\n payload: {\n numberOfAnchorsPerMetreSquare,\n constructionLayerId,\n isLinkedLayer,\n }\n});\n\nexport const setAnchorPenetration = (anchorPenetrationDepthMillimetres: number | undefined, constructionLayerId: number, isLinkedLayer: boolean): SetAnchorPenetration => ({\n type: SET_ANCHOR_PENETRATION,\n payload: {\n anchorPenetrationDepthMillimetres,\n constructionLayerId,\n isLinkedLayer,\n }\n});\n\nexport const setNetAreaPerMetreSquare = (netAreaOfAnchorsPerMetreSquareMillimetresSqrd: number, constructionLayerId: number, isLinkedLayer: boolean): SetNetAreaPerMetreSquare => ({\n type: SET_NET_AREA_PER_METRE_SQUARE,\n payload: {\n netAreaOfAnchorsPerMetreSquareMillimetresSqrd,\n constructionLayerId,\n isLinkedLayer,\n }\n});\n\nexport const setWoodPercentage = (percentage: number, constructionLayerId: number, isLinkedLayer: boolean): SetWoodPercentage => ({\n type: SET_WOOD_PERCENTAGE,\n payload: {\n percentage,\n constructionLayerId,\n isLinkedLayer,\n }\n});\n\nexport const setCalculatedLayerValue = (bridgingLayer: ConstructionLayer, insulationLayer: ConstructionLayer, airCavityLayer: ConstructionLayer): SetCalculatedLayerValue => ({\n type: SET_CALCULATED_LAYER_VALUE,\n payload: {\n bridgingLayer,\n insulationLayer,\n airCavityLayer,\n }\n});\n\nexport const clearCurrentCalculation = (): ClearCurrentCalculation => ({\n type: CLEAR_CURRENT_CALCULATION,\n});\n\nexport const fetchCalculationResultsAttempt = (): FetchCalculationResultsAttempt => ({\n type: FETCH_CALCULATION_RESULTS_ATTEMPT,\n});\n\nexport const fetchCalculationResultsSuccess = (data: Calculation): FetchCalculationResultsSuccess => ({\n type: FETCH_CALCULATION_RESULTS_SUCCESS,\n payload: data,\n});\n\nexport const fetchCalculationResultsFailure = (error: any): FetchCalculationResultsFailure => ({\n type: FETCH_CALCULATION_RESULTS_FAILURE,\n error,\n});\n\nexport const fetchCalculationResultsClientError = (): FetchCalculationResultsClientError => ({\n type: FETCH_CALCULATION_RESULTS_CLIENT_ERROR,\n});\n","import * as actionTypes from './current-calculation-data.action-types';\nimport { CalculationDataModel } from '../store.model';\nimport { CalculationLayer } from '../../types/domain/calculation-data.types';\n\nexport const initialState: CalculationDataModel = {\n calculationLayers: {},\n};\n\nexport const currentCalculationDataReducer = (\n state: CalculationDataModel = initialState,\n action: actionTypes.CurrentCalculationDataActionTypes,\n): CalculationDataModel => {\n switch (action.type) {\n case actionTypes.SET_PROJECT_DETAILS:\n return {\n ...state,\n projectDetails: action.payload,\n };\n case actionTypes.SET_ADDITIONAL_PARAMETERS:\n return {\n ...state,\n additionalParameters: action.payload,\n };\n case actionTypes.SET_AIR_CAVITY_GRADING:\n return {\n ...state,\n calculationLayers: {\n ...state.calculationLayers,\n [getCalculationLayerKey(action.payload.constructionLayerId, false)]: {\n ...state.calculationLayers[getCalculationLayerKey(action.payload.constructionLayerId)],\n airCavityGrading: action.payload.airCavityGrading\n }\n }\n };\n case actionTypes.SET_MATERIAL:\n return {\n ...state,\n calculationLayers: {\n ...state.calculationLayers,\n [getCalculationLayerKey(action.payload.constructionLayerId, action.payload.isLinkedLayer)]: {\n ...state.calculationLayers[getCalculationLayerKey(action.payload.constructionLayerId)],\n material: action.payload.material\n }\n }\n };\n case actionTypes.SET_THICKNESS:\n return {\n ...state,\n calculationLayers: {\n ...state.calculationLayers,\n [getCalculationLayerKey(action.payload.constructionLayerId, action.payload.isLinkedLayer)]: {\n ...state.calculationLayers[getCalculationLayerKey(action.payload.constructionLayerId, action.payload.isLinkedLayer)],\n thicknessMillimetres: action.payload.thicknessMillimetres\n }\n }\n };\n case actionTypes.SET_ANCHOR_DIAMETER:\n return {\n ...state,\n calculationLayers: {\n ...state.calculationLayers,\n [getCalculationLayerKey(action.payload.constructionLayerId, action.payload.isLinkedLayer)]: {\n ...state.calculationLayers[getCalculationLayerKey(action.payload.constructionLayerId)],\n diameterOfAnchorsMillimetres: action.payload.diameterOfAnchorsMillimetres\n }\n }\n };\n case actionTypes.SET_ANCHOR_PER_SQUARE_METRE:\n return {\n ...state,\n calculationLayers: {\n ...state.calculationLayers,\n [getCalculationLayerKey(action.payload.constructionLayerId, action.payload.isLinkedLayer)]: {\n ...state.calculationLayers[getCalculationLayerKey(action.payload.constructionLayerId, action.payload.isLinkedLayer)],\n numberOfAnchorsPerMetreSquare: action.payload.numberOfAnchorsPerMetreSquare\n }\n }\n };\n case actionTypes.SET_ANCHOR_PENETRATION:\n return {\n ...state,\n calculationLayers: {\n ...state.calculationLayers,\n [getCalculationLayerKey(action.payload.constructionLayerId, action.payload.isLinkedLayer)]: {\n ...state.calculationLayers[getCalculationLayerKey(action.payload.constructionLayerId, action.payload.isLinkedLayer)],\n anchorPenetrationDepthMillimetres: action.payload.anchorPenetrationDepthMillimetres\n }\n }\n };\n case actionTypes.SET_NET_AREA_PER_METRE_SQUARE:\n return {\n ...state,\n calculationLayers: {\n ...state.calculationLayers,\n [getCalculationLayerKey(action.payload.constructionLayerId, action.payload.isLinkedLayer)]: {\n ...state.calculationLayers[getCalculationLayerKey(action.payload.constructionLayerId, action.payload.isLinkedLayer)],\n netAreaOfAnchorsPerMetreSquareMillimetresSqrd: action.payload.netAreaOfAnchorsPerMetreSquareMillimetresSqrd\n }\n }\n };\n case actionTypes.SET_WOOD_PERCENTAGE:\n return {\n ...state,\n calculationLayers: {\n ...state.calculationLayers,\n [getCalculationLayerKey(action.payload.constructionLayerId, action.payload.isLinkedLayer)]: {\n ...state.calculationLayers[getCalculationLayerKey(action.payload.constructionLayerId, action.payload.isLinkedLayer)],\n thicknessMillimetres: action.payload.percentage\n }\n }\n };\n case actionTypes.SET_CALCULATED_LAYER_VALUE:\n const airLayerThickness = Math.max(0, (state.calculationLayers[getCalculationLayerKey(action.payload.bridgingLayer.constructionLayerId)].thicknessMillimetres)\n - ((action.payload?.insulationLayer?.constructionLayerId) ? state.calculationLayers[getCalculationLayerKey(action.payload.insulationLayer.constructionLayerId)].thicknessMillimetres : 0));\n\n const noAirLayerGrading = action.payload.airCavityLayer.airCavityGradings.find(a => a.airCavityGradingId === 'no-air-layer');\n const currentGrading = state.calculationLayers[getCalculationLayerKey(action.payload.airCavityLayer.constructionLayerId)].airCavityGrading;\n\n const airCavityGrading = airLayerThickness <= 0\n ? noAirLayerGrading ?? currentGrading\n : currentGrading?.airCavityGradingId === noAirLayerGrading?.airCavityGradingId\n ? action.payload.airCavityLayer.airCavityGradings.find(a => a.airCavityGradingId === state.calculationLayers[getCalculationLayerKey(action.payload.insulationLayer.constructionLayerId)].material?.defaultAirCavityGradingId)\n : currentGrading;\n\n return {\n ...state,\n calculationLayers: {\n ...state.calculationLayers,\n [getCalculationLayerKey(action.payload.airCavityLayer.constructionLayerId)]: {\n ...state.calculationLayers[getCalculationLayerKey(action.payload.airCavityLayer.constructionLayerId)],\n thicknessMillimetres: airLayerThickness,\n airCavityGrading: airCavityGrading,\n }\n }\n };\n case actionTypes.CREATE_LINKED_LAYER:\n return {\n ...state,\n calculationLayers: {\n ...state.calculationLayers,\n [getCalculationLayerKey(action.payload.calculationLayer.constructionLayerId, true)]: {\n ...action.payload.calculationLayer\n }\n }\n };\n case actionTypes.REMOVE_LINKED_LAYER:\n\n if (!state.calculationLayers[getCalculationLayerKey(action.payload.constructionLayerId, true)]) {\n return state;\n }\n\n\n const cl = Object.keys(state.calculationLayers)\n .filter(key => key !== getCalculationLayerKey(action.payload.constructionLayerId, true))\n .reduce((result, key) => ({\n ...result,\n [key]: state.calculationLayers[key],\n }), {}) as { [key: string]: CalculationLayer };\n\n return {\n ...state,\n calculationLayers: {\n ...cl\n }\n };\n\n case actionTypes.FETCH_CALCULATION_RESULTS_SUCCESS:\n return {\n ...state,\n calculationResult: action.payload.calculationResult,\n calculationId: action.payload.calculationId,\n calculationAccessCode: action.payload.calculationAccessCode\n };\n case actionTypes.NEW_CALCULATION_STARTED:\n return {\n ...state,\n calculationLayers: action.payload.calculationLayers\n };\n case actionTypes.EDIT_CALCULATION_STARTED:\n return {\n ...state,\n calculationLayers: action.payload.calculationLayers,\n calculationResult: action.payload.calculationResult,\n projectDetails: action.payload.projectDetails,\n additionalParameters: action.payload.additionalParameters,\n calculationAccessCode: action.payload.calculationAccessCode,\n calculationId: action.payload.calculationId,\n };\n case actionTypes.COPY_CALCULATION_STARTED:\n return {\n ...state,\n calculationLayers: action.payload.calculationLayers,\n projectDetails: action.payload.projectDetails,\n additionalParameters: action.payload.additionalParameters,\n };\n case actionTypes.CLEAR_CURRENT_CALCULATION:\n return initialState;\n default:\n return state;\n }\n};\n\n/* Might be a better place for this function */\nexport const getCalculationLayerKey = (constructionLayerId: number, isLinkedLayer: boolean = false) => constructionLayerId.toString() + (isLinkedLayer ? '.linked' : '');\n","import { StoreModel, CalculationDataModel } from '../store.model';\nimport { Material, AirCavityGrading, LayerType } from '../../types/domain/construction-data.types';\nimport { CalculationResult, ProjectDetails, CalculationLayer, AdditionalParameters } from '../../types/domain/calculation-data.types';\nimport { getCalculationLayerKey } from './current-calculation-data.reducer';\n\nexport const currentCalculationResultSelector = (store: StoreModel): CalculationResult | undefined => store.currentCalculationData.calculationResult;\n\nexport const currentCalculationDataSelector = (store: StoreModel): CalculationDataModel => store.currentCalculationData;\n\nexport const currentSelectedMaterialSelector = (isLinkedMaterial: boolean) => (store: StoreModel): Material | undefined =>\n store.currentCalculationData.calculationLayers[getCalculationLayerKey(store.componentState.activeConstructionLayerId, isLinkedMaterial)]?.material;\n\nexport const currentSelectedAirCavityGradingSelector = (store: StoreModel): AirCavityGrading | undefined =>\n store.currentCalculationData.calculationLayers[getCalculationLayerKey(store.componentState.activeConstructionLayerId, false)]?.airCavityGrading;\n\nexport const currentSelectedThicknessSelector = (isLinkedMaterial: boolean) => (store: StoreModel): number =>\n store.currentCalculationData.calculationLayers[getCalculationLayerKey(store.componentState.activeConstructionLayerId, isLinkedMaterial)]?.thicknessMillimetres;\n\nexport const previousInsulationCalculationLayerSelector = (store: StoreModel): CalculationLayer | undefined => {\n const constructionLayers = store.constructionData.layers[store.componentState.activeConstructionTypeId];\n const insluationLayerIndexes = constructionLayers\n .map((cl, index) => ({ layer: cl, index }))\n .filter(t => t.layer.layerType === LayerType.Insulation);\n\n let layerId = 0;\n if (insluationLayerIndexes.length === 1) {\n layerId = insluationLayerIndexes[0].layer?.constructionLayerId ?? 0;\n }\n else {\n layerId = insluationLayerIndexes\n .find(t => t.index < constructionLayers.indexOf(constructionLayers\n .filter(cl => cl.constructionLayerId === store.componentState.activeConstructionLayerId)[0]))?.layer?.constructionLayerId ?? 0;\n }\n\n return store.currentCalculationData.calculationLayers[getCalculationLayerKey(layerId)];\n};\n\nexport const currentAnchorPropertiesSelector = (store: StoreModel): any => {\n const layer = store.currentCalculationData.calculationLayers[getCalculationLayerKey(store.componentState.activeConstructionLayerId)];\n return {\n numberOfAnchorsPerMetreSquare: layer?.numberOfAnchorsPerMetreSquare,\n diameterOfAnchorsMillimetres: layer?.diameterOfAnchorsMillimetres,\n anchorPenetrationDepthMillimetres: layer?.anchorPenetrationDepthMillimetres,\n netAreaOfAnchorsPerMetreSquareMillimetresSqrd: layer?.netAreaOfAnchorsPerMetreSquareMillimetresSqrd,\n };\n};\n\nexport const projectDetailsSelector = (store: StoreModel): ProjectDetails | undefined => store.currentCalculationData.projectDetails;\n\nexport const additionalParametersSelector = (store: StoreModel): AdditionalParameters | undefined => store.currentCalculationData.additionalParameters;\n","import { ProjectDetails, CalculationResult, CalculationLayer, Calculation } from '../types/domain/calculation-data.types';\nimport { getCalculationLayerKey } from '../store/current-calculation-data/current-calculation-data.reducer';\nimport { parseISO } from 'date-fns';\n\ntype ApiCalculation = {\n calculationLayers: CalculationLayer[];\n calculationResult: CalculationResult;\n projectDetails?: ProjectDetails;\n createdOn: string;\n updatedOn: string;\n constructionTypeId: string;\n countryId: string;\n woodPercentage: number | null;\n};\n\nexport const mapApiResponseArrayToCalculcationObjectCollection = (data: ApiCalculation[]): { [key: string]: Calculation } => {\n if (data.length) {\n return (data as ApiCalculation[])\n .map(mapApiResponseToCalculcation)\n .reduce((obj, item) => {\n return {\n ...obj,\n [item.calculationId]: item\n };\n }, {}) as { [key: string]: Calculation };\n }\n return {};\n};\n\nexport const mapApiResponseToCalculcation = (calc: ApiCalculation): Calculation => {\n const { calculationLayers, projectDetails, ...result } = calc;\n\n return {\n ...result,\n projectDetails: {\n ...projectDetails,\n startDate: projectDetails?.startDate ? parseISO(projectDetails?.startDate.toString()) : undefined\n },\n createdOn: parseISO(result.createdOn),\n updatedOn: parseISO(result.updatedOn),\n calculationLayers: calculationLayers.reduce((obj, item) => {\n return {\n ...obj,\n [getCalculationLayerKey(item.constructionLayerId, item.material?.isLinkedMaterial ?? false)]: item\n };\n }, {})\n } as Calculation;\n};\n","\nimport axios from 'axios';\nimport { ConstructionLayer, Material, LayerType, Complexity, AirCavityGrading } from '../../types/domain/construction-data.types';\nimport { CurrentCalculationDataActionTypes } from './current-calculation-data.action-types';\nimport { CalculationLayer, ProjectDetails, Calculation } from '../../types/domain/calculation-data.types';\nimport {\n newCalculationStarted,\n fetchCalculationResultsAttempt,\n fetchCalculationResultsSuccess,\n fetchCalculationResultsClientError,\n fetchCalculationResultsFailure,\n setMaterialInternal,\n setThickness,\n setAnchorDiameter,\n setAnchorAmountPerSquareMetre,\n createLinkedLayer,\n removeLinkedLayer,\n setCalculatedLayerValue,\n setAnchorPenetration,\n editCalculationStarted,\n copyCalculationStarted,\n setAirCavityGradingInternal,\n} from './current-calculation-data.actions';\nimport { selectedCultureSelector } from '../../store/component-state/component-state.selectors';\nimport { StoreModel } from '../store.model';\nimport { getCalculationLayerKey } from './current-calculation-data.reducer';\nimport { AuthenticationState } from 'react-aad-msal';\nimport { activeConstructionTypeSelector } from '../component-state/component-state.selectors';\nimport { additionalParametersSelector, projectDetailsSelector } from './current-calculation-data.selectors';\nimport { mapApiResponseToCalculcation } from '../../helpers/calculation-response-helper';\nimport { debounce } from 'lodash';\n\nconst getDefaultMaterial = (layer: ConstructionLayer): Material | undefined => layer.materials.filter(m => m.isDefaultLayerMaterial)[0] ?? layer.materials[0];\n\nconst getDefaultLinkedMaterial = (parentMaterial: Material | undefined): Material | undefined => (parentMaterial && parentMaterial.linkedMaterials.filter(m => m.isDefaultLayerMaterial)[0]) ?? (parentMaterial && parentMaterial.linkedMaterials[0]);\n\nconst getDefaultAirCavityGrading = (layer: ConstructionLayer): AirCavityGrading | undefined => layer.airCavityGradings.filter(ac => ac.isDefaultLayerAirCavityGrading)[0] ?? layer.airCavityGradings[0];\n\nconst applyAutomaticBridgedInsulationAndAirCavityScenario = (constructionLayers: ConstructionLayer[], calculationLayers: { [key: string]: CalculationLayer }) => {\n // In the scenario where there is a bridging layer, and a bridged insulation layer, and an air cavity layer,\n // then the air cavity layer needs its value setting automatically.\n const bridgedInsulationLayerId: number | undefined = constructionLayers.filter(cl => cl.layerType === LayerType.Insulation && cl.isWithinBridgingFrame)[0]?.constructionLayerId;\n const bridgingLayerId: number | undefined = constructionLayers.filter(cl => cl.layerType === LayerType.Bridging)[0]?.constructionLayerId;\n const bridgedAirCavityLayerId: number | undefined = constructionLayers.filter(cl => cl.layerType === LayerType.AirCavity && cl.isWithinBridgingFrame)[0]?.constructionLayerId;\n if (bridgedInsulationLayerId && bridgingLayerId && bridgedAirCavityLayerId) {\n const insulationLayer = calculationLayers[getCalculationLayerKey(bridgedInsulationLayerId)];\n const airLayer = calculationLayers[getCalculationLayerKey(bridgedAirCavityLayerId)];\n const availableGradings = constructionLayers.find(cl => cl.constructionLayerId === airLayer.constructionLayerId)?.airCavityGradings;\n airLayer.thicknessMillimetres = calculationLayers[getCalculationLayerKey(bridgingLayerId)].thicknessMillimetres - insulationLayer.thicknessMillimetres;\n\n if (airLayer.thicknessMillimetres === 0 && availableGradings) {\n const noAirLayerGrading = availableGradings.find(a => a.airCavityGradingId === 'no-air-layer');\n airLayer.airCavityGrading = noAirLayerGrading;\n }\n else if (insulationLayer.material?.defaultAirCavityGradingId && availableGradings) {\n airLayer.airCavityGrading = availableGradings.find(g => g.airCavityGradingId === insulationLayer.material?.defaultAirCavityGradingId);\n }\n }\n};\n\nconst mapToCalculationLayers = (mappingFunction: (layer: ConstructionLayer) => CalculationLayer, constructionLayers: ConstructionLayer[]): { [key: string]: CalculationLayer } => {\n const calculationLayers = constructionLayers.map(mappingFunction).reduce((obj, item) => {\n return {\n ...obj,\n [getCalculationLayerKey(item.constructionLayerId)]: item\n };\n }, {}) as { [key: string]: CalculationLayer };\n\n applyAutomaticBridgedInsulationAndAirCavityScenario(constructionLayers, calculationLayers);\n\n // Add in any linked layers for the default materials\n constructionLayers.forEach(cl => {\n const defaultMaterial = getDefaultMaterial(cl);\n const defaultLinkedMaterial = getDefaultLinkedMaterial(defaultMaterial);\n if (defaultLinkedMaterial) {\n calculationLayers[getCalculationLayerKey(cl.constructionLayerId, true)] = {\n constructionLayerId: cl.constructionLayerId,\n thicknessMillimetres: defaultLinkedMaterial.defaultThicknessMillimetres,\n material: defaultLinkedMaterial\n };\n }\n });\n\n return calculationLayers;\n};\n\nexport const startNewCalculation = (constructionTypeId: string, constructionLayers: ConstructionLayer[]) => (\n\n async (dispatch: (action: CurrentCalculationDataActionTypes) => void, getState: () => StoreModel) => {\n\n const calculationLayers = mapToCalculationLayers(cl => {\n const defaultMaterial = getDefaultMaterial(cl);\n const defaultAirCavityGrading = getDefaultAirCavityGrading(cl);\n\n switch (cl.layerType) {\n case LayerType.WoodPercentage:\n return {\n constructionLayerId: cl.constructionLayerId,\n thicknessMillimetres: Math.round((getState().constructionData.types.filter(ct => ct.id === constructionTypeId)[0].defaultWoodPercentage ?? 0.2) * 100),\n } as CalculationLayer;\n case LayerType.Anchors:\n return {\n constructionLayerId: cl.constructionLayerId,\n material: defaultMaterial,\n diameterOfAnchorsMillimetres: defaultMaterial?.defaultDiameterOfAnchorsMillimetres,\n numberOfAnchorsPerMetreSquare: defaultMaterial?.defaultNumberOfAnchorsPerMetreSquare,\n anchorPenetrationDepthMillimetres: defaultMaterial?.defaultAnchorPenetrationMillimetres,\n } as CalculationLayer;\n case LayerType.AnchorsPreCalculated:\n return {\n constructionLayerId: cl.constructionLayerId,\n material: defaultMaterial,\n netAreaOfAnchorsPerMetreSquareMillimetresSqrd: 50,\n } as CalculationLayer;\n case LayerType.AirCavity:\n return {\n constructionLayerId: cl.constructionLayerId,\n thicknessMillimetres: defaultAirCavityGrading?.defaultThicknessMillimetres,\n airCavityGrading: defaultAirCavityGrading,\n } as CalculationLayer;\n default:\n return {\n constructionLayerId: cl.constructionLayerId,\n thicknessMillimetres: defaultMaterial?.defaultThicknessMillimetres,\n material: defaultMaterial,\n } as CalculationLayer;\n }\n }, constructionLayers);\n\n dispatch(newCalculationStarted(calculationLayers, constructionTypeId));\n }\n);\n\nconst buildCalculationLayersFromSaved = (calculation: Calculation, constructionLayers: ConstructionLayer[]) => {\n const calculationLayers = mapToCalculationLayers(cl => {\n const savedReferenceLayer = Object\n .values(calculation.calculationLayers)\n .find(calculationLayer => calculationLayer.constructionLayerId === cl.constructionLayerId &&\n calculationLayer.material?.isLinkedMaterial !== true);\n\n const material = cl.materials.filter(m => m.materialId === savedReferenceLayer?.material?.materialId)[0] ?? getDefaultMaterial(cl);\n const airCavityGrading = cl.airCavityGradings.filter(ac => ac.airCavityGradingId === savedReferenceLayer?.airCavityGrading?.airCavityGradingId)[0] ?? getDefaultAirCavityGrading(cl);\n\n switch (cl.layerType) {\n case LayerType.WoodPercentage:\n return {\n constructionLayerId: cl.constructionLayerId,\n thicknessMillimetres: (calculation.woodPercentage ?? 0.2) * 100,\n } as CalculationLayer;\n case LayerType.Anchors:\n return {\n constructionLayerId: cl.constructionLayerId,\n material: material,\n diameterOfAnchorsMillimetres: savedReferenceLayer?.diameterOfAnchorsMillimetres ?? material?.defaultDiameterOfAnchorsMillimetres,\n numberOfAnchorsPerMetreSquare: savedReferenceLayer?.numberOfAnchorsPerMetreSquare ?? material?.defaultNumberOfAnchorsPerMetreSquare,\n anchorPenetrationDepthMillimetres: savedReferenceLayer?.anchorPenetrationDepthMillimetres ?? material?.defaultAnchorPenetrationMillimetres,\n } as CalculationLayer;\n case LayerType.AnchorsPreCalculated:\n return {\n constructionLayerId: cl.constructionLayerId,\n material: material,\n netAreaOfAnchorsPerMetreSquareMillimetresSqrd: savedReferenceLayer?.netAreaOfAnchorsPerMetreSquareMillimetresSqrd ?? 50,\n } as CalculationLayer;\n case LayerType.AirCavity:\n return {\n constructionLayerId: cl.constructionLayerId,\n thicknessMillimetres: airCavityGrading?.defaultThicknessMillimetres,\n airCavityGrading: airCavityGrading,\n } as CalculationLayer;\n default:\n return {\n constructionLayerId: cl.constructionLayerId,\n thicknessMillimetres: savedReferenceLayer?.thicknessMillimetres ?? material?.defaultThicknessMillimetres,\n material: material,\n } as CalculationLayer;\n }\n }, constructionLayers);\n\n const projectDetails: ProjectDetails = {\n name: calculation.projectDetails.name,\n startDate: calculation.projectDetails.startDate,\n siteArea: calculation.projectDetails.siteArea,\n county: calculation.projectDetails.county,\n size: calculation.projectDetails.size,\n type: calculation.projectDetails.type,\n ribaStatus: calculation.projectDetails.ribaStatus,\n buildingUse: calculation.projectDetails.buildingUse,\n postcode: calculation.projectDetails.postcode\n };\n\n // Include the linked layers in to the calculation (fixes bug that stops linked layers from being reloaded)\n Object\n .values(calculation.calculationLayers)\n .filter(calculationLayer => calculationLayer.material?.isLinkedMaterial === true)\n .forEach(linkedLayer => {\n calculationLayers[getCalculationLayerKey(linkedLayer.constructionLayerId, true)] = {\n ...linkedLayer\n };\n });\n\n return {\n projectDetails,\n calculationLayers\n };\n};\n\nexport const startEditCalculation = (calculation: Calculation, constructionLayers: ConstructionLayer[]) => (\n async (dispatch: (action: CurrentCalculationDataActionTypes) => void) => {\n const { calculationLayers, projectDetails } = buildCalculationLayersFromSaved(calculation, constructionLayers);\n dispatch(editCalculationStarted(\n calculation.calculationId,\n calculation.calculationAccessCode,\n calculationLayers,\n calculation.constructionTypeId,\n projectDetails,\n calculation.calculationResult,\n calculation.additionalParameters));\n }\n);\n\nexport const startCopyCalculation = (calculation: Calculation, constructionLayers: ConstructionLayer[]) => (\n async (dispatch: (action: CurrentCalculationDataActionTypes) => void) => {\n const { calculationLayers, projectDetails } = buildCalculationLayersFromSaved(calculation, constructionLayers);\n dispatch(copyCalculationStarted(calculationLayers, calculation.constructionTypeId, projectDetails, calculation.additionalParameters));\n }\n);\n\nexport const setAirCavityGrading = (layer: ConstructionLayer, airCavityGrading: AirCavityGrading) => (\n async (dispatch: (action: CurrentCalculationDataActionTypes) => void, getState: () => StoreModel) => {\n\n dispatch(setAirCavityGradingInternal(airCavityGrading, layer.constructionLayerId));\n\n // This is the calulated layer for a complex construction type and doesn't need its thickness setting\n if (!layer.isWithinBridgingFrame) {\n setMaterialParameter(\n setThickness,\n layer,\n airCavityGrading.defaultThicknessMillimetres ?? 0,\n false)(dispatch, getState);\n }\n\n await debouncedDispatchCalculationAttempt(dispatch, getState);\n }\n);\n\nconst getNextAirCavityLayer = (layer: ConstructionLayer, store: StoreModel): ConstructionLayer | undefined => {\n const constructionLayers = store.constructionData.layers[layer.constructionTypeId];\n const airLayers = constructionLayers.filter(l => l.layerType === LayerType.AirCavity);\n if (airLayers.length === 1) { return airLayers[0]; }\n else if (airLayers.length > 1) {\n const insulationLayerIndex = constructionLayers.indexOf(layer);\n return constructionLayers.filter((l, i) => insulationLayerIndex < i && l.layerType === LayerType.AirCavity)[0];\n }\n return undefined;\n};\n\nexport const setMaterial = (layer: ConstructionLayer, material: Material) => (\n async (dispatch: (action: CurrentCalculationDataActionTypes) => void, getState: () => StoreModel) => {\n const defaultLinkedMaterial = getDefaultLinkedMaterial(material);\n if (defaultLinkedMaterial) {\n dispatch(createLinkedLayer({\n constructionLayerId: layer.constructionLayerId,\n thicknessMillimetres: defaultLinkedMaterial.defaultThicknessMillimetres,\n material: defaultLinkedMaterial,\n }));\n } else if (!material.isLinkedMaterial) {\n dispatch(removeLinkedLayer(layer.constructionLayerId));\n }\n\n dispatch(setMaterialInternal(material, layer.constructionLayerId, material.isLinkedMaterial));\n\n switch (layer.layerType) {\n case LayerType.Anchors:\n const calculationLayer = getState().currentCalculationData.calculationLayers[layer.constructionLayerId.toString()];\n\n // We do an optional dispatch intentionally,\n // so that we keep the currently selected values for the anchor layer's parameters wherever possible.\n // The requirement is that \"Anchors & Fastening should not change amount, diameter or penetration when selecting different anchor materials\"\n const optionalDispatch = (currentValue: number | undefined, options: (number | undefined)[] | undefined, action: CurrentCalculationDataActionTypes) => {\n if ((options || []).indexOf(currentValue) === -1) {\n dispatch(action);\n }\n };\n\n optionalDispatch(\n calculationLayer?.numberOfAnchorsPerMetreSquare,\n material.optionsForNumberOfAnchorsPerMetreSquare,\n setAnchorAmountPerSquareMetre(material.defaultNumberOfAnchorsPerMetreSquare, layer.constructionLayerId, false));\n\n optionalDispatch(\n calculationLayer?.diameterOfAnchorsMillimetres,\n material.optionsForDiameterOfAnchorsMillimetres,\n setAnchorDiameter(material.defaultDiameterOfAnchorsMillimetres, layer.constructionLayerId, false));\n\n optionalDispatch(\n calculationLayer?.anchorPenetrationDepthMillimetres,\n material.optionsForAnchorPenetrationMillimetres,\n setAnchorPenetration(material.defaultAnchorPenetrationMillimetres, layer.constructionLayerId, false));\n\n break;\n default:\n if (layer.layerType === LayerType.AirCavity && layer.isWithinBridgingFrame) {\n // This is the calulated layer for a complex construction type and doesn't need its thickness setting\n break;\n }\n setMaterialParameter(\n setThickness,\n layer,\n material.defaultThicknessMillimetres,\n material.isLinkedMaterial)(dispatch, getState);\n\n if (layer.layerType === LayerType.Insulation && material.defaultAirCavityGradingId && !material.isLinkedMaterial) {\n const nextAirLayer = getNextAirCavityLayer(layer, getState());\n const defaultGrading = nextAirLayer?.airCavityGradings.find(ac => ac.airCavityGradingId === material.defaultAirCavityGradingId);\n if (nextAirLayer && defaultGrading) {\n setAirCavityGrading(nextAirLayer, defaultGrading)(dispatch, getState);\n }\n }\n\n break;\n }\n\n await debouncedDispatchCalculationAttempt(dispatch, getState);\n }\n);\n\nexport const setMaterialParameter = (action: Function, layer: ConstructionLayer, value: number, isLinkedLayer: boolean) => (\n\n async (dispatch: (action: CurrentCalculationDataActionTypes) => void, getState: () => StoreModel) => {\n const store = getState();\n const constructionType = activeConstructionTypeSelector(store);\n\n switch (constructionType?.complexity) {\n case Complexity.Simple:\n dispatch(action(value, layer.constructionLayerId, isLinkedLayer));\n break;\n case Complexity.Complex:\n dispatch(action(value, layer.constructionLayerId, isLinkedLayer));\n const layers = store.constructionData.layers[store.componentState.activeConstructionTypeId];\n if ((layer.layerType === LayerType.Bridging || layer.layerType === LayerType.Insulation) &&\n layers.some(l => l.layerType === LayerType.AirCavity && l.isWithinBridgingFrame)) {\n dispatch(setCalculatedLayerValue(\n layers.filter(l => l.layerType === LayerType.Bridging)[0],\n layers.filter(l => l.layerType === LayerType.Insulation && l.isWithinBridgingFrame)[0],\n layers.filter(l => l.layerType === LayerType.AirCavity && l.isWithinBridgingFrame)[0],\n ));\n }\n break;\n }\n await debouncedDispatchCalculationAttempt(dispatch, getState);\n }\n);\n\nexport const dispatchCalculationAttempt = () => dispatchCalculationAttemptInternal;\n\nconst debouncedDispatchCalculationAttempt = debounce(async (dispatch: (action: CurrentCalculationDataActionTypes) => void, getState: () => StoreModel) => {\n await dispatchCalculationAttemptInternal(dispatch, getState);\n}, 250);\n\nconst dispatchCalculationAttemptInternal = async (dispatch: (action: CurrentCalculationDataActionTypes) => void, getState: () => StoreModel) => {\n\n const calculation = buildCalculationData(getState);\n\n if (!calculation || !calculation.layers || calculation.layers.length === 0) {\n // Do not dispatch the calculation if we're in a state where we have no layers yet, and therefore we're unable to build a calculation model.\n return;\n }\n\n dispatch(fetchCalculationResultsAttempt());\n\n try {\n const { authenticationState } = getState();\n\n const { data } = await axios.post('/api/calculation', calculation, {\n withCredentials: authenticationState.state === AuthenticationState.Authenticated\n }\n );\n\n dispatch(fetchCalculationResultsSuccess(mapApiResponseToCalculcation(data)));\n } catch (error) {\n // Only dispatch the failure if it is not a client error.\n // Note that we respond with 409 when simultaneous requests for the same calculation cause a concurrency error, when only one of the requests wins and the rest are essentially rejected.\n const isClientError = error?.response?.status && !isNaN(error.response.status) && error.response.status >= 400 && error.response.status < 500;\n if (isClientError) {\n dispatch(fetchCalculationResultsClientError());\n } else {\n dispatch(fetchCalculationResultsFailure(error?.message));\n }\n }\n};\n\nconst buildCalculationData = (getState: () => StoreModel) => {\n const store = getState();\n const selectedCulture = selectedCultureSelector(store);\n const constructionType = activeConstructionTypeSelector(store);\n const constructionTypeLayers = store.constructionData.layers[constructionType?.id ?? -1];\n if (!constructionTypeLayers || constructionTypeLayers.length === 0) {\n return null;\n }\n const pseudoLayers = constructionTypeLayers.filter(cl => cl.isPseudoLayer);\n let layers: { [key: string]: CalculationLayer } = store.currentCalculationData.calculationLayers;\n let woodPercentage: number = 0;\n\n if (constructionType?.complexity === Complexity.Complex && pseudoLayers.length > 0) {\n const woodPercentageLayerId = pseudoLayers.filter(cl => cl.layerType === LayerType.WoodPercentage)[0].constructionLayerId;\n //extract pseudo layer\n layers = Object.entries(store.currentCalculationData.calculationLayers).reduce(\n (obj, kvp: [string, CalculationLayer]) => {\n const [key, value] = kvp;\n if (pseudoLayers.some(cl => cl.constructionLayerId === value.constructionLayerId)) {\n if (value.constructionLayerId === woodPercentageLayerId) {\n woodPercentage = value.thicknessMillimetres;\n }\n return obj;\n }\n return {\n ...obj,\n [key]: value\n };\n }, {}) as { [key: string]: CalculationLayer };\n }\n\n const projectDetails = projectDetailsSelector(store);\n const additionalParameters = additionalParametersSelector(store);\n\n const calculation = {\n calculationId: store.currentCalculationData.calculationId,\n calculationAccessCode: store.currentCalculationData.calculationAccessCode,\n constructionTypeId: store.componentState.activeConstructionTypeId,\n countryId: store.componentState.selectedCountry?.countryId ?? '',\n woodPercentage: woodPercentage / 100,\n layers: Object.entries(layers).map((kvp) => {\n const [, value] = kvp;\n return {\n constructionLayerId: value.constructionLayerId,\n materialId: value.material?.materialId,\n airCavityGradingId: value.airCavityGrading?.airCavityGradingId,\n thicknessMillimetres: value.thicknessMillimetres,\n numberOfAnchorsPerMetreSquare: value.numberOfAnchorsPerMetreSquare,\n diameterOfAnchorsMillimetres: value.diameterOfAnchorsMillimetres,\n anchorPenetrationDepthMillimetres: value.anchorPenetrationDepthMillimetres,\n netAreaOfAnchorsPerMetreSquareMillimetresSqrd: value.netAreaOfAnchorsPerMetreSquareMillimetresSqrd,\n };\n }),\n clientTimestamp: new Date().getTime(),\n cultureOfUser: selectedCulture,\n projectDetails: {\n name: projectDetails?.name,\n siteArea: projectDetails?.siteArea,\n startDate: projectDetails?.startDate ? formatDate(projectDetails?.startDate) : '',\n county: projectDetails?.county,\n size: projectDetails?.size,\n type: projectDetails?.type,\n ribaStatus: projectDetails?.ribaStatus,\n buildingUse: projectDetails?.buildingUse,\n postcode: projectDetails?.postcode\n },\n additionalParameters: {\n areaMetresSquared: additionalParameters?.areaMetresSquared,\n perimeterMetres: additionalParameters?.perimeterMetres\n }\n };\n\n return calculation;\n};\n\nconst formatDate = (date: Date | undefined): string => {\n if (date === undefined) {\n return '';\n }\n return `${date.getFullYear()}-${appendLeadingZero(date.getMonth() + 1)}-${appendLeadingZero(date.getDate())}T00:00:00.000Z`;\n};\n\nconst appendLeadingZero = (n: number): string => n <= 9 ? '0' + n : n.toString();\n","import React, { useEffect } from 'react';\nimport { isEmpty } from 'lodash';\nimport { Box, Button } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { errorSelector, calculationResultErrorSelector } from '../../store/component-state/component-state.selectors';\nimport { dispatchCalculationAttempt } from '../../store/current-calculation-data/current-calculation-data.action-creators';\nimport { useTranslation } from 'react-i18next';\n\nexport default function ErrorBar() {\n\n const dispatch = useDispatch();\n const { t } = useTranslation();\n\n const error = useSelector(errorSelector);\n const calculationResultError = useSelector(calculationResultErrorSelector);\n\n useEffect(() => {\n if (!isEmpty(error)) {\n console.warn('Unhandled error:', error);\n }\n }, [error]);\n\n useEffect(() => {\n if (!isEmpty(calculationResultError)) {\n console.warn('Unhandled calculation error:', calculationResultError);\n }\n }, [calculationResultError]);\n\n if (!isEmpty(error)) {\n return \n \n {t('error-banner.generic-error-label')}\n \n ;\n }\n\n if (!isEmpty(calculationResultError)) {\n return \n dispatch(dispatchCalculationAttempt())}>\n {t('error-banner.refresh-button')}\n \n }>\n {t('error-banner.calculation-result-error-label')}\n \n ;\n }\n\n return null;\n}\n","import { createStyles, makeStyles, Theme, Typography } from '@material-ui/core';\nimport parse from 'html-react-parser';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useSelector } from 'react-redux';\n\nimport { countryIdSelector } from '../../../store/component-state/component-state.selectors';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n address: {\n fontStyle: 'normal',\n },\n })\n);\n\nexport function Address() {\n\n const { t } = useTranslation();\n const theme = useStyles();\n const countryId = useSelector(countryIdSelector);\n\n return (\n <>\n
\n \n {parse(t(`by-country.${countryId}.footer.address-label`))}\n \n
\n
\n
\n \n {parse(t(`by-country.${countryId}.footer.address.line1`))}\n \n
\n
\n \n {parse(t(`by-country.${countryId}.footer.address.line2`))}\n \n
\n
\n \n {parse(t(`by-country.${countryId}.footer.address.line3`))}\n \n
\n
\n \n {parse(t(`by-country.${countryId}.footer.address.line4`))}\n \n
\n
\n \n );\n}\n","import { createStyles, makeStyles, Theme, Typography } from '@material-ui/core';\nimport parse from 'html-react-parser';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useSelector } from 'react-redux';\n\nimport { countryIdSelector } from '../../../store/component-state/component-state.selectors';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n link: {\n color: theme.palette.text.primary,\n }\n })\n);\n\nexport function Contact() {\n\n const { t } = useTranslation();\n const theme = useStyles();\n const countryId = useSelector(countryIdSelector);\n\n const label1: string = t(`by-country.${countryId}.footer.contacts.contact-number-1.label`);\n const contactNumber1: string = t(`by-country.${countryId}.footer.contacts.contact-number-1.value`);\n const label2: string = t(`by-country.${countryId}.footer.contacts.contact-number-2.label`);\n const contactNumber2: string = t(`by-country.${countryId}.footer.contacts.contact-number-2.value`);\n\n return (\n <>\n {label1.length > 0 && contactNumber1.length > 0 &&\n \n }\n {label2.length > 0 && contactNumber2.length > 0 &&\n \n }\n \n );\n}\n","import { Box, createStyles, Grid, makeStyles, Theme, Typography } from '@material-ui/core';\nimport MailIcon from '@material-ui/icons/Mail';\nimport PhoneIcon from '@material-ui/icons/Phone';\nimport parse from 'html-react-parser';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useSelector } from 'react-redux';\n\nimport { countryIdSelector } from '../../../store/component-state/component-state.selectors';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n container: {\n padding: theme.spacing(1),\n },\n iconContainer: {\n justifyContent: 'center',\n display: 'flex',\n },\n contactInfo: {\n fontSize: theme.typography.caption.fontSize,\n paddingLeft: '5px',\n },\n techSupportContainer: {\n backgroundColor: theme.palette.grey[500],\n color: '#FFF',\n },\n techLink: {\n color: '#FFF',\n }\n })\n);\n\nexport function TechSupportBar() {\n\n const { t } = useTranslation();\n const theme = useStyles();\n const countryId = useSelector(countryIdSelector);\n\n return (\n <>\n {countryId &&\n
\n \n \n \n \n {parse(t(`by-country.${countryId}.footer.tech-support.blurb`))} \n \n {parse(t(`by-country.${countryId}.footer.tech-support.link-friendly`))}\n \n \n \n \n \n \n \n \n \n \n \n \n {parse(t(`by-country.${countryId}.footer.tech-support.email-friendly`))}\n \n \n \n \n \n \n \n \n \n \n \n \n \n {parse(t(`by-country.${countryId}.footer.tech-support.phone-friendly`))}\n \n \n \n \n \n \n
\n }\n \n );\n}","export interface Links {\n cookiePolicy: string;\n termsAndConditions: string;\n privacyPolicy: string;\n marketingConsent: string;\n}\n\nexport interface LinkData {\n link: string;\n i18nKey: string;\n defaultName: string;\n}\n\nexport const getLinks = (): Links => {\n const previouslySelectedCountryId = localStorage.getItem('previouslySelectedCountryId');\n const i18nextLng = localStorage.getItem('i18nextLng');\n const defaultLinks = {\n cookiePolicy: 'https://www.kingspan.com/gb/en/business-groups/kingspan-insulation/u-value-calculator-cookie-policy-and-control',\n privacyPolicy: 'https://www.kingspan.com/gb/en/business-groups/kingspan-insulation/u-value-calculator-website-privacy-notice',\n marketingConsent: 'https://www.kingspan.com/gb/en/business-groups/kingspan-insulation/u-value-calculator-direct-marketing-consent',\n termsAndConditions: 'https://www.kingspan.com/gb/en/business-groups/kingspan-insulation/u-value-calculator-terms-and-conditions-of-website-use',\n };\n\n switch (previouslySelectedCountryId) {\n case 'gb':\n return defaultLinks;\n case 'ie':\n return {\n cookiePolicy: 'https://www.kingspan.com/ie/en/business-groups-in-ireland/kingspan-insulation-boards/u-value-calculator-cookie-policy-and-control',\n privacyPolicy: 'https://www.kingspan.com/ie/en/business-groups-in-ireland/kingspan-insulation-boards/u-value-calculator-website-privacy-notice',\n marketingConsent: 'https://www.kingspan.com/ie/en/business-groups-in-ireland/kingspan-insulation-boards/u-value-calculator-direct-marketing-consent',\n termsAndConditions: 'https://www.kingspan.com/ie/en/business-groups-in-ireland/kingspan-insulation-boards/u-value-calculator-terms-and-conditions-of-website-use',\n };\n case 'be': {\n if (i18nextLng === 'nl-BE') {\n return {\n cookiePolicy: 'https://kingspan.com/be/nl/kingspan-divisies/kingspaninsulation/u-value-calculator-cookiebeleid-en-beheer',\n privacyPolicy: 'https://kingspan.com/be/nl/kingspan-divisies/kingspaninsulation/u-value-calculator-privacyverklaring-website',\n marketingConsent: 'https://kingspan.com/be/nl/kingspan-divisies/kingspaninsulation/u-value-calculator-direct-marketing-toestemming',\n termsAndConditions: 'https://kingspan.com/be/nl/kingspan-divisies/kingspaninsulation/u-value-calculator-algemene-voorwaarden-voor-gebruik-van-de-website',\n };\n }\n return {\n cookiePolicy: 'https://www.kingspan.com/be/fr/divisions/kingspaninsulation/u-value-calculator-politique-controle-sur-les-cookies',\n privacyPolicy: 'https://www.kingspan.com/be/fr/divisions/kingspaninsulation/u-value-calculator-politique-de-confidentialite-du-site-internet',\n marketingConsent: 'https://www.kingspan.com/be/fr/divisions/kingspaninsulation/u-value-calculator-engagements-de-kingspan-direct-marketing',\n termsAndConditions: 'https://www.kingspan.com/be/fr/divisions/kingspaninsulation/u-value-calculator-modalites-et-conditions-generales-dutilisation-du-site-internet',\n };\n }\n case 'nl':\n return {\n cookiePolicy: 'https://www.kingspan.com/nl/nl/kingspan-divisies/kingspaninsulation/u-value-calculator-cookiebeleid-en-beheer',\n privacyPolicy: 'https://kingspan.com/nl/nl/kingspan-divisies/kingspaninsulation/u-value-calculator-privacyverklaring-website',\n marketingConsent: 'https://www.kingspan.com/nl/nl/kingspan-divisies/kingspaninsulation/u-value-calculator-direct-marketing-toestemming',\n termsAndConditions: 'https://kingspan.com/nl/nl/kingspan-divisies/kingspaninsulation/u-value-calculator-algemene-voorwaarden-voor-gebruik-van-de-website',\n };\n default:\n return defaultLinks;\n }\n};\n","import React from 'react';\nimport styles from '../ChooseCountry/ChooseCountry.module.scss';\nimport { Trans } from 'react-i18next';\nimport { Grid } from '@material-ui/core';\nimport { getLinks, LinkData } from '../../common/links';\n\ndeclare const CookieControl: any;\n\nexport default function footerLinks() {\n const links = getLinks();\n const linkDatas: LinkData[] = [\n { link: links.cookiePolicy, i18nKey: 'choose-country.cookie-policy', defaultName: 'Cookie Policy & Control' },\n { link: links.privacyPolicy, i18nKey: 'choose-country.privacy-policy', defaultName: 'Website Privacy Policy' },\n { link: links.marketingConsent, i18nKey: 'choose-country.marketing-consent', defaultName: 'Direct Marketing Consent Notice' },\n { link: links.termsAndConditions, i18nKey: 'choose-country.terms-and-conditions', defaultName: 'Terms & Conditions of Website Use' },\n ];\n return (\n <>\n
\n
© Kingspan Insulation
\n
\n
\n \n {linkDatas.map((linkData, index) => (\n \n \n {linkData.defaultName}\n \n \n ))}\n \n CookieControl.open()}>\n Cookie Settings\n \n \n \n
\n \n );\n}\n","import { Box, createStyles, Divider, Grid, makeStyles, Theme, Typography } from '@material-ui/core';\nimport parse from 'html-react-parser';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useSelector } from 'react-redux';\n\nimport { countryIdSelector } from '../../store/component-state/component-state.selectors';\nimport { Address } from './Address/Address';\nimport { Contact } from './Contact/Contact';\nimport { TechSupportBar } from './TechSupportBar/TechSupportBar';\nimport FooterLinks from './FooterLinks';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n container: {\n padding: theme.spacing(1),\n },\n title: {\n [theme.breakpoints.up('md')]: {\n fontSize: theme.typography.h1.fontSize,\n },\n [theme.breakpoints.up('sm')]: {\n fontSize: theme.typography.h2.fontSize,\n },\n [theme.breakpoints.down('sm')]: {\n fontSize: theme.typography.h3.fontSize,\n },\n [theme.breakpoints.down('xs')]: {\n fontSize: theme.typography.h6.fontSize,\n },\n },\n paddedGrid: {\n [theme.breakpoints.up('md')]: {\n padding: 0,\n },\n [theme.breakpoints.down('md')]: {\n padding: theme.spacing(1),\n },\n },\n })\n);\n\nexport function Footer() {\n const { t } = useTranslation();\n\n const theme = useStyles();\n const countryId = useSelector(countryIdSelector);\n\n return (\n <>\n \n\n \n\n {countryId && (\n \n \n \n {parse(t(`by-country.${countryId}.footer.company`))}\n \n \n \n
\n \n \n \n \n \n )}\n \n \n {parse(t(`by-country.${countryId}.footer.disclaimer`))}\n \n \n \n \n );\n}\n","import React, { ReactNode, useEffect } from 'react';\nimport { Container } from '@material-ui/core';\n\nimport { Header } from '../Header/Header';\nimport ErrorBar from './ErrorBar';\nimport { Footer } from '../Footer/Footer';\nimport styles from './Layout.module.scss';\nimport { useSelector } from 'react-redux';\nimport { countryIdSelector } from '../../store/component-state/component-state.selectors';\n\ntype Props = {\n children: ReactNode;\n};\n\nexport function Layout({ children }: Props) {\n const countryId = useSelector(countryIdSelector);\n useEffect(() => {\n if (countryId === 'nl') {\n const script = document.createElement('script');\n script.src = '/live-chat.js';\n document.body.appendChild(script);\n return () => {\n document.body.removeChild(script);\n };\n }\n }, [countryId]);\n\n return (\n \n
\n \n
\n \n\n
\n {children}\n
\n
\n \n
\n
\n );\n}\n","import React, { ReactNode } from 'react';\nimport { Container } from '@material-ui/core';\n\nimport styles from './Layout.module.scss';\n\ntype Props = {\n children: ReactNode;\n};\n\nexport function LayoutMinimal({ children }: Props) {\n return (\n \n
\n \n
\n {children}\n
\n
\n
\n
\n );\n}\n","import {\n ConstructionType, ConstructionLayer,\n} from '../../types/domain/construction-data.types';\n\nexport const FETCH_CONSTRUCTION_TYPES_ATTEMPT = '[Construction Data] Fetch Construction Types Attempt';\nexport const FETCH_CONSTRUCTION_TYPES_SUCCESS = '[Construction Data] Fetch Construction Types Success';\nexport const FETCH_CONSTRUCTION_TYPES_FAILURE = '[Construction Data] Fetch Construction Types Failure';\n\nexport const FETCH_CONSTRUCTION_TYPE_NAMES_SUCCESS = '[Construction Data] Fetch Construction Type Names Success';\n\nexport const FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_ATTEMPT = '[Construction Data] Fetch Construction Layers for Type Attempt';\nexport const FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_SUCCESS = '[Construction Data] Fetch Construction Layers for Type Success';\nexport const FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_FAILURE = '[Construction Data] Fetch Construction Layers for Type Failure';\n\n// Construction Types Fetch\n\nexport interface FetchConstructionTypesAttempt {\n type: typeof FETCH_CONSTRUCTION_TYPES_ATTEMPT;\n}\n\nexport interface FetchConstructionTypesSuccess {\n type: typeof FETCH_CONSTRUCTION_TYPES_SUCCESS;\n payload: ConstructionType[];\n}\n\nexport interface FetchConstructionTypesFailure {\n type: typeof FETCH_CONSTRUCTION_TYPES_FAILURE;\n error: string;\n}\n\nexport interface FetchConstructionTypeNamesSuccess {\n type: typeof FETCH_CONSTRUCTION_TYPE_NAMES_SUCCESS;\n payload: ConstructionType[];\n}\n\n// Construction Layers for Type Fetch\n\nexport interface FetchConstructionLayersForTypeAttempt {\n type: typeof FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_ATTEMPT;\n}\n\nexport interface FetchConstructionLayersForTypeSuccess {\n type: typeof FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_SUCCESS;\n payload: {\n constructionType: string;\n constructionTypeNameLocalized: string;\n layers: ConstructionLayer[],\n };\n}\n\nexport interface FetchConstructionLayersForTypeFailure {\n type: typeof FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_FAILURE;\n error: string;\n}\n\n\nexport type ConstructionDataActionTypes =\n | FetchConstructionTypesAttempt\n | FetchConstructionTypesSuccess\n | FetchConstructionTypesFailure\n | FetchConstructionTypeNamesSuccess\n | FetchConstructionLayersForTypeAttempt\n | FetchConstructionLayersForTypeSuccess\n | FetchConstructionLayersForTypeFailure;\n","\nimport { cloneDeep } from 'lodash';\nimport * as he from 'he';\nimport * as actionTypes from './construction-data.action-types';\nimport { ConstructionDataModel } from '../store.model';\n\nexport const initialState: ConstructionDataModel = {\n types: [],\n layers: {}\n};\n\nexport const constructionDataReducer = (\n state: ConstructionDataModel = initialState,\n action: actionTypes.ConstructionDataActionTypes,\n ): ConstructionDataModel => {\n switch (action.type) {\n\n case actionTypes.FETCH_CONSTRUCTION_TYPES_SUCCESS:\n return {\n ...state,\n types: action.payload,\n };\n\n case actionTypes.FETCH_CONSTRUCTION_TYPE_NAMES_SUCCESS:\n {\n const newState = {\n ...state,\n types: cloneDeep(state.types ?? []),\n };\n\n // Build dictionary of the latest names where the key is the Construction Type ID\n const latestNames: { [key: string]: string } = {};\n action.payload.forEach(ct => latestNames[ct.id] = ct.nameLocalized);\n\n // Update the name of each Construction Type in our state, from the latest known names\n newState.types.forEach(ct => ct.nameLocalized = latestNames[ct.id] ?? ct.nameLocalized);\n\n return newState;\n }\n\n case actionTypes.FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_SUCCESS:\n {\n const newState = {\n ...state,\n types: cloneDeep(state.types ?? []),\n layers: {\n ...state.layers,\n [action.payload.constructionType]: action.payload.layers,\n },\n };\n\n const constructionType = newState.types.find(ct => ct.id === action.payload.constructionType);\n if (constructionType) {\n constructionType.nameLocalized = he.decode(action.payload.constructionTypeNameLocalized);\n }\n\n return newState;\n }\n\n default:\n return state;\n }\n};\n","import * as constructionDataActionTypes from '../construction-data/construction-data.action-types';\nimport * as componentStateActionTypes from './component-state.action-types';\nimport * as currentCalculationStateActionTypes from '../current-calculation-data/current-calculation-data.action-types';\nimport * as calculationStateActionTypes from '../calculations/calculations.action-types';\nimport { ComponentStateModel } from '../store.model';\nimport { getPreviouslySelectedCulture } from '../../helpers/memory-helper';\n\nexport const initialState: ComponentStateModel = {\n activeConstructionTypeId: '',\n activeConstructionLayerId: 0,\n countries: null,\n selectedCountry: null,\n isLoading: false,\n isLoadingConstructionTypes: false,\n isCalculationResultLoading: false,\n error: null,\n calculationResultError: null,\n selectedCulture: getPreviouslySelectedCulture() ?? navigator.language ?? 'en-GB',\n downloadingCalculationId: null,\n isGtmContainerSet: false,\n projectConfig: null,\n counties: null,\n fieldData: null\n};\n\nexport const componentStateReducer = (\n state: ComponentStateModel = initialState,\n action:\n | constructionDataActionTypes.ConstructionDataActionTypes\n | componentStateActionTypes.ComponentStateActionTypes\n | currentCalculationStateActionTypes.CurrentCalculationDataActionTypes\n | calculationStateActionTypes.CalculationActionTypes\n): ComponentStateModel => {\n switch (action.type) {\n // Page Loading State\n case constructionDataActionTypes.FETCH_CONSTRUCTION_TYPES_ATTEMPT:\n return {\n ...state,\n isLoadingConstructionTypes: true,\n error: null,\n };\n case constructionDataActionTypes.FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_ATTEMPT:\n case calculationStateActionTypes.FETCH_CALCULATIONS_ATTEMPT:\n return {\n ...state,\n isLoading: true,\n error: null,\n };\n case constructionDataActionTypes.FETCH_CONSTRUCTION_TYPES_SUCCESS:\n case constructionDataActionTypes.FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_SUCCESS:\n case calculationStateActionTypes.FETCH_CALCULATIONS_SUCCESS:\n return {\n ...state,\n isLoading: false,\n isLoadingConstructionTypes: false,\n };\n case constructionDataActionTypes.FETCH_CONSTRUCTION_TYPES_FAILURE:\n case constructionDataActionTypes.FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_FAILURE:\n case calculationStateActionTypes.FETCH_CALCULATIONS_FAILURE:\n return {\n ...state,\n isLoading: false,\n isLoadingConstructionTypes: false,\n error: action.error,\n };\n\n // Component State\n case componentStateActionTypes.SET_GTM_CONTAINER:\n return {\n ...state,\n isGtmContainerSet: true,\n };\n case componentStateActionTypes.SET_ACTIVE_CONSTRUCTION_TYPE:\n return {\n ...state,\n activeConstructionTypeId: action.payload,\n };\n case componentStateActionTypes.SET_ACTIVE_CONSTRUCTION_LAYER:\n return {\n ...state,\n activeConstructionLayerId: action.payload,\n };\n case componentStateActionTypes.SET_COUNTRIES:\n return {\n ...state,\n countries: action.payload,\n };\n case componentStateActionTypes.SET_SELECTED_COUNTRY:\n return {\n ...state,\n selectedCountry: action.payload,\n };\n case componentStateActionTypes.SET_PROJECT_CONFIG:\n return {\n ...state,\n projectConfig: action.payload,\n };\n case componentStateActionTypes.SET_SELECTED_CULTURE:\n return {\n ...state,\n selectedCulture: action.payload,\n };\n case componentStateActionTypes.SET_COUNTIES:\n return {\n ...state,\n counties: action.payload,\n };\n case componentStateActionTypes.SET_FIELD_DATA:\n return {\n ...state,\n fieldData: action.payload,\n };\n\n // Component State\n case currentCalculationStateActionTypes.FETCH_CALCULATION_RESULTS_ATTEMPT:\n return {\n ...state,\n isCalculationResultLoading: true,\n calculationResultError: null,\n };\n case currentCalculationStateActionTypes.FETCH_CALCULATION_RESULTS_SUCCESS:\n case currentCalculationStateActionTypes.FETCH_CALCULATION_RESULTS_CLIENT_ERROR:\n return {\n ...state,\n isCalculationResultLoading: false,\n };\n case currentCalculationStateActionTypes.FETCH_CALCULATION_RESULTS_FAILURE:\n return {\n ...state,\n isCalculationResultLoading: false,\n calculationResultError: action.error,\n };\n\n // Calculcation Downloading State\n case calculationStateActionTypes.DOWNLOAD_CALCULATION_ATTEMPT:\n case calculationStateActionTypes.DOWNLOAD_PDF_CALCULATION_ATTEMPT:\n return {\n ...state,\n downloadingCalculationId: action.payload,\n error: null,\n };\n case calculationStateActionTypes.DOWNLOAD_CALCULATION_SUCCESS:\n case calculationStateActionTypes.DOWNLOAD_PDF_CALCULATION_SUCCESS:\n return {\n ...state,\n downloadingCalculationId: null,\n };\n case calculationStateActionTypes.DOWNLOAD_CALCULATION_FAILURE:\n case calculationStateActionTypes.DOWNLOAD_PDF_CALCULATION_FAILURE:\n return {\n ...state,\n downloadingCalculationId: null,\n };\n default:\n return state;\n }\n};\n","\nimport { AuthenticationActions, AuthenticationState, IAccountInfo, IdTokenResponse, AccessTokenResponse } from 'react-aad-msal';\nimport { AuthenticationStateModel } from '../store.model';\nimport { AuthError } from 'msal';\n\nconst initialState: AuthenticationStateModel = {\n initializing: false,\n initialized: false,\n state: AuthenticationState.Unauthenticated\n};\n\n\nexport const authenticationReducer = (\n state: AuthenticationStateModel = initialState,\n action: { type: AuthenticationActions; payload: IAccountInfo | AuthError | IdTokenResponse | AccessTokenResponse | AuthenticationState },\n): AuthenticationStateModel => {\n switch (action.type) {\n case AuthenticationActions.Initializing:\n return {\n ...state,\n initializing: true,\n initialized: false\n };\n case AuthenticationActions.Initialized:\n return {\n ...state,\n initializing: false,\n initialized: true\n };\n case AuthenticationActions.AcquiredIdTokenSuccess:\n return {\n ...state,\n idToken: action.payload as IdTokenResponse\n };\n case AuthenticationActions.AcquiredAccessTokenSuccess:\n return {\n ...state,\n accessToken: action.payload as AccessTokenResponse\n };\n case AuthenticationActions.AcquiredAccessTokenError:\n return {\n ...state,\n accessToken: undefined\n };\n case AuthenticationActions.LoginSuccess:\n return {\n ...state,\n account: action.payload as IAccountInfo\n };\n case AuthenticationActions.LoginError:\n case AuthenticationActions.AcquiredIdTokenError:\n case AuthenticationActions.LogoutSuccess:\n return {\n ...state,\n idToken: undefined,\n accessToken: undefined,\n account: undefined,\n };\n case AuthenticationActions.AuthenticatedStateChanged:\n return {\n ...state,\n state: action.payload as AuthenticationState\n };\n default:\n return state;\n }\n};","import * as actionTypes from './account.action-types';\nimport { AccountDataModel } from '../store.model';\nimport { ResponseCode } from '../../types/application/response-code.types';\n\nexport const initialState: AccountDataModel = {\n uploadCompanyLogoState: {\n isLoading: false\n }\n};\n\nexport const accountReducer = (\n state: AccountDataModel = initialState,\n action: actionTypes.AccountActionTypes,\n): AccountDataModel => {\n switch (action.type) {\n\n case actionTypes.FETCH_USER_SUCCESS:\n return {\n ...state,\n loggedInUser: action.payload.user,\n isNewUser: action.payload.isNewUser\n };\n case actionTypes.GDPR_CONSENT_RESPONSE_SELECTED:\n return {\n ...state,\n gdprConsent: action.payload,\n };\n case actionTypes.UPLOAD_COMPANY_LOGO_ATTEMPT:\n return {\n ...state,\n uploadCompanyLogoState: {\n isLoading: true,\n error: null,\n }\n };\n case actionTypes.UPLOAD_COMPANY_LOGO_SUCCESS:\n return {\n ...state,\n uploadCompanyLogoState: {\n isLoading: false,\n response: {\n status: ResponseCode.OK,\n ok: action.payload,\n },\n }\n };\n case actionTypes.UPLOAD_COMPANY_LOGO_BAD_REQUEST:\n return {\n ...state,\n uploadCompanyLogoState: {\n isLoading: false,\n error: action.error,\n }\n };\n case actionTypes.UPLOAD_COMPANY_LOGO_FAILURE:\n return {\n ...state,\n uploadCompanyLogoState: {\n isLoading: false,\n error: action.error,\n }\n };\n case actionTypes.SET_IS_CONFIRMED_GUEST:\n return {\n ...state,\n isConfirmedGuest: action.payload,\n };\n default:\n return state;\n }\n};","import * as actionTypes from './calculations.action-types';\nimport { CalculationCollectionModel } from '../store.model';\n\nexport const initialState: CalculationCollectionModel = {\n calculations: {},\n deletingCalculations: []\n};\n\nexport const calculationsReducer = (\n state: CalculationCollectionModel = initialState,\n action: actionTypes.CalculationActionTypes,\n): CalculationCollectionModel => {\n switch (action.type) {\n\n case actionTypes.FETCH_CALCULATIONS_SUCCESS:\n return {\n ...state,\n calculations: {\n ...action.payload\n }\n };\n case actionTypes.DELETE_CALCULATION_ATTEMPT:\n return {\n ...state,\n deletingCalculations: [\n ...state.deletingCalculations,\n action.payload,\n ],\n };\n case actionTypes.DELETE_CALCULATION_SUCCESS:\n const calcs = Object\n .values(state.calculations)\n .filter(c => c.calculationId !== action.payload)\n .reduce((obj, calc) => { return { ...obj, [calc.calculationId]: calc }; }, {});\n\n return {\n calculations: {\n ...calcs\n },\n deletingCalculations: [\n ...(state.deletingCalculations.filter(c => c !== action.payload))\n ],\n };\n case actionTypes.DELETE_CALCULATION_FAILURE:\n return {\n ...state,\n deletingCalculations: [\n ...(state.deletingCalculations.filter(c => c !== action.payload))\n ],\n };\n default:\n return state;\n }\n};\n","import { NewsItemModel } from '../store.model';\n\nimport {\n NewsItemActionTypes,\n FETCH_NEWS_ITEM_SUCCESS,\n FETCH_NEWS_ITEM_FAILURE,\n FETCH_NEWS_ITEM_ATTEMPT,\n CLEAR_NEWS_ITEM,\n} from './news-item.action-types';\n\nexport const initialState: NewsItemModel = {\n isLoading: false,\n error: null,\n};\n\nexport function newsItemReducer(state = initialState, action: NewsItemActionTypes): NewsItemModel {\n \n switch (action.type) {\n case FETCH_NEWS_ITEM_ATTEMPT:\n return {\n ...initialState,\n isLoading: true,\n };\n case FETCH_NEWS_ITEM_SUCCESS:\n return {\n ...initialState,\n isLoading: false,\n content: action.payload,\n };\n case FETCH_NEWS_ITEM_FAILURE:\n return {\n ...initialState,\n isLoading: false,\n error: action.error,\n };\n case CLEAR_NEWS_ITEM:\n return { \n ...initialState\n };\n default:\n return state;\n }\n}\n","import { createStore, applyMiddleware, combineReducers } from 'redux';\nimport thunk from 'redux-thunk';\nimport { composeWithDevTools } from 'redux-devtools-extension';\nimport reduxImmutableStateInvariant from 'redux-immutable-state-invariant';\n\nimport { constructionDataReducer } from './construction-data/construction-data.reducer';\nimport { currentCalculationDataReducer } from './current-calculation-data/current-calculation-data.reducer';\nimport { componentStateReducer } from './component-state/component-state.reducer';\nimport { authenticationReducer } from './authentication/authentication.reducer';\nimport { accountReducer } from './account/account.reducer';\nimport { calculationsReducer } from './calculations/calculations.reducer';\nimport { newsItemReducer } from './news-item/news-item.reducer';\n\nconst middleware: any[] = [thunk];\n\nif (process.env.NODE_ENV !== 'production') {\n middleware.push(reduxImmutableStateInvariant());\n}\n\nexport const store = createStore(\n combineReducers({\n componentState: componentStateReducer,\n constructionData: constructionDataReducer,\n currentCalculationData: currentCalculationDataReducer,\n authenticationState: authenticationReducer,\n accountData: accountReducer,\n calculations: calculationsReducer,\n newsItem: newsItemReducer,\n }),\n composeWithDevTools(applyMiddleware(...middleware))\n);\n","import { Calculation } from '../../types/domain/calculation-data.types';\n\nexport const FETCH_CALCULATIONS_ATTEMPT = '[Calculations] Fetch Calculcation Attempt';\nexport const FETCH_CALCULATIONS_SUCCESS = '[Calculations] Fetch Calculcation Success';\nexport const FETCH_CALCULATIONS_FAILURE = '[Calculations] Fetch Calculcation Failure';\n\nexport const DELETE_CALCULATION_ATTEMPT = '[Calculations] Delete Calculcation Attempt';\nexport const DELETE_CALCULATION_SUCCESS = '[Calculations] Delete Calculcation Success';\nexport const DELETE_CALCULATION_FAILURE = '[Calculations] Delete Calculcation Failure';\n\nexport const DOWNLOAD_CALCULATION_ATTEMPT = '[Calculations] Download Calculcation Attempt';\nexport const DOWNLOAD_CALCULATION_SUCCESS = '[Calculations] Download Calculcation Success';\nexport const DOWNLOAD_CALCULATION_FAILURE = '[Calculations] Download Calculcation Failure';\n\nexport const DOWNLOAD_PDF_CALCULATION_ATTEMPT = '[Calculations] Download PDF Calculcation Attempt';\nexport const DOWNLOAD_PDF_CALCULATION_SUCCESS = '[Calculations] Download PDF Calculcation Success';\nexport const DOWNLOAD_PDF_CALCULATION_FAILURE = '[Calculations] Download PDF Calculcation Failure';\n\n// Calculations Fetch\nexport interface FetchCalculationsAttempt {\n type: typeof FETCH_CALCULATIONS_ATTEMPT;\n}\n\nexport interface FetchCalculationsSuccess {\n type: typeof FETCH_CALCULATIONS_SUCCESS;\n payload: { [key: string]: Calculation };\n}\n\nexport interface FetchCalculationsFailure {\n type: typeof FETCH_CALCULATIONS_FAILURE;\n error: any;\n}\n\n// Calculations Delete\nexport interface DeleteCalculationAttempt {\n type: typeof DELETE_CALCULATION_ATTEMPT;\n payload: string;\n}\n\nexport interface DeleteCalculationSuccess {\n type: typeof DELETE_CALCULATION_SUCCESS;\n payload: string;\n}\n\nexport interface DeleteCalculationFailure {\n type: typeof DELETE_CALCULATION_FAILURE;\n error: any;\n payload: string;\n}\n\n// Calculations Download\nexport interface DownloadCalculationAttempt {\n type: typeof DOWNLOAD_CALCULATION_ATTEMPT;\n payload: string;\n}\n\nexport interface DownloadCalculationSuccess {\n type: typeof DOWNLOAD_CALCULATION_SUCCESS;\n payload: string;\n}\n\nexport interface DownloadCalculationFailure {\n type: typeof DOWNLOAD_CALCULATION_FAILURE;\n error: any;\n payload: string;\n}\n\n// Direct Calculations PDF Download\nexport interface DownloadPdfCalculationAttempt {\n type: typeof DOWNLOAD_PDF_CALCULATION_ATTEMPT;\n payload: string;\n}\n\nexport interface DownloadPdfCalculationSuccess {\n type: typeof DOWNLOAD_PDF_CALCULATION_SUCCESS;\n payload: string;\n}\n\nexport interface DownloadPdfCalculationFailure {\n type: typeof DOWNLOAD_PDF_CALCULATION_FAILURE;\n error: any;\n payload: string;\n}\n\nexport type CalculationActionTypes =\n | FetchCalculationsAttempt\n | FetchCalculationsSuccess\n | FetchCalculationsFailure\n | DeleteCalculationAttempt\n | DeleteCalculationSuccess\n | DeleteCalculationFailure\n | DownloadCalculationAttempt\n | DownloadCalculationSuccess\n | DownloadCalculationFailure\n | DownloadPdfCalculationAttempt\n | DownloadPdfCalculationSuccess\n | DownloadPdfCalculationFailure;\n","import { NewsItem } from '../../types/domain/news-item.types';\n\nexport const FETCH_NEWS_ITEM_ATTEMPT = '[News Items] Fetch News Item Attempt';\nexport const FETCH_NEWS_ITEM_SUCCESS = '[News Items] Fetch News Item Success';\nexport const FETCH_NEWS_ITEM_FAILURE = '[News Items] Fetch News Item Failure';\nexport const FETCH_NEWS_ITEM_SKIPPED = '[News Items] Fetch News Item Skipped';\nexport const CLEAR_NEWS_ITEM = '[News Items] Clear News Item';\n\nexport interface FetchNewsItemAttempt {\n type: typeof FETCH_NEWS_ITEM_ATTEMPT;\n}\n\nexport interface FetchNewsItemSuccess {\n type: typeof FETCH_NEWS_ITEM_SUCCESS;\n payload: NewsItem;\n}\n\nexport interface FetchNewsItemFailure {\n type: typeof FETCH_NEWS_ITEM_FAILURE;\n error: string | undefined | null;\n}\n\nexport interface FetchNewsItemSkipped {\n type: typeof FETCH_NEWS_ITEM_SKIPPED;\n}\n\nexport interface ClearNewsItem {\n type: typeof CLEAR_NEWS_ITEM;\n}\n\nexport type NewsItemActionTypes =\n | FetchNewsItemAttempt\n | FetchNewsItemSuccess\n | FetchNewsItemFailure\n | FetchNewsItemSkipped\n | ClearNewsItem;\n","import { ThemeOptions } from '@material-ui/core';\nimport { createMuiTheme } from '@material-ui/core/styles';\n\nimport themeStyles from './theme.module.scss';\nimport './overrides.module.scss';\n\nconst themeOptions: ThemeOptions = {\n breakpoints: {\n keys: ['xs', 'sm', 'md', 'lg', 'xl'],\n values: {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920,\n },\n },\n direction: 'ltr',\n mixins: {\n toolbar: {\n minHeight: 56,\n '@media (min-width:0px) and (orientation: landscape)': { minHeight: 48 },\n '@media (min-width:600px)': { minHeight: 64 },\n },\n },\n overrides: {},\n palette: {\n common: {\n black: '#000',\n white: '#fff',\n },\n type: 'light',\n primary: {\n main: themeStyles.colorSecondaryGreyDarkest,\n light: themeStyles.colorSecondaryGreyDarkest,\n dark: themeStyles.colorSecondaryGreyDarkest,\n contrastText: '#fff',\n },\n secondary: {\n main: themeStyles.colorHighlightGold,\n light: themeStyles.colorHighlightGold,\n dark: themeStyles.colorHighlightGold,\n contrastText: '#fff',\n },\n error: {\n light: themeStyles.colorError,\n main: themeStyles.colorError,\n dark: themeStyles.colorError,\n contrastText: '#fff',\n },\n grey: {\n '50': '#fafafa',\n '100': '#f5f5f5',\n '200': '#eeeeee',\n '300': '#e0e0e0',\n '400': '#bdbdbd',\n '500': '#9e9e9e',\n '600': '#757575',\n '700': '#616161',\n '800': '#424242',\n '900': '#212121',\n A100: '#d5d5d5',\n A200: '#aaaaaa',\n A400: '#303030',\n A700: '#616161',\n },\n contrastThreshold: 3,\n tonalOffset: 0.2,\n text: {\n primary: themeStyles.colorTextBase,\n secondary: 'rgba(0, 0, 0, 0.54)',\n disabled: 'rgba(0, 0, 0, 0.38)',\n hint: 'rgba(0, 0, 0, 0.38)',\n },\n divider: 'rgba(0, 0, 0, 0.12)',\n background: { paper: '#fff', default: themeStyles.colorSecondaryGreyLightest },\n action: {\n active: 'rgba(0, 0, 0, 0.54)',\n hover: 'rgba(0, 0, 0, 0.08)',\n hoverOpacity: 0.08,\n selected: 'rgba(0, 0, 0, 0.14)',\n disabled: 'rgba(0, 0, 0, 0.26)',\n disabledBackground: 'rgba(0, 0, 0, 0.12)',\n },\n },\n props: {},\n shadows: [\n 'none',\n '0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)',\n '0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)',\n '0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)',\n '0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)',\n '0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)',\n '0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)',\n '0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)',\n '0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)',\n '0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)',\n '0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)',\n '0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)',\n '0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)',\n '0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)',\n '0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)',\n '0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)',\n '0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)',\n '0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)',\n '0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)',\n '0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)',\n '0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)',\n '0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)',\n '0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)',\n '0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)',\n '0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)',\n ],\n typography: {\n htmlFontSize: parseInt(themeStyles.fontSizeBase),\n fontFamily: themeStyles.fontFamily,\n fontSize: parseInt(themeStyles.fontSizeBase),\n fontWeightLight: parseInt(themeStyles.fontWeightLight),\n fontWeightRegular: parseInt(themeStyles.fontWeightRegular),\n fontWeightMedium: parseInt(themeStyles.fontWeightMedium),\n fontWeightBold: parseInt(themeStyles.fontWeightBold),\n h1: {\n fontFamily: themeStyles.fontFamily,\n fontWeight: parseInt(themeStyles.fontWeightLight),\n fontSize: themeStyles.fontSizeH1,\n lineHeight: 1,\n letterSpacing: themeStyles.headerLetterSpacing,\n },\n h2: {\n fontFamily: themeStyles.fontFamily,\n fontWeight: parseInt(themeStyles.fontWeightLight),\n fontSize: themeStyles.fontSizeH2,\n lineHeight: 1,\n letterSpacing: themeStyles.headerLetterSpacing,\n },\n h3: {\n fontFamily: themeStyles.fontFamily,\n fontWeight: parseInt(themeStyles.fontWeightRegular),\n fontSize: themeStyles.fontSizeH3,\n lineHeight: 1.04,\n letterSpacing: themeStyles.headerLetterSpacing,\n },\n h4: {\n fontFamily: themeStyles.fontFamily,\n fontWeight: parseInt(themeStyles.fontWeightRegular),\n fontSize: themeStyles.fontSizeH4,\n lineHeight: 1.17,\n letterSpacing: '0px',\n },\n h5: {\n fontFamily: themeStyles.fontFamily,\n fontWeight: parseInt(themeStyles.fontWeightRegular),\n fontSize: themeStyles.fontSizeH5,\n lineHeight: 1.33,\n letterSpacing: '0em',\n },\n h6: {\n fontFamily: themeStyles.fontFamily,\n fontWeight: parseInt(themeStyles.fontWeightMedium),\n fontSize: themeStyles.fontSizeH6,\n lineHeight: 1.6,\n letterSpacing: '0px',\n },\n subtitle1: {\n fontFamily: themeStyles.fontFamily,\n fontWeight: parseInt(themeStyles.fontWeightRegular),\n fontSize: themeStyles.fontSizeBase,\n lineHeight: 1.75,\n letterSpacing: '0px',\n },\n subtitle2: {\n fontFamily: themeStyles.fontFamily,\n fontWeight: parseInt(themeStyles.fontWeightMedium),\n fontSize: themeStyles.fontSizeSmall,\n lineHeight: 1.57,\n letterSpacing: '0px',\n },\n body1: {\n fontFamily: themeStyles.fontFamily,\n fontWeight: parseInt(themeStyles.fontWeightRegular),\n fontSize: themeStyles.fontSizeBase,\n lineHeight: 1.5,\n letterSpacing: '0px',\n },\n body2: {\n fontFamily: themeStyles.fontFamily,\n fontWeight: parseInt(themeStyles.fontWeightRegular),\n fontSize: themeStyles.fontSizeBase,\n lineHeight: 1.5,\n letterSpacing: '0px',\n },\n button: {\n fontFamily: themeStyles.fontFamily,\n fontWeight: parseInt(themeStyles.fontWeightMedium),\n fontSize: themeStyles.fontSizeSmall,\n lineHeight: 2,\n letterSpacing: '0px',\n textTransform: 'uppercase',\n },\n caption: {\n fontFamily: themeStyles.fontFamily,\n fontWeight: parseInt(themeStyles.fontWeightRegular),\n fontSize: themeStyles.fontSizeSmall,\n lineHeight: 1.66,\n letterSpacing: '0px',\n },\n overline: {\n fontFamily: themeStyles.fontFamily,\n fontWeight: parseInt(themeStyles.fontWeightRegular),\n fontSize: themeStyles.fontSizeSmall,\n lineHeight: 2.66,\n letterSpacing: '0px',\n textTransform: 'uppercase',\n },\n },\n shape: {\n borderRadius: parseInt(themeStyles.borderRadius),\n },\n transitions: {\n easing: {\n easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n easeOut: 'cubic-bezier(0.0, 0, 0.2, 1)',\n easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n sharp: 'cubic-bezier(0.4, 0, 0.6, 1)',\n },\n duration: {\n shortest: 150,\n shorter: 200,\n short: 250,\n standard: 300,\n complex: 375,\n enteringScreen: 225,\n leavingScreen: 195,\n },\n },\n zIndex: {\n mobileStepper: 1000,\n speedDial: 1050,\n appBar: 1100,\n drawer: 1200,\n modal: 1300,\n snackbar: 1400,\n tooltip: 1500,\n },\n};\n\nexport const theme = createMuiTheme(themeOptions);\n","import { StoreModel, ConstructionDataModel } from '../store.model';\nimport { ConstructionType, Category, ConstructionLayer } from '../../types/domain/construction-data.types';\n\nexport const constructionDataSelector = (store: StoreModel): ConstructionDataModel => store.constructionData;\n\nexport const constructionTypesSelector = (store: StoreModel): ConstructionType[] => constructionDataSelector(store).types;\n\nexport const isLoadingConstructionTypesSelector = (store: StoreModel): boolean => store.componentState.isLoading;\n\nexport const constructionCategoriesSelector = (store: StoreModel): Category[] => [...(store.constructionData?.types ?? [])]\n .sort((a, b) => b.category.localeCompare(a.category))\n .map(ct => ct.category)\n .filter((value, index, self) => self.indexOf(value) === index);\n\nexport const constructionLayerSelector = (constructionTypeId: string) => (store: StoreModel): ConstructionLayer[] => store.constructionData.layers[constructionTypeId] ?? [];\n\nexport const constructionTypeNameSelector = (constructionTypeId: string) => (store: StoreModel): string => constructionDataSelector(store).types\n .find(ct => ct.id === constructionTypeId)\n ?.nameLocalized ?? constructionTypeId;\n","import React from 'react';\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n List,\n ListItemText,\n ListItem,\n Box,\n DialogTitle,\n IconButton,\n Theme,\n createStyles,\n makeStyles,\n Typography,\n Grid,\n ListItemIcon,\n useMediaQuery,\n} from '@material-ui/core';\nimport CloseIcon from '@material-ui/icons/Close';\nimport { Trans, useTranslation } from 'react-i18next';\nimport ArrowRightIcon from '@material-ui/icons/ArrowRight';\n\nimport AzureAD, { IAzureADFunctionProps } from 'react-aad-msal';\nimport authProviderFactory from '../../authentication/authProvider';\nimport { useDispatch, useStore } from 'react-redux';\nimport { setIsConfirmedGuest } from '../../store/account/account.actions';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n margin: 0,\n padding: theme.spacing(2),\n },\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n fullWidthButton: {\n width: '100%',\n marginBottom: theme.spacing(1),\n marginTop: theme.spacing(1),\n },\n })\n);\n\nexport interface SignInDialogProps {\n open: boolean;\n handleClose: (cont: boolean) => void;\n}\n\nexport default function SignInDialog(props: SignInDialogProps) {\n\n const { open, handleClose } = props;\n const dispatch = useDispatch();\n\n const classes = useStyles();\n\n const isMobileView = useMediaQuery((theme: Theme) => theme.breakpoints.down('xs'));\n\n const store = useStore();\n const { t } = useTranslation();\n\n const reasons = [\n t('sign-in-dialog.reason-1'),\n t('sign-in-dialog.reason-2'),\n t('sign-in-dialog.reason-3'),\n ];\n\n const closeWindow = (cont: boolean, isConfirmedGuest: boolean) => {\n dispatch(setIsConfirmedGuest(isConfirmedGuest));\n handleClose(cont);\n };\n\n return (\n closeWindow(false, false)}\n fullWidth={true}\n maxWidth='sm'\n >\n \n \n \n Make your experience even better\n \n \n closeWindow(false, false)}>\n \n \n \n\n \n\n \n Creating an account is easy and free.\n \n\n \n {reasons.map((reason, index) => (\n \n \n \n \n \n \n ))}\n \n\n \n \n \n \n \n {({ login }: IAzureADFunctionProps) => {\n return (\n \n );\n }}\n \n \n \n \n \n \n \n \n );\n}\n\n\n","import React from 'react';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport Grid from '@material-ui/core/Grid';\nimport { useTranslation, Trans } from 'react-i18next';\nimport { ConstructionType, Category } from '../../types/domain/construction-data.types';\nimport { Card, CardActionArea, CardContent, CircularProgress, Typography, CardMedia, Divider } from '@material-ui/core';\nimport { useHistory } from 'react-router-dom';\nimport { useDispatch, useSelector, useStore } from 'react-redux';\nimport { constructionTypesSelector, constructionCategoriesSelector } from '../../store/construction-data/construction-data.selectors';\n\nimport './ConstructionTypeSelection.module.scss';\nimport { getAppConfig } from '../../config/config';\nimport { StoreModel } from '../../store/store.model';\nimport { buildRoute } from '../../helpers/routeHelper';\nimport SignInDialog from './SignInDialog';\nimport { isAuthenticatedSelector } from '../../store/authentication/authentication.selectors';\nimport { setActiveConstructionType } from '../../store/component-state/component-state.actions';\nimport { countryIdSelector, countrySelector } from '../../store/component-state/component-state.selectors';\nimport { isLoadingConstructionTypesSelector } from '../../store/construction-data/construction-data.selectors';\nimport { isConfirmedGuestSelector } from '../../store/account/account.selectors';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n flexGrow: 1,\n },\n media: {\n height: 270,\n backgroundSize: 'contain',\n backgroundPosition: 'center',\n },\n })\n);\n\nexport default function ConstructionTypeSelection() {\n const dispatch = useDispatch();\n const history = useHistory();\n const store = useStore().getState() as StoreModel;\n const apiUrl = getAppConfig()?.apiUrl;\n\n const constructionTypes: ConstructionType[] = useSelector(constructionTypesSelector);\n const categories: Category[] = useSelector(constructionCategoriesSelector);\n const country = useSelector(countrySelector);\n const countryId = useSelector(countryIdSelector).toLowerCase();\n const isLoadingConstructionTypes = useSelector(isLoadingConstructionTypesSelector);\n const countryIdUpper = countryId.toUpperCase();\n const isAuthenticated: boolean = useSelector(isAuthenticatedSelector);\n const isConfirmedGuest: boolean | undefined = useSelector(isConfirmedGuestSelector);\n const classes = useStyles();\n\n const [open, setOpen] = React.useState(false);\n const [selectedType, setSelectedType] = React.useState('');\n\n const { t } = useTranslation();\n\n const handleConstructionTypeSelection = (selectedConstructionType: string) => {\n if (!isAuthenticated && !isConfirmedGuest) {\n setOpen(true);\n setSelectedType(selectedConstructionType);\n } else {\n history.push(buildRoute(store, `/calculation/${selectedConstructionType}`));\n }\n };\n\n const handleSignInClose = (cont: boolean) => {\n setOpen(false);\n if (cont) {\n dispatch(setActiveConstructionType(selectedType));\n history.push(buildRoute(store, `/calculation/${selectedType}`));\n }\n };\n\n return (\n
\n \n \n
\n {t(`by-country.${countryId}.construction-type-selection-ui.title`, {\n resultType: t(`calculation-result-type.singular.${country?.calculationResultType}`),\n })}\n
\n
\n {t(`by-country.${countryId}.construction-type-selection-ui.sub-title`, {\n resultTypePlural: t(`calculation-result-type.plural.${country?.calculationResultType}`),\n calculationStandardName: country?.calculationStandardName,\n })}\n
\n
\n
\n\n {isLoadingConstructionTypes &&\n \n }\n\n {categories.map((c, index) => (\n
\n
\n \n {c}\n \n
\n \n
\n \n {constructionTypes\n .filter(ct => ct.category === c)\n .map(ct => (\n \n \n { handleConstructionTypeSelection(ct.id); }}>\n \n \n \n {ct.nameLocalized}\n \n \n \n \n \n ))}\n \n
\n ))}\n\n \n
\n );\n}\n","import {\n FetchNewsItemSuccess,\n FetchNewsItemFailure,\n FetchNewsItemSkipped,\n FetchNewsItemAttempt,\n ClearNewsItem,\n FETCH_NEWS_ITEM_SUCCESS,\n FETCH_NEWS_ITEM_FAILURE,\n FETCH_NEWS_ITEM_SKIPPED,\n FETCH_NEWS_ITEM_ATTEMPT,\n CLEAR_NEWS_ITEM,\n} from './news-item.action-types';\nimport { NewsItem } from '../../types/domain/news-item.types';\n\nexport const fetchNewsItemAttempt = (): FetchNewsItemAttempt => ({\n type: FETCH_NEWS_ITEM_ATTEMPT,\n});\n\nexport const fetchNewsItemSuccess = (newsItem: NewsItem): FetchNewsItemSuccess => ({\n type: FETCH_NEWS_ITEM_SUCCESS,\n payload: newsItem\n});\n\nexport const fetchNewsItemFailure = (error: any): FetchNewsItemFailure => ({\n type: FETCH_NEWS_ITEM_FAILURE,\n error: error,\n});\n\nexport const fetchNewsItemSkipped = (): FetchNewsItemSkipped => ({\n type: FETCH_NEWS_ITEM_SKIPPED,\n});\n\nexport const clearNewsItem = (): ClearNewsItem => ({\n type: CLEAR_NEWS_ITEM,\n});\n","import { StoreModel } from '../store.model';\nimport { NewsItem } from '../../types/domain/news-item.types';\n\nexport const newsItemContentSelector = (state: StoreModel): NewsItem | undefined => state.newsItem.content;\n\nexport const isLoadingSelector = (state: StoreModel): boolean => state.newsItem.isLoading;\n","import React, { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { fetchNewsItem } from '../../store/news-item/news-item.action-creators';\nimport { newsItemContentSelector, isLoadingSelector } from '../../store/news-item/news-item.selectors';\nimport { isAuthenticatedSelector } from '../../store/authentication/authentication.selectors';\nimport { clearNewsItem } from '../../store/news-item/news-item.actions';\nimport { Alert, AlertTitle } from '@material-ui/lab';\nimport styles from './NewsItemBanner.module.scss';\n\nexport interface NewsItemBannerProps {\n countryId: string;\n constructionType: string;\n language: string;\n}\n\nexport default function NewsItemBanner(props: NewsItemBannerProps) {\n\n const dispatch = useDispatch();\n\n const { countryId, constructionType, language } = props;\n\n useEffect(() => {\n if (constructionType && countryId && language) {\n dispatch(fetchNewsItem(constructionType, countryId, language));\n }\n return function cleanup() {\n dispatch(clearNewsItem());\n };\n }, [dispatch, constructionType, countryId, language]);\n\n const isLoading = useSelector(isLoadingSelector);\n const newsItem = useSelector(newsItemContentSelector);\n const isAuthenticated = useSelector(isAuthenticatedSelector);\n\n const handleDismiss = (event: React.SyntheticEvent) => {\n event.stopPropagation();\n dispatch(clearNewsItem());\n };\n\n return !isLoading && newsItem ? (\n window.open(newsItem.url)}\n className={styles.newsItemBanner} >\n \n {newsItem.subject}\n \n \n ) : null;\n}\n","import axios from 'axios';\nimport {\n fetchNewsItemSuccess,\n fetchNewsItemFailure,\n fetchNewsItemSkipped,\n fetchNewsItemAttempt\n} from './news-item.actions';\nimport { NewsItem } from '../../types/domain/news-item.types';\nimport { NewsItemActionTypes } from './news-item.action-types';\nimport { StoreModel } from '../store.model';\n\nexport type RequestResult = {\n success: boolean,\n error: string\n}\n\nexport const fetchNewsItem = (constructionType: string, countryId: string, language: string) =>\n\n async (dispatch: (action: NewsItemActionTypes) => void, getState: () => StoreModel) => {\n dispatch(fetchNewsItemAttempt());\n\n try {\n const response = await axios.get('/api/NewsItems', { params: {\n countryId,\n constructionType: constructionType,\n language: language,\n }});\n\n if (getState().componentState.activeConstructionTypeId !== constructionType) {\n // Fixes React sequencing issue that resulted on news items from previous construction type to be displayed.\n console.info('Ignored old news item response', {currentConstructionType: getState().componentState.activeConstructionTypeId, oldConstructionType: constructionType });\n dispatch(fetchNewsItemSkipped());\n return;\n }\n\n if (response.status === 200) {\n dispatch(fetchNewsItemSuccess(response.data as NewsItem));\n } else if (response.status === 204) {\n dispatch(fetchNewsItemFailure('No matching news item was found'));\n } else {\n dispatch(fetchNewsItemFailure(`Unexpected status: ${response.status}`));\n }\n\n } catch (error) {\n dispatch(fetchNewsItemFailure((error ?? {}).toString()));\n }\n};\n","export class PerimeterAreaConstants {\n static defaultPerimeter: number = 7.00;\n static defaultArea: number = 10.00;\n}\n","import { Box, Grid, InputLabel, TextField, Typography } from '@material-ui/core';\nimport { gt, gte } from 'lodash';\nimport React, { ChangeEvent } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport styles from './PerimeterAndArea.module.scss';\n\nexport interface PerimeterAndAreaProps {\n perimeter: number;\n setPerimeter: React.Dispatch>;\n area: number;\n setArea: React.Dispatch>;\n}\n\nexport default function PerimeterAndArea(props: PerimeterAndAreaProps) {\n\n const { t } = useTranslation();\n const maxPerimeter: number = 100000000;\n const maxArea: number = 100000000;\n const defaultMinimum: number = 1.00;\n\n function updatePerimeter(value: string): void {\n let perimeterValue: number = Number(value);\n\n if (Number.isNaN(perimeterValue) || perimeterValue <= 0) {\n perimeterValue = defaultMinimum;\n }\n\n if (gt(perimeterValue, maxPerimeter)) {\n perimeterValue = maxPerimeter;\n }\n\n props.setPerimeter(perimeterValue);\n }\n\n function updateArea(value: string): void {\n let areaValue: number = Number(value);\n\n if (Number.isNaN(areaValue) || areaValue <= 0) {\n areaValue = defaultMinimum;\n }\n\n if (gt(areaValue, maxArea)) {\n areaValue = maxArea;\n }\n\n props.setArea(areaValue);\n }\n\n function calcRatio(): number {\n if (props.area && props.perimeter) {\n return props.perimeter / props.area;\n }\n return 0;\n }\n\n function getHelperText(key: string, value: number, maxValue: number): string {\n let helperText = gte(value, maxValue)\n ? t(`additional-parameters.perimeter-and-area.${key}-exceeds-max`, { maxPerimeter: maxPerimeter })\n : '';\n return helperText;\n };\n\n return (\n \n \n \n {t('additional-parameters.perimeter-and-area.perimeter')}\n \n\n ) => updatePerimeter(event.target.value)}\n />\n \n\n \n {t('additional-parameters.perimeter-and-area.perimeter-units')}\n \n\n \n \n {t('additional-parameters.perimeter-and-area.area')}\n \n\n ) => updateArea(event.target.value)}\n />\n \n\n \n {t('additional-parameters.perimeter-and-area.area-units')}\n \n\n \n \n {t('additional-parameters.perimeter-and-area.pa-ratio')}\n \n\n \n = {calcRatio().toFixed(3)}\n \n \n \n );\n}\n","import DateFnsUtils from '@date-io/date-fns';\nimport { Box, Button, CircularProgress, createStyles, FormControl, Grid, InputLabel, makeStyles, MenuItem, Select, TextField, Theme, useMediaQuery,FormHelperText } from '@material-ui/core';\nimport { KeyboardDatePicker, MuiPickersUtilsProvider } from '@material-ui/pickers';\nimport 'date-fns';\nimport { Locale } from 'date-fns';\nimport * as Locales from 'date-fns/locale';\nimport { isEmpty } from 'lodash';\nimport React, { useEffect, useState } from 'react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Link as RouterLink } from 'react-router-dom';\nimport { getAppConfig } from '../../config/config';\nimport { buildRouteWithCountry } from '../../helpers/routeHelper';\nimport { activeConstructionTypeIdSelector, activeConstructionTypeSelector, countiesSelector, countryIdSelector, projectConfigSelector, selectedCultureSelector,fieldDataSelector } from '../../store/component-state/component-state.selectors';\nimport { constructionTypeNameSelector } from '../../store/construction-data/construction-data.selectors';\nimport { setAdditionalParameters, setProjectDetails } from '../../store/current-calculation-data/current-calculation-data.actions';\nimport { additionalParametersSelector, projectDetailsSelector } from '../../store/current-calculation-data/current-calculation-data.selectors';\nimport { ConstructionTypeAdditionalParameters } from '../../types/domain/construction-data.types';\nimport NewsItemBanner from '../NewsItem/NewsItemBanner';\nimport { PerimeterAreaConstants } from './PerimeterAndArea/perimeter-area.types';\n\nimport PerimeterAndArea from './PerimeterAndArea/PerimeterAndArea';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n [theme.breakpoints.down('xs')]: {\n formControl: {\n width: '100%',\n }\n },\n [theme.breakpoints.up('sm')]: {\n formControl: {\n width: 320,\n }\n },\n [theme.breakpoints.up('md')]: {\n formControl: {\n width: 380,\n }\n },\n }),\n);\n\nexport type CalculationProjectDetailsProps = {\n handleContinue: () => void;\n}\n\nexport default function CalculationProjectDetails(props: CalculationProjectDetailsProps) {\n\n const { handleContinue } = props;\n\n const dispatch = useDispatch();\n const { t } = useTranslation();\n const classes = useStyles();\n const apiUrl = getAppConfig()?.apiUrl;\n\n const isMobileView = useMediaQuery((theme: Theme) => theme.breakpoints.down('xs'));\n\n const constructionTypeId = useSelector(activeConstructionTypeIdSelector);\n const activeConstructionType = useSelector(activeConstructionTypeSelector);\n\n const constructionTypeName = useSelector(constructionTypeNameSelector(constructionTypeId));\n const countryId = useSelector(countryIdSelector);\n const language = useSelector(selectedCultureSelector);\n\n const projectDetails = useSelector(projectDetailsSelector);\n const projectConfig = useSelector(projectConfigSelector);\n const counties = useSelector(countiesSelector);\n const fieldData = useSelector(fieldDataSelector);\n\n const [projectName, setProjectName] = useState({ value: '', error: '' });\n const [startDate, setStartDate] = useState<{ value: Date | null, error: string }>({ value: null, error: '' });\n const [area, setArea] = useState(PerimeterAreaConstants.defaultArea);\n const [perimeter, setPerimeter] = useState(PerimeterAreaConstants.defaultPerimeter);\n const additionalParameters = useSelector(additionalParametersSelector);\n\n const countiesFiltered = counties.filter((county) =>{\n return county.countryId === projectConfig?.country; \n });\n\n const [countyName, setCountyName] = useState({value: '', error:''});\n \n const sizes = fieldData.filter((fieldData) => {\n return fieldData.fieldName === 'ProjectSize';\n });\n\n const types = fieldData.filter((fieldData) => {\n return fieldData.fieldName === 'ProjectType';\n });\n\n const statuses = fieldData.filter((fieldData) => {\n return fieldData.fieldName === 'RIBAStatus';\n });\n\n const uses = fieldData.filter((fieldData) => {\n return fieldData.fieldName === 'BuildingUse';\n }); \n\n const siteAreas = fieldData.filter((fieldData) => {\n if(projectConfig?.fieldNames?.includes('projectsitearea')){\n return fieldData.fieldName === 'ProjectSiteArea';\n }\n else{\n return fieldData.fieldName === 'SiteArea';\n }\n });\n\n const [projectSize, setProjectSize] = useState({value: '' , error:''}); \n const [projectType, setProjectType] = useState({value: '' , error:''});\n const [projectRibaStatus, setRIBAStatus] = useState({value:'', error:''});\n const [projectBuidingUse, setBuildingUse] = useState({value:'', error:''});\n const [projectPostcode, setPostcode] = useState({value:'', error:''});\n \n const [siteArea, setSiteArea] = useState({ value: '', error: '' });\n\n \n // Initialise values if they already exist in the store\n useEffect(() => {\n if (projectDetails !== undefined) {\n setProjectName({ value: projectDetails.name, error: '' });\n setStartDate({ value: projectDetails.startDate, error: '' });\n \n if(projectConfig?.fieldNames?.includes('projectsitearea') || projectConfig?.fieldNames?.includes('sitearea')){\n setSiteArea({ value: projectDetails.siteArea, error: '' });\n }\n else{\n setSiteArea({ value: projectDetails.siteArea, error: '' });\n }\n\n if(projectConfig?.fieldNames?.includes('projectcounty')){\n setCountyName({ value: projectDetails.county, error: '' });\n }\n else{\n setCountyName({ value: '', error: '' });\n }\n\n if(projectConfig?.fieldNames?.includes('projectsize')){\n setProjectSize({ value: projectDetails.size, error: '' });\n }\n else{\n setProjectSize({ value: '', error: '' });\n }\n\n if(projectConfig?.fieldNames?.includes('projecttype')){\n setProjectType({ value: projectDetails.type, error: '' });\n }\n else{\n setProjectType({ value: '', error: '' });\n }\n\n if(projectConfig?.fieldNames?.includes('ribastatus')){\n setRIBAStatus({ value: projectDetails.ribaStatus, error: '' });\n }\n else{\n setRIBAStatus({ value: '', error: '' });\n }\n\n if(projectConfig?.fieldNames?.includes('buildinguse')){\n setBuildingUse({ value: projectDetails.buildingUse, error: '' });\n }\n else{\n setBuildingUse({ value: '', error: '' });\n }\n\n if(projectConfig?.fieldNames?.includes('postcode')){\n setPostcode({ value: projectDetails.postcode, error: '' });\n }\n else{\n setPostcode({ value: '', error: '' });\n }\n }\n }, [projectDetails, projectConfig]);\n\n useEffect(() => {\n if (additionalParameters !== undefined) {\n setArea(additionalParameters.areaMetresSquared ?? PerimeterAreaConstants.defaultArea);\n setPerimeter(additionalParameters.perimeterMetres ?? PerimeterAreaConstants.defaultPerimeter);\n }\n }, [additionalParameters]);\n\n const onProjectNameChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n setProjectName({\n value: event.target.value as string,\n error: '',\n });\n };\n\n const onSiteAreaChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n setSiteArea({\n value: event.target.value as string,\n error: '',\n });\n };\n\n const onStartDateChange = (date: Date | null) => {\n setStartDate({\n value: date,\n error: '',\n });\n };\n\n const onCountyChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n setCountyName({\n value: event.target.value as string,\n error: '',\n });\n };\n\n const onProjectSizeChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n setProjectSize({\n value: event.target.value as string,\n error: '',\n });\n };\n\n const onProjectTypeChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n setProjectType({\n value: event.target.value as string,\n error: '',\n });\n };\n\n const onRIBAStatusChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n setRIBAStatus({\n value: event.target.value as string,\n error: '',\n });\n };\n\n const onBuildingUseChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n setBuildingUse({\n value: event.target.value as string,\n error: '',\n });\n };\n\n const onPostcodeChange = (event: React.ChangeEvent<{value: unknown}>) => {\n setPostcode({\n value: event.target.value as string,\n error: '',\n });\n };\n\n\n const validate = (): boolean => {\n\n let isValid = true;\n\n if (projectName.value === '') {\n isValid = false;\n setProjectName({\n ...projectName,\n error: t('project-details-ui.project-name.error-empty'),\n });\n }\n\n if (projectName.value.length > 150) {\n isValid = false;\n setProjectName({\n ...projectName,\n error: t('project-details-ui.project-name.error-too-long'),\n });\n }\n\n if (startDate.value === null) {\n isValid = false;\n setStartDate({\n ...startDate,\n error: t('project-details-ui.start-date.error-empty'),\n });\n }\n\n if (projectPostcode.value.length > 150) {\n isValid = false;\n setPostcode({\n ...projectPostcode,\n error: t('project-details-ui.postcode.error-too-long'),\n });\n } \n \n if (projectConfig?.fieldNames?.includes('projectcounty')) {\n if(countyName.value === ''){\n isValid = false;\n setCountyName({\n ...countyName,\n error: t('project-details-ui.county.error-empty'),\n });\n } \n } \n \n if (projectConfig?.fieldNames?.includes('projectsitearea')) {\n if(siteArea.value === ''){\n isValid = false;\n setSiteArea({\n ...siteArea,\n error: t('project-details-ui.site-area.error-empty'),\n });\n } \n } \n\n if (projectConfig?.fieldNames?.includes('projectsize')) {\n if(projectSize.value === ''){\n isValid = false;\n setProjectSize({\n ...projectSize,\n error: t('project-details-ui.size.error-empty'),\n });\n } \n } \n\n if (projectConfig?.fieldNames?.includes('projecttype')) {\n if(projectType.value === ''){\n isValid = false;\n setProjectType({\n ...projectType,\n error: t('project-details-ui.type.error-empty'),\n });\n } \n }\n \n if (projectConfig?.fieldNames?.includes('ribastatus')) {\n if(projectRibaStatus.value === ''){\n isValid = false;\n setRIBAStatus({\n ...projectRibaStatus,\n error: t('project-details-ui.ribastatus.error-empty'),\n });\n } \n } \n\n if (projectConfig?.fieldNames?.includes('buildinguse')) {\n if(projectBuidingUse.value === ''){\n isValid = false;\n setBuildingUse({\n ...projectBuidingUse,\n error: t('project-details-ui.buildinguse.error-empty'),\n });\n } \n } \n\n return isValid;\n };\n\n const onContinueClick = () => {\n const isValid = validate();\n if (isValid) {\n dispatch(setProjectDetails({\n name: projectName.value,\n siteArea: siteArea.value,\n startDate: startDate.value!,\n county: countyName.value!,\n size: projectSize.value!,\n type: projectType.value!,\n ribaStatus: projectRibaStatus.value!,\n buildingUse: projectBuidingUse.value!,\n postcode: projectPostcode.value!\n }));\n dispatch(setAdditionalParameters({\n areaMetresSquared: area,\n perimeterMetres: perimeter\n }));\n handleContinue();\n }\n };\n\n const getLocale = (localeCode: string): Locale => {\n const locales = (Locales as any);\n return locales[localeCode.replace('-', '')] ??\n locales[localeCode.substring(0, 2)] ??\n locales['enGB'];\n };\n\n return (\n \n \n\n \n

{constructionTypeName}

\n

Project details

\n
\n \n \n \n \n \n \n\n \n \n \n \n \n \n\n {\n projectConfig?.fieldNames?.includes('postcode') &&\n \n \n \n } \n\n {\n (projectConfig?.fieldNames?.includes('projectsitearea') || projectConfig?.fieldNames?.includes('sitearea')) &&\n \n \n {t('project-details-ui.site-area.label')}\n \n {siteAreas.map(siteArea => (\n \n {siteArea.code} \n \n ))}\n \n {siteArea.error}\n \n \n } \n\n {\n projectConfig?.fieldNames?.includes('projectcounty') &&\n \n \n {t('project-details-ui.county.label')}\n \n {countiesFiltered.map(county => (\n \n {county.code} \n \n ))}\n \n {countyName.error}\n \n \n }\n\n {\n projectConfig?.fieldNames?.includes('projectsize') && \n \n \n {t('project-details-ui.size.label')}\n \n {sizes.map(size => (\n \n {size.code} \n \n ))}\n \n {projectSize.error}\n \n \n }\n\n {\n projectConfig?.fieldNames?.includes('projecttype') && \n \n \n {t('project-details-ui.type.label')}\n \n {types.map(type => (\n \n {type.code} \n \n ))}\n \n {projectType.error}\n \n \n }\n\n {\n projectConfig?.fieldNames?.includes('ribastatus') && \n \n \n {t('project-details-ui.ribastatus.label')}\n \n {statuses.map(status => (\n \n {status.code} \n \n ))}\n \n {projectRibaStatus.error}\n \n \n }\n\n {\n projectConfig?.fieldNames?.includes('buildinguse') && \n \n \n {t('project-details-ui.buildinguse.label')}\n \n {uses.map(use => (\n \n {use.code} \n \n ))}\n \n {projectBuidingUse.error}\n \n \n }\n\n {\n activeConstructionType?.additionalParameters &&\n \n \n {\n activeConstructionType.additionalParameters.some(a => a === ConstructionTypeAdditionalParameters.PerimeterAndArea) &&\n \n }\n \n \n }\n\n \n \n \n \n \n\n \n \n \n \n \n \n \n \n\n \n {isEmpty(constructionTypeId)\n ? \n : \n }\n \n \n
\n );\n}\n\n\n","import React from 'react';\nimport { Typography, Select, MenuItem } from '@material-ui/core';\nimport { Trans } from 'react-i18next';\nimport { ConstructionLayer, Material } from '../../types/domain/construction-data.types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { activeConstructionLayerSelector } from '../../store/component-state/component-state.selectors';\nimport { currentSelectedMaterialSelector } from '../../store/current-calculation-data/current-calculation-data.selectors';\nimport { setMaterial } from '../../store/current-calculation-data/current-calculation-data.action-creators';\nimport { CalculationLayerProps } from './CalculationLayer';\n\nexport default function MaterialDropDown(props: CalculationLayerProps) {\n const { isLinkedMaterial } = props;\n const dispatch = useDispatch();\n const layer: ConstructionLayer = useSelector(activeConstructionLayerSelector);\n const currentSelectedMaterial: Material | undefined = useSelector(currentSelectedMaterialSelector(isLinkedMaterial));\n const parentSelectedMaterial: Material | undefined = useSelector(currentSelectedMaterialSelector(false));\n\n const materials = isLinkedMaterial ? parentSelectedMaterial!.linkedMaterials : layer.materials;\n\n const handleChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n dispatch(setMaterial(layer, materials.filter(m => m.materialId === (event.target.value as string))[0]));\n };\n\n return (\n
\n \n Material\n \n\n \n
\n );\n}\n","import React, { useState } from 'react';\nimport { Grid, Typography, Slider, Mark, Select, MenuItem, makeStyles, createStyles, Theme, Box } from '@material-ui/core';\nimport { Trans } from 'react-i18next';\n\nconst getMarks = (thicknesses: number[]): Mark[] => {\n return thicknesses.map(t => { return { value: t }; });\n};\n\nexport type ThicknessSliderProps = {\n labelKey: string,\n handleChange: Function,\n selectedThickness: number,\n disabled: boolean,\n min: number,\n max: number,\n marks: number[],\n defaultValue: number,\n units: string,\n isValueFixed: boolean,\n}\n\nconst useStyle = makeStyles((theme: Theme) => (\n createStyles({\n depthDropdownContainer: {\n marginTop: 19,\n },\n })\n));\n\nexport default function ThicknessSlider(props: ThicknessSliderProps) {\n const {\n labelKey,\n handleChange,\n selectedThickness,\n disabled,\n min,\n max,\n marks,\n defaultValue,\n units,\n isValueFixed\n } = props;\n\n const [value, setValue] = useState(selectedThickness);\n\n const handleChangeInternal = (event: any, newValue: number | number[]) => {\n setValue(newValue as number);\n };\n\n const handleDropdownChange = (event: any) => {\n setValue(event.target.value as number);\n handleChange(event.target.value as number);\n };\n\n const classes = useStyle();\n\n React.useEffect(() => {\n setValue(selectedThickness);\n }, [selectedThickness]);\n\n return (\n \n \n \n \n Thickness\n \n handleChange(value)}\n aria-labelledby=\"discrete-slider\"\n valueLabelDisplay=\"auto\"\n step={null}\n marks={getMarks(marks)}\n value={value ?? defaultValue}\n data-qa-id=\"depthSlider\"\n min={min}\n max={max}\n disabled={disabled}\n />\n \n \n {isValueFixed ?\n \n {value ?? defaultValue}\n \n :\n \n {\n marks.map((mark: number, index: number) => (\n {`${mark} ${units}`}\n ))\n }\n \n }\n \n \n \n );\n}\n","import React from 'react';\nimport { Grid, Box } from '@material-ui/core';\nimport { Trans } from 'react-i18next';\n\nexport type NoSliderProps = {\n labelKey: string,\n selectedThickness: number,\n units: string,\n}\n\nexport default function NoSlider(props: NoSliderProps) {\n const {\n labelKey,\n selectedThickness,\n } = props;\n\n return (\n \n \n \n Thickness\n
{ selectedThickness }
\n
\n
\n
\n );\n}\n","import React from 'react';\nimport { Box } from '@material-ui/core';\nimport { useDispatch } from 'react-redux';\nimport { ConstructionLayer, Material, LayerType } from '../../types/domain/construction-data.types';\nimport ThicknessSlider from './ThicknessSlider';\nimport NoSlider from './NoSlider';\nimport { setThickness } from '../../store/current-calculation-data/current-calculation-data.actions';\nimport { setMaterialParameter } from '../../store/current-calculation-data/current-calculation-data.action-creators';\n\ntype MaterialParametersAuxProps = {\n layer: ConstructionLayer,\n currentSelectedThickness: number,\n currentSelectedMaterial: Material | undefined,\n isLinkedMaterial: boolean,\n}\n\nexport default function MaterialParametersAux(props: MaterialParametersAuxProps) {\n const { isLinkedMaterial, layer, currentSelectedThickness, currentSelectedMaterial } = props;\n const dispatch = useDispatch();\n const isFixedLayer: boolean = layer.isWithinBridgingFrame && layer.layerType === LayerType.AirCavity;\n\n const handleChange = (value: number) => {\n dispatch(setMaterialParameter(setThickness, layer, value, isLinkedMaterial));\n };\n\n if (currentSelectedMaterial && currentSelectedMaterial.optionsForThicknessMillimetres.length > 1) {\n return (\n \n );\n }\n else if (currentSelectedMaterial && currentSelectedMaterial.optionsForThicknessMillimetres.length === 1 && currentSelectedMaterial.optionsForThicknessMillimetres[0] !== 0) {\n return (\n \n );\n }\n else {\n return (\n \n \n );\n }\n}\n","import React from 'react';\nimport { activeConstructionLayerSelector } from '../../store/component-state/component-state.selectors';\nimport { currentSelectedThicknessSelector, currentSelectedMaterialSelector } from '../../store/current-calculation-data/current-calculation-data.selectors';\nimport { useSelector } from 'react-redux';\nimport { ConstructionLayer, Material } from '../../types/domain/construction-data.types';\nimport { CalculationLayerProps } from './CalculationLayer';\nimport MaterialParametersAux from './MaterialParametersAux';\n\nexport default function MaterialParameters(props: CalculationLayerProps) {\n const { isLinkedMaterial } = props;\n const layer: ConstructionLayer = useSelector(activeConstructionLayerSelector);\n const currentSelectedThickness: number = useSelector(currentSelectedThicknessSelector(isLinkedMaterial));\n const currentSelectedMatrial: Material | undefined = useSelector(currentSelectedMaterialSelector(isLinkedMaterial));\n\n return (\n \n );\n}\n","import React from 'react';\nimport { activeConstructionLayerSelector } from '../../store/component-state/component-state.selectors';\nimport { currentAnchorPropertiesSelector, currentSelectedMaterialSelector, previousInsulationCalculationLayerSelector } from '../../store/current-calculation-data/current-calculation-data.selectors';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { ConstructionLayer, Material } from '../../types/domain/construction-data.types';\nimport ThicknessSlider from './ThicknessSlider';\nimport { setAnchorAmountPerSquareMetre, setAnchorDiameter, setAnchorPenetration } from '../../store/current-calculation-data/current-calculation-data.actions';\nimport { setMaterialParameter } from '../../store/current-calculation-data/current-calculation-data.action-creators';\nimport { useTranslation } from 'react-i18next';\nimport { CalculationLayer } from '../../types/domain/calculation-data.types';\n\nexport default function AnchorParameters() {\n const dispatch = useDispatch();\n const layer: ConstructionLayer = useSelector(activeConstructionLayerSelector);\n const { numberOfAnchorsPerMetreSquare, diameterOfAnchorsMillimetres, anchorPenetrationDepthMillimetres } = useSelector(currentAnchorPropertiesSelector);\n const currentSelectedMatrial: Material | undefined = useSelector(currentSelectedMaterialSelector(false));\n const previousInsulationLayer: CalculationLayer | undefined = useSelector(previousInsulationCalculationLayerSelector);\n\n const [optionsForAnchorPenetrationMillimetres, setOptionsForAnchorPenetrationMillimetres] = React.useState([] as number[]);\n\n const handleAmountChange = (value: number) => {\n dispatch(setMaterialParameter(setAnchorAmountPerSquareMetre, layer, value, false));\n };\n\n const handleDiameterChange = (value: number) => {\n dispatch(setMaterialParameter(setAnchorDiameter, layer, value, false));\n };\n\n const handlePenetrationChange = (value: number) => {\n dispatch(setMaterialParameter(setAnchorPenetration, layer, value, false));\n };\n\n const { t } = useTranslation();\n React.useEffect(() => {\n if (currentSelectedMatrial && currentSelectedMatrial.optionsForAnchorPenetrationMillimetres && previousInsulationLayer) {\n setOptionsForAnchorPenetrationMillimetres(currentSelectedMatrial.optionsForAnchorPenetrationMillimetres.filter(o => o <= previousInsulationLayer.thicknessMillimetres));\n }\n }, [setOptionsForAnchorPenetrationMillimetres, currentSelectedMatrial, previousInsulationLayer]);\n\n const defaultMarks = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n\n return (\n
\n \n\n \n\n {\n optionsForAnchorPenetrationMillimetres.length ?\n \n : null}\n
\n );\n\n}\n","import React from 'react';\nimport { activeConstructionLayerSelector } from '../../store/component-state/component-state.selectors';\nimport { currentAnchorPropertiesSelector, currentSelectedMaterialSelector } from '../../store/current-calculation-data/current-calculation-data.selectors';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { ConstructionLayer, Material } from '../../types/domain/construction-data.types';\nimport ThicknessSlider from './ThicknessSlider';\nimport { setNetAreaPerMetreSquare } from '../../store/current-calculation-data/current-calculation-data.actions';\nimport { setMaterialParameter } from '../../store/current-calculation-data/current-calculation-data.action-creators';\n\nexport default function AnchorParameters() {\n const dispatch = useDispatch();\n const layer: ConstructionLayer = useSelector(activeConstructionLayerSelector);\n const { netAreaOfAnchorsPerMetreSquareMillimetresSqrd } = useSelector(currentAnchorPropertiesSelector);\n const currentSelectedMatrial: Material | undefined = useSelector(currentSelectedMaterialSelector(false));\n\n const handleChange = (value: number) => {\n dispatch(setMaterialParameter(setNetAreaPerMetreSquare, layer, value, false));\n };\n\n const areaMarks = [50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 180, 200, 220, 250, 280, 300, 320, 350, 380, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950, 1000];\n\n return (\n
\n \n
\n );\n\n}\n","import React from 'react';\nimport { activeConstructionLayerSelector, activeConstructionTypeSelector } from '../../store/component-state/component-state.selectors';\nimport { currentSelectedThicknessSelector, } from '../../store/current-calculation-data/current-calculation-data.selectors';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { ConstructionLayer, ConstructionType } from '../../types/domain/construction-data.types';\nimport ThicknessSlider from './ThicknessSlider';\nimport { setWoodPercentage } from '../../store/current-calculation-data/current-calculation-data.actions';\nimport { setMaterialParameter } from '../../store/current-calculation-data/current-calculation-data.action-creators';\nimport { countryIdSelector } from '../../store/component-state/component-state.selectors';\n\nexport default function WoodPercentage() {\n const dispatch = useDispatch();\n const constructionType: ConstructionType | undefined = useSelector(activeConstructionTypeSelector);\n const layer: ConstructionLayer = useSelector(activeConstructionLayerSelector);\n const currentWoodPercentage: number = useSelector(currentSelectedThicknessSelector(false)); //using thickness property as % on pseudo layer\n const countryId = useSelector(countryIdSelector);\n const handleChange = (value: number) => {\n dispatch(setMaterialParameter(setWoodPercentage, layer, value, false));\n };\nif (countryId === 'gb' || countryId === 'ie') {\n return (\n \n );\n}\nelse {\n return (\n \n );\n}\n \n\n}\n","import React from 'react';\nimport { ConstructionLayer, AirCavityGrading } from '../../types/domain/construction-data.types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { activeConstructionLayerSelector } from '../../store/component-state/component-state.selectors';\nimport { currentSelectedThicknessSelector, currentSelectedAirCavityGradingSelector } from '../../store/current-calculation-data/current-calculation-data.selectors';\nimport { setMaterialParameter } from '../../store/current-calculation-data/current-calculation-data.action-creators';\nimport { setThickness } from '../../store/current-calculation-data/current-calculation-data.actions';\nimport ThicknessSlider from './ThicknessSlider';\nimport NoSlider from './NoSlider';\n\nexport default function AirCavityThickness() {\n const dispatch = useDispatch();\n const layer: ConstructionLayer = useSelector(activeConstructionLayerSelector);\n const currentSelectedAcg: AirCavityGrading | undefined = useSelector(currentSelectedAirCavityGradingSelector);\n const currentSelectedThickness: number = useSelector(currentSelectedThicknessSelector(false));\n const isFixedLayer: boolean = layer.isWithinBridgingFrame;\n\n const handleThicknessChange = (value: number) => {\n dispatch(setMaterialParameter(setThickness, layer, value, false));\n };\n\n if (!isFixedLayer) {\n return (<>\n \n );\n }\n else {\n return (<>\n \n );\n }\n\n}\n","import React from 'react';\nimport { Typography, Select, MenuItem } from '@material-ui/core';\nimport { Trans } from 'react-i18next';\nimport { ConstructionLayer, AirCavityGrading } from '../../types/domain/construction-data.types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { activeConstructionLayerSelector } from '../../store/component-state/component-state.selectors';\nimport { currentSelectedAirCavityGradingSelector } from '../../store/current-calculation-data/current-calculation-data.selectors';\nimport { setAirCavityGrading } from '../../store/current-calculation-data/current-calculation-data.action-creators';\nimport AirCavityThickness from './AirCavityThickness';\n\nexport default function AirCavity() {\n const dispatch = useDispatch();\n const layer: ConstructionLayer = useSelector(activeConstructionLayerSelector);\n const currentSelectedAcg: AirCavityGrading | undefined = useSelector(currentSelectedAirCavityGradingSelector);\n\n const handleAcgChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n dispatch(setAirCavityGrading(layer, layer.airCavityGradings.filter(ac => ac.airCavityGradingId === (event.target.value as string))[0]));\n };\n\n return (<>\n
\n \n Material\n \n\n \n
\n \n );\n}\n","const softHyphenChar = String.fromCharCode(173);\n\n/**\n *\n * @param layerName to suggest hyphens for\n * @returns A recombined layer name string with hyphen suggestions places in words that are long enough and they do not include hyphens already.\n */\nexport const insertSuggestedHyphenationIfRequired = (layerName: string) => {\n if (!navigator.userAgent.toLowerCase().includes('firefox/') && !navigator.userAgent.toLowerCase().includes('edg/')) {\n return layerName;\n }\n return insertSuggestedHyphenation(layerName);\n};\n\nexport const insertSuggestedHyphenation = (layerName: string) => {\n return layerName\n .split(' ')\n .map(word => (word.length <= 8 || word.includes(softHyphenChar) || word.includes('-') ? word : `${word.slice(0, 8)}${softHyphenChar}${word.slice(8, word.length)}`))\n .join(' ');\n};\n","import React from 'react';\nimport { ConstructionLayer, LayerType } from '../../types/domain/construction-data.types';\nimport { useTranslation } from 'react-i18next';\nimport { TFunction } from 'i18next';\nimport { insertSuggestedHyphenationIfRequired } from './hyphenSuggestion';\n\nexport type LayerNameProps = {\n layer: ConstructionLayer | null | undefined;\n insertSuggestedHyphenationIfRequired?: boolean | null | undefined;\n}\n\nconst getText = (props: LayerNameProps, t: TFunction) => {\n const text = props.layer?.layerType === LayerType.WoodPercentage\n ? t('calculation-ui.wood-percentage')\n : props.layer?.nameLocalized;\n\n return props.insertSuggestedHyphenationIfRequired === true\n ? insertSuggestedHyphenationIfRequired(text ?? '')\n : text;\n};\n\nexport default function LayerName(props: LayerNameProps) {\n const { t } = useTranslation();\n\n return {getText(props, t)};\n}\n","import React from 'react';\nimport MaterialDropDown from './MaterialDropDown';\nimport MaterialParameters from './MaterialParameters';\nimport AnchorParameters from './AnchorParameters';\nimport AnchorPreCalculatedParameters from './AnchorPreCalculatedParameters';\nimport WoodPercentage from './WoodPercentage';\nimport AirCavity from './AirCavity';\nimport { ConstructionLayer, LayerType, Material } from '../../types/domain/construction-data.types';\nimport { useTranslation } from 'react-i18next';\nimport { useSelector } from 'react-redux';\nimport { activeConstructionLayerSelector } from '../../store/component-state/component-state.selectors';\nimport { currentSelectedMaterialSelector } from '../../store/current-calculation-data/current-calculation-data.selectors';\nimport { Tooltip } from '@material-ui/core';\nimport InfoIcon from '@material-ui/icons/Info';\nimport LayerName from '../Calculation/LayerName';\n\nfunction renderControls(layer: ConstructionLayer, selectedMaterial: Material | undefined, isLinkedMaterial: boolean) {\n switch (layer.layerType) {\n case LayerType.Anchors:\n return (<>\n \n \n );\n case LayerType.AnchorsPreCalculated:\n return (<>\n \n \n );\n case LayerType.WoodPercentage:\n return (\n \n );\n case LayerType.AirCavity:\n return (\n \n );\n default:\n return (<>\n \n {(selectedMaterial?.optionsForThicknessMillimetres?.length || layer.isWithinBridgingFrame) && }\n );\n }\n}\n\nfunction renderLayerHeader(layer: ConstructionLayer, layerTooltipText: string) {\n switch (layer.layerType) {\n case LayerType.Anchors:\n case LayerType.AnchorsPreCalculated:\n case LayerType.WoodPercentage:\n return (\n \n
\n \n \n
\n
\n );\n default:\n return (\n
\n \n
\n );\n }\n}\n\n export type CalculationLayerProps = {\n isLinkedMaterial: boolean\n }\n\n export default function CalculationLayer() {\n const layer: ConstructionLayer = useSelector(activeConstructionLayerSelector);\n const currentSelectedMaterial: Material | undefined = useSelector(currentSelectedMaterialSelector(false));\n\n const { t } = useTranslation();\n\n const layerTooltipText = t(`layer-tooltip.${layer.layerType.toLowerCase()}`);\n\n return layer ? (\n
\n {renderLayerHeader(layer, layerTooltipText)}\n {renderControls(layer, currentSelectedMaterial, false)}\n {\n currentSelectedMaterial && currentSelectedMaterial.linkedMaterials.length > 0 && renderControls(layer, currentSelectedMaterial, true)\n }\n
\n ) : null;\n }\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { selectedCultureSelector } from '../../store/component-state/component-state.selectors';\n\nexport interface FormatNumberProps {\n toFormat: number | null;\n}\n\nexport default function FormatNumber(props: FormatNumberProps) {\n const culture = useSelector(selectedCultureSelector);\n\n return props.toFormat\n ? {props.toFormat.toLocaleString(culture, { minimumFractionDigits: 2, maximumFractionDigits: 2})}\n : null;\n}","import React from 'react';\nimport { Grid, makeStyles, createStyles, Theme, CircularProgress } from '@material-ui/core';\nimport { CalculationResult } from '../../types/domain/calculation-data.types';\nimport { useSelector } from 'react-redux';\nimport { currentCalculationResultSelector } from '../../store/current-calculation-data/current-calculation-data.selectors';\nimport { Trans } from 'react-i18next';\nimport { calculationResultLoadingStateSelector } from '../../store/component-state/component-state.selectors';\nimport FormatNumber from '../FormatNumber/FormatNumber';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n wrapper: {\n position: 'relative',\n },\n resultProgress: {\n color: theme.palette.primary.main,\n position: 'absolute',\n top: '50%',\n left: '50%',\n marginTop: -34,\n marginLeft: -34,\n },\n loadingClass: {\n opacity: 0.4,\n },\n }),\n);\n\nexport default function RcValue() {\n const classes = useStyles();\n const result: CalculationResult | undefined = useSelector(currentCalculationResultSelector);\n const isCalculationResultLoading: boolean = useSelector(calculationResultLoadingStateSelector);\n\n return (\n
\n \n \n
\n {result ?\n {result.resultType} :\n '--'}\n
\n
\n \n
\n {result && result.resultValue ?\n :\n '-,--'}\n
\n
\n \n
\n {result ?\n result.resultUnits :\n '--'}\n
\n
\n \n
\n Total Construction Thickness\n
\n
\n \n
\n {result ?\n result.totalThicknessMillimetres :\n '--'} mm\n
\n
\n
\n {isCalculationResultLoading && }\n
\n );\n}\n","import React from 'react';\nimport { Grid, Button, makeStyles, Theme, createStyles, useMediaQuery } from '@material-ui/core';\nimport { useTranslation } from 'react-i18next';\nimport KeyboardArrowRightIcon from '@material-ui/icons/KeyboardArrowRight';\nimport KeyboardArrowLeftIcon from '@material-ui/icons/KeyboardArrowLeft';\nimport { CalculationStep } from '../CalculationPage/calculation-page.types';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n fullWidthButton: {\n width: '100%',\n marginBottom: theme.spacing(1),\n marginTop: theme.spacing(1),\n },\n })\n);\n\nexport type CalculationWizardControlsProps = {\n activeStepIndex: number;\n steps: CalculationStep[];\n handleBackClick: () => void;\n handleNextClick: () => void;\n};\n\nexport default function CalculationWizardControls(props: CalculationWizardControlsProps) {\n\n const { activeStepIndex, steps, handleBackClick, handleNextClick } = props;\n\n const classes = useStyles();\n const { t } = useTranslation();\n\n const isMobileView = useMediaQuery((theme: Theme) => theme.breakpoints.down('xs'));\n\n const isLastStep = () => activeStepIndex === steps.length - 1;\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n );\n}\n","import React, { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Grid, Box, CircularProgress } from '@material-ui/core';\nimport CalculationLayer from '../CalculationLayer/CalculationLayer';\nimport RcValue from '../RcValue/RcValue';\n\nimport './Calculation.module.scss';\nimport { isLoadingSelector } from '../../store/component-state/component-state.selectors';\nimport CalculationWizardControls from './CalculationWizardControls';\nimport { projectDetailsSelector } from '../../store/current-calculation-data/current-calculation-data.selectors';\nimport { constructionTypeNameSelector } from '../../store/construction-data/construction-data.selectors';\nimport { dispatchCalculationAttempt } from '../../store/current-calculation-data/current-calculation-data.action-creators';\nimport { CalculationStep } from '../CalculationPage/calculation-page.types';\n\nexport type CalculationProps = {\n handleNextStep: () => void;\n handlePreviousStep: () => void;\n activeStepIndex: number;\n constructionTypeId: string;\n steps: CalculationStep[];\n}\n\nexport default function Calculation(props: CalculationProps) {\n const { activeStepIndex, constructionTypeId, steps, handleNextStep, handlePreviousStep } = props;\n\n const dispatch = useDispatch();\n\n const projectDetails = useSelector(projectDetailsSelector);\n const isLoading = useSelector(isLoadingSelector);\n const constructionTypeName = useSelector(constructionTypeNameSelector(constructionTypeId));\n\n useEffect(() => {\n if (!isLoading) {\n dispatch(dispatchCalculationAttempt());\n }\n }, [dispatch, isLoading]);\n\n const hasSteps = steps && steps.length > 0;\n\n return (\n \n \n \n \n \n \n {constructionTypeName}\n \n \n {projectDetails?.name}\n \n \n \n \n \n\n {hasSteps ? \n \n \n \n \n \n \n \n \n \n \n \n : }\n\n {hasSteps && }\n \n );\n}\n","import {\n FETCH_CONSTRUCTION_TYPES_ATTEMPT,\n FETCH_CONSTRUCTION_TYPES_SUCCESS,\n FETCH_CONSTRUCTION_TYPES_FAILURE,\n FETCH_CONSTRUCTION_TYPE_NAMES_SUCCESS,\n\n FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_ATTEMPT,\n FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_SUCCESS,\n FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_FAILURE,\n\n FetchConstructionTypesAttempt,\n FetchConstructionTypesSuccess,\n FetchConstructionTypesFailure,\n FetchConstructionTypeNamesSuccess,\n\n FetchConstructionLayersForTypeAttempt,\n FetchConstructionLayersForTypeSuccess,\n FetchConstructionLayersForTypeFailure,\n\n} from './construction-data.action-types';\nimport { ConstructionType, ConstructionLayer } from '../../types/domain/construction-data.types';\n\nexport const fetchConstructionTypesAttempt = (): FetchConstructionTypesAttempt => ({\n type: FETCH_CONSTRUCTION_TYPES_ATTEMPT,\n});\n\nexport const fetchConstructionTypesSuccess = (data: ConstructionType[]): FetchConstructionTypesSuccess => ({\n type: FETCH_CONSTRUCTION_TYPES_SUCCESS,\n payload: data,\n});\n\nexport const fetchConstructionTypeNamesSuccess = (data: ConstructionType[]): FetchConstructionTypeNamesSuccess => ({\n type: FETCH_CONSTRUCTION_TYPE_NAMES_SUCCESS,\n payload: data,\n});\n\nexport const fetchConstructionTypesFailure = (error: string): FetchConstructionTypesFailure => ({\n type: FETCH_CONSTRUCTION_TYPES_FAILURE,\n error,\n});\n\nexport const fetchConstructionLayersForTypeAttempt = (): FetchConstructionLayersForTypeAttempt => ({\n type: FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_ATTEMPT,\n});\n\nexport const fetchConstructionLayersForTypeSuccess = (constructionType: string, data: ConstructionLayer[], constructionTypeNameLocalized: string): FetchConstructionLayersForTypeSuccess => ({\n type: FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_SUCCESS,\n payload: {\n constructionType: constructionType,\n constructionTypeNameLocalized,\n layers: data,\n },\n});\n\nexport const fetchConstructionLayersForTypeFailure = (error: string): FetchConstructionLayersForTypeFailure => ({\n type: FETCH_CONSTRUCTION_LAYERS_FOR_TYPE_FAILURE,\n error,\n});\n","import axios from 'axios';\nimport {\n fetchConstructionTypesAttempt,\n fetchConstructionTypesFailure,\n fetchConstructionTypesSuccess,\n fetchConstructionTypeNamesSuccess,\n\n fetchConstructionLayersForTypeAttempt,\n fetchConstructionLayersForTypeFailure,\n fetchConstructionLayersForTypeSuccess,\n} from './construction-data.actions';\nimport {\n startNewCalculation, startEditCalculation, startCopyCalculation\n} from '../current-calculation-data/current-calculation-data.action-creators';\nimport { ConstructionLayer, ConstructionType, Complexity, LayerType } from '../../types/domain/construction-data.types';\nimport { setActiveConstructionLayer } from '../component-state/component-state.actions';\nimport { StoreModel } from '../store.model';\nimport { Calculation } from '../../types/domain/calculation-data.types';\n\nexport const fetchConstructionTypes = (countryId: string) => (\n\n // TODO: Typing needs to be defined\n async (dispatch: (action: any) => void) => {\n dispatch(fetchConstructionTypesAttempt());\n\n try {\n const { data } = await axios.get(`/api/constructionTypes/${countryId}`);\n\n dispatch(fetchConstructionTypesSuccess(data));\n } catch (error) {\n dispatch(fetchConstructionTypesFailure((error as any)?.message));\n }\n }\n);\n\nexport const fetchConstructionTypeNames = (countryId: string) => (\n async (dispatch: (action: any) => void) => {\n try {\n const { data } = await axios.get(`/api/constructionTypes/${countryId}`);\n\n dispatch(fetchConstructionTypeNamesSuccess(data));\n } catch (error) {\n console.warn('fetchConstructionTypeNames error', error);\n }\n }\n);\n\nexport const fetchConstructionLayersForType = (constructionTypeId: string, countryId: string, refetch?: boolean) => (\n\n // TODO: Typing needs to be defined\n async (dispatch: (action: any) => void, getState: () => StoreModel) => {\n dispatch(fetchConstructionLayersForTypeAttempt());\n\n try {\n const { data, headers } = await axios.get(`/api/constructionLayers/${constructionTypeId}/${countryId}`);\n const constructionTypeNameLocalized = headers['construction-type-name-localized'];\n\n const ct = getState().constructionData.types.filter(ct => ct.id === constructionTypeId)[0];\n\n const dataWithPseudoLayers = constructPseudoLayers(ct, data as ConstructionLayer[]);\n\n dispatch(fetchConstructionLayersForTypeSuccess(constructionTypeId, dataWithPseudoLayers, constructionTypeNameLocalized));\n\n if (refetch !== true) {\n dispatch(setActiveConstructionLayer((data as ConstructionLayer[])[0].constructionLayerId));\n await startNewCalculation(constructionTypeId, dataWithPseudoLayers)(dispatch, getState);\n }\n } catch (error) {\n console.warn('fetchConstructionLayersForType error', error);\n dispatch(fetchConstructionLayersForTypeFailure((error as any)?.message));\n }\n }\n);\n\nexport const fetchConstructionLayersForCalculation = (calculation: Calculation, copy: boolean) => (\n async (dispatch: (action: any) => void, getState: () => StoreModel) => {\n dispatch(fetchConstructionLayersForTypeAttempt());\n\n try {\n const { data, headers } = await axios.get(`/api/constructionLayers/${calculation.constructionTypeId}/${calculation.countryId}`);\n const constructionTypeNameLocalized = headers['construction-type-name-localized'];\n\n const ct = getState().constructionData.types.filter(ct => ct.id === calculation.constructionTypeId)[0];\n\n const dataWithPseudoLayers = constructPseudoLayers(ct, data as ConstructionLayer[]);\n\n dispatch(fetchConstructionLayersForTypeSuccess(calculation.constructionTypeId, dataWithPseudoLayers, constructionTypeNameLocalized));\n\n dispatch(setActiveConstructionLayer((data as ConstructionLayer[])[0].constructionLayerId));\n if (copy) {\n await startCopyCalculation(calculation, dataWithPseudoLayers)(dispatch);\n } else {\n await startEditCalculation(calculation, dataWithPseudoLayers)(dispatch);\n }\n } catch (error) {\n console.warn('fetchConstructionLayersForCalculation error', error);\n dispatch(fetchConstructionLayersForTypeFailure(error as any));\n }\n\n }\n);\n\nconst constructPseudoLayers = (constructionType: ConstructionType, layers: ConstructionLayer[]): ConstructionLayer[] => {\n if (!constructionType) {\n throw new Error('Invalid state: `constructionType` param is null. The `constructPseudoLayers` function requires the `constructionType` param');\n }\n\n if (constructionType.complexity === Complexity.Simple) {\n return layers;\n }\n\n return layers.reduce((obj: ConstructionLayer[], item: ConstructionLayer) => {\n\n if (item.layerType === LayerType.Bridging) {\n const pseudoLayer = {\n constructionLayerId: -9999,\n constructionTypeId: constructionType.id,\n name: 'wood-percentage',\n nameLocalized: 'Wood Percentage',\n materials: [],\n airCavityGradings: [],\n layerType: LayerType.WoodPercentage,\n isWithinBridgingFrame: false,\n isPseudoLayer: true\n };\n\n return [\n ...obj,\n item,\n pseudoLayer,\n ];\n }\n\n return [\n ...obj,\n item\n ];\n }, []) as ConstructionLayer[];\n};\n","import { StoreModel } from '../store.model';\nimport { Calculation } from '../../types/domain/calculation-data.types';\nimport compareDesc from 'date-fns/compareDesc';\n\nexport const calculationArraySelector = (store: StoreModel) : Calculation[] => \n Object.values(store.calculations.calculations).sort((a, b) => compareDesc(a.updatedOn, b.updatedOn));\n\nexport const calculationSelector = (calculationId: string) => (store: StoreModel) : Calculation | undefined =>\n store.calculations.calculations[calculationId];\n\nexport const deletingCalculationsSelector = (store: StoreModel): string[] => store.calculations.deletingCalculations;\n","import React from 'react';\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n Box,\n DialogTitle,\n IconButton,\n Theme,\n createStyles,\n makeStyles,\n Typography,\n Grid,\n useMediaQuery,\n FormControl,\n TextField,\n CircularProgress,\n Checkbox,\n FormControlLabel,\n} from '@material-ui/core';\nimport CloseIcon from '@material-ui/icons/Close';\nimport { Trans } from 'react-i18next';\nimport { getLinks } from '../../common/links';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n margin: 0,\n padding: theme.spacing(2),\n },\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n fullWidthButton: {\n width: '100%',\n marginBottom: theme.spacing(1),\n marginTop: theme.spacing(1),\n },\n formControl: {\n width: '100%',\n },\n buttonWrapper: {\n position: 'relative',\n },\n buttonProgress: {\n color: theme.palette.info.main,\n position: 'absolute',\n top: '50%',\n left: '50%',\n marginTop: -12,\n marginLeft: -12,\n },\n checkboxLabel: {\n marginLeft: 0,\n marginTop: theme.spacing(3),\n alignItems: 'start',\n },\n checkbox: {\n paddingTop: 0,\n },\n })\n);\n\nexport interface EmailDialogProps {\n open: boolean;\n handleClose: () => void;\n handleSend: (emailAddress: string, gdprConsentGiven: boolean) => void;\n sending: boolean;\n}\n\nexport default function EmailDialog(props: EmailDialogProps) {\n const { open, handleClose, handleSend, sending } = props;\n\n const classes = useStyles();\n\n const isMobileView = useMediaQuery((theme: Theme) => theme.breakpoints.down('xs'));\n\n const [guestEmail, setGuestEmail] = React.useState('');\n const [sendingState, setSendingState] = React.useState(false);\n const [gdprConsentGiven, setGdprConsentChecked] = React.useState(false);\n\n const links = getLinks();\n const directMarketingConsentLink = links.marketingConsent;\n const privacyPolicyLink = links.privacyPolicy;\n\n const onGuestEmailChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n setGuestEmail(event.target.value as string);\n };\n\n const handleGdprConsentChange = (event: React.ChangeEvent) => {\n setGdprConsentChecked(event.target.checked);\n };\n\n React.useEffect(() => {\n setSendingState(sending);\n }, [sending]);\n\n return (\n handleClose()} fullWidth={true} maxWidth=\"sm\">\n \n \n \n email-dialog.guest-title\n \n \n handleClose()}>\n \n \n \n\n \n \n email-dialog.guest-subtitle\n }\n label={\n Direct Marketing Consent Notice.

We will use your personal data for marketing and retargeting purposes and you have the right to withdraw this consent at any time as explained in our Privacy Policy.\"\n values={{ privacyPolicyLink: privacyPolicyLink, directMarketingConsentLink: directMarketingConsentLink }}\n components={{\n anchorlinkMarketing: (\n \n Direct Marketing Consent Notice\n \n ),\n anchorlinkPrivacy: (\n \n Privacy Policy\n \n ),\n }}\n />\n }\n labelPlacement=\"end\"\n />\n
\n \n \n } variant=\"outlined\" className={classes.formControl} value={guestEmail} onChange={onGuestEmailChange} />\n \n \n
\n\n \n \n \n {\n handleSend(guestEmail, gdprConsentGiven);\n }}\n >\n email-dialog.send-email\n \n {sendingState && }\n \n \n \n \n \n \n
\n );\n}\n","export const downloadPdf = (content: BlobPart, filename: string): void => {\n const blob = new Blob([content]);\n const link = window.document.createElement('a');\n link.download = filename;\n link.href = window.URL.createObjectURL(blob);\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n","import axios from 'axios';\nimport * as he from 'he';\nimport { AuthenticationState } from 'react-aad-msal';\n\nimport { downloadPdf } from '../../common/pdf';\nimport { mapApiResponseArrayToCalculcationObjectCollection } from '../../helpers/calculation-response-helper';\nimport { StoreModel } from '../store.model';\nimport { CalculationActionTypes } from './calculations.action-types';\nimport {\n deleteCalculationAttempt,\n deleteCalculationFailure,\n deleteCalculationSuccess,\n downloadCalculationAttempt,\n downloadCalculationFailure,\n downloadCalculationSuccess,\n downloadPdfCalculationAttempt,\n downloadPdfCalculationFailure,\n downloadPdfCalculationSuccess,\n fetchCalculationAttempt,\n fetchCalculationFailure,\n fetchCalculationSuccess,\n} from './calculations.actions';\n\nexport const fetchCalculation = (countryId: string) => async (dispatch: (action: CalculationActionTypes) => void, getState: () => StoreModel) => {\n dispatch(fetchCalculationAttempt());\n\n try {\n const { data } = await axios.get(`/api/calculation/${countryId}`, {\n withCredentials: true,\n });\n\n dispatch(fetchCalculationSuccess(mapApiResponseArrayToCalculcationObjectCollection(data)));\n } catch (error) {\n dispatch(fetchCalculationFailure(error));\n }\n};\n\nexport const deleteCalculation = (calculationId: string) => async (dispatch: (action: CalculationActionTypes) => void, getState: () => StoreModel) => {\n dispatch(deleteCalculationAttempt(calculationId));\n\n try {\n await axios.delete(`/api/calculation/${calculationId}`, {\n withCredentials: true,\n });\n\n dispatch(deleteCalculationSuccess(calculationId));\n } catch (error) {\n dispatch(deleteCalculationFailure(error, calculationId));\n }\n};\n\nexport const downloadCalculation = (calculationId: string, calculationAccessCode: string, emailAddress?: string, gdprConsentGiven?: boolean) => async (\n dispatch: (action: CalculationActionTypes) => void,\n getState: () => StoreModel\n): Promise => {\n dispatch(downloadCalculationAttempt(calculationId));\n\n try {\n const { authenticationState } = getState();\n\n await axios.post(\n '/api/pdf',\n {\n calculationId,\n calculationAccessCode,\n emailAddress,\n gdprConsentGiven,\n },\n {\n withCredentials: authenticationState.state === AuthenticationState.Authenticated,\n }\n );\n\n dispatch(downloadCalculationSuccess(calculationId));\n return true;\n } catch (error) {\n dispatch(downloadCalculationFailure(error, calculationId));\n }\n\n return false;\n};\n\nexport const directDownloadCalculation = (calculationId: string, calculationAccessCode: string) => async (dispatch: (action: CalculationActionTypes) => void, getState: () => StoreModel): Promise => {\n dispatch(downloadPdfCalculationAttempt(calculationId));\n\n try {\n const { authenticationState } = getState();\n\n const params = { calculationId: calculationId, calculationAccessCode: calculationAccessCode };\n\n const result = await axios.get('/api/pdf', {\n withCredentials: authenticationState.state === AuthenticationState.Authenticated,\n params,\n headers: {\n 'Content-Type': 'application/pdf',\n },\n responseType: 'blob',\n });\n\n let filename: string;\n if (result.headers['filename']) {\n filename = he.decode(result.headers['filename']);\n }\n else {\n filename = `${calculationId}.pdf`;\n }\n\n downloadPdf(result.data, filename);\n\n dispatch(downloadPdfCalculationSuccess(calculationId));\n return true;\n } catch (error) {\n dispatch(downloadPdfCalculationFailure(error, calculationId));\n }\n\n return false;\n};\n","import {\n FETCH_CALCULATIONS_ATTEMPT,\n FETCH_CALCULATIONS_SUCCESS,\n FETCH_CALCULATIONS_FAILURE,\n FetchCalculationsAttempt,\n FetchCalculationsSuccess,\n FetchCalculationsFailure,\n DELETE_CALCULATION_ATTEMPT,\n DELETE_CALCULATION_SUCCESS,\n DELETE_CALCULATION_FAILURE,\n DeleteCalculationAttempt,\n DeleteCalculationSuccess,\n DeleteCalculationFailure,\n DOWNLOAD_CALCULATION_ATTEMPT,\n DOWNLOAD_CALCULATION_SUCCESS,\n DOWNLOAD_CALCULATION_FAILURE,\n DownloadCalculationAttempt,\n DownloadCalculationSuccess,\n DownloadCalculationFailure,\n DOWNLOAD_PDF_CALCULATION_ATTEMPT,\n DOWNLOAD_PDF_CALCULATION_SUCCESS,\n DOWNLOAD_PDF_CALCULATION_FAILURE,\n DownloadPdfCalculationAttempt,\n DownloadPdfCalculationSuccess,\n DownloadPdfCalculationFailure,\n} from './calculations.action-types';\nimport { Calculation } from '../../types/domain/calculation-data.types';\n\nexport const fetchCalculationAttempt = (): FetchCalculationsAttempt => ({\n type: FETCH_CALCULATIONS_ATTEMPT,\n});\n\nexport const fetchCalculationSuccess = (data: { [key: string]: Calculation }): FetchCalculationsSuccess => ({\n type: FETCH_CALCULATIONS_SUCCESS,\n payload: data,\n});\n\nexport const fetchCalculationFailure = (error: any): FetchCalculationsFailure => ({\n type: FETCH_CALCULATIONS_FAILURE,\n error,\n});\n\nexport const deleteCalculationAttempt = (calculationId: string): DeleteCalculationAttempt => ({\n type: DELETE_CALCULATION_ATTEMPT,\n payload: calculationId,\n});\n\nexport const deleteCalculationSuccess = (calculationId: string): DeleteCalculationSuccess => ({\n type: DELETE_CALCULATION_SUCCESS,\n payload: calculationId,\n});\n\nexport const deleteCalculationFailure = (error: any, calculationId: string): DeleteCalculationFailure => ({\n type: DELETE_CALCULATION_FAILURE,\n error,\n payload: calculationId,\n});\n\nexport const downloadCalculationAttempt = (calculationId: string): DownloadCalculationAttempt => ({\n type: DOWNLOAD_CALCULATION_ATTEMPT,\n payload: calculationId,\n});\n\nexport const downloadCalculationSuccess = (calculationId: string): DownloadCalculationSuccess => ({\n type: DOWNLOAD_CALCULATION_SUCCESS,\n payload: calculationId,\n});\n\nexport const downloadCalculationFailure = (error: any, calculationId: string): DownloadCalculationFailure => ({\n type: DOWNLOAD_CALCULATION_FAILURE,\n error,\n payload: calculationId,\n});\n\nexport const downloadPdfCalculationAttempt = (calculationId: string): DownloadPdfCalculationAttempt => ({\n type: DOWNLOAD_PDF_CALCULATION_ATTEMPT,\n payload: calculationId,\n});\n\nexport const downloadPdfCalculationSuccess = (calculationId: string): DownloadPdfCalculationSuccess => ({\n type: DOWNLOAD_PDF_CALCULATION_SUCCESS,\n payload: calculationId,\n});\n\nexport const downloadPdfCalculationFailure = (error: any, calculationId: string): DownloadPdfCalculationFailure => ({\n type: DOWNLOAD_PDF_CALCULATION_FAILURE,\n error,\n payload: calculationId,\n});\n","import React from 'react';\nimport { Box } from '@material-ui/core';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\n\nexport type ThicknessBuildUpProps = {\n materialName: string;\n totalConstructionThicknessMillimetres: number;\n layerThicknessPercentageNormalised: number;\n isKingspanProduct: boolean\n};\n\nconst buildUpHeight = 120;\n\nconst useStyle = makeStyles((theme: Theme) => (\n createStyles({\n materialName: {\n display: 'flex',\n alignItems:'flex-end',\n justifyContent: 'center',\n textAlign: 'center',\n paddingBottom: '0.5em',\n },\n buildUpContainer: {\n display: 'flex',\n justifyContent: 'center',\n minWidth: '100px',\n },\n buildUpMaterial: {\n display: 'inline-block',\n height: `${buildUpHeight}px`,\n backgroundColor: '#FFF',\n borderRadius: '2px',\n borderColor: '#414141'\n },\n buildUpMaterialInsulation: {\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n },\n buildUpMaterialInnerWall: {\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n },\n constructionThicknessBracket: {\n height: '10px',\n width: '100%',\n marginTop: '10px',\n marginBottom: '5px',\n },\n thicknessLabel: {\n textAlign: 'center',\n fontSize: '95%',\n },\n kingSpan: {\n backgroundColor: '#F6AF9A',\n }\n })\n));\n\nexport default function ThicknessBuildUp(props: ThicknessBuildUpProps) {\n\n const classes = useStyle();\n\n return (\n
\n
\n {props.materialName}\n
\n\n
\n \n
\n \n \n \n
\n \n
\n
\n\n
\n {props.totalConstructionThicknessMillimetres} mm\n
\n
\n );\n}\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Grid } from '@material-ui/core';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport { ThicknessComparisonResult } from '../../types/domain/calculation-data.types';\nimport ThicknessBuildUp from './ThicknessBuildUp';\n\nexport type ThicknessComparisonProps = {\n thicknessComparison: ThicknessComparisonResult | null | undefined,\n};\n\nconst useStyle = makeStyles((theme: Theme) => (\n createStyles({\n tagLine: {\n textAlign: 'center',\n fontWeight: 'bold',\n marginTop: '1em',\n },\n })\n));\n\nexport default function ThicknessComparison(props: ThicknessComparisonProps) {\n\n const classes = useStyle();\n const { t } = useTranslation();\n\n const thicknessComparison = props.thicknessComparison;\n\n return thicknessComparison\n ?
\n \n \n \n \n \n \n \n \n\n
\n
\n {t('thickness-comparison-ui.you-will-save', { ...thicknessComparison })}\n
\n
\n {thicknessComparison.comparisonMaterialName} \n
\n
\n
\n :
;\n}\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { CalculationResult, ProjectDetails } from '../../types/domain/calculation-data.types';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport { Grid, Box, Typography } from '@material-ui/core';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport CancelIcon from '@material-ui/icons/Cancel';\nimport { Trans } from 'react-i18next';\nimport { isEmpty } from 'lodash';\nimport { getAppConfig } from '../../config/config';\nimport ThicknessComparison from './ThicknessComparison';\nimport RcValue from '../RcValue/RcValue';\nimport { countryIdSelector } from '../../store/component-state/component-state.selectors';\nimport { constructionTypeNameSelector } from '../../store/construction-data/construction-data.selectors';\nimport { currentCalculationDataSelector } from '../../store/current-calculation-data/current-calculation-data.selectors';\nimport { ConstructionLayer, LayerType, Material } from '../../types/domain/construction-data.types';\nimport LayerName from '../Calculation/LayerName';\nimport styles from './CalculationSummary.module.scss';\nimport { getCalculationLayerKey } from '../../store/current-calculation-data/current-calculation-data.reducer';\nimport MaterialParametersAux from '../CalculationLayer/MaterialParametersAux';\n\nexport type CalculationSummaryProps = {\n results: CalculationResult | undefined,\n constructionTypeId: string,\n projectDetails?: ProjectDetails | null,\n layers: ConstructionLayer[];\n};\n\nconst useStyle = makeStyles((theme: Theme) => (\n createStyles({\n media: {\n height: 270,\n backgroundSize: 'contain',\n backgroundPosition: 'center',\n },\n summaryContainer: {\n padding: theme.spacing(2),\n },\n summary: {\n marginBottom: 24,\n },\n layer: {\n marginBottom: 12,\n },\n link: {\n color: 'inherit',\n },\n panelsContainer: {\n marginTop: '0.5em',\n marginBottom: '1em',\n },\n panel: {\n padding: theme.spacing(2),\n backgroundColor: '#E0E0E0',\n borderRadius: '0.75em',\n },\n icon: {\n verticalAlign: 'bottom'\n },\n compliant: {\n color: 'green'\n },\n nonCompliant: {\n color: 'red'\n }\n })\n));\n\nfunction getAvailableMaterials(constructionLayer: ConstructionLayer | null | undefined) {\n let materials = [...constructionLayer?.materials ?? []];\n if (constructionLayer?.materials) {\n constructionLayer?.materials.forEach(material => {\n materials = [...materials, ...material.linkedMaterials ?? []];\n });\n }\n return materials;\n}\n\nexport const hasThicknessOptions = (material: Material | null | undefined): boolean => (\n material !== null && material !== undefined &&\n !isEmpty(material.optionsForThicknessMillimetres) &&\n material.optionsForThicknessMillimetres.some(x => x > 0)\n);\n\nexport default function CalculationSummary(props: CalculationSummaryProps) {\n\n const classes = useStyle();\n const apiUrl = getAppConfig()?.apiUrl;\n\n const countryId = useSelector(countryIdSelector);\n const constructionTypeId = isEmpty(props.constructionTypeId) ? 'cavity-wall' : props.constructionTypeId;\n const constructionTypeName = useSelector(constructionTypeNameSelector(constructionTypeId));\n const currentCalculationData = useSelector(currentCalculationDataSelector);\n\n const thicknessComparison = props.results?.thicknessComparison;\n\n return (\n \n \n \n {constructionTypeName}\n \n {props.projectDetails?.name}\n \n \n \n \n \n
\n \n Construction Summary\n \n
\n\n
    \n {props.results?.calculationLayers?.map(resultLayer => {\n const constructionLayer = props.layers.find(layer => layer.name === resultLayer.layerName);\n const selectedMaterial = getAvailableMaterials(constructionLayer).find(material => material.materialId === resultLayer.materialId);\n const calculationLayerKey = getCalculationLayerKey(constructionLayer?.constructionLayerId ?? -1, selectedMaterial?.isLinkedMaterial);\n return {\n ...resultLayer,\n constructionLayer,\n selectedMaterial,\n calculationLayer: currentCalculationData.calculationLayers[calculationLayerKey]\n };\n }).map(layer => (\n
  • \n \n
    \n {layer.materialName}\n {layer.constructionLayer?.layerType === LayerType.Insulation &&\n hasThicknessOptions(layer.selectedMaterial) &&\n
    \n \n \n \n
    }\n
    \n
  • \n ))}\n
\n\n
\n \n Total thickness\n  {props.results?.totalThicknessMillimetres ?? '--'} mm\n
\n
\n \n \n \n \n \n {\n props.results?.isBengCompliant != null &&\n \n \n \n BENG {\n props.results.isBengCompliant ?\n :\n \n }\n \n \n \n }\n {\n thicknessComparison &&\n \n \n \n \n \n }\n \n \n
\n\n );\n}\n","import { TFunction } from 'i18next';\nimport { toast } from 'react-toastify';\n\nexport const displayPdfDownloadToast = (success: boolean, t: TFunction) => {\n if (success) {\n toast.success(t('email-dialog.success-dialog'));\n } else {\n toast.error(t('email-dialog.failure-dialog'));\n }\n};\n","import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Grid, Button, Box, makeStyles, createStyles, Theme, useMediaQuery, CircularProgress } from '@material-ui/core';\nimport { useTranslation, Trans } from 'react-i18next';\nimport { toast } from 'react-toastify';\nimport EmailDialog from '../EmailDialogs/EmailDialog';\nimport { downloadCalculation, directDownloadCalculation } from '../../store/calculations/calculations.action-creators';\nimport { loggedInUserSelector } from '../../store/account/account.selectors';\nimport { selectedCultureSelector, activeConstructionTypeIdSelector, downloadingCalculationIdSelector } from '../../store/component-state/component-state.selectors';\nimport { dispatchCalculationAttempt } from '../../store/current-calculation-data/current-calculation-data.action-creators';\nimport { projectDetailsSelector, currentCalculationDataSelector } from '../../store/current-calculation-data/current-calculation-data.selectors';\nimport CalculationSummary from './CalculationSummary';\nimport { displayPdfDownloadToast } from '../../helpers/toast-helpers';\nimport { ThunkDispatch } from 'redux-thunk';\nimport { AnyAction } from 'redux';\nimport TagManager from 'react-gtm-module';\nimport { ConstructionLayer } from '../../types/domain/construction-data.types';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n fullWidthButton: {\n width: '100%',\n marginBottom: theme.spacing(1),\n marginTop: theme.spacing(1),\n },\n link: {\n color: 'inherit',\n textDecoration: 'inherit',\n },\n buttonWrapper: {\n position: 'relative',\n },\n buttonProgress: {\n color: theme.palette.info.main,\n position: 'absolute',\n top: '50%',\n left: '50%',\n marginTop: -12,\n marginLeft: -12,\n },\n })\n);\n\nexport type CalculationResultsProps = {\n layers: ConstructionLayer[];\n handleBack: () => void;\n};\n\nexport default function CalculationResults(props: CalculationResultsProps) {\n const dispatch: ThunkDispatch = useDispatch();\n const user = useSelector(loggedInUserSelector);\n const downloadingCalculationId: string | null = useSelector(downloadingCalculationIdSelector);\n const { t } = useTranslation();\n\n const handleDownloadClick = async (calculationId: string, calculationAccessCode: string) => {\n if (user != null) {\n const result = await dispatch(downloadCalculation(calculationId, calculationAccessCode));\n displayPdfDownloadToast(result, t);\n } else {\n setGuestDialogOpen(true);\n }\n };\n\n const handleDirectDownloadClick = async (calculationName: string | undefined, constructionTypeId: string, calculationId: string, calculationAccessCode: string) => {\n if (user != null) {\n await dispatch(directDownloadCalculation(calculationId, calculationAccessCode));\n }\n };\n\n const { handleBack } = props;\n\n const { calculationResult, calculationId, calculationAccessCode } = useSelector(currentCalculationDataSelector);\n const constructionTypeId = useSelector(activeConstructionTypeIdSelector);\n const projectDetails = useSelector(projectDetailsSelector);\n\n const classes = useStyles();\n\n const isMobileView = useMediaQuery((theme: Theme) => theme.breakpoints.down('xs'));\n\n const [guestDialogOpen, setGuestDialogOpen] = React.useState(false);\n const [downloadingState, setDownloadingState] = React.useState(false);\n\n React.useEffect(() => {\n TagManager.dataLayer({\n dataLayer: {\n event: 'calculation_results_page_init',\n }\n });\n });\n\n React.useEffect(() => {\n if (!downloadingState && downloadingCalculationId) {\n setDownloadingState(true);\n } else if (downloadingState && !downloadingCalculationId) {\n setDownloadingState(false);\n }\n }, [downloadingState, downloadingCalculationId, setDownloadingState]);\n\n const handleClose = () => {\n setGuestDialogOpen(false);\n };\n\n const handleGuestEmailSend = async (guestEmail: string, gdprConsentGiven: boolean) => {\n if (calculationId && calculationAccessCode) {\n const result = await dispatch(downloadCalculation(calculationId, calculationAccessCode, guestEmail, gdprConsentGiven));\n displayPdfDownloadToast(result, t);\n setGuestDialogOpen(false);\n }\n };\n\n const selectedCulture = useSelector(selectedCultureSelector);\n const isInitialised = React.useRef(false);\n React.useEffect(() => {\n if (!isInitialised.current) {\n isInitialised.current = true;\n } else {\n console.info(`Selected culture changed to ${selectedCulture}, so dispatching refresh of the calculation result`);\n dispatch(dispatchCalculationAttempt());\n }\n }, [dispatch, selectedCulture]);\n\n if (user != null && !isInitialised.current) {\n toast.info(t('calculation-results-ui.calculation-saved-message', { projectName: projectDetails?.name }));\n }\n\n return (\n \n \n\n \n\n \n \n {calculationId && calculationAccessCode && (\n \n )}\n {downloadingState && }\n \n \n {calculationId && calculationAccessCode && user != null && (\n handleDirectDownloadClick(projectDetails?.name, constructionTypeId, calculationId, calculationAccessCode)}\n className={isMobileView ? classes.fullWidthButton : ''}\n disabled={downloadingState}\n >\n View\n \n )}\n {downloadingState && }\n \n \n \n Edit calculation\n \n \n \n \n );\n}\n","import React from 'react';\nimport { Stepper, StepButton, Step, StepLabel, StepIconProps, useMediaQuery, Theme, Box, makeStyles, createStyles, Select, MenuItem } from '@material-ui/core';\nimport { toNumber } from 'lodash';\nimport SelectedIcon from '@material-ui/icons/LocationOn';\nimport { CalculationStep } from './calculation-page.types';\nimport styles from './CalculationStepper.module.scss';\n\ntype CalculationStepperProps = {\n activeStepIndex: number;\n steps: CalculationStep[];\n handleBreadcrumbStepChange: (newStepIndex: number) => void;\n};\n\nconst useStyles = makeStyles(() =>\n createStyles({\n step: {\n hyphens: 'auto',\n },\n })\n);\n\nexport default function CalculationStepper(props: CalculationStepperProps) {\n const { activeStepIndex, steps } = props;\n\n const isMobileView = useMediaQuery((theme: Theme) => theme.breakpoints.down('xs'));\n const isTabletView = useMediaQuery((theme: Theme) => theme.breakpoints.down('sm'));\n\n const classes = useStyles();\n\n return isMobileView || (isTabletView && steps.length > 5) ? (\n \n \n \n ) : (\n \n {steps.map((step, index) => (\n \n props.handleBreadcrumbStepChange(index)}>\n \n {step.renderLabel(true)}\n \n \n \n ))}\n \n );\n}\n\nfunction StepIcon(props: StepIconProps) {\n const { active } = props;\n return
\n {\n active\n ? \n :
\n }\n
;\n}\n","/**\n * Represents a specific step in the Calculaton Wizard.\n * The step can either be a layer in the calculation, or any other step in the wizard which isn't a layer.\n */\nexport class CalculationStep {\n constructor(\n public renderLabel: (insertSuggestedHyphenationIfRequired?: boolean) => JSX.Element,\n public id: string,\n ) { }\n}\n","import React, { useEffect, useState } from 'react';\nimport { useParams, useLocation, Redirect } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { CircularProgress } from '@material-ui/core';\nimport { setActiveConstructionType, setActiveConstructionLayer } from '../../store/component-state/component-state.actions';\nimport CalculationProjectDetails from '../CalculationProjectDetails/CalculationProjectDetails';\nimport Calculation from '../Calculation/Calculation';\nimport { activeConstructionTypeIdSelector, selectedCultureSelector, isLoadingSelector } from '../../store/component-state/component-state.selectors';\nimport { fetchConstructionLayersForType, fetchConstructionLayersForCalculation } from '../../store/construction-data/construction-data.action-creators';\nimport { resetActiveConstructionLayerForCurrentCalculation } from '../../store/component-state/component-state.action-creators';\nimport { isEmpty } from 'lodash';\nimport { calculationSelector } from '../../store/calculations/calculations.selectors';\nimport { clearCurrentCalculation } from '../../store/current-calculation-data/current-calculation-data.actions';\nimport CalculationResults from '../CalculationResults/CalculationResults';\nimport { constructionLayerSelector, constructionTypesSelector } from '../../store/construction-data/construction-data.selectors';\nimport { useHistory } from 'react-router-dom';\nimport { buildRouteWithCountry } from '../../helpers/routeHelper';\nimport { ConstructionLayer } from '../../types/domain/construction-data.types';\nimport CalculationStepper from './CalculationStepper';\nimport { CalculationStep } from './calculation-page.types';\nimport { Trans } from 'react-i18next';\nimport LayerName from '../Calculation/LayerName';\n\nenum CalculationStage {\n INITIALIZING,\n PROJECT_DETAILS,\n CALCULATION,\n RESULTS,\n}\n\ninterface SearchParams {\n isResultsStep: boolean;\n layerName?: string | null;\n}\n\nfunction parseSearch(search: string): SearchParams {\n const searchParams = new URLSearchParams(search);\n\n if (searchParams.has('results')) {\n return { isResultsStep: true };\n }\n\n return {\n isResultsStep: false,\n layerName: searchParams.get('layer'),\n };\n}\n\nexport default function CalculationPage() {\n const dispatch = useDispatch();\n\n const { constructionTypeId, calculationId, countryId } = useParams<{ constructionTypeId: string, calculationId: string, countryId: string }>();\n const { search } = useLocation();\n const history = useHistory();\n\n const isLoading = useSelector(isLoadingSelector);\n const activeConstructionTypeId = useSelector(activeConstructionTypeIdSelector);\n const layers = useSelector(constructionLayerSelector(constructionTypeId));\n const calculation = useSelector(calculationSelector(calculationId));\n const constructionTypes = useSelector(constructionTypesSelector);\n\n const [isCopy] = useState(search.indexOf('?copy') > -1);\n const [activeStepIndex, setActiveStepIndex] = useState(0);\n const [steps, setSteps] = useState([]);\n\n const selectStep = (stepToSelect: 'project-details' | number) => {\n const urlParts = [`/calculation/${constructionTypeId}`];\n\n if (calculationId) {\n urlParts.push(`/${calculationId}`);\n }\n\n if (typeof stepToSelect === 'number') {\n if (stepToSelect >= steps.length - 1) {\n urlParts.push('?results');\n } else {\n urlParts.push(`?layer=${layers[stepToSelect]?.name}`);\n }\n }\n\n const url = urlParts.join('');\n history.push(buildRouteWithCountry(countryId, url));\n };\n\n const handleNextStep = () => selectStep(activeStepIndex + 1);\n\n const handlePreviousStep = () => {\n if (activeStepIndex === 0) {\n selectStep('project-details');\n }\n else {\n selectStep(activeStepIndex - 1);\n }\n };\n\n const [calculationStage, setCalculationStage] = useState(CalculationStage.INITIALIZING);\n\n // Build the list of steps to reflect the layers for the current Construction Type\n useEffect(() => {\n // wait until we have initialised, this will mean the layers we have are for the correct Construction Type\n if (constructionTypeId === activeConstructionTypeId && !isLoading) {\n const layerSteps = (layers ?? []).map(layer => new CalculationStep(\n (insertSuggestedHyphenationIfRequired?: boolean) => ,\n `calc-layer-step-${layer.name}`,\n ));\n const finishStep = new CalculationStep(\n () => Construction Summary,\n 'calc-results-step',\n );\n setSteps([...layerSteps, finishStep]);\n }\n }, [layers, constructionTypeId, activeConstructionTypeId, isLoading]);\n\n // Update the state whenever the user navigates to a different step\n useEffect(() => {\n // wait until we have initialised, this will mean the layers we have are for the correct Construction Type\n if (constructionTypeId === activeConstructionTypeId && !isLoading) {\n const { isResultsStep, layerName } = parseSearch(search);\n const layerIndex = layers && layerName ? layers.findIndex((layer) => layer.name === layerName) : -1;\n const layer: ConstructionLayer | null | undefined = layers[layerIndex];\n\n if (layer) {\n setActiveStepIndex(layerIndex);\n setCalculationStage(CalculationStage.CALCULATION);\n dispatch(setActiveConstructionLayer(layer.constructionLayerId));\n } else if (isResultsStep) {\n setActiveStepIndex(layers.length);\n setCalculationStage(CalculationStage.RESULTS);\n } else {\n setCalculationStage(CalculationStage.PROJECT_DETAILS);\n }\n }\n }, [dispatch, search, layers, constructionTypeId, activeConstructionTypeId, isLoading]);\n\n // Initialise the Calculation Page and its layers\n useEffect(() => {\n dispatch(setActiveConstructionType(constructionTypeId));\n if (!isEmpty(countryId) && isEmpty(calculationId)) {\n dispatch(fetchConstructionLayersForType(constructionTypeId, countryId));\n } else if (!isEmpty(countryId) && !isEmpty(calculationId) && calculation) {\n dispatch(fetchConstructionLayersForCalculation(calculation, isCopy));\n }\n return function cleanup() {\n dispatch(clearCurrentCalculation());\n };\n }, [dispatch, constructionTypeId, countryId, calculationId, calculation, isCopy]);\n\n // Ensure latest translations from the backend are loaded\n const selectedCulture = useSelector(selectedCultureSelector);\n const isInitialised = React.useRef(false);\n useEffect(() => {\n if (!isInitialised.current) {\n isInitialised.current = true;\n } else {\n console.info('Selected culture/constructionType changed, so dispatching refresh of the current construction\\'s layers and material names');\n dispatch(fetchConstructionLayersForType(activeConstructionTypeId, countryId, true));\n }\n }, [dispatch, selectedCulture, activeConstructionTypeId, countryId]);\n\n // If the Construction Types haven't been loaded yet, that means the page has been refreshed within a Calculation\n // This is not supported, and causes errors and sequencing issues, so redirect the user back to the Construction Type Selection screen\n if ((constructionTypes?.length ?? 0) === 0) {\n return ;\n }\n\n const hasSteps = steps && steps.length > 0;\n\n const stepper = () => (hasSteps &&\n selectStep(newStepIndex)} />);\n\n switch (calculationStage) {\n case CalculationStage.PROJECT_DETAILS:\n return (\n selectStep(0)}\n />\n );\n case CalculationStage.CALCULATION:\n return (<>\n {stepper()}\n \n );\n case CalculationStage.RESULTS:\n return (<>\n {stepper()}\n {\n dispatch(resetActiveConstructionLayerForCurrentCalculation());\n selectStep('project-details');\n }}\n />\n );\n default:\n return (\n
\n \n
\n );\n }\n}\n","import axios from 'axios';\nimport i18n from 'i18next';\nimport { toast } from 'react-toastify';\nimport { ComponentStateActionTypes } from './component-state.action-types';\nimport { StoreModel } from '../store.model';\nimport { setActiveConstructionLayer, setCountries, setProjectConfig, setCounties, setFieldData } from './component-state.actions';\nimport { Country, ProjectConfig, County, FieldData } from '../../types/domain/construction-data.types';\n\nexport const resetActiveConstructionLayerForCurrentCalculation = () => (\n async (dispatch: (action: ComponentStateActionTypes) => void, getState: () => StoreModel) => {\n dispatch(setActiveConstructionLayer(Object.values(getState().currentCalculationData.calculationLayers)[0].constructionLayerId));\n }\n);\n\nexport const fetchCountries = () => async (dispatch: (action: ComponentStateActionTypes) => void) => {\n dispatch(setCountries(null));\n\n try {\n const showAllCountries = `${window.location.search}`.indexOf('preview=64b60e66-9735-4911-ad8f-b064aaa57526') > -1;\n const { data } = await axios.get(`/api/countries?all=${showAllCountries}`);\n\n dispatch(setCountries(data ?? []));\n } catch (error) {\n toast.error(i18n.t('navigation-ui.fetch-countries-failed'), {\n autoClose: false,\n closeOnClick: false,\n });\n dispatch(setCountries([]));\n }\n};\n\nexport const fetchCounties = () => async (dispatch: (action: ComponentStateActionTypes) => void) => {\n dispatch(setCounties(null));\n\n try{\n const { data } = await axios.get('/api/lookup/counties');\n\n dispatch(setCounties(data));\n } catch (error){\n toast.error(i18n.t('navigation-ui.fetch-countries-failed'), {\n autoClose: false,\n closeOnClick: false,\n }); }\n};\n\nexport const fetchFieldData = () => async (dispatch: (action: ComponentStateActionTypes) => void) => {\n dispatch(setFieldData(null));\n\n try{\n const { data } = await axios.get('/api/lookup/fielddata');\n\n dispatch(setFieldData(data));\n } catch (error){\n toast.error(i18n.t('navigation-ui.fetch-countries-failed'), {\n autoClose: false,\n closeOnClick: false,\n }); }\n};\n\nexport const fetchProjectConfig = (countryId: string) => async (dispatch: (action : ComponentStateActionTypes) => void) => {\n dispatch(setProjectConfig(null));\n\n try{\n const { data } = await axios.get(`/api/lookup/projectdetailsconfig/${countryId}`);\n\n dispatch(setProjectConfig(data));\n } catch (error){\n toast.error(i18n.t('navigation-ui.fetch-countries-failed'), {\n autoClose: false,\n closeOnClick: false,\n }); }\n};\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { Trans } from 'react-i18next';\nimport Grid from '@material-ui/core/Grid';\nimport styles from './ChooseCountry.module.scss';\nimport kingspanLogo from '../../assets/images/kingspan-logo.svg';\nimport { Link } from 'react-router-dom';\nimport { countriesSelector } from '../../store/component-state/component-state.selectors';\nimport FooterLinks from '../Footer/FooterLinks';\n\nexport default function ChooseCountry() {\n const countries = useSelector(countriesSelector);\n\n return (\n
\n \n \"Kingspan\n

\n U-value Calculator\n

\n
\n {countries.length === 0 ? (\n Sorry, we're down for scheduled maintenance right now. We'll be up and running again soon.\n ) : (\n Welcome to the Kingspan Insulation U-value Calculator. Please start your calculation below by selecting a country.\n )}\n
\n
\n\n
    \n {countries.map(c => (\n
  • \n 20 ? styles.longName : ''}>\n {c.localizedName}\n \n
  • \n ))}\n
\n\n \n
\n \n Whilst the information and/or specification contained here is to the best of our knowledge true and accurate we specifically exclude any liability for errors, omissions or otherwise arising therefrom. Details, practices,\n principles, values and calculations should be verified as to accuracy and suitability for the required purpose for use.\n \n
\n \n
\n
\n );\n}\n","import { useEffect } from 'react';\nimport React from 'react';\nimport { useRouteMatch, RouteProps, Route, useHistory } from 'react-router-dom';\nimport { setGTMContainer, setSelectedCountry } from '../../store/component-state/component-state.actions';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { getAppConfig } from '../../config/config';\nimport { setPreviouslySelectedCountryId } from '../../helpers/memory-helper';\nimport TagManager from 'react-gtm-module';\nimport { countriesSelector, getIsGtmContainerSet } from '../../store/component-state/component-state.selectors';\nimport { Dispatch } from 'redux';\nimport { fetchProjectConfig } from '../../store/component-state/component-state.action-creators';\n\nexport default function CountryRoute(props: RouteProps) {\n const dispatch = useDispatch();\n const match = useRouteMatch('/:countryId');\n const history = useHistory();\n const countryId = (match?.params as any)?.countryId;\n const countries = useSelector(countriesSelector);\n const isGtmContainerSet = useSelector(getIsGtmContainerSet);\n\n function getCookies(): { [key: string]: string } {\n const cookies: { [key: string]: string } = {};\n const cookiesArray = document.cookie.split(';');\n\n cookiesArray.forEach(cookie => {\n const [key, value] = cookie.split('=').map(c => c.trim());\n if (key && value) {\n cookies[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n });\n\n return cookies;\n }\n\n const getIsAnalyticalCookiesAccepted = (): boolean => {\n const cookieControl = getCookies()['CookieControl'];\n if (!cookieControl) return false;\n\n try {\n const { optionalCookies } = JSON.parse(cookieControl);\n return optionalCookies?.AnalyticalCookies === 'accepted';\n } catch {\n return false;\n }\n };\n\n const isAnalyticalCookiesAccepted = getIsAnalyticalCookiesAccepted();\n\n useEffect(() => {\n const country = countries.find(c => c.countryId.toLowerCase() === countryId.toLowerCase());\n\n if (country) {\n setPreviouslySelectedCountryId(countryId);\n if (!isGtmContainerSet && isAnalyticalCookiesAccepted) {\n initialiseGTMContainer(countryId, dispatch);\n }\n dispatch(setSelectedCountry(country));\n dispatch(fetchProjectConfig(country.countryId));\n } else {\n console.warn(`No country matching ${countryId}, redirecing to homepage`);\n history.push('/');\n }\n }, [dispatch, countryId, history, countries, isGtmContainerSet, isAnalyticalCookiesAccepted]);\n\n return ;\n}\n\nfunction initialiseGTMContainer(countryId: string, dispatch: Dispatch) {\n const { gtmTrackingIds } = getAppConfig()!;\n const gtmTrackingId: string | null | undefined = gtmTrackingIds[countryId.toUpperCase()];\n\n if (gtmTrackingId) {\n const tagManagerArgs = {\n gtmId: gtmTrackingId,\n };\n\n TagManager.initialize(tagManagerArgs);\n\n console.info(`GTM container set to ${gtmTrackingId} for ${countryId}`);\n dispatch(setGTMContainer());\n }\n}\n","import React from 'react';\nimport { Grid, Typography, List, ListItem, ListItemText, Button, makeStyles, Theme, createStyles, Link } from '@material-ui/core';\nimport { User } from '../../types/domain/account.types';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { Link as RouterLink } from 'react-router-dom';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n link: {\n color: 'inherit',\n textDecoration: 'inherit',\n },\n })\n);\n\nexport type PersonalInformationProps = {\n user: User;\n handleSignOutClick: () => void;\n};\n\nexport default function PersonalInformation(props: PersonalInformationProps) {\n const { user, handleSignOutClick } = props;\n\n const classes = useStyles();\n const { t } = useTranslation();\n\n return (\n \n \n Personal Information\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n }\n />\n \n \n \n \n \n }\n />\n \n \n \n Sign out\n \n \n \n \n );\n}\n","import React from 'react';\nimport { Grid, Typography, Box, Button, makeStyles, createStyles, Theme, List, ListItem, ListItemText, CircularProgress } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { User } from '../../types/domain/account.types';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { useDispatch } from 'react-redux';\nimport { uploadCompanyLogo } from '../../store/account/account.action-creators';\nimport { UploadCompanyLogoModel } from '../../types/application/upload-company-logo.model';\n\nconst useStyles = makeStyles((theme: Theme) => (\n createStyles({\n companyLogo: {\n width: 250,\n }\n })\n));\n\nexport type BusinessInformationProps = {\n user: User;\n uploadCompanyLogoState: UploadCompanyLogoModel;\n};\n\nexport default function BusinessInformation(props: BusinessInformationProps) {\n\n const dispatch = useDispatch();\n\n const { user, uploadCompanyLogoState } = props;\n const { isLoading, error, response } = uploadCompanyLogoState;\n const uploadSuccessful = response?.ok;\n\n const classes = useStyles();\n const { t } = useTranslation();\n\n const handleChooseFileChange = (event: any) => {\n if (event.target.files && event.target.files[0]) {\n dispatch(uploadCompanyLogo(event.target.files[0], event.target.files[0].name));\n // Clear out the HTML input control's selected file, allowing the user to select a new file, or even reselect the same file.\n // This does not clear out the blob reference we have, and as long as the file doesn't change on disk before commiting, the commit changes still works.\n event.target.value = null;\n }\n };\n\n return (\n \n \n \n Business Information\n \n \n\n \n \n \n {t('account-ui.titles.company-logo')}\n \n {user.companyLogoBase64 ? (\n \"Business\n ) : (\n \n \n No logo provided.\n \n \n )}\n \n\n {isLoading && }\n {error && Something went wrong when trying to upload your image, please try again.}\n {uploadSuccessful && Your image was uploaded successfully.}\n\n \n \n \n \n \n }\n />\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n );\n}\n","import React from 'react';\nimport { Grid, Typography, Box } from '@material-ui/core';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { useSelector } from 'react-redux';\nimport { User } from '../../types/domain/account.types';\nimport { loggedInUserSelector, uploadCompanyLogoSelector } from '../../store/account/account.selectors';\nimport PersonalInformation from './PersonalInformation';\nimport BusinessInformation from './BusinessInformation';\nimport authProviderFactory from '../../authentication/authProvider';\nimport { UploadCompanyLogoModel } from '../../types/application/upload-company-logo.model';\n\nexport default function AccountDetails() {\n\n useTranslation();\n\n const loggedInUser: User | undefined = useSelector(loggedInUserSelector);\n const uploadCompanyLogoState: UploadCompanyLogoModel = useSelector(uploadCompanyLogoSelector);\n\n const handleSignOutClick = () => {\n authProviderFactory().logout();\n };\n \n return <>\n \n \n \n Account settings\n \n \n \n\n {loggedInUser === undefined\n ? \n \n No logged in user to display.\n \n \n : \n \n \n \n }\n ;\n}\n","import React from 'react';\nimport AzureAD, { IAzureADFunctionProps } from 'react-aad-msal';\nimport authProviderFactory from '../../authentication/authProvider';\n\nexport default function PasswordReset() {\n\n return (\n \n {({ logout, accountInfo }: IAzureADFunctionProps) => {\n setTimeout(() => {\n if (accountInfo) {\n logout();\n } else {\n document.location.href = '/';\n }\n }, accountInfo ? 2000 : 500);\n return (\n accountInfo\n ? Signing out. If you changed your password, please sign in with your new password.\n : Redirecting...\n );\n }}\n \n );\n}\n","import { Material, AirCavityGrading } from './construction-data.types';\n\nexport type CalculationLayer = {\n constructionLayerId: number;\n thicknessMillimetres: number;\n numberOfAnchorsPerMetreSquare?: number;\n diameterOfAnchorsMillimetres?: number;\n anchorPenetrationDepthMillimetres?: number;\n netAreaOfAnchorsPerMetreSquareMillimetresSqrd?: number;\n material?: Material;\n airCavityGrading?: AirCavityGrading;\n}\n\nexport type CalculationResult = {\n calculationLayers: CalculationLayerInfo[];\n resultType: CalculationResultType;\n resultUnits: string;\n resultValue: number | null;\n failureMessage: string | null;\n totalThicknessMillimetres: number;\n thicknessComparison?: ThicknessComparisonResult | null;\n isBengCompliant: boolean | null;\n}\n\nexport type ThicknessComparisonResult = {\n sourceMaterialId: string;\n sourceMaterialName: string;\n sourceTotalConstructionThicknessMillimetres: number;\n sourceLayerRValue: number;\n comparisonMaterialId: string;\n comparisonMaterialName: string;\n comparisonTotalConstructionThicknessMillimetres: number;\n comparisonLayerRValue: number;\n totalConstructionThicknessSavingPercentage: number;\n layerThicknessSavingPercentage: number;\n}\n\nexport type ProjectDetails = {\n name: string;\n siteArea: string;\n startDate: Date;\n county: string;\n size: string;\n type: string;\n ribaStatus: string;\n buildingUse: string;\n postcode: string;\n}\n\nexport type AdditionalParameters = {\n perimeterMetres?: number;\n areaMetresSquared?: number;\n}\n\nexport type CalculationLayerInfo = {\n layerName: string;\n materialId?: string | null;\n materialName: string;\n specificationPageUrl?: string | null;\n}\n\nexport enum CalculationResultType {\n RValue = 'RValue',\n UValue = 'UValue',\n}\n\nexport type Calculation = {\n calculationId: string;\n calculationAccessCode: string;\n calculationLayers: { [key: string]: CalculationLayer };\n calculationResult: CalculationResult;\n projectDetails: ProjectDetails;\n additionalParameters: AdditionalParameters;\n createdOn: Date;\n updatedOn: Date;\n constructionTypeId: string;\n constructionTypeNameLocalized: string;\n countryId: string;\n woodPercentage: number | null;\n};\n","import React from 'react';\nimport { TableContainer, Table, TableHead, TableRow, TableCell, TableBody, Button, makeStyles, Theme, createStyles, Paper, CircularProgress, useMediaQuery } from '@material-ui/core';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport EmailIcon from '@material-ui/icons/Email';\nimport GetAppIcon from '@material-ui/icons/GetApp';\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\nimport { format } from 'date-fns';\nimport { Trans } from 'react-i18next';\nimport { useHistory } from 'react-router-dom';\nimport { buildRouteWithCountry } from '../../helpers/routeHelper';\nimport FormatNumber from '../FormatNumber/FormatNumber';\nimport { MyCalculationsProps } from './MyCalculations';\nimport { CalculationResultType } from '../../types/domain/calculation-data.types';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n table: {\n fontSize: '0.9em',\n '& td': {\n padding: '16px 0px 16px 4px',\n },\n '& th': {\n padding: '16px 0px 16px 4px',\n },\n '& .actionButtons': {\n padding: '16px 0px',\n },\n },\n button: {\n margin: `${theme.spacing(1)}px 2px`,\n },\n progressContainer: {\n display: 'flex',\n '& > * + *': {\n marginLeft: theme.spacing(2),\n },\n },\n buttonWrapper: {\n position: 'relative',\n float: 'left',\n },\n buttonProgress: {\n color: theme.palette.info.main,\n position: 'absolute',\n top: '50%',\n left: '50%',\n marginTop: -12,\n marginLeft: -12,\n },\n })\n);\n\nexport default function MyCalculationsDesktop(props: MyCalculationsProps) {\n const { calculations, country, countryId, handleDownloadClick, handleDirectDownloadClick, handleDeleteClick, isDeleting, isDownloading, isCalculationDownloading } = props;\n\n const history = useHistory();\n const classes = useStyles();\n\n const isTabletView = useMediaQuery((theme: Theme) => theme.breakpoints.only('sm'));\n\n return (\n \n \n \n \n \n Project Name\n \n \n Type of Construction\n \n \n {\n country?.calculationResultType === CalculationResultType.RValue\n ? R Value ()\n : U Value ()\n }\n \n {!isTabletView && (\n \n Start Date\n \n )}\n {!isTabletView && (\n \n Date of last Change\n \n )}\n \n \n \n \n {calculations.map(calc => (\n \n \n {calc.projectDetails.name}\n \n \n {calc.constructionTypeNameLocalized}\n \n \n {calc.calculationResult.resultUnits}\n \n {!isTabletView && {calc.projectDetails.startDate ? format(calc.projectDetails.startDate, 'dd-MM-yyyy') : '-'}}\n {!isTabletView && {calc.updatedOn ? format(calc.updatedOn, 'dd-MM-yyyy HH:mm:ss') : '-'}}\n \n
\n \n
\n
\n \n
\n
\n \n {isCalculationDownloading(calc.calculationId) && }\n
\n
\n \n {isCalculationDownloading(calc.calculationId) && }\n
\n
\n \n {isDeleting(calc.calculationId) && }\n
\n
\n
\n ))}\n
\n
\n
\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { Calculation, CalculationResultType } from '../../types/domain/calculation-data.types';\nimport { List, ListSubheader, ListItem, ListItemText, Collapse, makeStyles, Theme, createStyles, Box, ListItemSecondaryAction, IconButton, Button } from '@material-ui/core';\n\nimport ExpandLess from '@material-ui/icons/ExpandLess';\nimport ExpandMore from '@material-ui/icons/ExpandMore';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport EmailIcon from '@material-ui/icons/Email';\nimport GetAppIcon from '@material-ui/icons/GetApp';\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\n\nimport { groupBy, isEmpty } from 'lodash';\nimport { Trans } from 'react-i18next';\nimport { format } from 'date-fns';\nimport { useHistory } from 'react-router-dom';\nimport { buildRouteWithCountry } from '../../helpers/routeHelper';\nimport FormatNumber from '../FormatNumber/FormatNumber';\n\nimport { Link } from 'react-router-dom';\nimport { MyCalculationsProps } from './MyCalculations';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n width: '100%',\n maxWidth: 360,\n backgroundColor: theme.palette.background.paper,\n },\n nested: {\n paddingLeft: theme.spacing(4),\n },\n })\n);\n\nexport default function MyCalculationsMobile(props: MyCalculationsProps) {\n const { calculations, countryId, handleDownloadClick, handleDirectDownloadClick, handleDeleteClick, isDeleting } = props;\n\n const classes = useStyles();\n const history = useHistory();\n const [displayableCalculations, setDisplayableCalculations] = useState<{ [index: string]: Calculation[] }>({});\n const [opens, setOpens] = useState<{ [index: string]: { open: boolean } }>({});\n\n useEffect(() => {\n const result = groupBy(calculations, calculation => calculation.projectDetails.name);\n setDisplayableCalculations(result);\n }, [calculations]);\n\n useEffect(() => {\n const result = Object.keys(displayableCalculations).reduce(\n (acc, projectName) => ({\n ...acc,\n [projectName]: {\n open: false,\n },\n }),\n {} as { [index: string]: { open: boolean } }\n );\n setOpens(result);\n }, [displayableCalculations]);\n\n const handleItemClick = (projectName: any) => {\n setOpens({\n ...opens,\n [projectName]: {\n // @ts-ignore\n open: !opens[projectName].open,\n },\n });\n };\n\n const getProjectStartDate = (projectName: string): string => {\n // @ts-ignore\n if (isEmpty(displayableCalculations[projectName])) {\n return '';\n }\n // @ts-ignore\n return format(displayableCalculations[projectName][0].projectDetails.startDate, 'dd-MM-yyyy');\n };\n\n return (\n
\n \n My calculations\n \n }\n className={classes.root}\n >\n \n \n \n\n {Object.keys(displayableCalculations).map((projectName, index) => (\n \n handleItemClick(projectName)}>\n \n {/* @ts-ignore */}\n {opens[projectName]?.open ? : }\n \n \n \n {// @ts-ignore\n displayableCalculations[projectName].map((calculation: Calculation, index: number) => (\n \n \n \n {\n calculation.calculationResult.resultType === CalculationResultType.RValue\n ? R Value ()\n : U Value ()\n }:{' '}\n {calculation.calculationResult.resultUnits}\n \n }\n />\n \n \n \n \n history.push(buildRouteWithCountry(countryId, `/calculation/${calculation.constructionTypeId}/${calculation.calculationId}?copy`))}>\n \n \n history.push(buildRouteWithCountry(countryId, `/calculation/${calculation.constructionTypeId}/${calculation.calculationId}`))}>\n \n \n handleDownloadClick(calculation.calculationId, calculation.calculationAccessCode)}>\n \n \n handleDirectDownloadClick(calculation.calculationId, calculation.calculationAccessCode)}>\n \n \n handleDeleteClick(calculation.calculationId)}>\n \n \n \n \n \n ))}\n \n \n \n ))}\n \n
\n );\n}\n","import React, { useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { fetchCalculation, deleteCalculation, downloadCalculation, directDownloadCalculation } from '../../store/calculations/calculations.action-creators';\nimport { Box, Typography, Divider, Button, makeStyles, createStyles, Theme, CircularProgress, useMediaQuery } from '@material-ui/core';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { isEmpty } from 'lodash';\nimport { buildRouteWithCountry } from '../../helpers/routeHelper';\nimport { Link } from 'react-router-dom';\nimport { calculationArraySelector, deletingCalculationsSelector } from '../../store/calculations/calculations.selectors';\nimport { isAuthenticationInitialized } from '../../store/authentication/authentication.selectors';\nimport { isLoadingSelector, countryIdSelector, downloadingCalculationIdSelector, countrySelector, selectedCultureSelector } from '../../store/component-state/component-state.selectors';\n\nimport MyCalculationsDesktop from './MyCalculations.desktop';\nimport MyCalculationsMobile from './MyCalculations.mobile';\nimport { displayPdfDownloadToast } from '../../helpers/toast-helpers';\nimport { Calculation } from '../../types/domain/calculation-data.types';\nimport { ThunkDispatch } from 'redux-thunk';\nimport { AnyAction } from 'redux';\nimport { Country } from '../../types/domain/construction-data.types';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n progressContainer: {\n display: 'flex',\n '& > * + *': {\n marginLeft: theme.spacing(2),\n },\n },\n })\n);\n\nexport type MyCalculationsProps = {\n calculations: Calculation[];\n countryId: string;\n country: Country | null;\n handleDeleteClick: (calculationId: string) => void;\n handleDownloadClick: (calculationId: string, calculationAccessCode: string) => void;\n handleDirectDownloadClick: (calculationId: string, calculationAccessCode: string) => void;\n isDeleting: (calculationId: string) => boolean;\n isDownloading: () => boolean;\n isCalculationDownloading: (calculationId: string) => boolean;\n};\n\nexport default function MyCalculations() {\n const dispatch: ThunkDispatch = useDispatch();\n const country = useSelector(countrySelector);\n const countryId = useSelector(countryIdSelector);\n const selectedCulture = useSelector(selectedCultureSelector);\n const calculations = useSelector(calculationArraySelector);\n const isAuthInitialized = useSelector(isAuthenticationInitialized);\n const deletingCalculationsStore = useSelector(deletingCalculationsSelector);\n const isLoading = useSelector(isLoadingSelector);\n const downloadingCalculationId: string | null = useSelector(downloadingCalculationIdSelector);\n const classes = useStyles();\n\n const isMobileView = useMediaQuery((theme: Theme) => theme.breakpoints.down('xs'));\n\n const { t } = useTranslation();\n\n React.useEffect(() => {\n if (isAuthInitialized && !isEmpty(countryId)) {\n dispatch(fetchCalculation(countryId));\n }\n }, [dispatch, isAuthInitialized, countryId, selectedCulture]);\n\n const [deletingCalculationIds, setDeletingCalclationIds] = useState([] as string[]);\n const [downloadingState, setDownloadingState] = useState(false);\n\n React.useEffect(() => {\n if (!downloadingState && downloadingCalculationId) {\n setDownloadingState(true);\n } else if (downloadingState && !downloadingCalculationId) {\n setDownloadingState(false);\n }\n }, [downloadingState, downloadingCalculationId, setDownloadingState]);\n\n const handleDeleteClick = (calculationId: string) => {\n setDeletingCalclationIds([...deletingCalculationIds, calculationId]);\n dispatch(deleteCalculation(calculationId));\n };\n\n const handleDownloadClick = async (calculationId: string, calculationAccessCode: string) => {\n const result = await dispatch(downloadCalculation(calculationId, calculationAccessCode));\n displayPdfDownloadToast(result, t);\n };\n\n const handleDirectDownloadClick = async (calculationId: string, calculationAccessCode: string) => {\n await dispatch(directDownloadCalculation(calculationId, calculationAccessCode));\n };\n\n React.useEffect(() => {\n setDeletingCalclationIds(deletingCalculationsStore);\n }, [deletingCalculationsStore]);\n\n const isDeleting = (calculationId: string): boolean => {\n return deletingCalculationIds.some(c => c === calculationId);\n };\n\n const isDownloading = (): boolean => {\n return downloadingState;\n };\n\n const isCalculationDownloading = (calculationId: string): boolean => {\n return downloadingCalculationId === calculationId;\n };\n\n const renderMyCalculationsView = () => {\n return isMobileView ? (\n \n ) : (\n \n );\n };\n\n return (\n <>\n {!isMobileView && (\n <>\n \n \n My Calculations\n \n \n\n \n\n \n \n \n\n \n \n )}\n\n {isAuthInitialized && !isLoading ? (\n renderMyCalculationsView()\n ) : (\n
\n \n
\n )}\n \n );\n}\n","import { default as axiosDefault } from 'axios';\nimport { store } from '../store/store';\nimport authProviderFactory from '../authentication/authProvider';\nimport { getAppConfig } from '../config/config';\n\nfunction init() {\n axiosDefault.defaults.baseURL = getAppConfig()?.apiUrl;\n\n axiosDefault.interceptors.request.use(\n config => {\n config.headers = config.headers ?? {};\n config.headers['Accept-Language'] = store.getState().componentState.selectedCulture;\n return config;\n },\n error => (Promise.reject(error)));\n\n\n axiosDefault.interceptors.request.use(\n async (config) => {\n if (config.withCredentials) {\n const idToken = await authProviderFactory().getIdToken();\n config.headers['Authorization'] = `Bearer ${idToken?.idToken.rawIdToken}`;\n }\n return config;\n },\n error => (Promise.reject(error))\n );\n}\n\nexport default {\n init,\n};\n","import React, { ReactNode, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { CircularProgress, Grid } from '@material-ui/core';\nimport { isEmpty } from 'lodash';\nimport { fetchCountries, fetchCounties, fetchFieldData } from '../../store/component-state/component-state.action-creators';\nimport { countryIdSelector, isLoadingCountriesSelector, isLoadingConstructionTypesSelector, selectedCultureSelector } from '../../store/component-state/component-state.selectors';\nimport kingspanLogo from '../../assets/images/kingspan-logo.svg';\nimport { LayoutMinimal } from '../Layout/LayoutMinimal';\nimport { fetchConstructionTypes, fetchConstructionTypeNames } from '../../store/construction-data/construction-data.action-creators';\n\ntype Props = {\n children: ReactNode;\n};\n\nconst splash = () => (\n \n \n

\n \"Kingspan\n

\n \n
\n
\n);\n\nexport default function CountriesProvider({ children }: Props) {\n const isLoadingCountries = useSelector(isLoadingCountriesSelector);\n const countryId = useSelector(countryIdSelector);\n const selectedCulture = useSelector(selectedCultureSelector);\n const isLoadingConstructionTypes = useSelector(isLoadingConstructionTypesSelector);\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch(fetchCountries());\n }, [dispatch]);\n\n useEffect(() => {\n dispatch(fetchCounties());\n }, [dispatch]);\n\n useEffect(() => {\n dispatch(fetchFieldData());\n }, [dispatch]);\n\n // Make sure that the construction types for the current country are always available\n useEffect(() => {\n if (!isEmpty(countryId)) {\n console.log(`Loading Construction Types for Country: ${countryId}`);\n dispatch(fetchConstructionTypes(countryId));\n }\n }, [dispatch, countryId]);\n\n // Make sure that the localised names for the construction types are always in-sync\n useEffect(() => {\n if (!isEmpty(countryId)) {\n console.log(`Refreshing localised Construction Type Names for Country: ${countryId}, Culture: ${selectedCulture}`);\n dispatch(fetchConstructionTypeNames(countryId));\n }\n }, [dispatch, countryId, selectedCulture]);\n\n return (<>\n {isLoadingCountries || isLoadingConstructionTypes ? splash() : children}\n );\n}\n","import React, { Suspense } from 'react';\nimport { Provider } from 'react-redux';\nimport { BrowserRouter, Switch, Route, Redirect } from 'react-router-dom';\nimport { CssBaseline } from '@material-ui/core';\nimport { ThemeProvider } from '@material-ui/core/styles';\nimport { buildRouteWithCountry } from '../../helpers/routeHelper';\nimport { getPreviouslySelectedCountryId } from '../../helpers/memory-helper';\nimport { authenticationActionCreatorOverrides } from '../../store/authentication/authentication.action-creators';\nimport { Layout } from '../Layout/Layout';\nimport { LayoutMinimal } from '../Layout/LayoutMinimal';\nimport { store } from '../../store/store';\nimport { theme } from '../../theme/theme';\nimport ConstructionTypeSelection from '../ConstructionTypeSelection/ConstructionTypeSelection';\nimport CalculationPage from '../CalculationPage/CalculationPage';\nimport ChooseCountry from '../ChooseCountry/ChooseCountry';\nimport CountryRoute from './CountryRoute';\nimport AccountDetails from '../AccountDetails/AccountDetails';\nimport PasswordReset from '../PasswordReset/PasswordReset';\nimport MyCalculations from '../MyCalculations/MyCalculations';\nimport logo from '../../assets/images/kingspan-logo.svg';\nimport i18n from '../../i18n';\nimport { I18nextProvider } from 'react-i18next';\nimport authProviderFactory, { launchRedirectToPasswordReset, updateDetailsAuthConfig, buildAuthenticationParameters } from '../../authentication/authProvider';\nimport * as Msal from 'msal';\nimport interceptors from '../../interceptors/interceptors';\nimport AzureAD from 'react-aad-msal';\nimport { ToastContainer } from 'react-toastify';\nimport 'react-toastify/dist/ReactToastify.min.css';\nimport CountriesProvider from './CountriesProvider';\n\nconst Loader = () => (\n
\n \"logo\"\n
loading...
\n
\n);\n\nexport function App() {\n authenticationActionCreatorOverrides(store);\n\n authProviderFactory().registerReduxStore(store);\n\n interceptors.init();\n\n return (\n \n \n \n \n }>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {\n launchRedirectToPasswordReset();\n return ({i18n.t('navigation-ui.redirecting-ellipsis')});\n }} />\n {\n const myMSALObj = new Msal.UserAgentApplication(updateDetailsAuthConfig());\n setTimeout(() => myMSALObj.loginRedirect(buildAuthenticationParameters('updateDetails')), 250);\n return ({i18n.t('navigation-ui.redirecting-ellipsis')});\n }} />\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\n\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { detect, BrowserInfo } from 'detect-browser';\n\nimport { App } from './components/App/App';\nimport { setAppConfig } from './config/config';\nimport { AppConfig } from './types/config/config.types';\nimport { isUnsupportedBrowser } from './isUnsupportedBrowser';\n\nif (isUnsupportedBrowser(detect() as BrowserInfo)) {\n const unsupportedBrowserBannerEl = document.getElementById('browser-unsupported');\n if (unsupportedBrowserBannerEl != null) {\n unsupportedBrowserBannerEl.style.display = 'block';\n }\n}\n\n(async function() {\n try {\n const clientConfig = await (await fetch('/config.json')).json();\n const { apiUrl } = clientConfig;\n const configData = await fetch(`${apiUrl}/config.json`);\n const appConfig = {\n ...(await configData.json()) as AppConfig,\n ...clientConfig\n };\n console.log('appConfig', appConfig);\n\n setAppConfig(appConfig);\n\n ReactDOM.render(, document.getElementById('root'));\n } catch (e) {\n console.error('App config could not be loaded');\n console.error(e);\n }\n})();\n","import cmp from 'semver-compare';\nimport { BrowserInfo } from 'detect-browser';\n\nexport const isUnsupportedBrowser = (browser: BrowserInfo): boolean => {\n switch (browser && browser.name) {\n case 'chrome':\n return cmp(browser.version, '85') < 0;\n case 'firefox':\n return cmp(browser.version, '80') < 0;\n case 'edge':\n return cmp(browser.version, '84') < 0;\n case 'safari':\n return cmp(browser.version, '13') < 0;\n default:\n return false;\n }\n};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spacing\":\"8px\",\"maxWidth\":\"1280px\",\"fontSizeBase\":\"1em\",\"fontSizeSmall\":\".875em\",\"fontSizeSmallest\":\".75em\",\"fontSizeH1\":\"2.5em\",\"fontSizeH2\":\"2em\",\"fontSizeH3\":\"1.75em\",\"fontSizeH4\":\"1.5em\",\"fontSizeH5\":\"1.25em\",\"fontSizeH6\":\"1em\",\"headerLetterSpacing\":\"-.05em\",\"fontFamily\":\"\\\"Montserrat\\\",sans-serif\",\"fontWeightLight\":\"300\",\"fontWeightRegular\":\"500\",\"fontWeightMedium\":\"600\",\"fontWeightBold\":\"800\",\"colorPrimaryBlue\":\"#004289\",\"colorBackgroundWhite\":\"#fff\",\"colorSecondaryGreyDarkest\":\"#3c3c3b\",\"colorSecondaryGreyDark\":\"#8c8c8c\",\"colorSecondaryGreyLight\":\"#b3b3b3\",\"colorSecondaryGreyLightest\":\"#e6e6e6\",\"colorHighlightOrange\":\"#f7a42d\",\"colorHighlightBlue\":\"#138dc6\",\"colorHighlightGreen\":\"#0fa042\",\"colorHighlightGold\":\"#c09a5d\",\"colorError\":\"#d63031\",\"colorTextBase\":\"rgba(0,0,0,0.87)\",\"borderRadius\":\"4px\",\"paLabel\":\"PerimeterAndArea_paLabel__3LlKC\",\"paLabelShort\":\"PerimeterAndArea_paLabelShort__35cKB\",\"paTextFieldShort\":\"PerimeterAndArea_paTextFieldShort__114Zl\",\"paUnits\":\"PerimeterAndArea_paUnits__Up7_J\",\"paRatio\":\"PerimeterAndArea_paRatio__1W3KM\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spacing\":\"8px\",\"maxWidth\":\"1280px\",\"fontSizeBase\":\"1em\",\"fontSizeSmall\":\".875em\",\"fontSizeSmallest\":\".75em\",\"fontSizeH1\":\"2.5em\",\"fontSizeH2\":\"2em\",\"fontSizeH3\":\"1.75em\",\"fontSizeH4\":\"1.5em\",\"fontSizeH5\":\"1.25em\",\"fontSizeH6\":\"1em\",\"headerLetterSpacing\":\"-.05em\",\"fontFamily\":\"\\\"Montserrat\\\",sans-serif\",\"fontWeightLight\":\"300\",\"fontWeightRegular\":\"500\",\"fontWeightMedium\":\"600\",\"fontWeightBold\":\"800\",\"colorPrimaryBlue\":\"#004289\",\"colorBackgroundWhite\":\"#fff\",\"colorSecondaryGreyDarkest\":\"#3c3c3b\",\"colorSecondaryGreyDark\":\"#8c8c8c\",\"colorSecondaryGreyLight\":\"#b3b3b3\",\"colorSecondaryGreyLightest\":\"#e6e6e6\",\"colorHighlightOrange\":\"#f7a42d\",\"colorHighlightBlue\":\"#138dc6\",\"colorHighlightGreen\":\"#0fa042\",\"colorHighlightGold\":\"#c09a5d\",\"colorError\":\"#d63031\",\"colorTextBase\":\"rgba(0,0,0,0.87)\",\"borderRadius\":\"4px\",\"title\":\"ChooseCountry_title__JrkLW\",\"prompt\":\"ChooseCountry_prompt__3HdkZ\",\"footer\":\"ChooseCountry_footer__1bHrv\",\"disclaimer\":\"ChooseCountry_disclaimer__PX2uC\",\"footerLinks\":\"ChooseCountry_footerLinks__2VJSv\",\"countryList\":\"ChooseCountry_countryList__3HZn2\",\"longName\":\"ChooseCountry_longName__2DyhU\",\"flagEmoji\":\"ChooseCountry_flagEmoji__3PIG2\"};","module.exports = __webpack_public_path__ + \"static/media/kingspan-logo.0880b6c7.svg\";"],"sourceRoot":""}