{"version":3,"file":"static/js/67116.5fd96cfb.chunk.js","mappings":"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","sources":["components/AppPage.tsx","components/FocusableHeader.tsx","helpers/queryParamsHook.ts","pages/LoadingPage.tsx","../../../../../../../../../tmp/mct/frontend/node_modules/classnames/index.js"],"sourcesContent":["import { FocusableHeader } from \"./FocusableHeader\";\nimport { ActionType } from \"../@types\";\nimport { useAppContext } from \"../helpers/context-hooks/useAppContext\";\nimport { useRouteMatch } from \"react-router-dom\";\nimport { useQueryParams } from \"../helpers/queryParamsHook\";\nimport { type FC, type ReactNode, useEffect } from \"react\";\n\ninterface WithHeading {\n heading: string;\n headingClass?: string;\n headingId?: string;\n /**\n * Unless the component using `AppPage` isn't either a routed component or part\n * of Enrollment, both of which are scrolled to top by the `ScrollRestoration`\n * component, the `FocusableHeader` will only get focus on mount and not trigger a\n * scroll event. Pass this prop if you actually do want `FocusableHeader` to\n * trigger a scroll event.\n */\n scrollToFocusableHeader?: boolean;\n}\n\ninterface WithoutHeading {\n heading?: never;\n headingClass?: never;\n headingId?: never;\n scrollToFocusableHeader?: never;\n}\n\ntype HeadingProps = WithHeading | WithoutHeading;\n\nexport type AppPageProps = HeadingProps & {\n headerExtension?: ReactNode;\n hideLogin?: boolean;\n subHeading?: ReactNode;\n subHeadingClass?: string;\n outerClassName?: string;\n innerClassName?: string;\n bannerClassName?: string;\n title?: string;\n children: ReactNode;\n};\n\nexport const AppPage: FC<AppPageProps> = props => {\n const {\n headerExtension,\n heading,\n headingClass,\n headingId,\n scrollToFocusableHeader = false,\n subHeading,\n subHeadingClass,\n outerClassName,\n innerClassName,\n title,\n children,\n bannerClassName,\n } = props;\n const { dispatch } = useAppContext();\n const match = useRouteMatch();\n useQueryParams();\n\n useEffect(() => {\n if (title) {\n document.title = title;\n } else if (heading) {\n document.title = heading;\n }\n }, [title, heading]);\n\n useEffect(() => {\n // Trigger only on page load\n dispatch({ type: ActionType.UPDATE_ROUTE_PARAMS, payload: match.params });\n }, []);\n\n return (\n <>\n <div className={`appPage ${outerClassName ? outerClassName : \"\"}`}>\n {headerExtension}\n {(heading || subHeading) && (\n <div\n className={`appPage__banner ${\n bannerClassName ? bannerClassName : \"\"\n }`}\n >\n {heading && (\n <FocusableHeader\n className={headingClass || \"\"}\n id={headingId}\n scrollOnFocus={scrollToFocusableHeader}\n text={heading}\n />\n )}\n {subHeading && (\n <div\n className={\n subHeadingClass || \"ds-text-body--md ds-u-margin-top--1\"\n }\n >\n {subHeading}\n </div>\n )}\n </div>\n )}\n <div\n className={`appPage__content ${innerClassName ? innerClassName : \"\"}`}\n >\n {children}\n </div>\n </div>\n </>\n );\n};\n","import {\n type FC,\n useEffect,\n useRef,\n useContext,\n type ComponentPropsWithoutRef,\n} from \"react\";\nimport classNames from \"classnames\";\nimport { IntlContext, type TranslationKey } from \"../helpers/intlHooks\";\nimport { FormattedMessage } from \"react-intl\";\n\ninterface FocusableHeaderProps\n extends Omit<ComponentPropsWithoutRef<\"h1\">, \"children\"> {\n text:\n | string\n | {\n id: TranslationKey;\n values: ComponentPropsWithoutRef<typeof FormattedMessage>[\"values\"];\n };\n ignoreFocus?: boolean;\n scrollOnFocus?: boolean;\n srOnly?: boolean;\n}\n\nexport const FocusableHeader: FC<FocusableHeaderProps> = ({\n className = \"\",\n id,\n ignoreFocus,\n scrollOnFocus = false,\n srOnly,\n text,\n ...headingProps\n}) => {\n const headingRef = useRef<HTMLHeadingElement>(null);\n const fm = useContext(IntlContext).formatMessage;\n const documentTitle =\n typeof text === \"string\" ? text : fm({ id: text.id }, text.values);\n\n useEffect(() => {\n headingRef.current?.focus({ preventScroll: !scrollOnFocus });\n }, [headingRef, ignoreFocus, scrollOnFocus, text]);\n\n useEffect(() => {\n if (typeof documentTitle === \"string\") {\n document.title = documentTitle;\n } else if (headingRef.current?.textContent) {\n document.title = headingRef.current.textContent;\n }\n }, [documentTitle]);\n\n return (\n <h1\n ref={headingRef}\n className={classNames(className, {\n \"ds-u-visibility--screen-reader\": srOnly,\n })}\n tabIndex={-1}\n id={id}\n {...headingProps}\n >\n {typeof text === \"string\" ? (\n `${text}`\n ) : (\n <>\n <FormattedMessage id={text.id} values={text.values} />\n </>\n )}\n </h1>\n );\n};\n","import { useEffect, useCallback } from \"react\";\nimport {\n type RouteComponentProps,\n useHistory,\n useLocation,\n} from \"react-router-dom\";\nimport URI from \"urijs\";\nimport {\n ActionType,\n UserLanguage,\n type MctYearPartFlag,\n ManagedQueryParameters,\n} from \"../@types\";\nimport {\n getYearPartInfoFromYearPart,\n useCurrentPlanYear,\n useYearPart,\n} from \"./yearFlagHelpers\";\nimport { useAppContext } from \"./context-hooks/useAppContext\";\nimport { parseSearchParams } from \"./objectUtilities\";\nimport { getShouldUpdateSearchYear } from \"./yearHelpers\";\nimport {\n getLanguage as getCmsdsLanguage,\n type Language as CmsdsLanguage,\n setLanguage as setCmsdsLanguage,\n} from \"@cmsgov/design-system\";\n\n/**\n * Manages setting and updating both year and language in the URL and application\n * state, keeping them in sync and ensuring that the year is valid for the currently\n * set year part (evaluated based on the current plan year)\n */\nexport const useQueryParams = (): void => {\n const {\n state: { language: languageInAppState, year: yearInAppState },\n dispatch,\n } = useAppContext();\n const location = useLocation();\n const history = useHistory();\n const { yearPart } = useYearPart();\n const { hash, search } = location;\n const mctCurrentPlanYear = useCurrentPlanYear();\n\n /**\n * Updates the year in URL and/or app state\n * Also sets the language in the URL when updating, so it's not wiped out\n */\n const handleAppYear = useCallback(\n ({\n location,\n mctCurrentPlanYear,\n yearPart,\n }: {\n location: RouteComponentProps[\"location\"];\n mctCurrentPlanYear: number;\n yearPart: MctYearPartFlag;\n }): void => {\n const uri = new URI(location.search);\n const { lang: languageInUrl, year: yearInUrl } = parseSearchParams(\n uri.search(true)\n ) as { [x: string]: string | undefined };\n const { shouldUpdateAppState, shouldUpdateUrl, yearToSet } =\n getShouldUpdateSearchYear({\n mctCurrentPlanYear,\n yearInAppState,\n yearInUrl,\n yearPart,\n });\n if (yearToSet) {\n const shouldPreserveLanguageInUrl =\n languageInUrl &&\n [UserLanguage.ENGLISH, UserLanguage.SPANISH].includes(\n languageInUrl as UserLanguage\n );\n if (shouldUpdateAppState) {\n dispatch({ type: ActionType.UPDATE_YEAR, payload: yearToSet });\n }\n if (shouldUpdateUrl) {\n uri.setQuery(ManagedQueryParameters.YEAR, yearToSet);\n }\n if (shouldPreserveLanguageInUrl) {\n uri.setQuery(ManagedQueryParameters.LANG, languageInUrl);\n }\n if (shouldUpdateUrl || shouldPreserveLanguageInUrl) {\n location.search = uri.search();\n location.hash = new URI().hash(hash || \"\").hash();\n history.replace(location);\n }\n }\n },\n [dispatch, history, yearInAppState, hash]\n );\n\n /**\n * Synchronizes language in URL, `AppState`, and `i18n` helpers for DS components\n * (so OOB translations for components should work with our translation system)\n */\n const handleAppLanguage = useCallback(\n (location: RouteComponentProps[\"location\"]): void => {\n const uri = new URI(location.search);\n const { lang: languageInUrl } = parseSearchParams(uri.search(true)) as {\n [x: string]: string | undefined;\n };\n const cmsdsLanguage = getCmsdsLanguage();\n const htmlLanguage = document.documentElement.getAttribute(\"lang\");\n if (\n languageInUrl &&\n [UserLanguage.ENGLISH, UserLanguage.SPANISH].includes(\n languageInUrl as UserLanguage\n )\n ) {\n if (languageInAppState !== languageInUrl) {\n dispatch({\n type: ActionType.UPDATE_LANGUAGE,\n payload: languageInUrl,\n });\n }\n if (cmsdsLanguage !== languageInUrl) {\n setCmsdsLanguage(languageInUrl as CmsdsLanguage);\n }\n if (htmlLanguage !== languageInUrl) {\n document.documentElement.setAttribute(\"lang\", languageInUrl);\n }\n } else {\n uri.setQuery(ManagedQueryParameters.LANG, languageInAppState);\n location.search = uri.search();\n location.hash = new URI().hash(hash || \"\").hash();\n history.replace(location);\n }\n },\n [dispatch, history, languageInAppState, hash]\n );\n\n /**\n * Watch changes to yearPart and query params and update values in app state and\n * the URL, accordingly\n */\n useEffect(() => {\n const ypFlagsAreDefined = Object.values(\n getYearPartInfoFromYearPart(yearPart)\n ).every(val => val !== undefined);\n if (!ypFlagsAreDefined) {\n return;\n }\n handleAppYear({\n location,\n mctCurrentPlanYear,\n yearPart,\n });\n // The way this hook is structured, we are modifying `location` directly.\n // For this reason, currently, `location` needs to be a dependency on the effects\n // or more accurately these memoized helpers, but adding it causes issues\n // (using up of the JS memory heap, tests never finishing).\n // We should look into using URI to take the existing pathname (new URI(pathname))\n // adding/updating the query (`newLocation.addSearch(...)`), and then passing that to\n // `history.replace` (but this will require ensuring that stringified query params are\n // combined and not replaced)\n // @see MCT-9130\n }, [handleAppYear, mctCurrentPlanYear, search, yearPart]);\n\n useEffect(() => {\n handleAppLanguage(location);\n // @see the note in the other effect helper\n }, [search, handleAppLanguage]);\n};\n","import { AppPage } from \"../components/AppPage\";\n\nexport const LoadingPage = (): JSX.Element => <AppPage>{null}</AppPage>;\n","/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n"],"names":["AppPage","props","headerExtension","heading","headingClass","headingId","scrollToFocusableHeader","subHeading","subHeadingClass","outerClassName","innerClassName","title","children","bannerClassName","dispatch","useAppContext","match","useRouteMatch","useQueryParams","useEffect","document","type","ActionType","UPDATE_ROUTE_PARAMS","payload","params","_jsx","_Fragment","_jsxs","className","FocusableHeader","id","scrollOnFocus","text","_ref","ignoreFocus","srOnly","headingProps","headingRef","useRef","fm","useContext","IntlContext","formatMessage","documentTitle","values","_headingRef$current","current","focus","preventScroll","_headingRef$current2","textContent","ref","classNames","tabIndex","FormattedMessage","state","language","languageInAppState","year","yearInAppState","location","useLocation","history","useHistory","yearPart","useYearPart","hash","search","mctCurrentPlanYear","useCurrentPlanYear","handleAppYear","useCallback","uri","URI","lang","languageInUrl","yearInUrl","parseSearchParams","shouldUpdateAppState","shouldUpdateUrl","yearToSet","getShouldUpdateSearchYear","shouldPreserveLanguageInUrl","UserLanguage","ENGLISH","SPANISH","includes","UPDATE_YEAR","setQuery","ManagedQueryParameters","YEAR","LANG","replace","handleAppLanguage","cmsdsLanguage","getCmsdsLanguage","htmlLanguage","documentElement","getAttribute","UPDATE_LANGUAGE","setCmsdsLanguage","setAttribute","Object","getYearPartInfoFromYearPart","every","val","undefined","LoadingPage","hasOwn","hasOwnProperty","classes","i","arguments","length","arg","appendClass","parseValue","Array","isArray","apply","toString","prototype","key","call","value","newClass","module","exports","default"],"sourceRoot":""}