{"version":3,"sources":["images/top-banner-default.jpg","images/card-img-default.jpg","images/featured-img-default.jpg","images/stick-figure-1.png","images/stick-figures-2.png","images/home-contact-default.jpg","images/home-bottom-content-default.jpg","images/stick-figures-3.png","images/quote-grey-default.png","images/cic-logo-white.png","../node_modules/@ionic/core/dist/esm-es5 lazy /^/.*/.entry/.js$/ include: /.entry/.js$/ exclude: /.system/.entry/.js$/ groupOptions: {} namespace object","../node_modules/ionicons/dist/esm-es5 lazy /^/.*/.entry/.js$/ include: /.entry/.js$/ exclude: /.system/.entry/.js$/ groupOptions: {} namespace object","data/stateLogger.js","data/config/config.init.js","data/page/pageData.init.js","data/user/user.init.js","data/state.js","data/page/page.init.js","data/search/search.init.js","data/combineReducers.js","data/config/config.reducer.js","data/page/page.reducer.js","data/user/user.reducer.js","data/search/search.reducer.js","data/AppContext.jsx","data/user/user.actions.js","data/page/page.actions.js","data/general/cookieStorage.js","data/user/logoutUser.js","pages/ComponentErrorPage.jsx","ErrorBoundary.jsx","data/general/extractStandardDataProperties.js","data/user/extractFormattedUserData.js","helpers/handleUserAuthenticationErrors.js","data/general/sendStatsToApi.js","data/user/loginUser.js","helpers/getContactDetails.js","helpers/handleContentShortcodes.js","helpers/sanitiseHtml.js","components/TopBanner.jsx","pages/LoginPage.jsx","helpers/getPagePaths.js","data/page/extractFormattedPageData.js","data/page/fetchPageDataFromApi.js","data/search/search.actions.js","hooks/useAutoscrollToTopOnLoad.js","components/BackgroundShape.jsx","templates/ErrorTemplate.jsx","components/SkeletonTextParagraphs.jsx","components/TopContent.jsx","helpers/changePage.js","components/TopicCard.jsx","components/TopicCardLoading.jsx","helpers/getMenu.js","components/HomeTopCTAs.jsx","helpers/openLiveChat.js","components/HomeContactDetails.jsx","components/HomeBottomContent.jsx","components/FeaturedTopics.jsx","templates/HomeTemplate.jsx","components/TopicListingIconCards.jsx","templates/SectionRootTemplate.jsx","components/TopicCards.jsx","components/Quote.jsx","templates/TopicListingTemplate.jsx","components/HelpsheetDownloadButton.jsx","templates/TopicTemplate.jsx","templates/ContentIsLoadingTemplate.jsx","templates/BasicTemplate.jsx","templates/TemplateLoader.jsx","components/TopBannerSlider.jsx","components/TopBanners.jsx","components/MenuHorizontal.jsx","components/SearchBar.jsx","components/Header.jsx","components/MenuVertical.jsx","components/Footer.jsx","components/Breadcrumbs.jsx","pages/Page.jsx","hooks/usePageData.js","pages/ConfigLoadingPage.jsx","data/search/extractFormattedSearchResults.js","data/search/fetchSearchResultsFromApi.js","components/SearchResults.jsx","pages/SearchPage.jsx","components/Menu.jsx","components/LiveChat.jsx","data/config/updateLiveChatStatus.js","data/config/config.actions.js","data/config/extractFormattedConfig.js","data/config/fetchAppConfig.js","data/user/loadStoredUserData.js","helpers/color.ts","helpers/updateAppColours.js","PageRouter.jsx","App.jsx","serviceWorker.ts","index.jsx"],"names":["module","exports","map","webpackAsyncContext","req","__webpack_require__","o","Promise","resolve","then","e","Error","code","ids","id","keys","Object","configInitialState","isLoading","isError","liveChatEnabled","data","title","homepage_slug","homepage_title","homepage_banners","logo","logo_link_url","banner_image","default_phone","default_ngt_no","default_email","display_phone","display_email","display_live_chat","live_chat_url","live_chat_start_time","live_chat_stop_time","display_cic_logo","ga_code","menu_locations","header","footer","lower_footer","menus","colours","primary","secondary","tertiary","text_alternative","bg_default","light","medium","dark","text","live_chat","contact","read_more","home_breadcrumb","main_menu_title","download","topics_title","featured_topics_title","topic_listings_title","related_topic_listings_title","footer_explore_menu_title","footer_policies_menu_title","footer_contact_section_title","copyright","login_title","login_page","login_loading_message","username_field_label","password_field_label","login_empty_field_message","login_error_message","logout","page_loading_message","page_load_error_title","page_load_error_message","search_title","search_loading_message","search_empty_field_title","search_empty_field_message","search_load_error_title","search_load_error_message","search_results_title","no_search_results_message","menuItemInitialState","section_title","link","excerpt","featured_image","template","type","target","homepageBannerInitialState","pageInitialData","content","help_sheet","show_help_sheet","quote","quote_image","home_display_contact_section","home_contact_section_content","home_display_phone_number","home_display_live_chat","home_display_message_link","home_display_bottom_section","home_bottom_section_content","home_bottom_section_image","child_pages","sibling_pages","ancestor_pages","featured_topics","relatedPageInitialData","icon","userInitialState","loggedIn","startedLogin","loginErrors","username","token","company_email","company_phone","company_ngt_no","reducer","appInitialState","config","page","path","user","search","showSearchBar","showSearchBtn","query","prepopulateQuery","isLoadingNewSearch","isLoadingNextPage","pageNum","totalPages","results","reducers","state","action","newState","forEach","key","result","combineReducers","payload","concat","loggedReducers","AppContext","createContext","dispatch","AppContextProvider","props","useReducer","store","Provider","value","children","userLoggedIn","setCurrentPagePath","setCookie","name","expiryDays","expires","date","Date","setTime","getTime","toGMTString","document","cookie","getCookie","nameEQ","cookies","split","i","length","charAt","substring","indexOf","logoutUser","a","error","console","ComponentErrorPage","useContext","window","location","reload","className","onClick","ErrorBoundary","hasError","errorInfo","this","React","Component","extractStandardDataProperties","rawData","defaultData","skipProperties","rawPropertyKeyPrefix","extractedData","propertyKey","rawPropertyKey","hasOwnProperty","extractFormattedUserData","rawUserData","formattedUserData","handleUserAuthenticationErrors","sendStatsToApi","statsData","statsEndpoint","userToken","apiUrlPath","fetch","method","headers","authorization","body","JSON","stringify","response","json","success","warn","process","loginUser","password","userData","encodeURIComponent","sendUserLoginStatsToApi","message","logged_in","getContactPhoneNumber","getContactPhoneUrl","phone","replace","getContactEmailAddress","handleContentShortcodes","processedContent","phoneUrl","getPhoneLink","ngtNo","getNextGenerationTextNumber","getNgtNo","email","getEmailLink","handleExtraContentShortcodes","sanitisedContent","sanitiseHtml","rawHtml","__html","sanitise","sanitiseHtmlWithShortcodes","rawContent","dompurify","sanitize","TopBanner","image","useH1","src","alt","fixed","xmlns","xmlnsXlink","width","height","viewBox","d","transform","isPlatform","dangerouslySetInnerHTML","LoginPage","useState","setUsername","setPassword","formRef","useRef","handleSubmit","preventDefault","topBannerImg","topBannerPlaceholderImg","loginPageText","isOpen","onSubmit","ref","style","fontSize","position","color","required","onInput","currentTarget","expand","getPagePathFromUrl","url","pagePathStartIndex","getFullPagePathIncSlashes","getSectionRootPath","pagePath","fullPagePath","rootSectionPathEndIndex","extractPageSlug","pageSlugStartIndex","lastIndexOf","extractFormattedPageData","rawPageData","expectedPagePath","curPageData","extractPagePath","formatCurrentPageData","relatedPageProperties","formattedPageData","rendered","extractFormattedPageTemplateName","curRelatedPageProperty","rawRelatedPageData","extractRelatedPagesData","rawRelatedPagesData","formattedPagesData","rawCurPageData","formattedCurPageData","push","pageData","fetchPageDataFromApi","pageSlug","sendPageVisitStatsToApi","ReactGA","pathname","pageTitle","querySelector","innerHTML","pageId","page_id","setSearchQuery","initSearchResultsPageFetch","useAutoscrollToTopOnLoad","contentRef","useEffect","current","scrollToTop","onScroll","detail","scrollTop","BackgroundShape","contentTop","svgWidth","svgHeight","svgViewBox","pathTransform","shapeClassNames","hideOnSmallScreens","hideOnLargeScreens","ErrorTemplate","SkeletonTextParagraphs","number","paras","curParaNum","Fragment","animated","TopContent","sizeXs","sizeMd","pushMd","display","pullMd","stickFigureImg1","stickFiguresImg2","changePage","newPageData","newPagePayload","TopicCard","topic","sizeSm","routerLink","TopicCardLoading","hasImage","marginTop","getMenuItems","menuId","curMenu","items","HomeTopCTAs","numDisplayedCtas","cols","ctaSize","curItemNum","item","featuredImg","ctaPlaceholderImg","openLiveChat","liveChatWindow","closed","logLiveChatStatus","open","focus","HomeContactDetails","size-xs","size-sm","contactPlaceholderImg","call","chatbubbles","mail","href","HomeBottomContent","contentPlaceholderImg","FeaturedTopics","heading","topics","curTopicNum","featuredTopicPlaceholderImg","HomeTemplate","TopicListingIconCards","topicListings","rows","curColNum","ionicons","totalNumRows","Math","ceil","curTopicListingNum","curRowNum","numRemainingListings","topicListing","SectionRootTemplate","stickFiguresImg","margin","sectionRootPlaceholderImg","TopicCards","Quote","class","borderRadius","quotePlaceholderImg","TopicListingTemplate","HelpsheetDownloadButton","pageVisitData","slot","TopicTemplate","topicCardsTitle","size-lg","topicPlaceholderImg","ContentIsLoadingTemplate","BasicTemplate","TemplateLoader","useLocation","TopBannerSlider","banners","pager","options","loop","autoplay","delay","disableOnInteraction","banner","index","TopBanners","topBannerTitle","MenuHorizontal","sectionRootPath","menuItems","to","rel","SearchBar","onSearchPage","searchBarRef","useIonViewDidEnter","setFocus","history","useHistory","onIonChange","searchText","onIonFocus","debounce","placeholder","Header","MenuVertical","Footer","exploreMenuItems","policyMenuItems","push-lg","pull-lg","cicLogoImg","Breadcrumbs","Page","canLoadData","setCanLoadData","useIonViewWillLeave","useIonViewWillEnter","usePageData","scrollEvents","onIonScroll","ConfigLoadingPage","extractFormattedSearchResults","rawSearchResults","formattedSearchResults","rawCurSearchResult","formattedCurSearchResult","wellonline_template","fetchSearchResultsFromApi","searchQuery","searchResults","totalResultPages","get","parseInt","SearchResults","curResultNum","searchResultPlaceholderImg","SearchPage","decodeURIComponent","infiniteScrollRef","complete","threshold","onIonInfinite","disabled","loadingSpinner","loadingText","Menu","contentId","side","autoHide","lines","LiveChat","handleLiveChatStatusUpdates","configData","navigator","onLine","curDateTime","splitStartTime","startTime","setHours","stopTime","splitStopTime","getDay","updateLiveChatStatus","updateStatusEachMinute","setInterval","addEventListener","clearInterval","removeEventListener","fill","clipPath","extractFormattedConfig","rawConfig","formattedConfig","rawMenus","formattedMenus","curRawMenu","curFormattedMenu","extractMenuItems","extractMenus","initMenuLocations","extractMenuLocations","initialColours","extractFormattedColours","initialTextStrings","extractFormattedTextStrings","rawBanners","formattedBanners","curRawBanner","curFormattedBanner","page_link","extractHomepageBanners","rawMenuItems","formattedMenuItems","curRawMenuItem","curFormattedMenuItem","fetchAppConfig","setUpGoogleAnalytics","initialize","debug","loadStoredUserData","logUserLoginStatus","parse","componentToHex","c","hex","toString","expandHex","_m","r","g","b","mixColors","mixColor","weight","colorRGB","rgb","mixColorRGB","mixColorWeight","round","rgbToHex","rgbToHSL","max","min","h","s","l","Color","hsl","yiq","test","matches","exec","intValue","hexToRGB","hue2rgb","p","q","t","hslToRGB","from","amount","base","mix","trim","updateAppColour","colourKey","colourHexCode","baseColourCssVarName","colourVariants","contrast","tint","shade","documentElement","setProperty","rgbToString","PageRouter","setAttribute","updateAppColours","component","exact","App","setupConfig","mode","x1","y1","x2","y2","offset","isLocalhost","Boolean","hostname","match","registerValidSW","swUrl","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","log","alert","onUpdate","onSuccess","catch","ReactDOM","render","getElementById","URL","origin","contentType","status","ready","unregister","checkValidServiceWorker"],"mappings":"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","file":"static/js/main.fe8baf27.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/top-banner-default.bdaa9274.jpg\";","module.exports = __webpack_public_path__ + \"static/media/card-img-default.442059fa.jpg\";","module.exports = __webpack_public_path__ + \"static/media/featured-img-default.0b863af3.jpg\";","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/home-contact-default.2a918577.jpg\";","module.exports = __webpack_public_path__ + \"static/media/home-bottom-content-default.92982945.jpg\";","module.exports = __webpack_public_path__ + \"static/media/stick-figures-3.bbe10870.png\";","module.exports = __webpack_public_path__ + \"static/media/quote-grey-default.98ed2c11.png\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAoCAYAAAAIeF9DAAAFkUlEQVRoge2be6hUVRSHvztmmmmmqD0sS3tYUGlRXk0x7CkVJZX0IvWfqAjsIRQV9KSHolKiFegfSRElSKZxk7IHVmgpkhamGaE9LK9aWuLzNr/YsAaG05kzZ+85Z2aEPthwZ2bvs39r1tx91ll77RZJ5EALcAxwFFAA9gO7gGLgVBcBzwDD7ZrtwNvAk8CePAyogJu7B9DJbNlttmVGrQ5xws4HhgHnAKcD/YFeQE/gSHPOIXPIDuAXYBOwHlgNfA10JMzxADCzwmfumq3A91l+KcDJwAhgKDAYGAD0Mbu62Y9M9mNwNv0O/AhsANYCXwI7g2Z2DvFsnSXdJGmBpF2qnb8ktUmaFKPjuhRX3ySpU4Ad0TZU0nRJGzOwybFK0gxJJ/jo8BF8nKRZkvZlJDjKwpg5V6Qce18NjpiQoROiFCUNytohXSTNyUlwOUMi8w70GLskwBE3StqRs01TfXUdUWVFux54C+gatB6mZ4GtveX09Rh/kkff3sC7wKgc7CjH3Tfn+A4qJHw2G1hUB2c4ZsW895tHVLY5Zb/LLULL2xmOucBPvoMqOWQJcG/tmlLRBnwR0/FnYHnKayxN0Wci8KFFhvVgdsgccWHvIluqauGghbVbgD8sROxhzyYuHD4eONWufxXwQYW5LgU+qqJjrYWnSdwKvJmBE7ZYiO3+y/bZc0lPs62Phcfu7zeAO4JmiNxUZtZwA+uQ9LqksZK6p7iB9Zd0saSuVfpNTJhzc4qwclgNNjnWSLpL0ikpbHK2jEzZt2qUlSbmr8TclE4IbX0kTbPYfr2kZRauVrueWwE2BNr0naTWHG1KdEhB0g8BovdKGlVHwe4X2Mv0pun/VKAzptXbEVGHTA4QvVvSaTkLdA9VK22+/ZLaJW0tyxBslzSuwth+kvYE2HV/o5xR7pB1AcJH5yyuYGmRNAyPGf9wgE0vN9IZrrmwdyRwrmcs8KJHSBrKlZasTMMtMX3i3kvChdkP5mxTVZxDrvAccwCYUQdtx3r07Rl5fWaKUDjKS1mn0kMo2F6DD22WQs+bQx7Xj6bvhwRoW1gHm6riHDLQc8ynDdDpy9me/Vd5pF9yxTmkn+cEWW8G5YFPYtKxsVmEF2xXz4f2xkpOxdGe/bc3SOd/KFTZPo0jl034jDlwuNpUsI16H3yXuEawy3NO3yUuNwoBOfvBzSI+gU2e/c+qq7oEnEPWeY4ZU1eFYXzrOcqF/oOaQbhzyOeeY64t28toVlbbk7cP45vBloJtDvncR9w+/EM5asqCou0O+jDFMzuQC84hf1ohgw/3AFc3kQPieM2zf9+QooSsKe2phwhZHJB2qSefJWwNV+I2YHojRZcc8k2Fyo8kXLHAV8Dt9ZPrzRMBY6ZYWVJDKESE+IaL2Ib+x00aDq8EngsYN96KMybkoCmRcod0WHVGCGOs0HgFcLelv2vFJ9ubxGPAsoBxrrB6PrANmAqMtkLrXIkrA7oGeC+DSdstEbnTyoJaPMb+bQ9rI1L2nwfcmfB5Z8vohqTly9lvichfgb2WcklrV4uVP7kV5dWKnWIc4hgLvF+j+HpSzSFYEnW5HV9oNI8AL8RpqFS5uNT2FLYeDt5IyUE78DO/CbQ8XyngSKrt3WCHb+blp6shTAJusCWnkbjTX89G509ySAm3FJxnIW6z4luv+47dtCudzKoXj0brE9I4BHtOabUHwcVN6JRtAWMOWqjvHPO0HU1rBK7S5ZXSvKFnDHtbrD4OuMSKjhuF7H6XxTbsZcDNVgA+oM72fOKKy7M4heuilwuBC+yLcWnsEy1R181CztIksla0Fv37n7LXxbLXlIWXpVCzm1W/TAbW1GpEDIMsCHCHWc+wg6Cuwr070MU0lOwqRmxLsrEYaR32Hbkw//Ec7PifYIB/AfrQjz9qtkYqAAAAAElFTkSuQmCC\"","var map = {\n\t\"./ion-action-sheet-ios.entry.js\": [\n\t\t108,\n\t\t29\n\t],\n\t\"./ion-action-sheet-md.entry.js\": [\n\t\t109,\n\t\t30\n\t],\n\t\"./ion-alert-ios.entry.js\": [\n\t\t110,\n\t\t31\n\t],\n\t\"./ion-alert-md.entry.js\": [\n\t\t111,\n\t\t32\n\t],\n\t\"./ion-app_8-ios.entry.js\": [\n\t\t112,\n\t\t13\n\t],\n\t\"./ion-app_8-md.entry.js\": [\n\t\t113,\n\t\t14\n\t],\n\t\"./ion-avatar_3-ios.entry.js\": [\n\t\t114,\n\t\t33\n\t],\n\t\"./ion-avatar_3-md.entry.js\": [\n\t\t115,\n\t\t34\n\t],\n\t\"./ion-back-button-ios.entry.js\": [\n\t\t116,\n\t\t35\n\t],\n\t\"./ion-back-button-md.entry.js\": [\n\t\t117,\n\t\t36\n\t],\n\t\"./ion-backdrop-ios.entry.js\": [\n\t\t118,\n\t\t79\n\t],\n\t\"./ion-backdrop-md.entry.js\": [\n\t\t119,\n\t\t80\n\t],\n\t\"./ion-button_2-ios.entry.js\": [\n\t\t120,\n\t\t37\n\t],\n\t\"./ion-button_2-md.entry.js\": [\n\t\t121,\n\t\t38\n\t],\n\t\"./ion-card_5-ios.entry.js\": [\n\t\t122,\n\t\t39\n\t],\n\t\"./ion-card_5-md.entry.js\": [\n\t\t123,\n\t\t40\n\t],\n\t\"./ion-checkbox-ios.entry.js\": [\n\t\t124,\n\t\t41\n\t],\n\t\"./ion-checkbox-md.entry.js\": [\n\t\t125,\n\t\t42\n\t],\n\t\"./ion-chip-ios.entry.js\": [\n\t\t126,\n\t\t43\n\t],\n\t\"./ion-chip-md.entry.js\": [\n\t\t127,\n\t\t44\n\t],\n\t\"./ion-col_3.entry.js\": [\n\t\t128,\n\t\t81\n\t],\n\t\"./ion-datetime_3-ios.entry.js\": [\n\t\t129,\n\t\t19\n\t],\n\t\"./ion-datetime_3-md.entry.js\": [\n\t\t130,\n\t\t20\n\t],\n\t\"./ion-fab_3-ios.entry.js\": [\n\t\t131,\n\t\t45\n\t],\n\t\"./ion-fab_3-md.entry.js\": [\n\t\t132,\n\t\t46\n\t],\n\t\"./ion-img.entry.js\": [\n\t\t133,\n\t\t82\n\t],\n\t\"./ion-infinite-scroll_2-ios.entry.js\": [\n\t\t134,\n\t\t83\n\t],\n\t\"./ion-infinite-scroll_2-md.entry.js\": [\n\t\t135,\n\t\t84\n\t],\n\t\"./ion-input-ios.entry.js\": [\n\t\t136,\n\t\t47\n\t],\n\t\"./ion-input-md.entry.js\": [\n\t\t137,\n\t\t48\n\t],\n\t\"./ion-item-option_3-ios.entry.js\": [\n\t\t138,\n\t\t49\n\t],\n\t\"./ion-item-option_3-md.entry.js\": [\n\t\t139,\n\t\t50\n\t],\n\t\"./ion-item_8-ios.entry.js\": [\n\t\t140,\n\t\t51\n\t],\n\t\"./ion-item_8-md.entry.js\": [\n\t\t141,\n\t\t52\n\t],\n\t\"./ion-loading-ios.entry.js\": [\n\t\t142,\n\t\t53\n\t],\n\t\"./ion-loading-md.entry.js\": [\n\t\t143,\n\t\t54\n\t],\n\t\"./ion-menu_3-ios.entry.js\": [\n\t\t144,\n\t\t55\n\t],\n\t\"./ion-menu_3-md.entry.js\": [\n\t\t145,\n\t\t56\n\t],\n\t\"./ion-modal-ios.entry.js\": [\n\t\t146,\n\t\t15\n\t],\n\t\"./ion-modal-md.entry.js\": [\n\t\t147,\n\t\t16\n\t],\n\t\"./ion-nav_2.entry.js\": [\n\t\t148,\n\t\t25\n\t],\n\t\"./ion-popover-ios.entry.js\": [\n\t\t149,\n\t\t17\n\t],\n\t\"./ion-popover-md.entry.js\": [\n\t\t150,\n\t\t18\n\t],\n\t\"./ion-progress-bar-ios.entry.js\": [\n\t\t151,\n\t\t57\n\t],\n\t\"./ion-progress-bar-md.entry.js\": [\n\t\t152,\n\t\t58\n\t],\n\t\"./ion-radio_2-ios.entry.js\": [\n\t\t153,\n\t\t59\n\t],\n\t\"./ion-radio_2-md.entry.js\": [\n\t\t154,\n\t\t60\n\t],\n\t\"./ion-range-ios.entry.js\": [\n\t\t155,\n\t\t61\n\t],\n\t\"./ion-range-md.entry.js\": [\n\t\t156,\n\t\t62\n\t],\n\t\"./ion-refresher_2-ios.entry.js\": [\n\t\t157,\n\t\t63\n\t],\n\t\"./ion-refresher_2-md.entry.js\": [\n\t\t158,\n\t\t64\n\t],\n\t\"./ion-reorder_2-ios.entry.js\": [\n\t\t159,\n\t\t27\n\t],\n\t\"./ion-reorder_2-md.entry.js\": [\n\t\t160,\n\t\t28\n\t],\n\t\"./ion-ripple-effect.entry.js\": [\n\t\t161,\n\t\t85\n\t],\n\t\"./ion-route_4.entry.js\": [\n\t\t162,\n\t\t65\n\t],\n\t\"./ion-searchbar-ios.entry.js\": [\n\t\t163,\n\t\t66\n\t],\n\t\"./ion-searchbar-md.entry.js\": [\n\t\t164,\n\t\t67\n\t],\n\t\"./ion-segment_2-ios.entry.js\": [\n\t\t165,\n\t\t68\n\t],\n\t\"./ion-segment_2-md.entry.js\": [\n\t\t166,\n\t\t69\n\t],\n\t\"./ion-select_3-ios.entry.js\": [\n\t\t167,\n\t\t70\n\t],\n\t\"./ion-select_3-md.entry.js\": [\n\t\t168,\n\t\t71\n\t],\n\t\"./ion-slide_2-ios.entry.js\": [\n\t\t169,\n\t\t86\n\t],\n\t\"./ion-slide_2-md.entry.js\": [\n\t\t170,\n\t\t87\n\t],\n\t\"./ion-spinner.entry.js\": [\n\t\t171,\n\t\t23\n\t],\n\t\"./ion-split-pane-ios.entry.js\": [\n\t\t172,\n\t\t88\n\t],\n\t\"./ion-split-pane-md.entry.js\": [\n\t\t173,\n\t\t89\n\t],\n\t\"./ion-tab-bar_2-ios.entry.js\": [\n\t\t174,\n\t\t72\n\t],\n\t\"./ion-tab-bar_2-md.entry.js\": [\n\t\t175,\n\t\t73\n\t],\n\t\"./ion-tab_2.entry.js\": [\n\t\t176,\n\t\t26\n\t],\n\t\"./ion-text.entry.js\": [\n\t\t177,\n\t\t74\n\t],\n\t\"./ion-textarea-ios.entry.js\": [\n\t\t178,\n\t\t75\n\t],\n\t\"./ion-textarea-md.entry.js\": [\n\t\t179,\n\t\t76\n\t],\n\t\"./ion-toast-ios.entry.js\": [\n\t\t180,\n\t\t77\n\t],\n\t\"./ion-toast-md.entry.js\": [\n\t\t181,\n\t\t78\n\t],\n\t\"./ion-toggle-ios.entry.js\": [\n\t\t182,\n\t\t21\n\t],\n\t\"./ion-toggle-md.entry.js\": [\n\t\t183,\n\t\t22\n\t],\n\t\"./ion-virtual-scroll.entry.js\": [\n\t\t184,\n\t\t90\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 72;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./ion-icon.entry.js\": [\n\t\t188,\n\t\t93\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 74;\nmodule.exports = webpackAsyncContext;","/**\r\n * This function can log any actions which update the app's state to the browser console, as well as full details\r\n * of the previous and next app state. This makes it easier to keep track of what is going on in the app,\r\n * making it simpler to debug any unexpected issues. The reducer(s) passed to this function are executed and\r\n * returned, so that the app state can be updated.\r\n *\r\n * Logging will only be enabled if the 'REACT_APP_ENABLE_STATE_LOGGING' environment variable is set to a value of 1.\r\n * This environment variable is defined in the '.env.development' or '.env.production' file in the app's root folder.\r\n * See: https://create-react-app.dev/docs/adding-custom-environment-variables/\r\n *\r\n * This function forms part of the simple Redux-like state management pattern for React which is implemented for\r\n * this app using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * The code below is based on the code in the 'Ionic Music Player React Demo' app\r\n * (see https://stackblitz.com/edit/ionic-react-demo?file=State.jsx).\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nexport const stateLogger = (reducer) => {\r\n return (state, action) => {\r\n if(process.env.REACT_APP_ENABLE_STATE_LOGGING && process.env.REACT_APP_ENABLE_STATE_LOGGING === \"1\") {\r\n console.log(\"%cAction:\", \"color: #00A7F7; font-weight: 700;\", action);\r\n console.log(\"%cPrevious State:\", \"color: #9E9E9E; font-weight: 700;\", state);\r\n console.log(\"%cNext State:\", \"color: #47B04B; font-weight: 700;\", reducer(state, action));\r\n console.log(\"%cTime:\", \"color: #071C8B; font-style: italic;\", new Date().getTime() + 'ms, ' + new Date());\r\n }\r\n \r\n return reducer(state, action);\r\n };\r\n};","/**\r\n * The initial app configuration state is defined within this file. This is used by the 'state.js' file to define the\r\n * overall initial application state, which ensures the app runs smoothly before all data has been fully populated.\r\n *\r\n * This forms part of the simple Redux-like state management pattern for React which is implemented for this app\r\n * using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nexport const configInitialState = {\r\n isLoading: true,\r\n isError: false,\r\n liveChatEnabled: false,\r\n data: {\r\n title: '',\r\n homepage_slug: 'home',\r\n homepage_title: '',\r\n homepage_banners: [],\r\n logo: '',\r\n logo_link_url: '',\r\n banner_image: '',\r\n default_phone: '',\r\n default_ngt_no: '',\r\n default_email: '',\r\n display_phone: 'yes',\r\n display_email: 'yes',\r\n display_live_chat: 'yes',\r\n live_chat_url: '',\r\n live_chat_start_time: '09:00',\r\n live_chat_stop_time: '17:00',\r\n display_cic_logo: 'no',\r\n ga_code: '',\r\n menu_locations: {\r\n header: 0,\r\n footer: 0,\r\n lower_footer: 0\r\n },\r\n menus: [],\r\n colours: {\r\n primary: '#7FBC03',\r\n secondary: '#707070',\r\n tertiary: '#3F8B00',\r\n text_alternative: '#F5F5F5',\r\n bg_default: '#FFFFFF',\r\n light: '#F5F5F5',\r\n medium: '#EDEDED',\r\n dark: '#707070'\r\n },\r\n text: {\r\n live_chat: 'Live Chat',\r\n contact: 'Message Us',\r\n read_more: 'Learn More',\r\n home_breadcrumb: 'Home',\r\n main_menu_title: 'Menu',\r\n download: 'Download the Full Helpsheet',\r\n topics_title: 'Topics',\r\n featured_topics_title: 'Featured Topics',\r\n topic_listings_title: 'Helpsheets',\r\n related_topic_listings_title: 'Other Helpsheets on \"[TOPIC_TITLE]\"',\r\n footer_explore_menu_title: 'Explore',\r\n footer_policies_menu_title: 'Policies',\r\n footer_contact_section_title: 'Get In Touch',\r\n copyright: '© Copyright CiC 2020',\r\n login_title: 'Log In',\r\n login_page: '',\r\n login_loading_message: 'Logging in...',\r\n username_field_label: 'Username',\r\n password_field_label: 'Password',\r\n login_empty_field_message: 'Please enter a username and password.',\r\n login_error_message: 'Please make sure you have entered a valid username and password.',\r\n logout: 'Log out from WellOnline',\r\n page_loading_message: 'Please wait...',\r\n page_load_error_title: 'Page Loading Error',\r\n page_load_error_message: '',\r\n search_title: 'Search',\r\n search_loading_message: 'Loading More Search Results...',\r\n search_empty_field_title: 'Enter a Search Query',\r\n search_empty_field_message: 'Please enter a new query into the search box at the top of the page.',\r\n search_load_error_title: 'Search Results Loading Error',\r\n search_load_error_message: '',\r\n search_results_title: 'Search Results for \"[SEARCH_QUERY]\"',\r\n no_search_results_message: 'No search results could be found for the query \"[SEARCH_QUERY]\". Please try ' +\r\n 'entering a different query into the search box at the top of the page.',\r\n }\r\n },\r\n};\r\n\r\nexport const menuItemInitialState = {\r\n id: 0,\r\n title: '',\r\n section_title: '',\r\n link: '',\r\n excerpt: '',\r\n featured_image: '',\r\n banner_image: '',\r\n template: '',\r\n type: 'post_type',\r\n target: ''\r\n}\r\n\r\nexport const homepageBannerInitialState = {\r\n banner_image: '',\r\n title: '',\r\n link: ''\r\n}","/**\r\n * The initial page data is defined within this file. This is ultimately used by the 'state.js' file to define the\r\n * overall initial application state, which ensures the app runs smoothly before all data has been fully populated.\r\n *\r\n * This forms part of the simple Redux-like state management pattern for React which is implemented for this app\r\n * using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\nexport const pageInitialData = {\r\n id: 0,\r\n title: '',\r\n section_title: '',\r\n content: '',\r\n template: '',\r\n featured_image: '',\r\n banner_image: '',\r\n help_sheet: '',\r\n show_help_sheet: 'yes',\r\n quote: '',\r\n quote_image: '',\r\n home_display_contact_section: 'yes',\r\n home_contact_section_content: '',\r\n home_display_phone_number: 'yes',\r\n home_display_live_chat: 'yes',\r\n home_display_message_link: 'yes',\r\n home_display_bottom_section: 'yes',\r\n home_bottom_section_content: '',\r\n home_bottom_section_image: '',\r\n child_pages: [],\r\n sibling_pages: [],\r\n ancestor_pages: [],\r\n featured_topics: []\r\n};\r\n\r\nexport const relatedPageInitialData = {\r\n id: 0,\r\n title: '',\r\n section_title: '',\r\n link: '',\r\n excerpt: '',\r\n template: '',\r\n featured_image: '',\r\n banner_image: '',\r\n icon: ''\r\n};","/**\r\n * The initial user state is defined within this file. This is used by the 'state.js' file to define the overall\r\n * initial application state, which ensures the app runs smoothly before all data has been fully populated.\r\n *\r\n * This forms part of the simple Redux-like state management pattern for React which is implemented for this app\r\n * using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nexport const userInitialState = {\r\n loggedIn: false,\r\n startedLogin: false,\r\n loginErrors: '',\r\n data: {\r\n username: '',\r\n token: '',\r\n company_email: '',\r\n company_phone: '',\r\n company_ngt_no: ''\r\n }\r\n};","/**\r\n * This script implements a simple Redux-like state management pattern for React using hooks.\r\n * This mechanism can be used wherever the app state needs to be managed or updated.\r\n *\r\n * It is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * The code below is loosely based on the code in the 'Ionic Music Player React Demo' app\r\n * (see https://stackblitz.com/edit/ionic-react-demo?file=State.jsx), but refactored to use\r\n * a structure more similar to the code in the 'Ionic Conference App' template (see\r\n * https://github.com/ionic-team/ionic-react-conference-app/blob/master/src/data/state.ts).\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nimport { combineReducers } from './combineReducers';\r\nimport { stateLogger } from './stateLogger';\r\n\r\nimport { configInitialState } from './config/config.init';\r\nimport { configReducer } from './config/config.reducer';\r\n\r\nimport { pageInitialState } from './page/page.init';\r\nimport { pageReducer } from './page/page.reducer';\r\n\r\nimport { userInitialState } from './user/user.init';\r\nimport { userReducer } from './user/user.reducer';\r\n\r\nimport { searchInitialState } from './search/search.init';\r\nimport { searchReducer } from './search/search.reducer';\r\n\r\n// Define initial app state\r\nexport const appInitialState = {\r\n config: configInitialState,\r\n page: pageInitialState,\r\n user: userInitialState,\r\n search: searchInitialState\r\n};\r\n\r\n// Combine all the reducers used by the app\r\nconst reducers = combineReducers(\r\n {\r\n config: configReducer,\r\n page: pageReducer,\r\n user: userReducer,\r\n search: searchReducer\r\n }\r\n);\r\n\r\n// Ensure that actions that update the app state via the reducers can be logged to the browser console\r\nexport const loggedReducers = stateLogger(reducers);","/**\r\n * The initial page state is defined within this file. This is used by the 'state.js' file to define the overall\r\n * initial application state, which ensures the app runs smoothly before all data has been fully populated.\r\n *\r\n * This forms part of the simple Redux-like state management pattern for React which is implemented for this app\r\n * using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\nimport { pageInitialData } from './pageData.init';\r\n\r\nexport const pageInitialState = {\r\n isLoading: false,\r\n isError: false,\r\n path: '',\r\n data: pageInitialData\r\n};","/**\r\n * The initial state relating to the search functionality is defined within this file. This is used by the\r\n * 'state.js' file to define the overall initial application state, which ensures the app runs smoothly before\r\n * all data has been fully populated.\r\n *\r\n * This forms part of the simple Redux-like state management pattern for React which is implemented for this app\r\n * using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nexport const searchInitialState = {\r\n showSearchBar: true,\r\n showSearchBtn: false,\r\n query: '',\r\n prepopulateQuery: true,\r\n isLoadingNewSearch: false,\r\n isLoadingNextPage: false,\r\n isError: false,\r\n pageNum: 1,\r\n totalPages: 1,\r\n results: []\r\n};","/**\r\n * This function combines multiple reducers which can be used to update the app state.\r\n *\r\n * This forms part of the simple Redux-like state management pattern for React which is implemented for this app\r\n * using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * The code below is based on a simplified version of the code in the 'Ionic Conference App' template (see\r\n * https://github.com/ionic-team/ionic-react-conference-app/blob/master/src/data/combineReducers.ts).\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nexport function combineReducers(reducers) {\r\n return (state, action) => {\r\n const newState = {};\r\n const keys = Object.keys(reducers);\r\n keys.forEach(key => {\r\n const result = reducers[key](state[key], action);\r\n newState[key] = result || state[key];\r\n });\r\n return newState;\r\n };\r\n}","/**\r\n * This Reducer function specifies how the app state should be transformed when data relating to the current app\r\n * configuration is updated; for example when data is being retrieved from the WP REST API (see the fetchAppConfig()\r\n * function), based on the specified action type. The function creates and returns a new version of the 'state'\r\n * variable, based on the supplied action object data (see the config.actions.js file for the defined action objects\r\n * which relate to the fetching of app config data).\r\n *\r\n * This forms part of the simple Redux-like state management pattern for React which is implemented for this app\r\n * using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * The code below is based on a simplified version of the reducers in the 'Ionic Conference App' template (see e.g.\r\n * https://github.com/ionic-team/ionic-react-conference-app/blob/master/src/data/user/user.reducer.ts).\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nexport function configReducer(state, action) {\r\n switch (action.type) {\r\n case 'CONFIG_FETCH_INIT':\r\n return {\r\n ...state,\r\n isLoading: true,\r\n isError: false\r\n };\r\n case 'CONFIG_FETCH_SUCCESS':\r\n return {\r\n ...state,\r\n isLoading: false,\r\n isError: false,\r\n data: action.payload\r\n };\r\n case 'CONFIG_FETCH_ERROR':\r\n return {\r\n ...state,\r\n isLoading: false,\r\n isError: true\r\n };\r\n case 'CONFIG_LIVE_CHAT_ENABLED':\r\n return {\r\n ...state,\r\n liveChatEnabled: true\r\n };\r\n case 'CONFIG_LIVE_CHAT_DISABLED':\r\n return {\r\n ...state,\r\n liveChatEnabled: false\r\n };\r\n default:\r\n // Intentionally left empty - further action types may exist in other reducers\r\n break;\r\n }\r\n}","/**\r\n * This Reducer function specifies how the app state should be transformed when data relating to the current page is\r\n * updated; for example when data is being retrieved from the WP REST API (see the 'usePageData' custom React hook),\r\n * based on the specified action type. The function creates and returns a new version of the 'state' variable, based\r\n * on the supplied action object data (see the page.actions.js file for the defined action objects which relate to\r\n * the fetching of page data).\r\n *\r\n * This forms part of the simple Redux-like state management pattern for React which is implemented for this app\r\n * using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * The code below is based on a simplified version of the reducers in the 'Ionic Conference App' template (see e.g.\r\n * https://github.com/ionic-team/ionic-react-conference-app/blob/master/src/data/user/user.reducer.ts).\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nimport { pageInitialData } from './pageData.init';\r\n\r\nexport function pageReducer(state, action) {\r\n switch (action.type) {\r\n case 'SET_CURRENT_PAGE_PATH':\r\n return {\r\n ...state,\r\n path: action.path\r\n };\r\n case 'PAGE_DATA_FETCH_INIT':\r\n return {\r\n ...state,\r\n isLoading: true,\r\n isError: false,\r\n data: {\r\n ...pageInitialData,\r\n template: state.data.template,\r\n title: state.data.title,\r\n section_title: state.data.section_title,\r\n banner_image: state.data.banner_image\r\n }\r\n };\r\n case 'PAGE_DATA_FETCH_SUCCESS':\r\n return {\r\n ...state,\r\n isLoading: false,\r\n isError: false,\r\n data: action.payload\r\n };\r\n case 'PAGE_DATA_FETCH_ERROR':\r\n return {\r\n ...state,\r\n isLoading: false,\r\n isError: true,\r\n };\r\n case 'CHANGE_CURRENT_PAGE':\r\n return {\r\n ...state,\r\n isLoading: true,\r\n data: {\r\n ...pageInitialData,\r\n ...action.payload\r\n }\r\n };\r\n default:\r\n // Intentionally left empty - further action types may exist in other reducers\r\n break;\r\n }\r\n}","/**\r\n * This Reducer function specifies how the app state should be transformed when data relating to the current user is\r\n * updated; for example when the user logs in or out of the app, based on the specified action type. The function\r\n * creates and returns a new version of the 'state' variable, based on the supplied action object data (see the\r\n * user.actions.js file for the defined action objects which relate to the updates of user data).\r\n *\r\n * This forms part of the simple Redux-like state management pattern for React which is implemented for this app\r\n * using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * The code below is based on a simplified version of the reducers in the 'Ionic Conference App' template (see e.g.\r\n * https://github.com/ionic-team/ionic-react-conference-app/blob/master/src/data/user/user.reducer.ts).\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nimport { userInitialState } from './user.init';\r\n\r\nexport function userReducer(state, action) {\r\n switch (action.type) {\r\n case 'USER_LOGIN_INIT':\r\n return {\r\n ...state,\r\n startedLogin: true,\r\n loginErrors: '',\r\n data: {...userInitialState.data}\r\n };\r\n case 'USER_LOGIN_ERROR':\r\n return {\r\n ...state,\r\n startedLogin: false,\r\n loginErrors: action.payload\r\n };\r\n case 'USER_LOGGED_IN':\r\n return {\r\n ...state,\r\n loggedIn: true,\r\n startedLogin: false,\r\n data: action.payload\r\n };\r\n case 'USER_LOGGED_OUT':\r\n return {\r\n ...state,\r\n loggedIn: false,\r\n data: {...userInitialState.data}\r\n };\r\n default:\r\n // Intentionally left empty - further action types may exist in other reducers\r\n break;\r\n }\r\n}","/**\r\n * This Reducer function specifies how the app state should be transformed when data relating to the search\r\n * functionality is updated; for example when search results are being retrieved from the WP REST API (see the\r\n * 'fetchSearchResultsFromApi()' function), based on the specified action type. The function creates and returns\r\n * a new version of the 'state' variable, based on the supplied action object data (see the search.actions.js\r\n * file for the defined action objects which relate to the search functionality).\r\n *\r\n * This forms part of the simple Redux-like state management pattern for React which is implemented for this app\r\n * using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * The code below is based on a simplified version of the reducers in the 'Ionic Conference App' template (see\r\n * e.g. https://github.com/ionic-team/ionic-react-conference-app/blob/master/src/data/user/user.reducer.ts).\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nexport function searchReducer(state, action) {\r\n switch (action.type) {\r\n case 'HIDE_SEARCH_BAR':\r\n return {\r\n ...state,\r\n showSearchBar: false,\r\n showSearchBtn: true\r\n };\r\n case 'SHOW_SEARCH_BAR':\r\n return {\r\n ...state,\r\n showSearchBar: true\r\n };\r\n case 'SET_SEARCH_QUERY':\r\n return {\r\n ...state,\r\n query: action.payload,\r\n prepopulateQuery: false,\r\n isLoadingNewSearch: true\r\n };\r\n case 'SEARCH_RESULTS_FETCH_NEW_INIT':\r\n return {\r\n ...state,\r\n isLoadingNewSearch: true,\r\n isLoadingNextPage: false,\r\n pageNum: 1,\r\n totalPages: 1,\r\n isError: false,\r\n results: []\r\n };\r\n case 'SEARCH_RESULTS_FETCH_PAGE_INIT':\r\n return {\r\n ...state,\r\n isLoadingNewSearch: false,\r\n isLoadingNextPage: true,\r\n pageNum: action.pageNum,\r\n isError: false,\r\n };\r\n case 'SEARCH_RESULTS_FETCH_SUCCESS':\r\n return {\r\n ...state,\r\n isLoadingNewSearch: false,\r\n isLoadingNextPage: false,\r\n isError: false,\r\n results: state.results.concat(action.payload),\r\n totalPages: action.totalPages\r\n };\r\n case 'SEARCH_RESULTS_FETCH_ERROR':\r\n return {\r\n ...state,\r\n isLoadingNewSearch: false,\r\n isLoadingNextPage: false,\r\n isError: true,\r\n };\r\n default:\r\n // Intentionally left empty - further action types may exist in other reducers\r\n break;\r\n }\r\n}","/**\r\n * This script sets up a React Context (see https://reactjs.org/docs/context.html) which allows the app state\r\n * to be managed and updated where necessary throughout the app.\r\n *\r\n * This forms part of the simple Redux-like state management pattern for React which is implemented for this app\r\n * using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * The code below is loosely based on the code in the 'Ionic Music Player React Demo' app\r\n * (see https://stackblitz.com/edit/ionic-react-demo?file=State.jsx), but refactored to use\r\n * a structure more similar to the code in the 'Ionic Conference App' template (see\r\n * https://github.com/ionic-team/ionic-react-conference-app/blob/master/src/data/AppContext.tsx).\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nimport React, { createContext, useReducer } from 'react';\r\nimport { appInitialState, loggedReducers } from './state'\r\n\r\nexport const AppContext = createContext({\r\n state: appInitialState,\r\n dispatch: () => undefined\r\n});\r\n\r\nexport const AppContextProvider = (props => {\r\n\r\n const [store, dispatch] = useReducer(loggedReducers, appInitialState);\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n});","/**\r\n * This file contains JS functions to set up the action objects which describe what happens when the app state\r\n * relating to the current user is changed, e.g. as a result of logging in or out of the app. Each action object\r\n * specifies the action type and the associated data which will be used to update the state via the associated\r\n * reducer (see the user.reducer.js file).\r\n *\r\n * This forms part of the simple Redux-like state management pattern for React which is implemented for this app\r\n * using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * The code below is based on a simplified version of the actions in the 'Ionic Conference App' template (see e.g.\r\n * https://github.com/ionic-team/ionic-react-conference-app/blob/master/src/data/user/user.actions.ts).\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nexport const initUserLogin = () => (\r\n {\r\n type: 'USER_LOGIN_INIT'\r\n }\r\n);\r\n\r\nexport const setUserLoginError = (error) => (\r\n {\r\n type: 'USER_LOGIN_ERROR',\r\n payload: error\r\n }\r\n);\r\n\r\nexport const userLoggedIn = (user) => (\r\n {\r\n type: 'USER_LOGGED_IN',\r\n payload: user\r\n }\r\n);\r\n\r\nexport const userLoggedOut = () => (\r\n {\r\n type: 'USER_LOGGED_OUT',\r\n }\r\n);","/**\r\n * This file contains JS functions to set up the action objects which describe what happens when the app state\r\n * relating to the current page is changed, e.g. as a result of retrieving page data from the WP REST API\r\n * (see the 'usePageData' custom React hook). Each action object specifies the action type and the associated\r\n * data which will be used to update the state via the associated reducer (see the page.reducer.js file).\r\n *\r\n * This forms part of the simple Redux-like state management pattern for React which is implemented for this app\r\n * using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * The code below is based on a simplified version of the actions in the 'Ionic Conference App' template (see e.g.\r\n * https://github.com/ionic-team/ionic-react-conference-app/blob/master/src/data/user/user.actions.ts).\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nexport const setCurrentPagePath = (path) => (\r\n {\r\n type: 'SET_CURRENT_PAGE_PATH',\r\n path: path\r\n }\r\n);\r\n\r\nexport const initPageDataFetch = () => (\r\n {\r\n type: 'PAGE_DATA_FETCH_INIT'\r\n }\r\n);\r\n\r\nexport const setPageDataFetchSuccess = (payload) => (\r\n {\r\n type: 'PAGE_DATA_FETCH_SUCCESS',\r\n payload: payload\r\n }\r\n);\r\n\r\nexport const setPageDataFetchError = () => (\r\n {\r\n type: 'PAGE_DATA_FETCH_ERROR'\r\n }\r\n);\r\n\r\nexport const changeCurrentPage = (payload) => (\r\n {\r\n type: 'CHANGE_CURRENT_PAGE',\r\n payload: payload\r\n }\r\n);\r\n","/**\r\n * The functions in this file provide functionality to store and retrieve data within browser cookies, as well as\r\n * to remove cookies that are no longer needed.\r\n *\r\n * These functions are based on the sample code at: https://www.quirksmode.org/js/cookies.html\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\n/**\r\n * Store a cookie in the user's browser\r\n *\r\n * @param {string} name\r\n * The name of the cookie to store\r\n * @param {string} value\r\n * The value to store in the relevant cookie\r\n * @param {number} expiryDays\r\n * The number of days before the cookie will expire, e.g 90\r\n */\r\nexport function setCookie(name, value, expiryDays) {\r\n let expires = '';\r\n if (expiryDays) {\r\n const date = new Date();\r\n date.setTime(date.getTime() + (expiryDays * 24 * 60 * 60 * 1000));\r\n expires = '; expires=' + date.toGMTString();\r\n }\r\n \r\n document.cookie = name + '=' + value + expires + '; path=/';\r\n}\r\n\r\n/**\r\n * Retrieve the value of a specified cookie that was previously stored by the user's browser\r\n *\r\n * @param {string} name\r\n * The name of the cookie to retrieve\r\n *\r\n * @returns {string|null}\r\n * The retrieved cookie value, or NULL if no cookie value could be retrieved (e.g. if the cookie does not exist)\r\n */\r\nexport function getCookie(name) {\r\n const nameEQ = name + '=';\r\n const cookies = document.cookie.split(';');\r\n \r\n for(let i=0; i < cookies.length; i++) {\r\n let cookie = cookies[i];\r\n while (cookie.charAt(0) === ' ') {\r\n cookie = cookie.substring(1, cookie.length);\r\n }\r\n \r\n if (cookie.indexOf(nameEQ) === 0) {\r\n return cookie.substring(nameEQ.length, cookie.length);\r\n }\r\n }\r\n \r\n return null;\r\n}\r\n\r\n/**\r\n * Remove the specified cookie from the user's browser.\r\n *\r\n * This is achieved by updating the relevant cookie to use an expiry date that is set in the past.\r\n *\r\n * @param {string} name\r\n * The name of the cookie to remove\r\n */\r\nexport function removeCookie(name) {\r\n setCookie(name, '', -1);\r\n}","/**\r\n * @todo review & document\r\n */\r\n\r\nimport { userLoggedOut } from './user.actions';\r\nimport { setCurrentPagePath } from '../page/page.actions';\r\nimport { removeCookie } from '../general/cookieStorage';\r\n\r\nexport const logoutUser = async (dispatch) => {\r\n \r\n try {\r\n removeCookie('wellonlinepwa_user');\r\n \r\n dispatch(userLoggedOut());\r\n \r\n // Set page path to empty string, so page data will be re-retrieved if user logs in again\r\n dispatch(setCurrentPagePath(''));\r\n } catch(error) {\r\n // Log any storage errors to browser console\r\n console.error(error);\r\n }\r\n};","/**\r\n * @todo review & document\r\n */\r\nimport React, { useContext } from 'react';\r\nimport { IonButton, IonContent, IonPage } from '@ionic/react';\r\n\r\nimport { AppContext } from '../data/AppContext';\r\nimport { logoutUser } from '../data/user/logoutUser';\r\n\r\nexport const ComponentErrorPage = () => {\r\n const {state, dispatch} = useContext(AppContext);\r\n \r\n async function onLogOutBtnClick() {\r\n await logoutUser(dispatch);\r\n // Reload page because error boundary surrounds all components, so login page isn't shown automatically\r\n window.location.reload();\r\n }\r\n \r\n return (\r\n \r\n \r\n
\r\n

Error

\r\n \r\n

Apologies, an unexpected error occurred. Please try the following steps:

\r\n \r\n

1. Check whether you are currently connected to the internet. If not, please connect now.

\r\n

2. Try reloading the page.

\r\n

3. If you are logged in, try logging out and then back in again.

\r\n

4. Try clearing your browser history, or visiting this site in\r\n Private/Incognito mode, or using a different web browser.

\r\n

5. If none of the above steps work, please contact us for further assistance.

\r\n \r\n {state.user.loggedIn && (\r\n Log out\r\n )}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","/**\r\n * This code implements an Error Boundary component - see https://reactjs.org/docs/error-boundaries.html for more\r\n * details, and to see the sample code that this component is based upon.\r\n *\r\n * This Error Boundary surrounds all app components (see `App.jsx`). If a JS error occurs inside any app component,\r\n * this component will render a special error page (see the separate `ComponentErrorPage` component), which provides\r\n * useful advice to help the user resolve the issues when displaying the app. Otherwise all the child components of\r\n * this component will be rendered, to ensure the app is displayed as normal.\r\n *\r\n * This component is only intended as a 'worst case' app error handling mechanism, since displaying this error page\r\n * significantly disrupts the user experience - wherever possible, errors should instead be handled more seamlessly\r\n * within the relevant app code, and/or functionality should be implemented in such a way that errors will never\r\n * occur in the first place.\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nimport React from 'react';\r\nimport { ComponentErrorPage } from './pages/ComponentErrorPage';\r\n\r\nexport class ErrorBoundary extends React.Component {\r\n \r\n /**\r\n * Initialise this class\r\n *\r\n * @param props\r\n */\r\n constructor(props) {\r\n super(props);\r\n this.state = { hasError: false };\r\n }\r\n \r\n /**\r\n * Update state so that an Error Page can be displayed when this component next renders.\r\n *\r\n * @param error\r\n * @returns {{hasError: boolean}}\r\n */\r\n static getDerivedStateFromError(error) {\r\n return { hasError: true };\r\n }\r\n \r\n /**\r\n * Log details of the error\r\n *\r\n * @param error\r\n * @param errorInfo\r\n */\r\n componentDidCatch(error, errorInfo) {\r\n console.error('A component error occurred: ' + error);\r\n console.error(errorInfo);\r\n }\r\n \r\n /**\r\n * When this component is rendered, all the child components will get rendered unless an error occurred.\r\n * If an error occurred, instead render the `ComponentErrorPage` component.\r\n *\r\n * @returns {React.ReactNode|*}\r\n */\r\n render() {\r\n if (this.state.hasError) {\r\n return ;\r\n }\r\n \r\n return this.props.children;\r\n }\r\n}","/**\r\n * This file contains functionality to extract raw data from a JS object containing keys and values, so that the\r\n * data can safely be used throughout the app as required. Before using any raw data that was retrieved e.g. from\r\n * WP's REST API within the app, it is recommended to first pass it through this function, for the following\r\n * reasons:\r\n *\r\n * - Any data properties that do not exist within the raw data, or contain values which appear to be invalid\r\n * (e.g. any NULL or undefined values) will be ignored, and instead a specified default value will be used for\r\n * the relevant property, which is normally based on the initial value that gets stored for that property within\r\n * the app state. This helps to protect against unexpected app crashes.\r\n * - If the raw data contains any additional data properties that are not expected, any irrelevant data will be\r\n * stripped out, so the resulting data only contains the expected properties.\r\n * - Certain fields in the REST API responses contain an optional prefix to avoid conflicts with built-in or\r\n * 3rd party field names. This function allows the relevant field data to be extracted, and the prefix to be\r\n * stripped out from the resulting data properties (where applicable), ensuring that the format of the\r\n * extracted data is simpler.\r\n *\r\n * Note that this function is intended for extraction of raw data that closely matches the format of the\r\n * resulting data that will be used throughout the app. If any advanced data transformations need to be carried\r\n * out and/or other more sophisticated data extraction mechanisms must be used for certain data properties to\r\n * ensure that the data is usable within the app, the relevant property keys can be specified within the\r\n * skipProperties array, and the relevant data can then be extracted separately later via a different mechanism.\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n *\r\n * @param {Object} rawData\r\n * Raw data within a JS object containing keys and values. This may have been retrieved e.g. from WP's REST API.\r\n * @param {Object} defaultData\r\n * The default values to use for any properties that cannot be successfully extracted from the raw data. The\r\n * extracted data object will only contain the properties defined within this object; any additional properties\r\n * in the raw data are discarded. The supplied object should contain all the properties that the app supports\r\n * for this type of data, and is normally based upon the relevant keys & associated values that get stored in\r\n * the initial app state.\r\n * @param {Array} skipProperties\r\n * An array containing the keys of any properties within the default data that should be skipped, and thus not\r\n * extracted from the raw data for now. This is normally used for properties that require their own dedicated\r\n * (and more sophisticated) mechanism, which will extract the required data at a later stage.\r\n * @param {string} rawPropertyKeyPrefix\r\n * This prefix can optionally be prepended to the key of a raw data property. Certain fields in the REST API\r\n * responses contain an optional prefix to avoid conflicts with built-in or 3rd party field names, so this allows\r\n * the relevant field data to be extracted, and the prefix to be stripped out from the resulting data properties.\r\n * If an empty string (the default value) is used, this indicates the raw & formatted property key is the same.\r\n *\r\n * @returns {Object}\r\n * Extracted data, which can be used throughout the app as required.\r\n */\r\nexport function extractStandardDataProperties(\r\n rawData,\r\n defaultData,\r\n skipProperties,\r\n rawPropertyKeyPrefix = ''\r\n) {\r\n // Set up the default keys and values to use for the extracted data\r\n const extractedData = {...defaultData};\r\n \r\n // Loop through each applicable data property supported by the app, and extract corresponding raw data\r\n for (let propertyKey in extractedData) {\r\n // Get the raw data property key (inc optional prefix) corresponding to the equivalent extracted data property\r\n let rawPropertyKey = rawPropertyKeyPrefix + propertyKey;\r\n \r\n // Skip certain properties that have their own dedicated data extraction mechanism\r\n if(skipProperties.indexOf(propertyKey) !== -1) {\r\n continue;\r\n }\r\n \r\n // Skip any properties that cannot be found in the raw or extracted data\r\n if(\r\n ! extractedData.hasOwnProperty(propertyKey) ||\r\n ! rawData.hasOwnProperty(rawPropertyKey)\r\n ) {\r\n continue;\r\n }\r\n \r\n // Skip any properties that appear to contain invalid (i.e. non-'truthy') values\r\n if( ! rawData[rawPropertyKey]) {\r\n continue;\r\n }\r\n \r\n // Otherwise add the relevant raw data property value to the extracted data\r\n extractedData[propertyKey] = rawData[rawPropertyKey];\r\n }\r\n \r\n return extractedData;\r\n}","/**\r\n * This file contains functionality to extract raw user JSON data (which has already been retrieved e.g. from WP's\r\n * REST API), converting it into a simpler format which can then be used throughout the app. If the raw data cannot\r\n * be extracted/formatted correctly, an error will be thrown - this then needs to be handled elsewhere in the app.\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nimport { userInitialState } from './user.init';\r\nimport { extractStandardDataProperties } from '../general/extractStandardDataProperties';\r\n\r\n/**\r\n * This function converts the raw user JSON data which has already been retrieved\r\n * (e.g. from WP's REST API) into a simpler format which can then be used throughout the app.\r\n *\r\n * If the raw data cannot be extracted/formatted correctly, an error is thrown.\r\n *\r\n * IMPORTANT NOTE:\r\n * Due to the way user data is stored, this data may get processed by this function more than once. Therefore it needs\r\n * to correctly handle both raw user data, and user data that was already formatted by this function previously.\r\n *\r\n * @param {string} username\r\n * The username of the current user\r\n * @param {Object} rawUserData\r\n * Raw user data in JSON format. This may have been retrieved e.g. from WP's REST API.\r\n * @returns {Object}\r\n * Formatted user data, which can be used throughout the app as required.\r\n *\r\n * @throws {Error}\r\n * If the user data cannot be formatted successfully\r\n */\r\nexport function extractFormattedUserData(username, rawUserData) {\r\n // Make sure a username was supplied\r\n if( ! username || username.length === 0) {\r\n throw new Error('Please specify a username.');\r\n }\r\n \r\n // Check if any user data has been retrieved\r\n if( ! rawUserData || rawUserData.length === 0) {\r\n throw new Error('No user data can be retrieved.');\r\n }\r\n \r\n // Check that all the required user data properties exist in the raw data\r\n if( ! rawUserData.hasOwnProperty('token') || ! rawUserData.token || rawUserData.token.length === 0 ) {\r\n throw new Error('Unexpected user data format: Token not specified.');\r\n }\r\n \r\n /* Extract all of the standard user data properties supported by the app from the raw data,\r\n skipping those properties that require their own dedicated data extraction mechanism. */\r\n const skipProperties = ['username'];\r\n const formattedUserData = extractStandardDataProperties(\r\n rawUserData, userInitialState.data, skipProperties\r\n );\r\n \r\n // Add the supplied username to the formatted user data\r\n formattedUserData.username = username;\r\n \r\n return formattedUserData;\r\n}","import { logoutUser } from '../data/user/logoutUser';\r\n\r\n/**\r\n * This function handles any errors relating to the authentication of the current user, based on a response\r\n * object retrieved via the WP REST API.\r\n *\r\n * If the response object contains a 'code' property value prefixed with 'jwt_auth', this indicates that an\r\n * authentication error was returned from the API, so the user is logged out automatically. Otherwise the\r\n * response is allowed to be processed as normal.\r\n *\r\n * This is an 'async' function, and must be called using an 'await' keyword; this is to allow the user to\r\n * be safely logged out if required.\r\n *\r\n * ----------\r\n * - Usage: -\r\n * ----------\r\n *\r\n * 1. Import this function at the top of any file that needs to check for any user authentication errors:\r\n *\r\n * import { handleUserAuthenticationErrors } from '../../helpers/handleUserAuthenticationErrors';\r\n *\r\n * 2. Add code similar to this within the function handling the API response (note the usage of the 'await' keyword):\r\n *\r\n * await handleUserAuthenticationErrors(result, dispatch);\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n *\r\n * @param {object} result\r\n * A JS object which has been obtained from a WP REST API response\r\n * @param {function} dispatch\r\n * Dispatch function to use to update global application state if an authentication error response was returned\r\n */\r\nexport async function handleUserAuthenticationErrors(result, dispatch) {\r\n // Check if the result object contains a 'code' property with a value prefixed with 'jwt_auth'\r\n if( ! result.hasOwnProperty('code') || result.code.substring(0, 8) !== 'jwt_auth') {\r\n // If not, the response does not appear to contain any user authentication errors, so proceed as normal\r\n return;\r\n }\r\n \r\n // Otherwise, a user authentication error has occurred, so log the user out, and throw an error containing details\r\n await logoutUser(dispatch);\r\n throw new Error('User authentication error whilst retrieving data: ' + result.code);\r\n}","/**\r\n * This file implements functionality to send app usage statistics as JSON-encoded POST data to custom WP REST API\r\n * endpoints. The functionality in this file is fairly generic, to allow different kinds of stats to be submitted\r\n * to slightly different REST API endpoints.\r\n *\r\n * Statistics are collected via separate API requests instead of collecting them as part of the main data retrieval\r\n * API requests (implemented elsewhere), to allow the main data retrieval responses to be cached via service workers\r\n * etc (and thus not necessarily require a round trip to the server), without interfering with the stats collection.\r\n *\r\n * If any errors occur, these are logged to the browser console, however no further action is taken, to avoid\r\n * interfering with the standard app functionality. Similarly, the stats collection functionality is asynchronous,\r\n * so that it can take place in the background after the main data has been retrieved, to ensure this functionality\r\n * does not affect normal app usage.\r\n *\r\n * The functionality within this file is self-contained, and does not need to store any info within the app state\r\n * (aside from the standard handling of any user authentication errors after the stats were submitted).\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nimport { handleUserAuthenticationErrors } from '../../helpers/handleUserAuthenticationErrors';\r\n\r\n/**\r\n * Asynchronous function to send app usage statistics as JSON-encoded POST data to a WP REST API endpoint.\r\n *\r\n * @param {Object} statsData\r\n * An object which will be sent to the API as JSON POST data, and used to generate statistics.\r\n * The data in this object may vary depending on the type of statistics being collected.\r\n * @param {string} statsEndpoint\r\n * The name of the endpoint used to store the relevant statistics, e.g. 'page'\r\n * @param {string} userToken\r\n * JSON Web Token (JWT), so the server can identify which user to collect statistics for\r\n * @param {function} dispatch\r\n * Dispatch function to use to update global application state if an authentication error response was returned\r\n *\r\n * @returns {Promise}\r\n */\r\nexport const sendStatsToApi = async (statsData, statsEndpoint, userToken, dispatch) => {\r\n // Set URL path for REST API request (i.e. a base stats endpoint path, followed by a custom endpoint name)\r\n const apiUrlPath = '/wp-json/page_user_statistics/v1/' + statsEndpoint + '/';\r\n \r\n try {\r\n // Send stats; then wait for JSON data response to be retrieved from URL\r\n const response = await fetch(apiUrlPath, {\r\n method: 'POST',\r\n headers: {\r\n authorization: 'Bearer ' + userToken,\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(statsData) // JSON-encode the supplied stats data\r\n });\r\n const result = await response.json();\r\n \r\n // Handle any errors relating to the authentication of the current user\r\n await handleUserAuthenticationErrors(result, dispatch);\r\n \r\n // Log details if the response date has an unexpected format\r\n if( ! result.hasOwnProperty('success') && result.success !== true) {\r\n console.warn('Unexpected ' + statsEndpoint + ' stats response:');\r\n console.warn(result);\r\n return;\r\n }\r\n \r\n // Log the successful collection of stats, if this is enabled based on the configured environment variables\r\n if(\r\n process.env.REACT_APP_ENABLE_STATS_SUCCESS_LOGGING &&\r\n process.env.REACT_APP_ENABLE_STATS_SUCCESS_LOGGING === \"1\"\r\n ) {\r\n console.log(statsEndpoint + ' stats collected successfully');\r\n }\r\n } catch (error) {\r\n // Log any stats collection errors to browser console\r\n console.warn(statsEndpoint + ' stats collection error:');\r\n console.warn(error);\r\n }\r\n};","/**\r\n * @todo review & document\r\n */\r\n\r\nimport {initUserLogin, setUserLoginError, userLoggedIn} from \"./user.actions\";\r\nimport { extractFormattedUserData } from './extractFormattedUserData';\r\nimport { sendStatsToApi } from '../general/sendStatsToApi';\r\nimport { setCookie } from '../general/cookieStorage';\r\n\r\nexport const loginUser = async (username, password, state, dispatch) => {\r\n // Set URL path for REST API request\r\n const apiUrlPath = '/wp-json/jwt-auth/v1/token/';\r\n \r\n dispatch(initUserLogin());\r\n \r\n try {\r\n if(username.length === 0 || password.length === 0) {\r\n throw new Error(state.config.data.text.login_empty_field_message);\r\n }\r\n \r\n // Wait for JSON data response to be retrieved from URL\r\n const response = await fetch(apiUrlPath, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(\r\n {\r\n username: username,\r\n password: password\r\n })\r\n });\r\n const result = await response.json();\r\n \r\n if( ! result.hasOwnProperty('token') || result.token.length === 0) {\r\n throw new Error(state.config.data.text.login_error_message);\r\n }\r\n \r\n // Convert retrieved data into expected format\r\n const userData = extractFormattedUserData(username, result);\r\n \r\n // Store the resulting user data, so the user can be logged in automatically in future\r\n const encodedUserData = encodeURIComponent(JSON.stringify(userData));\r\n setCookie('wellonlinepwa_user', encodedUserData, 90);\r\n \r\n dispatch(userLoggedIn(userData));\r\n \r\n // Send user login stats to the WP REST API\r\n sendUserLoginStatsToApi(userData.token, dispatch);\r\n } catch (error) {\r\n // Update app state to indicate that errors occurred when logging in the user\r\n dispatch(setUserLoginError(error.message));\r\n // Log any errors to browser console\r\n console.error(error);\r\n }\r\n};\r\n\r\n/**\r\n * If the user logged in successfully, send user login stats back to the WP REST API, using the separate\r\n * `sendStatsToApi()` function. This is implemented via a separate API request, to allow the user login\r\n * statistics to be collected seamlessly, without affecting other app functionality.\r\n *\r\n * @param {string} userToken\r\n * JSON Web Token (JWT), so the server can identify which user to collect statistics for\r\n * @param {function} dispatch\r\n * Dispatch function to use to update global application state if an authentication error response was returned\r\n *\r\n * @returns {Promise}\r\n */\r\nconst sendUserLoginStatsToApi = (userToken, dispatch) => {\r\n const loginData = {\r\n logged_in: true\r\n }\r\n \r\n sendStatsToApi(loginData, 'login', userToken, dispatch);\r\n};","/**\r\n * The functions in this file retrieve the correct contact details to display within a component, based on the\r\n * relevant data stored within the app state for the current user and/or the overall site.\r\n *\r\n * Please see the comment blocks above each function for further details.\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\n/**\r\n * Get the correct contact phone number. This will be based on the company phone number that is stored for the\r\n * current user if this is available, or the default phone number stored for the overall website if not.\r\n *\r\n * @param {Object} state\r\n * Object containing the current overall app state. This can be retrieved from the AppContext.\r\n *\r\n * @returns {string}\r\n * The resulting phone number.\r\n */\r\nexport function getContactPhoneNumber(state) {\r\n return state.user.data.company_phone.length > 0 ? state.user.data.company_phone : state.config.data.default_phone;\r\n}\r\n\r\n/**\r\n * Get the correct Next Generation Text (NGT) number. This will be based on the company NGT number that is stored\r\n * for the current user if this is available, or the default NGT number stored for the overall website if not.\r\n *\r\n * @param {Object} state\r\n * Object containing the current overall app state. This can be retrieved from the AppContext.\r\n *\r\n * @returns {string}\r\n * The resulting NGT number.\r\n */\r\nexport function getNextGenerationTextNumber(state) {\r\n return state.user.data.company_ngt_no.length > 0 ?\r\n state.user.data.company_ngt_no : state.config.data.default_ngt_no;\r\n}\r\n\r\n/**\r\n * Get the correct contact phone number, in a format that browsers will recognise as a URL (and thus allow the user\r\n * to call the relevant number). A 'tel:' prefix is added to the start of the phone number, and any spaces will be\r\n * stripped out. For example, if the phone number is '0800 0384 9382', the string 'tel:080003849382' is returned.\r\n *\r\n * The retrieved phone number URL will be based on the company phone number that is stored for the current user if\r\n * this is available, or the default phone number stored for the overall website if not. If no phone number can be\r\n * retrieved at all, an empty string is returned.\r\n *\r\n * @param {Object} state\r\n * Object containing the current overall app state. This can be retrieved from the AppContext.\r\n *\r\n * @returns {string}\r\n * The resulting phone number URL, or an empty string if a phone number cannot be retrieved.\r\n */\r\nexport function getContactPhoneUrl(state) {\r\n const phone = getContactPhoneNumber(state);\r\n return phone ? 'tel:' + phone.replace(/\\s/g,'') : '';\r\n}\r\n\r\n/**\r\n * Get the correct contact email address. This will be based on the company email address that is stored for the\r\n * current user if this is available, or the default email address stored for the overall website if not.\r\n *\r\n * @param {Object} state\r\n * Object containing the current overall app state. This can be retrieved from the AppContext.\r\n *\r\n * @returns {string}\r\n * The resulting email address.\r\n */\r\nexport function getContactEmailAddress(state) {\r\n return state.user.data.company_email.length > 0 ? state.user.data.company_email : state.config.data.default_email;\r\n}","import {\r\n getContactEmailAddress,\r\n getContactPhoneNumber,\r\n getContactPhoneUrl,\r\n getNextGenerationTextNumber\r\n} from './getContactDetails';\r\n\r\n/**\r\n * This function provides the ability to dynamically replace certain 'shortcodes' embedded within a content string\r\n * with some alternative content, which varies depending on the shortcode.\r\n *\r\n * This concept is based on the similar shortcodes functionality built into WordPress - see:\r\n * https://codex.wordpress.org/shortcode\r\n *\r\n * Only certain custom Well Online-specific shortcodes are supported by this functionality; all other shortcodes\r\n * are already processed by WordPress itself on the server-side before the content is sent via the REST API to\r\n * this app. These custom shortcodes are instead implemented here on the client-side, to avoid rare conflicts with\r\n * the multi-site content retrieval functionality that would occur if they were implemented on the server-side.\r\n *\r\n * The custom shortcodes supported by this functionality are:\r\n *\r\n * [WELLONLINE_PHONE_NO] - this is replaced with a link containing the correct contact phone number for this user/site\r\n * [WELLONLINE_NGT_NUMBER] - this is replaced with the correct Next Generation Text (NGT) number for this user/site\r\n * [WELLONLINE_EMAIL] - this is replaced with a link containing the correct contact email address for this user/site\r\n *\r\n * ----------\r\n * - Usage: -\r\n * ----------\r\n *\r\n * 1. Import this function at the top of any component that needs to render content that may contain shortcodes:\r\n *\r\n * import { handleContentShortcodes } from '../../helpers/handleContentShortcodes';\r\n *\r\n * 2. Add code similar to this to the component (this code will replace shortcodes within the current page content\r\n * retrieved from the app state):\r\n *\r\n * const content = handleContentShortcodes(app.page.data.content, state);\r\n *\r\n * 3. Render the content using the 'sanitiseHtml()' helper function (see that function for full usage instructions):\r\n *\r\n *
\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n *\r\n * @param {string} content\r\n * A string of content that may contain custom shortcodes. This content string has probably been obtained\r\n * from a WP REST API response.\r\n * @param {Object} state\r\n * Object containing the current overall app state. This can be retrieved from the AppContext.\r\n *\r\n * @returns {string}\r\n * The resulting content, after all applicable shortcodes have been replaced. This content may include HTML\r\n * which later needs to be sanitised using a separate function in the `sanitiseHtml` helper file.\r\n */\r\nexport function handleContentShortcodes(content, state) {\r\n let processedContent = content;\r\n if( ! processedContent) {\r\n return '';\r\n }\r\n \r\n processedContent = processedContent.replace(\r\n /\\[WELLONLINE_PHONE_NO]/g,\r\n getPhoneLink(state)\r\n );\r\n \r\n processedContent = processedContent.replace(\r\n /\\[WELLONLINE_NGT_NUMBER]/g,\r\n getNgtNo(state)\r\n );\r\n \r\n processedContent = processedContent.replace(\r\n /\\[WELLONLINE_EMAIL]/g,\r\n getEmailLink(state)\r\n );\r\n \r\n return processedContent;\r\n}\r\n\r\n/**\r\n * This function provides the ability to dynamically replace certain additional 'shortcodes' embedded within a\r\n * content string with some alternative content, which varies depending on the shortcode.\r\n *\r\n * This concept is based on the similar shortcodes functionality built into WordPress - see:\r\n * https://codex.wordpress.org/shortcode\r\n *\r\n * Only certain custom Well Online-specific shortcodes are supported by this functionality; all other shortcodes\r\n * are already processed by WordPress itself on the server-side before the content is sent via the REST API to\r\n * this app, and/or by the separate handleContentShortcodes() function included within these file. These\r\n * additional custom shortcodes are instead implemented here, because otherwise the resulting HTML would be\r\n * stripped out by the client-side HTML sanitisation mechanism.\r\n *\r\n * The custom shortcodes supported by this functionality are:\r\n *\r\n * [NHS_LIVE_WELL_FEED] - this is replaced with an iframe containing trusted content from an NHS website (using a\r\n * specified predefined external URL which is not dynamically adjusted).\r\n *\r\n * -------------------\r\n * - IMPORTANT NOTE: -\r\n * -------------------\r\n *\r\n * This shortcode handling mechanism does mean that some unsanitised HTML content could potentially be rendered within\r\n * the user's browser. Thus support for any additional custom shortcodes should only be added if there is a high level\r\n * of confidence that the relevant content is safe, and is unlikely to be abused by malicious users to inject\r\n * dangerous content.\r\n *\r\n * We recommend using this function in conjunction with the separate sanitiseHtmlWithShortcodes() function in the\r\n * `sanitiseHtml` helper file, to ensure that content is sanitised to the maximum extent possible. Please see the\r\n * comments at the top of that function for usage instructions...\r\n *\r\n * @param {string} sanitisedContent\r\n * A string of content that may contain custom shortcodes. This content string has probably been obtained\r\n * from a WP REST API response, and should have already been sanitised using one of the functions in the\r\n * separate `sanitiseHtml` helper file.\r\n *\r\n * @returns {string}\r\n * The resulting content, after all applicable shortcodes have been replaced. NOTE: Any replaced content has not\r\n * been sanitised, so should only be rendered if there is a high level of confidence that the content is safe!\r\n */\r\nexport function handleExtraContentShortcodes(sanitisedContent) {\r\n let processedContent = sanitisedContent;\r\n if( ! processedContent) {\r\n return '';\r\n }\r\n \r\n processedContent = processedContent.replace(\r\n /\\[NHS_LIVE_WELL_FEED]/g,\r\n ''\r\n );\r\n \r\n return processedContent;\r\n}\r\n\r\n/**\r\n * Output a link containing the correct contact phone number. The link URL will be in URL format (i.e. prefixed\r\n * with 'tel:', and with all spaces stripped out), so that the user can call the number by clicking/tapping on the\r\n * link, whereas the link text will contain the phone number in the original unmodified format.\r\n *\r\n * This function is intended for usage when replacing the '[WELLONLINE_PHONE_NO]' shortcode within some content.\r\n *\r\n * This displayed phone number will be based on the company phone number that is stored for the current user if\r\n * this is available, or the default phone number stored for the overall website if not. If the phone number is\r\n * not available at all, the original unmodified '[WELLONLINE_PHONE_NO]' shortcode is returned instead.\r\n *\r\n * @param {Object} state\r\n * Object containing the current overall app state. This can be retrieved from the AppContext.\r\n *\r\n * @returns {string}\r\n * A link containing the contact phone number if available, or '[WELLONLINE_PHONE_NO]' if not.\r\n */\r\nfunction getPhoneLink(state) {\r\n const defaultText = '[WELLONLINE_PHONE_NO]';\r\n if(state.config.data.display_phone === 'no') {\r\n return defaultText;\r\n }\r\n \r\n const phone = getContactPhoneNumber(state);\r\n const phoneUrl = getContactPhoneUrl(state);\r\n \r\n return (phone && phoneUrl) ? '' + phone + '' : defaultText;\r\n}\r\n\r\n/**\r\n * Output a link containing the correct contact email address. The link URL will be in URL format (i.e. prefixed\r\n * with 'mailto:'), so that the user can send an email by clicking/tapping on the link, whereas the link text will\r\n * contain the email address in the original unmodified format.\r\n *\r\n * This function is intended for usage when replacing the '[WELLONLINE_EMAIL]' shortcode within some content.\r\n *\r\n * This displayed email address will be based on the company email address that is stored for the current user if\r\n * this is available, or the default email address stored for the overall website if not. If the email address is\r\n * not available at all, the original unmodified '[WELLONLINE_EMAIL]' shortcode is returned instead.\r\n *\r\n * @param {Object} state\r\n * Object containing the current overall app state. This can be retrieved from the AppContext.\r\n *\r\n * @returns {string}\r\n * A link containing the contact email address if available, or '[WELLONLINE_EMAIL]' if not.\r\n */\r\nfunction getEmailLink(state) {\r\n const defaultText = '[WELLONLINE_EMAIL]';\r\n if(state.config.data.display_email === 'no') {\r\n return defaultText;\r\n }\r\n \r\n const email = getContactEmailAddress(state);\r\n \r\n return email ? '' + email + '' : defaultText;\r\n}\r\n\r\n/**\r\n * Output the correct Next Generation Text (NGT) number.\r\n *\r\n * This function is intended for usage when replacing the '[WELLONLINE_NGT_NUMBER]' shortcode within some content.\r\n *\r\n * This displayed phone number will be based on the company NGT number that is stored for the current user if\r\n * this is available, or the default NGT number stored for the overall website if not. If the NGT number is\r\n * not available at all, the original unmodified '[WELLONLINE_NGT_NUMBER]' shortcode is returned instead.\r\n *\r\n * @param {Object} state\r\n * Object containing the current overall app state. This can be retrieved from the AppContext.\r\n *\r\n * @returns {string}\r\n * A link containing the NGT number if available, or '[WELLONLINE_NGT_NUMBER]' if not.\r\n */\r\nfunction getNgtNo(state) {\r\n const ngtNo = getNextGenerationTextNumber(state);\r\n return ngtNo ? ngtNo : '[WELLONLINE_NGT_NUMBER]';\r\n}","import dompurify from 'dompurify';\r\nimport { handleContentShortcodes, handleExtraContentShortcodes } from './handleContentShortcodes';\r\n\r\n/**\r\n * This function sanitises the specified HTML, so that it can be rendered more safely by the browser, using React's\r\n * 'dangerouslySetInnerHTML' attribute (see https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml) -\r\n * helping to protect against XSS attacks.\r\n *\r\n * The function is intended for rendering HTML which has retrieved from an external source (e.g. WP's REST API),\r\n * and should be used in conjunction with sanitisation measures implemented on the server side.\r\n *\r\n * ----------\r\n * - Usage: -\r\n * ----------\r\n *\r\n * 1. Import this function at the top of any React component file that needs to render HTML from an external source:\r\n *\r\n * import {sanitiseHtml} from \"../helpers/sanitiseHtml\";\r\n *\r\n * 2. Add this code within the component - the browser will render the HTML contained in the 'originalHtml' variable:\r\n *\r\n *
\r\n *\r\n * ----------\r\n * - Notes: -\r\n * ----------\r\n *\r\n * This function currently uses the 'DOMPurify' JS library to perform the HTML sanitisation - see:\r\n * https://github.com/cure53/DOMPurify\r\n *\r\n * See https://github.com/cure53/DOMPurify/wiki/Security-Goals-&-Threat-Model for more details about how DOMPurify\r\n * is designed to work, including any associated limitations.\r\n *\r\n * See also https://dev.to/jam3/how-to-prevent-xss-attacks-when-using-dangerouslysetinnerhtml-in-react-1464\r\n * for info on using the DOMPurify library with React.\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n *\r\n * @param {string} rawHtml\r\n * The raw HTML from an external source which needs to be sanitised\r\n *\r\n * @returns {{__html: string}}\r\n * The sanitised HTML, converted into a format designed to work with React's 'dangerouslySetInnerHTML' attribute\r\n */\r\nexport function sanitiseHtml(rawHtml) {\r\n return {\r\n __html: sanitise(rawHtml)\r\n };\r\n}\r\n\r\n/**\r\n * This function sanitises the specified HTML, so that it can be rendered more safely by the browser, using React's\r\n * 'dangerouslySetInnerHTML' attribute (see https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml) -\r\n * helping to protect against XSS attacks. Any custom 'shortcodes' within the content will automatically be replaced\r\n * with the correct alternative content.\r\n *\r\n * The function is intended for rendering HTML which has retrieved from an external source (e.g. WP's REST API),\r\n * and should be used in conjunction with sanitisation measures implemented on the server side. The shortcode\r\n * handling mechanism includes support for certain 'whitelisted' content (e.g. embedded iframes that load content\r\n * from predefined trusted third parties) which would otherwise be stripped out by the sanitisation mechanism.\r\n *\r\n * ----------\r\n * - Usage: -\r\n * ----------\r\n *\r\n * 1. Import this function at the top of any React component file that needs to render HTML from an external source:\r\n *\r\n * import { sanitiseHtmlWithShortcodes } from \"../helpers/sanitiseHtml\";\r\n *\r\n * 2. Add this code within the component - the browser will render the HTML contained in the 'originalHtml' variable,\r\n * using the passed in app state to ensure that any shortcodes will be replaced with the correct content:\r\n *\r\n *
\r\n *\r\n * ----------\r\n * - Notes: -\r\n * ----------\r\n *\r\n * This function currently uses the 'DOMPurify' JS library to perform the HTML sanitisation - see:\r\n * https://github.com/cure53/DOMPurify\r\n *\r\n * See https://github.com/cure53/DOMPurify/wiki/Security-Goals-&-Threat-Model for more details about how DOMPurify\r\n * is designed to work, including any associated limitations.\r\n *\r\n * See also https://dev.to/jam3/how-to-prevent-xss-attacks-when-using-dangerouslysetinnerhtml-in-react-1464\r\n * for info on using the DOMPurify library with React.\r\n *\r\n * The shortcode handling mechanism does mean that some unsanitised HTML content could potentially be rendered within\r\n * the user's browser. Thus support for custom shortcodes should only be added when there is a high level of confidence\r\n * that the relevant content is safe, and is unlikely to be abused by malicious users to inject dangerous content.\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n *\r\n * @param {string} rawHtml\r\n * The raw HTML from an external source which needs to be sanitised\r\n * @param {Object} state\r\n * Object containing the current overall app state. This can be retrieved from the AppContext.\r\n *\r\n * @returns {{__html: string}}\r\n * The sanitised HTML, with any custom shortcodes processed, converted into a format designed to work with\r\n * React's 'dangerouslySetInnerHTML' attribute\r\n */\r\nexport function sanitiseHtmlWithShortcodes(rawHtml, state) {\r\n // Handle any standard content shortcodes supported by this app\r\n const content = handleContentShortcodes(rawHtml, state);\r\n \r\n // Sanitise the HTML content\r\n const sanitisedContent = sanitise(content);\r\n \r\n /* Handle any additional shortcodes where the resulting content would otherwise be stripped by the sanitiser;\r\n then convert into a format that will work in a React component */\r\n return {\r\n __html: handleExtraContentShortcodes(sanitisedContent)\r\n };\r\n}\r\n\r\n/**\r\n * This function sanitises the specified HTML, so that it can subsequently be rendered more safely by the browser -\r\n * helping to protect against XSS attacks. Please instead use the sanitiseHtml() function contained within this file\r\n * if you need to use the resulting HTML directly within a React component.\r\n *\r\n * The function is intended for sanitising HTML which has retrieved from an external source (e.g. WP's REST API),\r\n * and should be used in conjunction with sanitisation measures implemented on the server side.\r\n *\r\n * ------------------\r\n * - Usage Example: -\r\n * ------------------\r\n *\r\n * import {sanitise} from \"../helpers/sanitiseHtml\";\r\n *\r\n * const sanitisedHTML = sanitise(originalHtml);\r\n *\r\n * ----------\r\n * - Notes: -\r\n * ----------\r\n *\r\n * This function currently uses the 'DOMPurify' JS library to perform the HTML sanitisation - see:\r\n * https://github.com/cure53/DOMPurify. It is intended to be used as a wrapper function, to allow the sanitisation\r\n * library and/or mechanism to be updated more easily if required in the future, without the need to update other\r\n * app components that utilise this functionality.\r\n *\r\n * See https://github.com/cure53/DOMPurify/wiki/Security-Goals-&-Threat-Model for more details about how DOMPurify\r\n * is designed to work, including any associated limitations.\r\n *\r\n * Usage Example:\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n *\r\n * @param {string} rawContent\r\n * The raw HTML content from an external source which needs to be sanitised\r\n * @returns {string}\r\n * The resulting sanitised HTML\r\n */\r\nexport function sanitise(rawContent) {\r\n return dompurify.sanitize(rawContent);\r\n}","/**\r\n * @todo review & document\r\n */\r\n\r\nimport React from 'react';\r\nimport { IonGrid, IonImg, isPlatform } from '@ionic/react';\r\n\r\nimport './TopBanner.css';\r\n\r\nimport { sanitiseHtml } from '../helpers/sanitiseHtml';\r\n\r\nexport const TopBanner = ({\r\n image,\r\n title,\r\n link,\r\n useH1\r\n}) => {\r\n \r\n const onBannerClick = () => {\r\n // Don't navigate anywhere if a banner link was not specified\r\n if( ! link ) {\r\n return;\r\n }\r\n \r\n // Update window.location, because we don't have enough data about the link to transition more gracefully\r\n window.location = link;\r\n }\r\n \r\n return (\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n {useH1 !== false ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n \r\n};","/**\r\n * @todo review & document\r\n */\r\nimport React, { useContext, useRef, useState } from 'react';\r\nimport {\r\n IonButton,\r\n IonContent,\r\n IonPage,\r\n IonList,\r\n IonItem,\r\n IonLabel,\r\n IonInput,\r\n IonLoading,\r\n IonGrid,\r\n IonHeader,\r\n IonToolbar,\r\n IonText\r\n} from '@ionic/react';\r\n\r\nimport { AppContext } from '../data/AppContext';\r\nimport { loginUser } from '../data/user/loginUser';\r\n\r\nimport { TopBanner } from '../components/TopBanner';\r\n\r\nimport { handleContentShortcodes } from '../helpers/handleContentShortcodes';\r\nimport { sanitiseHtml } from '../helpers/sanitiseHtml';\r\n\r\nimport topBannerPlaceholderImg from '../images/top-banner-default.jpg';\r\n\r\nexport const LoginPage = () => {\r\n const { state, dispatch } = useContext(AppContext);\r\n \r\n const [ username, setUsername ] = useState('');\r\n const [ password, setPassword ] = useState('');\r\n \r\n const formRef = useRef(null);\r\n \r\n const handleSubmit = async e => {\r\n e.preventDefault();\r\n await loginUser(username, password, state, dispatch);\r\n };\r\n \r\n const logo = state.config.data.logo;\r\n const topBannerImg = state.config.data.banner_image ? state.config.data.banner_image : topBannerPlaceholderImg;\r\n const loginPageText = handleContentShortcodes(state.config.data.text.login_page, state);\r\n \r\n return (\r\n \r\n \r\n \r\n {logo && (\r\n

\r\n \"Well\r\n

\r\n )}\r\n
\r\n
\r\n \r\n {topBannerImg && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {loginPageText && (\r\n

\r\n )}\r\n \r\n {state.user.loginErrors.length > 0 && (\r\n

\r\n {state.user.loginErrors}\r\n

\r\n ) }\r\n \r\n
\r\n \r\n \r\n \r\n {state.config.data.text.username_field_label} *\r\n \r\n setUsername(e.currentTarget.value)}\r\n />\r\n \r\n \r\n \r\n {state.config.data.text.password_field_label} *\r\n \r\n setPassword(e.currentTarget.value)}\r\n />\r\n \r\n \r\n

\r\n {state.config.data.text.login_title}\r\n

\r\n
\r\n \r\n
\r\n
\r\n
\r\n );\r\n};","/**\r\n * The functions in this file extract page path information based on a supplied page URL or path.\r\n * Please see the comment blocks above each function for further details.\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\n/**\r\n * Attempt to extract the path of an app page from the supplied URL.\r\n *\r\n * The page path is the main page URL, but excluding the http(s):// and the current site domain from the start.\r\n * For example: '/work-life/bullying/'.\r\n *\r\n * An error will be thrown if this is unsuccessful.\r\n *\r\n * @param {string} url\r\n * The full URL of a page, including http(s):// and the current site domain\r\n *\r\n * @returns {string}\r\n * The resulting page path, e.g. /work-life/bullying/\r\n *\r\n * @throws {Error}\r\n * If the page path cannot be extracted successfully\r\n */\r\nexport function getPagePathFromUrl(url) {\r\n if(url.indexOf(\"http\") !== 0) {\r\n throw new Error('Unexpected URL format');\r\n }\r\n \r\n // Attempt to extract page path from URL, stripping 'http(s)://' and site domain from the start\r\n const pagePathStartIndex = url.indexOf(\"/\", 8);\r\n if(pagePathStartIndex === -1) {\r\n throw new Error('Unexpected page permalink format');\r\n }\r\n return getFullPagePathIncSlashes(url.substring(pagePathStartIndex));\r\n}\r\n\r\n/**\r\n * Attempt to extract the path of the root page in the current site section, based on the supplied full page path.\r\n *\r\n * This is based on the assumption that the section root page path will be the first segment of the URL up to\r\n * to the second forward slash, e.g. if the supplied page path is '/work-life/bullying/', the section root page\r\n * path will be '/work-life/'.\r\n *\r\n * An error will be thrown if the section root path cannot be extracted successfully.\r\n *\r\n * @param {string} pagePath\r\n * The full path of a page, e.g. /work-life/bullying/\r\n *\r\n * @returns {string}\r\n * The path of the section root page, e.g. /work-life/\r\n *\r\n * @throws {Error}\r\n * If the section root page path cannot be extracted successfully\r\n */\r\nexport function getSectionRootPath(pagePath) {\r\n // Prepend and/or append '/' to page path if it is not present already, to ensure consistency\r\n const fullPagePath = getFullPagePathIncSlashes(pagePath);\r\n \r\n // If this is the homepage, simply return the current path as-is, since it is already a section root page\r\n if(fullPagePath === '/') {\r\n return fullPagePath;\r\n }\r\n \r\n // Find out the position of the first forward slash ('/'), not including the one at the beginning of the page path\r\n const rootSectionPathEndIndex = fullPagePath.indexOf(\"/\", 1);\r\n if(rootSectionPathEndIndex === -1) {\r\n throw new Error('Unexpected page path format');\r\n }\r\n \r\n // Extract the section root path from the full page path\r\n return fullPagePath.substring(0, rootSectionPathEndIndex + 1);\r\n}\r\n\r\n/**\r\n * Prepend and/or append a forward slash ('/') to a supplied page path, if forward slashes are not already present\r\n * at the start and end of this path.\r\n *\r\n * This ensures that all page paths follow a consistent format, reducing the risk of errors occurring.\r\n *\r\n * @param {string} pagePath\r\n * The path of a page, which may or not include forward slashes at the start and end, e.g.\r\n * /work-life/bullying/ or\r\n * /work-life/bullying or\r\n * work-life/bullying/ or\r\n * work-life/bullying\r\n *\r\n * @returns {string}\r\n * The full page path including forward slashes at the start and end, e.g. /work-life/bullying/\r\n */\r\nexport function getFullPagePathIncSlashes(pagePath) {\r\n // Prepend '/' to beginning of page path if necessary\r\n if(pagePath.substring(0, 1) !== '/') {\r\n pagePath = '/' + pagePath;\r\n }\r\n \r\n // Append '/' to end of page path if necessary\r\n if(pagePath.substring(pagePath.length - 1) !== '/') {\r\n pagePath = pagePath + '/';\r\n }\r\n \r\n return pagePath;\r\n}\r\n\r\n/**\r\n * Extract page 'slug' from specified page path. The page slug is the string in the final segment of the path, between\r\n * the last 2 forward slashes (a special page slug is used for the homepage however, based on the slug set up for that\r\n * page on the current WP site). The page slug is required to retrieve applicable page data from the WP REST API.\r\n *\r\n * @param {string} pagePath\r\n * Full page path to extract slug from (e.g. '/work-life/bullying/')\r\n * @param {Object} config\r\n * Object containing the current app configuration data\r\n *\r\n * @returns {string}\r\n * Resulting page slug (e.g. 'bullying'), or an empty string if slug cannot be retrieved\r\n */\r\nexport function extractPageSlug(pagePath, config) {\r\n if(pagePath === '/') {\r\n return config.homepage_slug;\r\n }\r\n \r\n const pageSlugStartIndex = pagePath.lastIndexOf(\"/\", pagePath.length - 2) + 1;\r\n if(pageSlugStartIndex === -1) {\r\n return '';\r\n }\r\n return pagePath.substring(pageSlugStartIndex, pagePath.length - 1);\r\n}","/**\r\n * This file contains functionality to extract raw page JSON data (which has already been retrieved e.g. from WP's\r\n * REST API), converting it into a simpler format which can then be used throughout the app. If the raw data cannot\r\n * be extracted/formatted correctly, an error will be thrown - this then needs to be handled elsewhere in the app.\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nimport { pageInitialData, relatedPageInitialData } from './pageData.init';\r\n\r\nimport { getPagePathFromUrl } from '../../helpers/getPagePaths';\r\nimport { extractStandardDataProperties } from '../general/extractStandardDataProperties';\r\n\r\n/**\r\n * This function extracts raw page JSON data (which has already been retrieved e.g. from WP's REST API),\r\n * converting it into a simpler format which can then be used throughout the app. If the raw data cannot\r\n * be extracted/formatted correctly, an error is thrown.\r\n *\r\n * Note that WP's REST API may retrieve multiple pages matching the current page slug. To ensure the correct\r\n * page data is extracted, the expected page path must be passed into this function. This is then matched\r\n * against the full path within the retrieved data for each page. An error is thrown if none of the retrieved\r\n * page paths match this expected path.\r\n *\r\n * @param {array} rawPageData\r\n * Raw page data in JSON format. This may have been retrieved e.g. from WP's REST API.\r\n * @param {string} expectedPagePath\r\n * Full path of expected page (e.g. '/work-life/bullying/'). This is used to ensure the correct page data\r\n * can extracted if data for multiple pages was retrieved.\r\n * @returns {Object}\r\n * Formatted page data which can be used throughout the app as required.\r\n *\r\n * @throws {Error}\r\n * If the page data cannot be extracted/formatted successfully\r\n */\r\nexport const extractFormattedPageData = (rawPageData, expectedPagePath) => {\r\n // Check if data for any pages has been retrieved\r\n if( ! rawPageData || rawPageData.length === 0) {\r\n throw new Error('No page data can be retrieved. This page may not exist?');\r\n }\r\n \r\n // Loop through the retrieved data for each page, so data can be extracted for the correct page (if applicable)\r\n for(let i = 0; i < rawPageData.length; i++) {\r\n // Get the raw data relating to the current retrieved page\r\n let curPageData = rawPageData[i];\r\n \r\n // Attempt to extract the page path from the current page data\r\n const curPagePath = extractPagePath(curPageData);\r\n \r\n // Skip the data for this page if it does not match the expected page path\r\n if(curPagePath !== expectedPagePath) {\r\n continue;\r\n }\r\n \r\n // Data for a page with a matching path has been extracted. Return formatted data for this page.\r\n return formatCurrentPageData(curPageData);\r\n }\r\n \r\n // Throw an error only if none of the retrieved pages have a path matching the expected path.\r\n throw new Error('No pages matching the current page path can be retrieved.');\r\n};\r\n\r\n/**\r\n * This function converts the raw JSON data which has already been retrieved for the current page\r\n * (e.g. from WP's REST API) into a simpler format which can then be used throughout the app.\r\n *\r\n * If the raw data cannot be extracted/formatted correctly, an error is thrown.\r\n *\r\n * @param {Object} rawPageData\r\n * Raw data for the current page in JSON format. This may have been retrieved e.g. from WP's REST API.\r\n * @returns {Object}\r\n * Formatted data for the current page, which can be used throughout the app as required.\r\n *\r\n * @throws {Error}\r\n * If the current page data cannot be formatted successfully\r\n */\r\nfunction formatCurrentPageData(rawPageData) {\r\n // Check that all the required page data properties exist in the raw data\r\n if( ! rawPageData.hasOwnProperty('id') || ! rawPageData.id) {\r\n throw new Error('Unexpected page data format: ID not specified.');\r\n }\r\n if(\r\n ! rawPageData.hasOwnProperty('title') ||\r\n ! rawPageData.title ||\r\n ! rawPageData.title.hasOwnProperty('rendered')\r\n ) {\r\n throw new Error('Unexpected page data format: Title not specified.');\r\n }\r\n if( ! rawPageData.hasOwnProperty('wellonline_content')) {\r\n throw new Error('Unexpected page data format: Content not specified.');\r\n }\r\n if( ! rawPageData.hasOwnProperty('template')) {\r\n throw new Error('Unexpected page data format: Template not specified.');\r\n }\r\n \r\n /* Extract all of the standard page data properties supported by the app from the raw data,\r\n skipping those properties that require their own dedicated data extraction mechanism. */\r\n const relatedPageProperties = ['child_pages', 'sibling_pages', 'ancestor_pages', 'featured_topics'];\r\n const skipProperties = ['id', 'title', 'template', ...relatedPageProperties];\r\n const formattedPageData = extractStandardDataProperties(\r\n rawPageData, pageInitialData, skipProperties, 'wellonline_'\r\n );\r\n \r\n // Attempt to get the page ID & title from the raw page data.\r\n formattedPageData.id = rawPageData.id;\r\n formattedPageData.title = rawPageData.title.rendered ? rawPageData.title.rendered : '';\r\n \r\n // Attempt to get the page template from the raw page data.\r\n formattedPageData.template = extractFormattedPageTemplateName(rawPageData.template);\r\n \r\n // Extract formatted data about related pages from the raw data\r\n for(let i = 0; i < relatedPageProperties.length; i++) {\r\n let curRelatedPageProperty = relatedPageProperties[i];\r\n \r\n // Skip if no data exists for this type of related page\r\n if( ! rawPageData.hasOwnProperty('wellonline_' + curRelatedPageProperty) ) {\r\n continue;\r\n }\r\n \r\n let rawRelatedPageData = rawPageData['wellonline_' + curRelatedPageProperty];\r\n formattedPageData[curRelatedPageProperty] = extractRelatedPagesData(rawRelatedPageData);\r\n }\r\n \r\n return formattedPageData;\r\n}\r\n\r\n/**\r\n * This function converts raw retrieved JSON data containing details about related pages into a simpler format\r\n * which can then be used throughout the app. Related pages may include child pages, sibling pages etc.\r\n *\r\n * If the raw data cannot be extracted/formatted correctly, an error is thrown.\r\n *\r\n * @param {array} rawRelatedPagesData\r\n * Raw data containing details of related pages in JSON format. This may have been retrieved via WP's REST API.\r\n * @returns {array}\r\n * Formatted data for the related pages, which can be used throughout the app as required.\r\n *\r\n * @throws {Error}\r\n * If the related page data cannot be formatted successfully\r\n */\r\nconst extractRelatedPagesData = (rawRelatedPagesData) => {\r\n const formattedPagesData = [];\r\n \r\n // Check if data for any related pages has been retrieved. Return empty array if not.\r\n if( ! rawRelatedPagesData || rawRelatedPagesData.length === 0) {\r\n return formattedPagesData;\r\n }\r\n \r\n // Loop through the retrieved data for each page, so data can be extracted for the correct page (if applicable)\r\n for(let i = 0; i < rawRelatedPagesData.length; i++) {\r\n // Get the raw data relating to the current retrieved page\r\n let rawCurPageData = rawRelatedPagesData[i];\r\n \r\n // Check that all the required page data properties exist in the raw data\r\n if( ! rawCurPageData.hasOwnProperty('id') || ! rawCurPageData.id) {\r\n throw new Error('Unexpected related page data format: ID not specified.');\r\n }\r\n if( ! rawCurPageData.hasOwnProperty('title') ) {\r\n throw new Error('Unexpected related page data format: Title not specified.');\r\n }\r\n \r\n /* Extract all of the standard related page data properties supported by the app from the raw data,\r\n skipping those properties that require their own dedicated data extraction mechanism. */\r\n const skipProperties = ['link', 'template'];\r\n const formattedCurPageData = extractStandardDataProperties(\r\n rawCurPageData, relatedPageInitialData, skipProperties\r\n );\r\n \r\n // Attempt to extract the page link path from the raw page data\r\n formattedCurPageData.link = extractPagePath(rawCurPageData);\r\n \r\n // Extract the page template if available\r\n if(rawCurPageData.hasOwnProperty('template')) {\r\n formattedCurPageData.template = extractFormattedPageTemplateName(rawCurPageData.template);\r\n }\r\n \r\n formattedPagesData.push(formattedCurPageData);\r\n }\r\n \r\n return formattedPagesData;\r\n};\r\n\r\n/**\r\n * This function extracts the page path from the supplied page data.\r\n *\r\n * The page path is the main page URL, but excluding the http(s):// and the current site domain from the start.\r\n * For example: '/work-life/bullying/'.\r\n *\r\n * @param {Object} pageData\r\n * Raw data containing details of the specified page in JSON format. This may have been retrieved via WP's\r\n * REST API. This JSON object must include a 'link' property containing the full page URL.\r\n * @returns {string}\r\n * The extracted page path\r\n *\r\n * @throws {Error}\r\n * If the page path cannot be extracted successfully based on the supplied page data\r\n */\r\nexport const extractPagePath = (pageData) => {\r\n // Make sure that the raw data for this page has a valid 'link' property\r\n if( ! pageData.hasOwnProperty('link') || ! pageData.link) {\r\n throw new Error('Unexpected page data format: Unknown page permalink path');\r\n }\r\n \r\n // Attempt to extract page path from 'link' property, stripping 'http(s)://' and site domain from the start\r\n return getPagePathFromUrl(pageData.link);\r\n};\r\n\r\n/**\r\n * This function extracts the formatted page template name based on the supplied template name string\r\n *\r\n * The '.php' suffix is stripped from the end of the original template name if present. If no template name\r\n * was specified explicitly in the raw data, the template template name is used instead: 'page-topic'\r\n *\r\n * @param {string} template\r\n * Original raw page template name. This may have been retrieved for a page via WP's REST API.\r\n * @returns {string}\r\n * The resulting formatted page template name\r\n */\r\nexport const extractFormattedPageTemplateName = (template) => {\r\n return template !== '' ? template.replace('.php', '') : 'page-topic';\r\n};","/**\r\n * This file implements functionality to retrieve page data in JSON format from WP's REST API.\r\n *\r\n * Page-related information (including whether data is still being loaded, whether any errors were encountered,\r\n * and the latest retrieved page data) is stored within the overall application state (see 'data/state.js'),\r\n * and can therefore be retrieved from anywhere in the app where needed.\r\n *\r\n * If the page data is retrieved successfully, page visit stats are sent back to the WP REST API, using the\r\n * separate `sendStatsToApi()` function. This is implemented via a separate API request, to allow the main\r\n * page data response to be cached via service workers etc, without interfering with stats collection.\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nimport { initPageDataFetch, setPageDataFetchError, setPageDataFetchSuccess } from './page.actions';\r\nimport { extractFormattedPageData } from './extractFormattedPageData';\r\nimport { handleUserAuthenticationErrors } from '../../helpers/handleUserAuthenticationErrors';\r\nimport { extractPageSlug } from '../../helpers/getPagePaths';\r\nimport { sendStatsToApi } from '../general/sendStatsToApi';\r\nimport * as ReactGA from 'react-ga';\r\nimport { sanitise } from '../../helpers/sanitiseHtml';\r\n\r\n/**\r\n * Asynchronous function to retrieve page data in JSON format from the WP REST API.\r\n *\r\n * @param {string} pagePath\r\n * Full page path to retrieve page data for (e.g. '/work-life/bullying/')\r\n * @param {string} userToken\r\n * JSON Web Token (JWT), to ensure user is allowed to access the page data\r\n * @param {Object} config\r\n * Object containing the current app configuration data\r\n * @param {function} dispatch\r\n * Dispatch function to use to update global application state when data retrieval status changes\r\n *\r\n * @returns {Promise}\r\n */\r\nexport const fetchPageDataFromApi = async (pagePath, userToken, config, dispatch) => {\r\n // Set URL path for REST API request\r\n const apiUrlPath = '/wp-json/wp/v2/pages/?slug=';\r\n \r\n // Extract page 'slug' from specified page path, so correct data can be retrieved from API\r\n const pageSlug = extractPageSlug(pagePath, config);\r\n if(pageSlug === '') {\r\n return; // Don't fetch any data if page slug is empty\r\n }\r\n \r\n // Update app state to indicate that page data fetching is in progress\r\n dispatch(initPageDataFetch());\r\n \r\n try {\r\n // Wait for JSON data response to be retrieved from URL\r\n const response = await fetch(apiUrlPath + pageSlug, {\r\n headers: {\r\n authorization: 'Bearer ' + userToken\r\n }\r\n });\r\n const result = await response.json();\r\n \r\n // Handle any errors relating to the authentication of the current user\r\n await handleUserAuthenticationErrors(result, dispatch);\r\n \r\n // Convert retrieved data into expected format\r\n const pageData = extractFormattedPageData(result, pagePath);\r\n \r\n // Update app state to keep track of the successfully retrieved data\r\n dispatch(setPageDataFetchSuccess(pageData));\r\n \r\n // Send page visit stats to the WP REST API\r\n sendPageVisitStatsToApi(pageData.id, userToken, dispatch);\r\n \r\n // Send page visit stats to Google Analytics\r\n if(config.ga_code) {\r\n ReactGA.pageview(window.location.pathname + window.location.search);\r\n }\r\n \r\n // Update page title\r\n if(config.title && pageData.title) {\r\n // Use this method to ensure HTML entities are correctly decoded, whilst minimising security risks\r\n const pageTitle = config.title + ' - ' + pageData.title;\r\n document.querySelector('title').innerHTML = sanitise(pageTitle);\r\n }\r\n } catch (error) {\r\n // Update app state to indicate that errors occurred when retrieving data\r\n dispatch(setPageDataFetchError());\r\n // Log any data retrieval errors to browser console\r\n console.error(error);\r\n }\r\n};\r\n\r\n/**\r\n * If the page data was retrieved successfully, send page visit stats back to the WP REST API, using the\r\n * separate `sendStatsToApi()` function. This is implemented via a separate API request, to allow the main page\r\n * data response to be cached via service workers etc, without interfering with stats collection.\r\n *\r\n * @param {number} pageId\r\n * The ID of the page which has been visited\r\n * @param {string} userToken\r\n * JSON Web Token (JWT), so the server can identify which user to collect statistics for\r\n * @param {function} dispatch\r\n * Dispatch function to use to update global application state if an authentication error response was returned\r\n *\r\n * @returns {Promise}\r\n */\r\nconst sendPageVisitStatsToApi = (pageId, userToken, dispatch) => {\r\n const pageVisitData = {\r\n page_id: pageId\r\n }\r\n \r\n sendStatsToApi(pageVisitData, 'page', userToken, dispatch);\r\n};","/**\r\n * This file contains JS functions to set up the action objects which describe what happens when the app state\r\n * relating to the search functionality is changed, e.g. as a result of retrieving search results from the\r\n * WP REST API (see the 'fetchSearchResultsFromApi()' function). Each action object specifies the action type\r\n * and the associated data which will be used to update the state via the associated reducer (see the\r\n * search.reducer.js file).\r\n *\r\n * This forms part of the simple Redux-like state management pattern for React which is implemented for this app\r\n * using hooks. This solution is based on Ionic's suggested mechanism for managing app state - see:\r\n * https://ionicframework.com/blog/a-state-management-pattern-for-ionic-react-with-react-hooks/\r\n *\r\n * The code below is based on a simplified version of the actions in the 'Ionic Conference App' template (see e.g.\r\n * https://github.com/ionic-team/ionic-react-conference-app/blob/master/src/data/user/user.actions.ts).\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nexport const hideSearchBar = () => (\r\n {\r\n type: 'HIDE_SEARCH_BAR'\r\n }\r\n);\r\n\r\nexport const showSearchBar = () => (\r\n {\r\n type: 'SHOW_SEARCH_BAR'\r\n }\r\n);\r\n\r\nexport const setSearchQuery = (payload) => (\r\n {\r\n type: 'SET_SEARCH_QUERY',\r\n payload: payload\r\n }\r\n);\r\n\r\nexport const initNewSearchResultsFetch = () => (\r\n {\r\n type: 'SEARCH_RESULTS_FETCH_NEW_INIT'\r\n }\r\n);\r\n\r\nexport const initSearchResultsPageFetch = (pageNum) => (\r\n {\r\n type: 'SEARCH_RESULTS_FETCH_PAGE_INIT',\r\n pageNum: pageNum\r\n }\r\n);\r\n\r\nexport const setSearchResultsFetchSuccess = (payload, totalPages) => (\r\n {\r\n type: 'SEARCH_RESULTS_FETCH_SUCCESS',\r\n payload: payload,\r\n totalPages: parseInt(totalPages)\r\n }\r\n);\r\n\r\nexport const setSearchResultsFetchError = () => (\r\n {\r\n type: 'SEARCH_RESULTS_FETCH_ERROR'\r\n }\r\n);\r\n","/**\r\n * Custom React hook to automatically scroll the user back to the top of a content area whilst the content of\r\n * a page is being loaded. This hook also provides functionality to automatically hide the search bar in the header\r\n * after the user has scrolled down a certain distance in the content area when on a mobile device, to maximise the\r\n * amount of visible content. A search button is made visible in the header when this happens, so that the search\r\n * bar can be made visible again if required.\r\n *\r\n * This hook is intended for usage within page components (i.e. React components in the 'pages' folder) that\r\n * contain an `IonContent` component with a `scrollEvents` prop set to TRUE. A boolean value indicating whether\r\n * content is currently loading needs to be passed into this hook - this makes it possible for the hook to be\r\n * used regardless of the mechanism being utilised to load the content. The hook returns a `ref` object (see\r\n * https://reactjs.org/docs/refs-and-the-dom.html), which needs to be assigned to the relevant `IonContent`\r\n * component. An `onScroll` function is also returned; this needs to be assigned to the `onIonScroll` prop of\r\n * the `IonContent` component.\r\n *\r\n * This hook utilises React's useEffect hook to ensure that the auto-scrolling only occurs when the `isLoading`\r\n * parameter value changes. Furthermore, scrolling will only take place if content is still in the process of\r\n * being loaded, to prevent unexpected behaviour when the loading process completes.\r\n *\r\n * The code in this hook is inspired by the sample code at: https://stackoverflow.com/a/58734987\r\n *\r\n * ----------\r\n * - Usage: -\r\n * ----------\r\n *\r\n * You can use this custom hook within page components, by implementing code similar to the below (this example code\r\n * retrieves a property from the app state to find out if content is loading, but other mechanisms could be used):\r\n *\r\n * import { useAutoscrollToTopOnLoad } from '../hooks/useAutoscrollToTopOnLoad';\r\n *\r\n * const MyPage = () => {\r\n * const {state} = useContext(AppContext);\r\n * const {contentRef, onScroll} = useAutoscrollToTopOnLoad(state.page.isLoading);\r\n * return (\r\n * \r\n * \r\n * ...\r\n * \r\n * \r\n * );\r\n * };\r\n *\r\n * @category GenerateUK\r\n * @package wellonline-pwa\r\n * @author Patrick Hathway - Generate UK\r\n */\r\n\r\nimport { useContext, useEffect, useRef } from 'react';\r\nimport { AppContext } from '../data/AppContext';\r\nimport { hideSearchBar } from '../data/search/search.actions';\r\n\r\nexport const useAutoscrollToTopOnLoad = (isLoading) => {\r\n // Set up ref object for the content that will be auto-scrolled\r\n const contentRef = useRef(null);\r\n // Use app context to handle state management & updates\r\n const {state, dispatch} = useContext(AppContext);\r\n // Specify how long (in milliseconds) the scrolling should take.\r\n const scrollDuration = 500;\r\n \r\n // Add behaviour to hide the header search bar when the user has scrolled a certain distance in the content area\r\n function onScroll(e) {\r\n // Specify the minimum scroll distance (in pixels) before the search bar gets hidden\r\n const hideSearchBarMinScrollOffset = 200;\r\n \r\n // Make sure an event object containing the expected properties has been passed to this function\r\n if( ! e.detail || ! e.detail.scrollTop) {\r\n return;\r\n }\r\n \r\n // Don't hide the search bar if this function has already run (i.e. the search button is already visible)\r\n if(state.search.showSearchBtn) {\r\n return;\r\n }\r\n \r\n // If scrolled distance is greater than specified distance, hide search bar and also show search button\r\n if(e.detail.scrollTop > hideSearchBarMinScrollOffset) {\r\n dispatch(hideSearchBar());\r\n }\r\n }\r\n \r\n // Only run this code when the `page.isLoading` app state changes\r\n useEffect(() => {\r\n // Only scroll to top when content is still being loaded, to prevent unexpected behaviour when loading finishes\r\n if(isLoading && contentRef.current && typeof contentRef.current.scrollToTop !== 'undefined') {\r\n contentRef.current.scrollToTop(scrollDuration);\r\n }\r\n }, [isLoading]);\r\n \r\n return {contentRef, onScroll};\r\n};","/**\r\n * This component renders an abstract semi-transparent shape that can be displayed within the background of page\r\n * content, as per the original site designs. The shape can be displayed on either the left or right side of the\r\n * page, higher up or lower down in the content area, and shown or hidden on larger and smaller screens.\r\n *\r\n * The shape is implemented as an SVG file embedded directly within the component code, to allow its appearance,\r\n * positioning, colour, opacity and visibility to be customised via CSS code (a CSS variable is used to adjust\r\n * the shape colour, depending on the configured primary colour for the site being accessed).\r\n *\r\n * Note that the shape is absolutely positioned based on the overall page content height, and thus components\r\n * that embed this component need to be wrapped in a relatively positioned HTML element that surrounds *all* of\r\n * the page content except for the header, footer and breadcrumbs. A
tag is\r\n * appropriate for this purpose. For example:\r\n *\r\n * \r\n *
\r\n * \r\n * \r\n * \r\n *
\r\n *\r\n * \r\n * \r\n *\r\n * \r\n * { // main page content components here... }\r\n * \r\n *
\r\n *