codeforlife 2.10.1 → 2.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Countdown-ZA68a09m.js → Countdown-BTyB1rrK.js} +3 -3
- package/dist/{Countdown-ZA68a09m.js.map → Countdown-BTyB1rrK.js.map} +1 -1
- package/dist/{Countdown-7-Mzftzr.cjs → Countdown-CyJ-01oU.cjs} +2 -2
- package/dist/{Countdown-7-Mzftzr.cjs.map → Countdown-CyJ-01oU.cjs.map} +1 -1
- package/dist/{Image-KHEjEELP.js → Image-C-f2ChBh.js} +2 -2
- package/dist/{Image-KHEjEELP.js.map → Image-C-f2ChBh.js.map} +1 -1
- package/dist/{Image-mgT45r_B.cjs → Image-CgYjq-tA.cjs} +2 -2
- package/dist/{Image-mgT45r_B.cjs.map → Image-CgYjq-tA.cjs.map} +1 -1
- package/dist/{LinkButton-cfljqSBx.cjs → LinkButton-BOPjG7_2.cjs} +2 -2
- package/dist/{LinkButton-cfljqSBx.cjs.map → LinkButton-BOPjG7_2.cjs.map} +1 -1
- package/dist/{LinkButton-Do07PnhU.js → LinkButton-Bk50AHHg.js} +3 -3
- package/dist/{LinkButton-Do07PnhU.js.map → LinkButton-Bk50AHHg.js.map} +1 -1
- package/dist/{Navigate-Cu8Ge031.cjs → Navigate-C_sgy8Xs.cjs} +2 -2
- package/dist/{Navigate-Cu8Ge031.cjs.map → Navigate-C_sgy8Xs.cjs.map} +1 -1
- package/dist/{Navigate-DC6ag0th.js → Navigate-SL_oMjPc.js} +3 -3
- package/dist/{Navigate-DC6ag0th.js.map → Navigate-SL_oMjPc.js.map} +1 -1
- package/dist/api/endpoints/index.cjs.js +1 -1
- package/dist/api/endpoints/index.es.js +2 -2
- package/dist/api/index.cjs.js +1 -1
- package/dist/api/index.es.js +3 -3
- package/dist/{api-CYqNqtN9.js → api-BvUiTeR7.js} +2 -2
- package/dist/{api-CYqNqtN9.js.map → api-BvUiTeR7.js.map} +1 -1
- package/dist/{api-CnMfjRk3.cjs → api-CaeeoZaI.cjs} +2 -2
- package/dist/{api-CnMfjRk3.cjs.map → api-CaeeoZaI.cjs.map} +1 -1
- package/dist/{auth-C_aSIrwD.cjs → auth-B7Vdot4N.cjs} +2 -2
- package/dist/{auth-C_aSIrwD.cjs.map → auth-B7Vdot4N.cjs.map} +1 -1
- package/dist/{auth-CvJ5Mh6y.js → auth-CQ1InCxP.js} +4 -4
- package/dist/{auth-CvJ5Mh6y.js.map → auth-CQ1InCxP.js.map} +1 -1
- package/dist/components/form/index.cjs.js +1 -1
- package/dist/components/form/index.es.js +1 -1
- package/dist/components/index.cjs.js +1 -1
- package/dist/components/index.es.js +11 -11
- package/dist/components/page/index.cjs.js +1 -1
- package/dist/components/page/index.es.js +1 -1
- package/dist/components/router/index.cjs.js +1 -1
- package/dist/components/router/index.es.js +2 -2
- package/dist/components/table/index.cjs.js +1 -1
- package/dist/components/table/index.es.js +1 -1
- package/dist/features/index.cjs.js +1 -1
- package/dist/features/index.es.js +6 -6
- package/dist/hooks/index.cjs.js +1 -1
- package/dist/hooks/index.es.js +1 -1
- package/dist/{index-CA-ugBSa.cjs → index-B6aNVvMr.cjs} +2 -2
- package/dist/{index-CA-ugBSa.cjs.map → index-B6aNVvMr.cjs.map} +1 -1
- package/dist/{index-DuVBQMst.js → index-C-3iPCa4.js} +5 -5
- package/dist/{index-DuVBQMst.js.map → index-C-3iPCa4.js.map} +1 -1
- package/dist/{index-DsVpb45W.cjs → index-CBPn0wyX.cjs} +2 -2
- package/dist/{index-DsVpb45W.cjs.map → index-CBPn0wyX.cjs.map} +1 -1
- package/dist/{index-BUMdUVBH.cjs → index-CIj5ef8a.cjs} +2 -2
- package/dist/{index-BUMdUVBH.cjs.map → index-CIj5ef8a.cjs.map} +1 -1
- package/dist/{index-DlQc68Q4.js → index-DcmDxIXA.js} +5 -5
- package/dist/{index-DlQc68Q4.js.map → index-DcmDxIXA.js.map} +1 -1
- package/dist/{index-B3cd2A-G.js → index-Dfo744Sb.js} +2 -2
- package/dist/{index-B3cd2A-G.js.map → index-Dfo744Sb.js.map} +1 -1
- package/dist/{index-Brh3Kbv6.js → index-VverRavP.js} +2 -2
- package/dist/{index-Brh3Kbv6.js.map → index-VverRavP.js.map} +1 -1
- package/dist/{index-DZ7ETsOg.cjs → index-ifedknoZ.cjs} +2 -2
- package/dist/{index-DZ7ETsOg.cjs.map → index-ifedknoZ.cjs.map} +1 -1
- package/dist/jsx-runtime-C7wFtzyj.js +285 -0
- package/dist/jsx-runtime-C7wFtzyj.js.map +1 -0
- package/dist/jsx-runtime-Dszzpdy0.cjs +23 -0
- package/dist/jsx-runtime-Dszzpdy0.cjs.map +1 -0
- package/dist/{schemas-BZbJpkD5.cjs → schemas-CpAWhNsP.cjs} +2 -2
- package/dist/{schemas-BZbJpkD5.cjs.map → schemas-CpAWhNsP.cjs.map} +1 -1
- package/dist/{schemas-CDXuSjyI.js → schemas-D3tO0rys.js} +2 -2
- package/dist/{schemas-CDXuSjyI.js.map → schemas-D3tO0rys.js.map} +1 -1
- package/dist/theme/components/index.cjs.js +1 -1
- package/dist/theme/components/index.es.js +1 -1
- package/dist/theme/index.cjs.js +1 -1
- package/dist/theme/index.es.js +2 -2
- package/dist/{urls-BY-za1bX.js → urls-5m9PgoEX.js} +2 -2
- package/dist/{urls-BY-za1bX.js.map → urls-5m9PgoEX.js.map} +1 -1
- package/dist/{urls-MaVXL_C2.cjs → urls-RtSTEZfW.cjs} +2 -2
- package/dist/{urls-MaVXL_C2.cjs.map → urls-RtSTEZfW.cjs.map} +1 -1
- package/dist/utils/api.cjs.js +1 -1
- package/dist/utils/api.es.js +2 -2
- package/dist/utils/router.cjs.js +1 -1
- package/dist/utils/router.es.js +2 -2
- package/dist/utils/test.cjs.js +250 -1
- package/dist/utils/test.cjs.js.map +1 -1
- package/dist/utils/test.es.js +25214 -39
- package/dist/utils/test.es.js.map +1 -1
- package/dist/utils/theme.cjs.js +1 -1
- package/dist/utils/theme.es.js +2 -2
- package/package.json +6 -6
- package/dist/jsx-runtime-CeSfJrVB.cjs +0 -31
- package/dist/jsx-runtime-CeSfJrVB.cjs.map +0 -1
- package/dist/jsx-runtime-XvoU0p7t.js +0 -634
- package/dist/jsx-runtime-XvoU0p7t.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-C_aSIrwD.cjs","sources":["../src/hooks/router.tsx","../src/hooks/auth.tsx"],"sourcesContent":["import {\n type Location,\n type Params,\n type To,\n type NavigateOptions as _NavigateOptions,\n useLocation as _useLocation,\n useNavigate as _useNavigate,\n useParams as _useParams,\n useSearchParams as _useSearchParams,\n} from \"react-router\"\nimport { type ObjectShape, object as objectSchema } from \"yup\"\nimport { type ReactNode, useEffect } from \"react\"\n\nimport {\n type ObjectSchemaFromShape,\n type TryValidateSyncOnErrorRT,\n type TryValidateSyncOptions,\n type TryValidateSyncRT,\n tryValidateSync,\n} from \"../utils/schema\"\nimport { type PageState } from \"../components/page\"\nimport { type ReadOnly } from \"../utils/router\"\n\nexport type NavigateOptions<\n State extends Record<string, any> = Record<string, any>,\n> = Omit<_NavigateOptions, \"state\"> & {\n state?: State & Partial<PageState>\n next?: boolean\n}\n\nexport type Navigate = {\n <State extends Record<string, any> = Record<string, any>>(\n to: To,\n options?: NavigateOptions<State>,\n ): void\n (delta: number): void\n}\n\nexport function useNavigate(): Navigate {\n const navigate = _useNavigate()\n const searchParams = useSearchParams()\n\n return (\n toOrDelta: To | number,\n options: (NavigateOptions & { next?: boolean }) | undefined = undefined,\n ) => {\n if (typeof toOrDelta === \"number\") void navigate(toOrDelta)\n else {\n const { next = true, ..._options } = options || {}\n\n void navigate(\n next && \"next\" in searchParams ? searchParams.next : toOrDelta,\n _options,\n )\n }\n }\n}\n\nexport function useLocation<State = {}>() {\n return _useLocation() as Location<null | Partial<PageState & State>>\n}\n\n// -----------------------------------------------------------------------------\n// Use Search Params\n// -----------------------------------------------------------------------------\n\nexport function useSearchParams(): { [k: string]: string }\n\nexport function useSearchParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n): TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n\nexport function useSearchParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape?: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n) {\n const searchParams = Object.fromEntries(_useSearchParams()[0].entries())\n if (!shape) return searchParams\n\n return tryValidateSync(searchParams, objectSchema(shape), validateOptions)\n}\n\n// -----------------------------------------------------------------------------\n// Use Params\n// -----------------------------------------------------------------------------\n\nexport function useParams(): ReadOnly<Params<string>>\n\nexport function useParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n): TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n\nexport function useParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape?: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n) {\n const params = _useParams()\n if (!shape) return params\n\n return tryValidateSync(params, objectSchema(shape), validateOptions)\n}\n\nexport function useParamsRequired<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>({\n shape,\n children,\n onValidationError,\n onValidationSuccess = () => {},\n validateOptions,\n}: {\n shape: Shape\n children: (\n data: NonNullable<\n TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n >,\n ) => ReactNode\n onValidationError: (navigate: Navigate) => void\n onValidationSuccess?: (\n params: NonNullable<\n TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n >,\n ) => void\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >\n}) {\n const params = useParams(shape, validateOptions)\n const navigate = useNavigate()\n\n useEffect(\n () => {\n if (params) onValidationSuccess(params)\n else onValidationError(navigate)\n },\n [], // eslint-disable-line react-hooks/exhaustive-deps\n )\n\n return params ? children(params) : <></>\n}\n","import * as yup from \"yup\"\nimport { type ReactNode, useCallback, useEffect, useState } from \"react\"\nimport Cookies from \"js-cookie\"\nimport type { TypedUseMutation } from \"@reduxjs/toolkit/query/react\"\nimport { createSearchParams } from \"react-router\"\n// eslint-disable-next-line @typescript-eslint/no-restricted-imports\nimport { useSelector } from \"react-redux\"\n\nimport { type AuthFactor, type User } from \"../api\"\nimport {\n type OAuth2CodeChallenge,\n type OAuth2CodeChallengeLengths,\n type OAuth2ReceiveCodeUrlSearchParams,\n type OAuth2RequestCodeUrlSearchParams,\n generateOAuth2CodeChallenge,\n makeOAuth2StorageKey,\n} from \"../utils/auth\"\nimport { useLocation, useNavigate, useSearchParams } from \"./router\"\nimport { type ExchangeOAuth2CodeArg } from \"../api/endpoints/session\"\nimport { SESSION_METADATA_COOKIE_NAME } from \"../settings\"\nimport { generateSecureRandomString } from \"../utils/general\"\nimport { selectIsLoggedIn } from \"../slices/session\"\n\n// -----------------------------------------------------------------------------\n// Session\n// -----------------------------------------------------------------------------\n\nexport interface SessionMetadata {\n user_id: User[\"id\"]\n user_type: \"teacher\" | \"student\" | \"indy\"\n auth_factors: Array<AuthFactor[\"type\"]>\n otp_bypass_token_exists: boolean\n}\n\nexport function useSessionMetadata<T = SessionMetadata>(\n cookieName = SESSION_METADATA_COOKIE_NAME,\n): T | undefined {\n return useSelector(selectIsLoggedIn)\n ? (JSON.parse(Cookies.get(cookieName)!) as T)\n : undefined\n}\n\n/**\n * A utility function to predefine a useSessionMetadata hook.\n * @param cookieName The name of the session metadata cookie.\n * @returns An object containing the session metadata.\n */\nuseSessionMetadata.predefine = <SessionMetadata,>(\n cookieName = SESSION_METADATA_COOKIE_NAME,\n) => {\n return () => useSessionMetadata<SessionMetadata>(cookieName)\n}\n\nexport type UseSessionChildrenFunction<Required extends boolean> = (\n metadata: Required extends true\n ? SessionMetadata\n : SessionMetadata | undefined,\n) => ReactNode\n\nexport type UseSessionChildren<\n UserType extends SessionMetadata[\"user_type\"] | undefined,\n> =\n | ReactNode\n | (UserType extends undefined\n ? UseSessionChildrenFunction<false>\n : UseSessionChildrenFunction<true>)\n\nexport type UseSessionOptions<\n UserType extends SessionMetadata[\"user_type\"] | undefined,\n> = Partial<{\n userType: UserType\n next: boolean\n}>\n\nexport function useSession<\n UserType extends SessionMetadata[\"user_type\"] | undefined = undefined,\n>(\n children: UseSessionChildren<UserType>,\n options: UseSessionOptions<UserType> = {},\n) {\n const { userType, next = true } = options\n\n const { pathname } = useLocation()\n const navigate = useNavigate()\n const sessionMetadata = useSessionMetadata()\n\n const loginRequired =\n userType && (!sessionMetadata || sessionMetadata.user_type !== userType)\n\n useEffect(() => {\n if (loginRequired) {\n navigate({\n pathname:\n \"/login\" +\n {\n teacher: \"/teacher\",\n student: \"/student\",\n indy: \"/independent\",\n }[userType],\n search: next\n ? createSearchParams({ next: pathname }).toString()\n : undefined,\n })\n }\n }, [navigate, loginRequired, userType, next, pathname])\n\n if (loginRequired) return <></>\n\n if (typeof children === \"function\") {\n return sessionMetadata\n ? (children as UseSessionChildrenFunction<true>)(sessionMetadata)\n : (children as UseSessionChildrenFunction<false>)(sessionMetadata)\n }\n\n return children\n}\n\n// -----------------------------------------------------------------------------\n// OAuth2\n// -----------------------------------------------------------------------------\n\nexport function useOAuth2State(\n provider: string,\n length: number = 32,\n storageKey: string = \"state\",\n): [string | undefined, () => void] {\n const oAuth2StorageKey = makeOAuth2StorageKey(provider, storageKey)\n const storageValue = sessionStorage.getItem(oAuth2StorageKey)\n\n const [_state, _setState] = useState<string>()\n\n useEffect(() => {\n let state: string\n if (storageValue && storageValue.length === length) {\n state = storageValue\n } else {\n state = generateSecureRandomString(length)\n sessionStorage.setItem(oAuth2StorageKey, state)\n }\n\n _setState(state)\n }, [oAuth2StorageKey, storageValue, length])\n\n const resetState = useCallback(() => {\n sessionStorage.removeItem(oAuth2StorageKey)\n _setState(undefined)\n }, [oAuth2StorageKey])\n\n return [_state, resetState]\n}\n\nexport function useOAuth2CodeChallenge(\n provider: string,\n length: OAuth2CodeChallengeLengths = 128,\n storageKey: string = \"codeChallenge\",\n): [OAuth2CodeChallenge | undefined, () => void] {\n const oAuth2StorageKey = makeOAuth2StorageKey(provider, storageKey)\n const storageValue = sessionStorage.getItem(oAuth2StorageKey)\n\n const [_codeChallenge, _setCodeChallenge] = useState<OAuth2CodeChallenge>()\n\n useEffect(() => {\n let codeChallenge: OAuth2CodeChallenge | undefined\n if (storageValue) {\n const storageJsonValue: unknown = JSON.parse(storageValue)\n if (\n typeof storageJsonValue === \"object\" &&\n storageJsonValue &&\n \"verifier\" in storageJsonValue &&\n typeof storageJsonValue.verifier == \"string\" &&\n storageJsonValue.verifier.length === length &&\n \"challenge\" in storageJsonValue &&\n typeof storageJsonValue.challenge === \"string\" &&\n \"method\" in storageJsonValue &&\n storageJsonValue.method === \"S256\"\n ) {\n codeChallenge = {\n verifier: storageJsonValue.verifier,\n challenge: storageJsonValue.challenge,\n method: storageJsonValue.method,\n }\n }\n }\n\n if (codeChallenge) _setCodeChallenge(codeChallenge)\n else {\n generateOAuth2CodeChallenge(length)\n .then(codeChallenge => {\n sessionStorage.setItem(\n oAuth2StorageKey,\n JSON.stringify(codeChallenge),\n )\n\n _setCodeChallenge(codeChallenge)\n })\n .catch(error => {\n if (error) console.error(error)\n })\n }\n }, [oAuth2StorageKey, storageValue, length])\n\n const resetCodeChallenge = useCallback(() => {\n sessionStorage.removeItem(oAuth2StorageKey)\n _setCodeChallenge(undefined)\n }, [oAuth2StorageKey])\n\n return [_codeChallenge, resetCodeChallenge]\n}\n\ninterface BaseUseOAuth2KwArgs<SessionMetadata> {\n provider: string\n authUri: string\n clientId: string\n redirectUri: string\n scope: string\n responseType?: \"code\"\n accessType?: \"offline\"\n prompt?: string\n useLoginMutation: TypedUseMutation<\n SessionMetadata,\n ExchangeOAuth2CodeArg,\n any\n >\n onCreateSession: (result: SessionMetadata) => void\n onRetrieveSession: (metadata: SessionMetadata) => void\n}\n\ninterface UseOAuth2KwArgs<SessionMetadata>\n extends BaseUseOAuth2KwArgs<SessionMetadata> {\n useSessionMetadata: () => SessionMetadata | undefined\n}\n\nexport type OAuth2 = [string, OAuth2RequestCodeUrlSearchParams] | []\n\n// https://datatracker.ietf.org/doc/html/rfc7636\nfunction useOAuth2Internal<SessionMetadata>({\n provider,\n authUri,\n clientId,\n redirectUri,\n scope,\n responseType = \"code\",\n accessType = \"offline\",\n prompt,\n useSessionMetadata,\n useLoginMutation,\n onCreateSession,\n onRetrieveSession,\n}: UseOAuth2KwArgs<SessionMetadata>): OAuth2 {\n const [state, resetState] = useOAuth2State(provider)\n const [\n {\n verifier: codeVerifier,\n challenge: codeChallenge,\n method: codeChallengeMethod,\n } = {},\n resetCodeChallenge,\n ] = useOAuth2CodeChallenge(provider)\n const [\n login,\n {\n originalArgs: loginArgs = {} as ExchangeOAuth2CodeArg,\n isLoading: loginIsLoading,\n isError: loginIsError,\n },\n ] = useLoginMutation()\n const sessionMetadata = useSessionMetadata()\n const navigate = useNavigate()\n const searchParams =\n useSearchParams({ code: yup.string(), state: yup.string() }) || {}\n const location = useLocation<OAuth2ReceiveCodeUrlSearchParams>()\n\n const locationState = location.state || {}\n\n useEffect(() => {\n // If the the auth provider has redirected back to our site with the\n // expected search params, we redirect to the current page to remove them.\n if (searchParams.code && searchParams.state) {\n navigate<OAuth2ReceiveCodeUrlSearchParams>(\".\", {\n // Removes the URL containing the search params from the history stack.\n replace: true,\n // Ensure we don't break the auth flow by navigating to another page.\n next: false,\n // Store the search params in the page's state instead.\n state: { code: searchParams.code, state: searchParams.state },\n })\n }\n }, [searchParams.code, searchParams.state, navigate])\n\n useEffect(() => {\n // If we're already logged in, no need to log in again.\n if (sessionMetadata) onRetrieveSession(sessionMetadata)\n else if (\n // If the state and code verifier have been generated...\n state &&\n codeVerifier &&\n // ...and the page's state contains a code...\n locationState.code &&\n // ...and the page's state contains the stored state...\n locationState.state === state &&\n // ...and the login endpoint was not called with the current values or has\n // not returned an error...\n (loginArgs.code !== locationState.code ||\n loginArgs.code_verifier !== codeVerifier ||\n loginArgs.redirect_uri !== redirectUri ||\n !loginIsError) &&\n // ...and the login endpoint is not currently being called...\n !loginIsLoading\n ) {\n // ...call the login endpoint.\n login({\n code: locationState.code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n })\n .unwrap()\n .then(onCreateSession)\n .catch(() => {\n navigate(\".\", {\n replace: true,\n state: {\n notifications: [\n {\n props: {\n error: true,\n children: \"Failed to login. Please try again.\",\n },\n },\n ],\n },\n })\n })\n .finally(() => {\n resetState()\n resetCodeChallenge()\n })\n }\n }, [\n navigate,\n redirectUri,\n // State\n state,\n locationState.state,\n resetState,\n // Code\n codeVerifier,\n locationState.code,\n resetCodeChallenge,\n // Login\n login,\n loginIsLoading,\n loginIsError,\n loginArgs.code,\n loginArgs.code_verifier,\n loginArgs.redirect_uri,\n // Session\n sessionMetadata,\n onCreateSession,\n onRetrieveSession,\n ])\n\n if (state && codeChallenge && codeChallengeMethod) {\n const urlSearchParams: OAuth2RequestCodeUrlSearchParams = {\n client_id: clientId,\n redirect_uri: redirectUri,\n scope,\n response_type: responseType,\n access_type: accessType,\n state,\n code_challenge: codeChallenge,\n code_challenge_method: codeChallengeMethod,\n }\n\n if (prompt) urlSearchParams[\"prompt\"] = prompt\n\n return [\n authUri + \"?\" + new URLSearchParams(urlSearchParams).toString(),\n urlSearchParams,\n ]\n }\n\n return []\n}\n\nexport const useOAuth2: {\n <SessionMetadata>(kwargs: UseOAuth2KwArgs<SessionMetadata>): OAuth2\n (kwargs: BaseUseOAuth2KwArgs<SessionMetadata>): OAuth2\n} = <_SessionMetadata,>(\n kwargs:\n | UseOAuth2KwArgs<_SessionMetadata>\n | BaseUseOAuth2KwArgs<SessionMetadata>,\n): OAuth2 => {\n return useOAuth2Internal(\n // @ts-expect-error value is assignable\n \"useSessionMetadata\" in kwargs ? kwargs : { ...kwargs, useSessionMetadata },\n )\n}\n"],"names":["useNavigate","navigate","_useNavigate","searchParams","useSearchParams","toOrDelta","options","next","_options","useLocation","_useLocation","shape","validateOptions","_useSearchParams","tryValidateSync","objectSchema","useParams","params","_useParams","useParamsRequired","children","onValidationError","onValidationSuccess","useEffect","jsx","Fragment","useSessionMetadata","cookieName","SESSION_METADATA_COOKIE_NAME","useSelector","selectIsLoggedIn","Cookies","useSession","userType","pathname","sessionMetadata","loginRequired","createSearchParams","useOAuth2State","provider","length","storageKey","oAuth2StorageKey","makeOAuth2StorageKey","storageValue","_state","_setState","useState","state","generateSecureRandomString","resetState","useCallback","useOAuth2CodeChallenge","_codeChallenge","_setCodeChallenge","codeChallenge","storageJsonValue","generateOAuth2CodeChallenge","error","resetCodeChallenge","useOAuth2Internal","authUri","clientId","redirectUri","scope","responseType","accessType","prompt","useLoginMutation","onCreateSession","onRetrieveSession","codeVerifier","codeChallengeMethod","login","loginArgs","loginIsLoading","loginIsError","yup","locationState","urlSearchParams","useOAuth2","kwargs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth-B7Vdot4N.cjs","sources":["../src/hooks/router.tsx","../src/hooks/auth.tsx"],"sourcesContent":["import {\n type Location,\n type Params,\n type To,\n type NavigateOptions as _NavigateOptions,\n useLocation as _useLocation,\n useNavigate as _useNavigate,\n useParams as _useParams,\n useSearchParams as _useSearchParams,\n} from \"react-router\"\nimport { type ObjectShape, object as objectSchema } from \"yup\"\nimport { type ReactNode, useEffect } from \"react\"\n\nimport {\n type ObjectSchemaFromShape,\n type TryValidateSyncOnErrorRT,\n type TryValidateSyncOptions,\n type TryValidateSyncRT,\n tryValidateSync,\n} from \"../utils/schema\"\nimport { type PageState } from \"../components/page\"\nimport { type ReadOnly } from \"../utils/router\"\n\nexport type NavigateOptions<\n State extends Record<string, any> = Record<string, any>,\n> = Omit<_NavigateOptions, \"state\"> & {\n state?: State & Partial<PageState>\n next?: boolean\n}\n\nexport type Navigate = {\n <State extends Record<string, any> = Record<string, any>>(\n to: To,\n options?: NavigateOptions<State>,\n ): void\n (delta: number): void\n}\n\nexport function useNavigate(): Navigate {\n const navigate = _useNavigate()\n const searchParams = useSearchParams()\n\n return (\n toOrDelta: To | number,\n options: (NavigateOptions & { next?: boolean }) | undefined = undefined,\n ) => {\n if (typeof toOrDelta === \"number\") void navigate(toOrDelta)\n else {\n const { next = true, ..._options } = options || {}\n\n void navigate(\n next && \"next\" in searchParams ? searchParams.next : toOrDelta,\n _options,\n )\n }\n }\n}\n\nexport function useLocation<State = {}>() {\n return _useLocation() as Location<null | Partial<PageState & State>>\n}\n\n// -----------------------------------------------------------------------------\n// Use Search Params\n// -----------------------------------------------------------------------------\n\nexport function useSearchParams(): { [k: string]: string }\n\nexport function useSearchParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n): TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n\nexport function useSearchParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape?: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n) {\n const searchParams = Object.fromEntries(_useSearchParams()[0].entries())\n if (!shape) return searchParams\n\n return tryValidateSync(searchParams, objectSchema(shape), validateOptions)\n}\n\n// -----------------------------------------------------------------------------\n// Use Params\n// -----------------------------------------------------------------------------\n\nexport function useParams(): ReadOnly<Params<string>>\n\nexport function useParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n): TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n\nexport function useParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape?: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n) {\n const params = _useParams()\n if (!shape) return params\n\n return tryValidateSync(params, objectSchema(shape), validateOptions)\n}\n\nexport function useParamsRequired<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>({\n shape,\n children,\n onValidationError,\n onValidationSuccess = () => {},\n validateOptions,\n}: {\n shape: Shape\n children: (\n data: NonNullable<\n TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n >,\n ) => ReactNode\n onValidationError: (navigate: Navigate) => void\n onValidationSuccess?: (\n params: NonNullable<\n TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n >,\n ) => void\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >\n}) {\n const params = useParams(shape, validateOptions)\n const navigate = useNavigate()\n\n useEffect(\n () => {\n if (params) onValidationSuccess(params)\n else onValidationError(navigate)\n },\n [], // eslint-disable-line react-hooks/exhaustive-deps\n )\n\n return params ? children(params) : <></>\n}\n","import * as yup from \"yup\"\nimport { type ReactNode, useCallback, useEffect, useState } from \"react\"\nimport Cookies from \"js-cookie\"\nimport type { TypedUseMutation } from \"@reduxjs/toolkit/query/react\"\nimport { createSearchParams } from \"react-router\"\n// eslint-disable-next-line @typescript-eslint/no-restricted-imports\nimport { useSelector } from \"react-redux\"\n\nimport { type AuthFactor, type User } from \"../api\"\nimport {\n type OAuth2CodeChallenge,\n type OAuth2CodeChallengeLengths,\n type OAuth2ReceiveCodeUrlSearchParams,\n type OAuth2RequestCodeUrlSearchParams,\n generateOAuth2CodeChallenge,\n makeOAuth2StorageKey,\n} from \"../utils/auth\"\nimport { useLocation, useNavigate, useSearchParams } from \"./router\"\nimport { type ExchangeOAuth2CodeArg } from \"../api/endpoints/session\"\nimport { SESSION_METADATA_COOKIE_NAME } from \"../settings\"\nimport { generateSecureRandomString } from \"../utils/general\"\nimport { selectIsLoggedIn } from \"../slices/session\"\n\n// -----------------------------------------------------------------------------\n// Session\n// -----------------------------------------------------------------------------\n\nexport interface SessionMetadata {\n user_id: User[\"id\"]\n user_type: \"teacher\" | \"student\" | \"indy\"\n auth_factors: Array<AuthFactor[\"type\"]>\n otp_bypass_token_exists: boolean\n}\n\nexport function useSessionMetadata<T = SessionMetadata>(\n cookieName = SESSION_METADATA_COOKIE_NAME,\n): T | undefined {\n return useSelector(selectIsLoggedIn)\n ? (JSON.parse(Cookies.get(cookieName)!) as T)\n : undefined\n}\n\n/**\n * A utility function to predefine a useSessionMetadata hook.\n * @param cookieName The name of the session metadata cookie.\n * @returns An object containing the session metadata.\n */\nuseSessionMetadata.predefine = <SessionMetadata,>(\n cookieName = SESSION_METADATA_COOKIE_NAME,\n) => {\n return () => useSessionMetadata<SessionMetadata>(cookieName)\n}\n\nexport type UseSessionChildrenFunction<Required extends boolean> = (\n metadata: Required extends true\n ? SessionMetadata\n : SessionMetadata | undefined,\n) => ReactNode\n\nexport type UseSessionChildren<\n UserType extends SessionMetadata[\"user_type\"] | undefined,\n> =\n | ReactNode\n | (UserType extends undefined\n ? UseSessionChildrenFunction<false>\n : UseSessionChildrenFunction<true>)\n\nexport type UseSessionOptions<\n UserType extends SessionMetadata[\"user_type\"] | undefined,\n> = Partial<{\n userType: UserType\n next: boolean\n}>\n\nexport function useSession<\n UserType extends SessionMetadata[\"user_type\"] | undefined = undefined,\n>(\n children: UseSessionChildren<UserType>,\n options: UseSessionOptions<UserType> = {},\n) {\n const { userType, next = true } = options\n\n const { pathname } = useLocation()\n const navigate = useNavigate()\n const sessionMetadata = useSessionMetadata()\n\n const loginRequired =\n userType && (!sessionMetadata || sessionMetadata.user_type !== userType)\n\n useEffect(() => {\n if (loginRequired) {\n navigate({\n pathname:\n \"/login\" +\n {\n teacher: \"/teacher\",\n student: \"/student\",\n indy: \"/independent\",\n }[userType],\n search: next\n ? createSearchParams({ next: pathname }).toString()\n : undefined,\n })\n }\n }, [navigate, loginRequired, userType, next, pathname])\n\n if (loginRequired) return <></>\n\n if (typeof children === \"function\") {\n return sessionMetadata\n ? (children as UseSessionChildrenFunction<true>)(sessionMetadata)\n : (children as UseSessionChildrenFunction<false>)(sessionMetadata)\n }\n\n return children\n}\n\n// -----------------------------------------------------------------------------\n// OAuth2\n// -----------------------------------------------------------------------------\n\nexport function useOAuth2State(\n provider: string,\n length: number = 32,\n storageKey: string = \"state\",\n): [string | undefined, () => void] {\n const oAuth2StorageKey = makeOAuth2StorageKey(provider, storageKey)\n const storageValue = sessionStorage.getItem(oAuth2StorageKey)\n\n const [_state, _setState] = useState<string>()\n\n useEffect(() => {\n let state: string\n if (storageValue && storageValue.length === length) {\n state = storageValue\n } else {\n state = generateSecureRandomString(length)\n sessionStorage.setItem(oAuth2StorageKey, state)\n }\n\n _setState(state)\n }, [oAuth2StorageKey, storageValue, length])\n\n const resetState = useCallback(() => {\n sessionStorage.removeItem(oAuth2StorageKey)\n _setState(undefined)\n }, [oAuth2StorageKey])\n\n return [_state, resetState]\n}\n\nexport function useOAuth2CodeChallenge(\n provider: string,\n length: OAuth2CodeChallengeLengths = 128,\n storageKey: string = \"codeChallenge\",\n): [OAuth2CodeChallenge | undefined, () => void] {\n const oAuth2StorageKey = makeOAuth2StorageKey(provider, storageKey)\n const storageValue = sessionStorage.getItem(oAuth2StorageKey)\n\n const [_codeChallenge, _setCodeChallenge] = useState<OAuth2CodeChallenge>()\n\n useEffect(() => {\n let codeChallenge: OAuth2CodeChallenge | undefined\n if (storageValue) {\n const storageJsonValue: unknown = JSON.parse(storageValue)\n if (\n typeof storageJsonValue === \"object\" &&\n storageJsonValue &&\n \"verifier\" in storageJsonValue &&\n typeof storageJsonValue.verifier == \"string\" &&\n storageJsonValue.verifier.length === length &&\n \"challenge\" in storageJsonValue &&\n typeof storageJsonValue.challenge === \"string\" &&\n \"method\" in storageJsonValue &&\n storageJsonValue.method === \"S256\"\n ) {\n codeChallenge = {\n verifier: storageJsonValue.verifier,\n challenge: storageJsonValue.challenge,\n method: storageJsonValue.method,\n }\n }\n }\n\n if (codeChallenge) _setCodeChallenge(codeChallenge)\n else {\n generateOAuth2CodeChallenge(length)\n .then(codeChallenge => {\n sessionStorage.setItem(\n oAuth2StorageKey,\n JSON.stringify(codeChallenge),\n )\n\n _setCodeChallenge(codeChallenge)\n })\n .catch(error => {\n if (error) console.error(error)\n })\n }\n }, [oAuth2StorageKey, storageValue, length])\n\n const resetCodeChallenge = useCallback(() => {\n sessionStorage.removeItem(oAuth2StorageKey)\n _setCodeChallenge(undefined)\n }, [oAuth2StorageKey])\n\n return [_codeChallenge, resetCodeChallenge]\n}\n\ninterface BaseUseOAuth2KwArgs<SessionMetadata> {\n provider: string\n authUri: string\n clientId: string\n redirectUri: string\n scope: string\n responseType?: \"code\"\n accessType?: \"offline\"\n prompt?: string\n useLoginMutation: TypedUseMutation<\n SessionMetadata,\n ExchangeOAuth2CodeArg,\n any\n >\n onCreateSession: (result: SessionMetadata) => void\n onRetrieveSession: (metadata: SessionMetadata) => void\n}\n\ninterface UseOAuth2KwArgs<SessionMetadata>\n extends BaseUseOAuth2KwArgs<SessionMetadata> {\n useSessionMetadata: () => SessionMetadata | undefined\n}\n\nexport type OAuth2 = [string, OAuth2RequestCodeUrlSearchParams] | []\n\n// https://datatracker.ietf.org/doc/html/rfc7636\nfunction useOAuth2Internal<SessionMetadata>({\n provider,\n authUri,\n clientId,\n redirectUri,\n scope,\n responseType = \"code\",\n accessType = \"offline\",\n prompt,\n useSessionMetadata,\n useLoginMutation,\n onCreateSession,\n onRetrieveSession,\n}: UseOAuth2KwArgs<SessionMetadata>): OAuth2 {\n const [state, resetState] = useOAuth2State(provider)\n const [\n {\n verifier: codeVerifier,\n challenge: codeChallenge,\n method: codeChallengeMethod,\n } = {},\n resetCodeChallenge,\n ] = useOAuth2CodeChallenge(provider)\n const [\n login,\n {\n originalArgs: loginArgs = {} as ExchangeOAuth2CodeArg,\n isLoading: loginIsLoading,\n isError: loginIsError,\n },\n ] = useLoginMutation()\n const sessionMetadata = useSessionMetadata()\n const navigate = useNavigate()\n const searchParams =\n useSearchParams({ code: yup.string(), state: yup.string() }) || {}\n const location = useLocation<OAuth2ReceiveCodeUrlSearchParams>()\n\n const locationState = location.state || {}\n\n useEffect(() => {\n // If the the auth provider has redirected back to our site with the\n // expected search params, we redirect to the current page to remove them.\n if (searchParams.code && searchParams.state) {\n navigate<OAuth2ReceiveCodeUrlSearchParams>(\".\", {\n // Removes the URL containing the search params from the history stack.\n replace: true,\n // Ensure we don't break the auth flow by navigating to another page.\n next: false,\n // Store the search params in the page's state instead.\n state: { code: searchParams.code, state: searchParams.state },\n })\n }\n }, [searchParams.code, searchParams.state, navigate])\n\n useEffect(() => {\n // If we're already logged in, no need to log in again.\n if (sessionMetadata) onRetrieveSession(sessionMetadata)\n else if (\n // If the state and code verifier have been generated...\n state &&\n codeVerifier &&\n // ...and the page's state contains a code...\n locationState.code &&\n // ...and the page's state contains the stored state...\n locationState.state === state &&\n // ...and the login endpoint was not called with the current values or has\n // not returned an error...\n (loginArgs.code !== locationState.code ||\n loginArgs.code_verifier !== codeVerifier ||\n loginArgs.redirect_uri !== redirectUri ||\n !loginIsError) &&\n // ...and the login endpoint is not currently being called...\n !loginIsLoading\n ) {\n // ...call the login endpoint.\n login({\n code: locationState.code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n })\n .unwrap()\n .then(onCreateSession)\n .catch(() => {\n navigate(\".\", {\n replace: true,\n state: {\n notifications: [\n {\n props: {\n error: true,\n children: \"Failed to login. Please try again.\",\n },\n },\n ],\n },\n })\n })\n .finally(() => {\n resetState()\n resetCodeChallenge()\n })\n }\n }, [\n navigate,\n redirectUri,\n // State\n state,\n locationState.state,\n resetState,\n // Code\n codeVerifier,\n locationState.code,\n resetCodeChallenge,\n // Login\n login,\n loginIsLoading,\n loginIsError,\n loginArgs.code,\n loginArgs.code_verifier,\n loginArgs.redirect_uri,\n // Session\n sessionMetadata,\n onCreateSession,\n onRetrieveSession,\n ])\n\n if (state && codeChallenge && codeChallengeMethod) {\n const urlSearchParams: OAuth2RequestCodeUrlSearchParams = {\n client_id: clientId,\n redirect_uri: redirectUri,\n scope,\n response_type: responseType,\n access_type: accessType,\n state,\n code_challenge: codeChallenge,\n code_challenge_method: codeChallengeMethod,\n }\n\n if (prompt) urlSearchParams[\"prompt\"] = prompt\n\n return [\n authUri + \"?\" + new URLSearchParams(urlSearchParams).toString(),\n urlSearchParams,\n ]\n }\n\n return []\n}\n\nexport const useOAuth2: {\n <SessionMetadata>(kwargs: UseOAuth2KwArgs<SessionMetadata>): OAuth2\n (kwargs: BaseUseOAuth2KwArgs<SessionMetadata>): OAuth2\n} = <_SessionMetadata,>(\n kwargs:\n | UseOAuth2KwArgs<_SessionMetadata>\n | BaseUseOAuth2KwArgs<SessionMetadata>,\n): OAuth2 => {\n return useOAuth2Internal(\n // @ts-expect-error value is assignable\n \"useSessionMetadata\" in kwargs ? kwargs : { ...kwargs, useSessionMetadata },\n )\n}\n"],"names":["useNavigate","navigate","_useNavigate","searchParams","useSearchParams","toOrDelta","options","next","_options","useLocation","_useLocation","shape","validateOptions","_useSearchParams","tryValidateSync","objectSchema","useParams","params","_useParams","useParamsRequired","children","onValidationError","onValidationSuccess","useEffect","jsx","Fragment","useSessionMetadata","cookieName","SESSION_METADATA_COOKIE_NAME","useSelector","selectIsLoggedIn","Cookies","useSession","userType","pathname","sessionMetadata","loginRequired","createSearchParams","useOAuth2State","provider","length","storageKey","oAuth2StorageKey","makeOAuth2StorageKey","storageValue","_state","_setState","useState","state","generateSecureRandomString","resetState","useCallback","useOAuth2CodeChallenge","_codeChallenge","_setCodeChallenge","codeChallenge","storageJsonValue","generateOAuth2CodeChallenge","error","resetCodeChallenge","useOAuth2Internal","authUri","clientId","redirectUri","scope","responseType","accessType","prompt","useLoginMutation","onCreateSession","onRetrieveSession","codeVerifier","codeChallengeMethod","login","loginArgs","loginIsLoading","loginIsError","yup","locationState","urlSearchParams","useOAuth2","kwargs"],"mappings":"2xBAsCO,SAASA,GAAwB,CACtC,MAAMC,EAAWC,EAAAA,YAAA,EACXC,EAAeC,EAAA,EAErB,MAAO,CACLC,EACAC,EAA8D,SAC3D,CACH,GAAI,OAAOD,GAAc,SAAeJ,EAASI,CAAS,MACrD,CACH,KAAM,CAAE,KAAAE,EAAO,GAAM,GAAGC,CAAA,EAAaF,GAAW,CAAA,EAE3CL,EACHM,GAAQ,SAAUJ,EAAeA,EAAa,KAAOE,EACrDG,CAAA,CAEJ,CACF,CACF,CAEO,SAASC,GAA0B,CACxC,OAAOC,cAAA,CACT,CAmBO,SAASN,EAIdO,EACAC,EAIA,CACA,MAAMT,EAAe,OAAO,YAAYU,EAAAA,gBAAA,EAAmB,CAAC,EAAE,SAAS,EACvE,OAAKF,EAEEG,EAAAA,gBAAgBX,EAAcY,EAAAA,OAAaJ,CAAK,EAAGC,CAAe,EAFtDT,CAGrB,CAmBO,SAASa,EAIdL,EACAC,EAIA,CACA,MAAMK,EAASC,EAAAA,UAAA,EACf,OAAKP,EAEEG,EAAAA,gBAAgBG,EAAQF,EAAAA,OAAaJ,CAAK,EAAGC,CAAe,EAFhDK,CAGrB,CAEO,SAASE,EAGd,CACA,MAAAR,EACA,SAAAS,EACA,kBAAAC,EACA,oBAAAC,EAAsB,IAAM,CAAC,EAC7B,gBAAAV,CACF,EAiBG,CACD,MAAMK,EAASD,EAAUL,EAAOC,CAAe,EACzCX,EAAWD,EAAA,EAEjBuB,OAAAA,EAAAA,UACE,IAAM,CACAN,IAA4BA,CAAM,IACfhB,CAAQ,CACjC,EACA,CAAA,CAAC,EAGIgB,EAASG,EAASH,CAAM,EAAIO,EAAAA,kBAAAA,IAAAC,EAAAA,kBAAAA,SAAA,EAAE,CACvC,CCrIO,SAASC,EACdC,EAAaC,+BACE,CACf,OAAOC,EAAAA,YAAYC,kBAAgB,EAC9B,KAAK,MAAMC,EAAQ,IAAIJ,CAAU,CAAE,EACpC,MACN,CAOAD,EAAmB,UAAY,CAC7BC,EAAaC,iCAEN,IAAMF,EAAoCC,CAAU,EAwBtD,SAASK,EAGdZ,EACAd,EAAuC,GACvC,CACA,KAAM,CAAE,SAAA2B,EAAU,KAAA1B,EAAO,EAAA,EAASD,EAE5B,CAAE,SAAA4B,CAAA,EAAazB,EAAA,EACfR,EAAWD,EAAA,EACXmC,EAAkBT,EAAA,EAElBU,EACJH,IAAa,CAACE,GAAmBA,EAAgB,YAAcF,GAmBjE,OAjBAV,EAAAA,UAAU,IAAM,CACVa,GACFnC,EAAS,CACP,SACE,SACA,CACE,QAAS,WACT,QAAS,WACT,KAAM,cAAA,EACNgC,CAAQ,EACZ,OAAQ1B,EACJ8B,qBAAmB,CAAE,KAAMH,CAAA,CAAU,EAAE,WACvC,MAAA,CACL,CAEL,EAAG,CAACjC,EAAUmC,EAAeH,EAAU1B,EAAM2B,CAAQ,CAAC,EAElDE,EAAsBZ,wBAAAC,EAAAA,kBAAAA,SAAA,CAAA,CAAE,EAExB,OAAOL,GAAa,WAEjBA,EAA8Ce,CAAe,EAI7Df,CACT,CAMO,SAASkB,EACdC,EACAC,EAAiB,GACjBC,EAAqB,QACa,CAClC,MAAMC,EAAmBC,EAAAA,qBAAqBJ,EAAUE,CAAU,EAC5DG,EAAe,eAAe,QAAQF,CAAgB,EAEtD,CAACG,EAAQC,CAAS,EAAIC,WAAA,EAE5BxB,EAAAA,UAAU,IAAM,CACd,IAAIyB,EACAJ,GAAgBA,EAAa,SAAWJ,EAC1CQ,EAAQJ,GAERI,EAAQC,EAAAA,2BAA2BT,CAAM,EACzC,eAAe,QAAQE,EAAkBM,CAAK,GAGhDF,EAAUE,CAAK,CACjB,EAAG,CAACN,EAAkBE,EAAcJ,CAAM,CAAC,EAE3C,MAAMU,EAAaC,EAAAA,YAAY,IAAM,CACnC,eAAe,WAAWT,CAAgB,EAC1CI,EAAU,MAAS,CACrB,EAAG,CAACJ,CAAgB,CAAC,EAErB,MAAO,CAACG,EAAQK,CAAU,CAC5B,CAEO,SAASE,EACdb,EACAC,EAAqC,IACrCC,EAAqB,gBAC0B,CAC/C,MAAMC,EAAmBC,EAAAA,qBAAqBJ,EAAUE,CAAU,EAC5DG,EAAe,eAAe,QAAQF,CAAgB,EAEtD,CAACW,EAAgBC,CAAiB,EAAIP,WAAA,EAE5CxB,EAAAA,UAAU,IAAM,CACd,IAAIgC,EACJ,GAAIX,EAAc,CAChB,MAAMY,EAA4B,KAAK,MAAMZ,CAAY,EAEvD,OAAOY,GAAqB,UAC5BA,GACA,aAAcA,GACd,OAAOA,EAAiB,UAAY,UACpCA,EAAiB,SAAS,SAAWhB,GACrC,cAAegB,GACf,OAAOA,EAAiB,WAAc,UACtC,WAAYA,GACZA,EAAiB,SAAW,SAE5BD,EAAgB,CACd,SAAUC,EAAiB,SAC3B,UAAWA,EAAiB,UAC5B,OAAQA,EAAiB,MAAA,EAG/B,CAEID,IAAiCA,CAAa,EAEhDE,EAAAA,4BAA4BjB,CAAM,EAC/B,KAAKe,GAAiB,CACrB,eAAe,QACbb,EACA,KAAK,UAAUa,CAAa,CAAA,EAG9BD,EAAkBC,CAAa,CACjC,CAAC,EACA,MAAMG,GAAS,CACVA,GAAO,QAAQ,MAAMA,CAAK,CAChC,CAAC,CAEP,EAAG,CAAChB,EAAkBE,EAAcJ,CAAM,CAAC,EAE3C,MAAMmB,EAAqBR,EAAAA,YAAY,IAAM,CAC3C,eAAe,WAAWT,CAAgB,EAC1CY,EAAkB,MAAS,CAC7B,EAAG,CAACZ,CAAgB,CAAC,EAErB,MAAO,CAACW,EAAgBM,CAAkB,CAC5C,CA4BA,SAASC,EAAmC,CAC1C,SAAArB,EACA,QAAAsB,EACA,SAAAC,EACA,YAAAC,EACA,MAAAC,EACA,aAAAC,EAAe,OACf,WAAAC,EAAa,UACb,OAAAC,EACA,mBAAAzC,EACA,iBAAA0C,EACA,gBAAAC,EACA,kBAAAC,CACF,EAA6C,CAC3C,KAAM,CAACtB,EAAOE,CAAU,EAAIZ,EAAeC,CAAQ,EAC7C,CACJ,CACE,SAAUgC,EACV,UAAWhB,EACX,OAAQiB,CAAA,EACN,CAAA,EACJb,CAAA,EACEP,EAAuBb,CAAQ,EAC7B,CACJkC,EACA,CACE,aAAcC,EAAY,CAAA,EAC1B,UAAWC,EACX,QAASC,CAAA,CACX,EACER,EAAA,EACEjC,EAAkBT,EAAAA,EAClBzB,EAAWD,EAAA,EACXG,EACJC,EAAgB,CAAE,KAAMyE,EAAI,SAAU,MAAOA,EAAI,OAAA,CAAO,CAAG,GAAK,CAAA,EAG5DC,EAFWrE,EAAA,EAEc,OAAS,CAAA,EAyFxC,GAvFAc,EAAAA,UAAU,IAAM,CAGVpB,EAAa,MAAQA,EAAa,OACpCF,EAA2C,IAAK,CAE9C,QAAS,GAET,KAAM,GAEN,MAAO,CAAE,KAAME,EAAa,KAAM,MAAOA,EAAa,KAAA,CAAM,CAC7D,CAEL,EAAG,CAACA,EAAa,KAAMA,EAAa,MAAOF,CAAQ,CAAC,EAEpDsB,EAAAA,UAAU,IAAM,CAEVY,IAAmCA,CAAe,EAGpDa,GACAuB,GAEAO,EAAc,MAEdA,EAAc,QAAU9B,IAGvB0B,EAAU,OAASI,EAAc,MAChCJ,EAAU,gBAAkBH,GAC5BG,EAAU,eAAiBX,GAC3B,CAACa,IAEH,CAACD,GAGDF,EAAM,CACJ,KAAMK,EAAc,KACpB,cAAeP,EACf,aAAcR,CAAA,CACf,EACE,OAAA,EACA,KAAKM,CAAe,EACpB,MAAM,IAAM,CACXpE,EAAS,IAAK,CACZ,QAAS,GACT,MAAO,CACL,cAAe,CACb,CACE,MAAO,CACL,MAAO,GACP,SAAU,oCAAA,CACZ,CACF,CACF,CACF,CACD,CACH,CAAC,EACA,QAAQ,IAAM,CACbiD,EAAA,EACAS,EAAA,CACF,CAAC,CAEP,EAAG,CACD1D,EACA8D,EAEAf,EACA8B,EAAc,MACd5B,EAEAqB,EACAO,EAAc,KACdnB,EAEAc,EACAE,EACAC,EACAF,EAAU,KACVA,EAAU,cACVA,EAAU,aAEVvC,EACAkC,EACAC,CAAA,CACD,EAEGtB,GAASO,GAAiBiB,EAAqB,CACjD,MAAMO,EAAoD,CACxD,UAAWjB,EACX,aAAcC,EACd,MAAAC,EACA,cAAeC,EACf,YAAaC,EACb,MAAAlB,EACA,eAAgBO,EAChB,sBAAuBiB,CAAA,EAGzB,OAAIL,IAAQY,EAAgB,OAAYZ,GAEjC,CACLN,EAAU,IAAM,IAAI,gBAAgBkB,CAAe,EAAE,SAAA,EACrDA,CAAA,CAEJ,CAEA,MAAO,CAAA,CACT,CAEO,MAAMC,EAIXC,GAIOrB,EAEL,uBAAwBqB,EAASA,EAAS,CAAE,GAAGA,EAAQ,mBAAAvD,CAAA,CAAmB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { j as S } from "./jsx-runtime-
|
|
1
|
+
import { j as S } from "./jsx-runtime-C7wFtzyj.js";
|
|
2
2
|
import * as j from "yup";
|
|
3
3
|
import { object as L } from "yup";
|
|
4
4
|
import { useEffect as g, useState as V, useCallback as J } from "react";
|
|
@@ -11,8 +11,8 @@ import { makeOAuth2StorageKey as R, generateOAuth2CodeChallenge as W } from "./u
|
|
|
11
11
|
import "@mui/material";
|
|
12
12
|
import { generateSecureRandomString as X } from "./utils/general.es.js";
|
|
13
13
|
import "@mui/icons-material";
|
|
14
|
-
import "./schemas-
|
|
15
|
-
import "./urls-
|
|
14
|
+
import "./schemas-D3tO0rys.js";
|
|
15
|
+
import "./urls-5m9PgoEX.js";
|
|
16
16
|
import { tryValidateSync as $ } from "./utils/schema.es.js";
|
|
17
17
|
import "./palette-CYwuLBW7.js";
|
|
18
18
|
function C() {
|
|
@@ -234,4 +234,4 @@ export {
|
|
|
234
234
|
Se as i,
|
|
235
235
|
v as u
|
|
236
236
|
};
|
|
237
|
-
//# sourceMappingURL=auth-
|
|
237
|
+
//# sourceMappingURL=auth-CQ1InCxP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-CvJ5Mh6y.js","sources":["../src/hooks/router.tsx","../src/hooks/auth.tsx"],"sourcesContent":["import {\n type Location,\n type Params,\n type To,\n type NavigateOptions as _NavigateOptions,\n useLocation as _useLocation,\n useNavigate as _useNavigate,\n useParams as _useParams,\n useSearchParams as _useSearchParams,\n} from \"react-router\"\nimport { type ObjectShape, object as objectSchema } from \"yup\"\nimport { type ReactNode, useEffect } from \"react\"\n\nimport {\n type ObjectSchemaFromShape,\n type TryValidateSyncOnErrorRT,\n type TryValidateSyncOptions,\n type TryValidateSyncRT,\n tryValidateSync,\n} from \"../utils/schema\"\nimport { type PageState } from \"../components/page\"\nimport { type ReadOnly } from \"../utils/router\"\n\nexport type NavigateOptions<\n State extends Record<string, any> = Record<string, any>,\n> = Omit<_NavigateOptions, \"state\"> & {\n state?: State & Partial<PageState>\n next?: boolean\n}\n\nexport type Navigate = {\n <State extends Record<string, any> = Record<string, any>>(\n to: To,\n options?: NavigateOptions<State>,\n ): void\n (delta: number): void\n}\n\nexport function useNavigate(): Navigate {\n const navigate = _useNavigate()\n const searchParams = useSearchParams()\n\n return (\n toOrDelta: To | number,\n options: (NavigateOptions & { next?: boolean }) | undefined = undefined,\n ) => {\n if (typeof toOrDelta === \"number\") void navigate(toOrDelta)\n else {\n const { next = true, ..._options } = options || {}\n\n void navigate(\n next && \"next\" in searchParams ? searchParams.next : toOrDelta,\n _options,\n )\n }\n }\n}\n\nexport function useLocation<State = {}>() {\n return _useLocation() as Location<null | Partial<PageState & State>>\n}\n\n// -----------------------------------------------------------------------------\n// Use Search Params\n// -----------------------------------------------------------------------------\n\nexport function useSearchParams(): { [k: string]: string }\n\nexport function useSearchParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n): TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n\nexport function useSearchParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape?: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n) {\n const searchParams = Object.fromEntries(_useSearchParams()[0].entries())\n if (!shape) return searchParams\n\n return tryValidateSync(searchParams, objectSchema(shape), validateOptions)\n}\n\n// -----------------------------------------------------------------------------\n// Use Params\n// -----------------------------------------------------------------------------\n\nexport function useParams(): ReadOnly<Params<string>>\n\nexport function useParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n): TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n\nexport function useParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape?: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n) {\n const params = _useParams()\n if (!shape) return params\n\n return tryValidateSync(params, objectSchema(shape), validateOptions)\n}\n\nexport function useParamsRequired<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>({\n shape,\n children,\n onValidationError,\n onValidationSuccess = () => {},\n validateOptions,\n}: {\n shape: Shape\n children: (\n data: NonNullable<\n TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n >,\n ) => ReactNode\n onValidationError: (navigate: Navigate) => void\n onValidationSuccess?: (\n params: NonNullable<\n TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n >,\n ) => void\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >\n}) {\n const params = useParams(shape, validateOptions)\n const navigate = useNavigate()\n\n useEffect(\n () => {\n if (params) onValidationSuccess(params)\n else onValidationError(navigate)\n },\n [], // eslint-disable-line react-hooks/exhaustive-deps\n )\n\n return params ? children(params) : <></>\n}\n","import * as yup from \"yup\"\nimport { type ReactNode, useCallback, useEffect, useState } from \"react\"\nimport Cookies from \"js-cookie\"\nimport type { TypedUseMutation } from \"@reduxjs/toolkit/query/react\"\nimport { createSearchParams } from \"react-router\"\n// eslint-disable-next-line @typescript-eslint/no-restricted-imports\nimport { useSelector } from \"react-redux\"\n\nimport { type AuthFactor, type User } from \"../api\"\nimport {\n type OAuth2CodeChallenge,\n type OAuth2CodeChallengeLengths,\n type OAuth2ReceiveCodeUrlSearchParams,\n type OAuth2RequestCodeUrlSearchParams,\n generateOAuth2CodeChallenge,\n makeOAuth2StorageKey,\n} from \"../utils/auth\"\nimport { useLocation, useNavigate, useSearchParams } from \"./router\"\nimport { type ExchangeOAuth2CodeArg } from \"../api/endpoints/session\"\nimport { SESSION_METADATA_COOKIE_NAME } from \"../settings\"\nimport { generateSecureRandomString } from \"../utils/general\"\nimport { selectIsLoggedIn } from \"../slices/session\"\n\n// -----------------------------------------------------------------------------\n// Session\n// -----------------------------------------------------------------------------\n\nexport interface SessionMetadata {\n user_id: User[\"id\"]\n user_type: \"teacher\" | \"student\" | \"indy\"\n auth_factors: Array<AuthFactor[\"type\"]>\n otp_bypass_token_exists: boolean\n}\n\nexport function useSessionMetadata<T = SessionMetadata>(\n cookieName = SESSION_METADATA_COOKIE_NAME,\n): T | undefined {\n return useSelector(selectIsLoggedIn)\n ? (JSON.parse(Cookies.get(cookieName)!) as T)\n : undefined\n}\n\n/**\n * A utility function to predefine a useSessionMetadata hook.\n * @param cookieName The name of the session metadata cookie.\n * @returns An object containing the session metadata.\n */\nuseSessionMetadata.predefine = <SessionMetadata,>(\n cookieName = SESSION_METADATA_COOKIE_NAME,\n) => {\n return () => useSessionMetadata<SessionMetadata>(cookieName)\n}\n\nexport type UseSessionChildrenFunction<Required extends boolean> = (\n metadata: Required extends true\n ? SessionMetadata\n : SessionMetadata | undefined,\n) => ReactNode\n\nexport type UseSessionChildren<\n UserType extends SessionMetadata[\"user_type\"] | undefined,\n> =\n | ReactNode\n | (UserType extends undefined\n ? UseSessionChildrenFunction<false>\n : UseSessionChildrenFunction<true>)\n\nexport type UseSessionOptions<\n UserType extends SessionMetadata[\"user_type\"] | undefined,\n> = Partial<{\n userType: UserType\n next: boolean\n}>\n\nexport function useSession<\n UserType extends SessionMetadata[\"user_type\"] | undefined = undefined,\n>(\n children: UseSessionChildren<UserType>,\n options: UseSessionOptions<UserType> = {},\n) {\n const { userType, next = true } = options\n\n const { pathname } = useLocation()\n const navigate = useNavigate()\n const sessionMetadata = useSessionMetadata()\n\n const loginRequired =\n userType && (!sessionMetadata || sessionMetadata.user_type !== userType)\n\n useEffect(() => {\n if (loginRequired) {\n navigate({\n pathname:\n \"/login\" +\n {\n teacher: \"/teacher\",\n student: \"/student\",\n indy: \"/independent\",\n }[userType],\n search: next\n ? createSearchParams({ next: pathname }).toString()\n : undefined,\n })\n }\n }, [navigate, loginRequired, userType, next, pathname])\n\n if (loginRequired) return <></>\n\n if (typeof children === \"function\") {\n return sessionMetadata\n ? (children as UseSessionChildrenFunction<true>)(sessionMetadata)\n : (children as UseSessionChildrenFunction<false>)(sessionMetadata)\n }\n\n return children\n}\n\n// -----------------------------------------------------------------------------\n// OAuth2\n// -----------------------------------------------------------------------------\n\nexport function useOAuth2State(\n provider: string,\n length: number = 32,\n storageKey: string = \"state\",\n): [string | undefined, () => void] {\n const oAuth2StorageKey = makeOAuth2StorageKey(provider, storageKey)\n const storageValue = sessionStorage.getItem(oAuth2StorageKey)\n\n const [_state, _setState] = useState<string>()\n\n useEffect(() => {\n let state: string\n if (storageValue && storageValue.length === length) {\n state = storageValue\n } else {\n state = generateSecureRandomString(length)\n sessionStorage.setItem(oAuth2StorageKey, state)\n }\n\n _setState(state)\n }, [oAuth2StorageKey, storageValue, length])\n\n const resetState = useCallback(() => {\n sessionStorage.removeItem(oAuth2StorageKey)\n _setState(undefined)\n }, [oAuth2StorageKey])\n\n return [_state, resetState]\n}\n\nexport function useOAuth2CodeChallenge(\n provider: string,\n length: OAuth2CodeChallengeLengths = 128,\n storageKey: string = \"codeChallenge\",\n): [OAuth2CodeChallenge | undefined, () => void] {\n const oAuth2StorageKey = makeOAuth2StorageKey(provider, storageKey)\n const storageValue = sessionStorage.getItem(oAuth2StorageKey)\n\n const [_codeChallenge, _setCodeChallenge] = useState<OAuth2CodeChallenge>()\n\n useEffect(() => {\n let codeChallenge: OAuth2CodeChallenge | undefined\n if (storageValue) {\n const storageJsonValue: unknown = JSON.parse(storageValue)\n if (\n typeof storageJsonValue === \"object\" &&\n storageJsonValue &&\n \"verifier\" in storageJsonValue &&\n typeof storageJsonValue.verifier == \"string\" &&\n storageJsonValue.verifier.length === length &&\n \"challenge\" in storageJsonValue &&\n typeof storageJsonValue.challenge === \"string\" &&\n \"method\" in storageJsonValue &&\n storageJsonValue.method === \"S256\"\n ) {\n codeChallenge = {\n verifier: storageJsonValue.verifier,\n challenge: storageJsonValue.challenge,\n method: storageJsonValue.method,\n }\n }\n }\n\n if (codeChallenge) _setCodeChallenge(codeChallenge)\n else {\n generateOAuth2CodeChallenge(length)\n .then(codeChallenge => {\n sessionStorage.setItem(\n oAuth2StorageKey,\n JSON.stringify(codeChallenge),\n )\n\n _setCodeChallenge(codeChallenge)\n })\n .catch(error => {\n if (error) console.error(error)\n })\n }\n }, [oAuth2StorageKey, storageValue, length])\n\n const resetCodeChallenge = useCallback(() => {\n sessionStorage.removeItem(oAuth2StorageKey)\n _setCodeChallenge(undefined)\n }, [oAuth2StorageKey])\n\n return [_codeChallenge, resetCodeChallenge]\n}\n\ninterface BaseUseOAuth2KwArgs<SessionMetadata> {\n provider: string\n authUri: string\n clientId: string\n redirectUri: string\n scope: string\n responseType?: \"code\"\n accessType?: \"offline\"\n prompt?: string\n useLoginMutation: TypedUseMutation<\n SessionMetadata,\n ExchangeOAuth2CodeArg,\n any\n >\n onCreateSession: (result: SessionMetadata) => void\n onRetrieveSession: (metadata: SessionMetadata) => void\n}\n\ninterface UseOAuth2KwArgs<SessionMetadata>\n extends BaseUseOAuth2KwArgs<SessionMetadata> {\n useSessionMetadata: () => SessionMetadata | undefined\n}\n\nexport type OAuth2 = [string, OAuth2RequestCodeUrlSearchParams] | []\n\n// https://datatracker.ietf.org/doc/html/rfc7636\nfunction useOAuth2Internal<SessionMetadata>({\n provider,\n authUri,\n clientId,\n redirectUri,\n scope,\n responseType = \"code\",\n accessType = \"offline\",\n prompt,\n useSessionMetadata,\n useLoginMutation,\n onCreateSession,\n onRetrieveSession,\n}: UseOAuth2KwArgs<SessionMetadata>): OAuth2 {\n const [state, resetState] = useOAuth2State(provider)\n const [\n {\n verifier: codeVerifier,\n challenge: codeChallenge,\n method: codeChallengeMethod,\n } = {},\n resetCodeChallenge,\n ] = useOAuth2CodeChallenge(provider)\n const [\n login,\n {\n originalArgs: loginArgs = {} as ExchangeOAuth2CodeArg,\n isLoading: loginIsLoading,\n isError: loginIsError,\n },\n ] = useLoginMutation()\n const sessionMetadata = useSessionMetadata()\n const navigate = useNavigate()\n const searchParams =\n useSearchParams({ code: yup.string(), state: yup.string() }) || {}\n const location = useLocation<OAuth2ReceiveCodeUrlSearchParams>()\n\n const locationState = location.state || {}\n\n useEffect(() => {\n // If the the auth provider has redirected back to our site with the\n // expected search params, we redirect to the current page to remove them.\n if (searchParams.code && searchParams.state) {\n navigate<OAuth2ReceiveCodeUrlSearchParams>(\".\", {\n // Removes the URL containing the search params from the history stack.\n replace: true,\n // Ensure we don't break the auth flow by navigating to another page.\n next: false,\n // Store the search params in the page's state instead.\n state: { code: searchParams.code, state: searchParams.state },\n })\n }\n }, [searchParams.code, searchParams.state, navigate])\n\n useEffect(() => {\n // If we're already logged in, no need to log in again.\n if (sessionMetadata) onRetrieveSession(sessionMetadata)\n else if (\n // If the state and code verifier have been generated...\n state &&\n codeVerifier &&\n // ...and the page's state contains a code...\n locationState.code &&\n // ...and the page's state contains the stored state...\n locationState.state === state &&\n // ...and the login endpoint was not called with the current values or has\n // not returned an error...\n (loginArgs.code !== locationState.code ||\n loginArgs.code_verifier !== codeVerifier ||\n loginArgs.redirect_uri !== redirectUri ||\n !loginIsError) &&\n // ...and the login endpoint is not currently being called...\n !loginIsLoading\n ) {\n // ...call the login endpoint.\n login({\n code: locationState.code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n })\n .unwrap()\n .then(onCreateSession)\n .catch(() => {\n navigate(\".\", {\n replace: true,\n state: {\n notifications: [\n {\n props: {\n error: true,\n children: \"Failed to login. Please try again.\",\n },\n },\n ],\n },\n })\n })\n .finally(() => {\n resetState()\n resetCodeChallenge()\n })\n }\n }, [\n navigate,\n redirectUri,\n // State\n state,\n locationState.state,\n resetState,\n // Code\n codeVerifier,\n locationState.code,\n resetCodeChallenge,\n // Login\n login,\n loginIsLoading,\n loginIsError,\n loginArgs.code,\n loginArgs.code_verifier,\n loginArgs.redirect_uri,\n // Session\n sessionMetadata,\n onCreateSession,\n onRetrieveSession,\n ])\n\n if (state && codeChallenge && codeChallengeMethod) {\n const urlSearchParams: OAuth2RequestCodeUrlSearchParams = {\n client_id: clientId,\n redirect_uri: redirectUri,\n scope,\n response_type: responseType,\n access_type: accessType,\n state,\n code_challenge: codeChallenge,\n code_challenge_method: codeChallengeMethod,\n }\n\n if (prompt) urlSearchParams[\"prompt\"] = prompt\n\n return [\n authUri + \"?\" + new URLSearchParams(urlSearchParams).toString(),\n urlSearchParams,\n ]\n }\n\n return []\n}\n\nexport const useOAuth2: {\n <SessionMetadata>(kwargs: UseOAuth2KwArgs<SessionMetadata>): OAuth2\n (kwargs: BaseUseOAuth2KwArgs<SessionMetadata>): OAuth2\n} = <_SessionMetadata,>(\n kwargs:\n | UseOAuth2KwArgs<_SessionMetadata>\n | BaseUseOAuth2KwArgs<SessionMetadata>,\n): OAuth2 => {\n return useOAuth2Internal(\n // @ts-expect-error value is assignable\n \"useSessionMetadata\" in kwargs ? kwargs : { ...kwargs, useSessionMetadata },\n )\n}\n"],"names":["useNavigate","navigate","_useNavigate","searchParams","useSearchParams","toOrDelta","options","next","_options","useLocation","_useLocation","shape","validateOptions","_useSearchParams","tryValidateSync","objectSchema","useParams","params","_useParams","useParamsRequired","children","onValidationError","onValidationSuccess","useEffect","jsx","Fragment","useSessionMetadata","cookieName","SESSION_METADATA_COOKIE_NAME","useSelector","selectIsLoggedIn","Cookies","useSession","userType","pathname","sessionMetadata","loginRequired","createSearchParams","useOAuth2State","provider","length","storageKey","oAuth2StorageKey","makeOAuth2StorageKey","storageValue","_state","_setState","useState","state","generateSecureRandomString","resetState","useCallback","useOAuth2CodeChallenge","_codeChallenge","_setCodeChallenge","codeChallenge","storageJsonValue","generateOAuth2CodeChallenge","error","resetCodeChallenge","useOAuth2Internal","authUri","clientId","redirectUri","scope","responseType","accessType","prompt","useLoginMutation","onCreateSession","onRetrieveSession","codeVerifier","codeChallengeMethod","login","loginArgs","loginIsLoading","loginIsError","yup","locationState","urlSearchParams","useOAuth2","kwargs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth-CQ1InCxP.js","sources":["../src/hooks/router.tsx","../src/hooks/auth.tsx"],"sourcesContent":["import {\n type Location,\n type Params,\n type To,\n type NavigateOptions as _NavigateOptions,\n useLocation as _useLocation,\n useNavigate as _useNavigate,\n useParams as _useParams,\n useSearchParams as _useSearchParams,\n} from \"react-router\"\nimport { type ObjectShape, object as objectSchema } from \"yup\"\nimport { type ReactNode, useEffect } from \"react\"\n\nimport {\n type ObjectSchemaFromShape,\n type TryValidateSyncOnErrorRT,\n type TryValidateSyncOptions,\n type TryValidateSyncRT,\n tryValidateSync,\n} from \"../utils/schema\"\nimport { type PageState } from \"../components/page\"\nimport { type ReadOnly } from \"../utils/router\"\n\nexport type NavigateOptions<\n State extends Record<string, any> = Record<string, any>,\n> = Omit<_NavigateOptions, \"state\"> & {\n state?: State & Partial<PageState>\n next?: boolean\n}\n\nexport type Navigate = {\n <State extends Record<string, any> = Record<string, any>>(\n to: To,\n options?: NavigateOptions<State>,\n ): void\n (delta: number): void\n}\n\nexport function useNavigate(): Navigate {\n const navigate = _useNavigate()\n const searchParams = useSearchParams()\n\n return (\n toOrDelta: To | number,\n options: (NavigateOptions & { next?: boolean }) | undefined = undefined,\n ) => {\n if (typeof toOrDelta === \"number\") void navigate(toOrDelta)\n else {\n const { next = true, ..._options } = options || {}\n\n void navigate(\n next && \"next\" in searchParams ? searchParams.next : toOrDelta,\n _options,\n )\n }\n }\n}\n\nexport function useLocation<State = {}>() {\n return _useLocation() as Location<null | Partial<PageState & State>>\n}\n\n// -----------------------------------------------------------------------------\n// Use Search Params\n// -----------------------------------------------------------------------------\n\nexport function useSearchParams(): { [k: string]: string }\n\nexport function useSearchParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n): TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n\nexport function useSearchParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape?: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n) {\n const searchParams = Object.fromEntries(_useSearchParams()[0].entries())\n if (!shape) return searchParams\n\n return tryValidateSync(searchParams, objectSchema(shape), validateOptions)\n}\n\n// -----------------------------------------------------------------------------\n// Use Params\n// -----------------------------------------------------------------------------\n\nexport function useParams(): ReadOnly<Params<string>>\n\nexport function useParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n): TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n\nexport function useParams<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>(\n shape?: Shape,\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >,\n) {\n const params = _useParams()\n if (!shape) return params\n\n return tryValidateSync(params, objectSchema(shape), validateOptions)\n}\n\nexport function useParamsRequired<\n OnErrorRT extends TryValidateSyncOnErrorRT<ObjectSchemaFromShape<Shape>>,\n Shape extends ObjectShape = {},\n>({\n shape,\n children,\n onValidationError,\n onValidationSuccess = () => {},\n validateOptions,\n}: {\n shape: Shape\n children: (\n data: NonNullable<\n TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n >,\n ) => ReactNode\n onValidationError: (navigate: Navigate) => void\n onValidationSuccess?: (\n params: NonNullable<\n TryValidateSyncRT<ObjectSchemaFromShape<Shape>, OnErrorRT>\n >,\n ) => void\n validateOptions?: TryValidateSyncOptions<\n ObjectSchemaFromShape<Shape>,\n OnErrorRT\n >\n}) {\n const params = useParams(shape, validateOptions)\n const navigate = useNavigate()\n\n useEffect(\n () => {\n if (params) onValidationSuccess(params)\n else onValidationError(navigate)\n },\n [], // eslint-disable-line react-hooks/exhaustive-deps\n )\n\n return params ? children(params) : <></>\n}\n","import * as yup from \"yup\"\nimport { type ReactNode, useCallback, useEffect, useState } from \"react\"\nimport Cookies from \"js-cookie\"\nimport type { TypedUseMutation } from \"@reduxjs/toolkit/query/react\"\nimport { createSearchParams } from \"react-router\"\n// eslint-disable-next-line @typescript-eslint/no-restricted-imports\nimport { useSelector } from \"react-redux\"\n\nimport { type AuthFactor, type User } from \"../api\"\nimport {\n type OAuth2CodeChallenge,\n type OAuth2CodeChallengeLengths,\n type OAuth2ReceiveCodeUrlSearchParams,\n type OAuth2RequestCodeUrlSearchParams,\n generateOAuth2CodeChallenge,\n makeOAuth2StorageKey,\n} from \"../utils/auth\"\nimport { useLocation, useNavigate, useSearchParams } from \"./router\"\nimport { type ExchangeOAuth2CodeArg } from \"../api/endpoints/session\"\nimport { SESSION_METADATA_COOKIE_NAME } from \"../settings\"\nimport { generateSecureRandomString } from \"../utils/general\"\nimport { selectIsLoggedIn } from \"../slices/session\"\n\n// -----------------------------------------------------------------------------\n// Session\n// -----------------------------------------------------------------------------\n\nexport interface SessionMetadata {\n user_id: User[\"id\"]\n user_type: \"teacher\" | \"student\" | \"indy\"\n auth_factors: Array<AuthFactor[\"type\"]>\n otp_bypass_token_exists: boolean\n}\n\nexport function useSessionMetadata<T = SessionMetadata>(\n cookieName = SESSION_METADATA_COOKIE_NAME,\n): T | undefined {\n return useSelector(selectIsLoggedIn)\n ? (JSON.parse(Cookies.get(cookieName)!) as T)\n : undefined\n}\n\n/**\n * A utility function to predefine a useSessionMetadata hook.\n * @param cookieName The name of the session metadata cookie.\n * @returns An object containing the session metadata.\n */\nuseSessionMetadata.predefine = <SessionMetadata,>(\n cookieName = SESSION_METADATA_COOKIE_NAME,\n) => {\n return () => useSessionMetadata<SessionMetadata>(cookieName)\n}\n\nexport type UseSessionChildrenFunction<Required extends boolean> = (\n metadata: Required extends true\n ? SessionMetadata\n : SessionMetadata | undefined,\n) => ReactNode\n\nexport type UseSessionChildren<\n UserType extends SessionMetadata[\"user_type\"] | undefined,\n> =\n | ReactNode\n | (UserType extends undefined\n ? UseSessionChildrenFunction<false>\n : UseSessionChildrenFunction<true>)\n\nexport type UseSessionOptions<\n UserType extends SessionMetadata[\"user_type\"] | undefined,\n> = Partial<{\n userType: UserType\n next: boolean\n}>\n\nexport function useSession<\n UserType extends SessionMetadata[\"user_type\"] | undefined = undefined,\n>(\n children: UseSessionChildren<UserType>,\n options: UseSessionOptions<UserType> = {},\n) {\n const { userType, next = true } = options\n\n const { pathname } = useLocation()\n const navigate = useNavigate()\n const sessionMetadata = useSessionMetadata()\n\n const loginRequired =\n userType && (!sessionMetadata || sessionMetadata.user_type !== userType)\n\n useEffect(() => {\n if (loginRequired) {\n navigate({\n pathname:\n \"/login\" +\n {\n teacher: \"/teacher\",\n student: \"/student\",\n indy: \"/independent\",\n }[userType],\n search: next\n ? createSearchParams({ next: pathname }).toString()\n : undefined,\n })\n }\n }, [navigate, loginRequired, userType, next, pathname])\n\n if (loginRequired) return <></>\n\n if (typeof children === \"function\") {\n return sessionMetadata\n ? (children as UseSessionChildrenFunction<true>)(sessionMetadata)\n : (children as UseSessionChildrenFunction<false>)(sessionMetadata)\n }\n\n return children\n}\n\n// -----------------------------------------------------------------------------\n// OAuth2\n// -----------------------------------------------------------------------------\n\nexport function useOAuth2State(\n provider: string,\n length: number = 32,\n storageKey: string = \"state\",\n): [string | undefined, () => void] {\n const oAuth2StorageKey = makeOAuth2StorageKey(provider, storageKey)\n const storageValue = sessionStorage.getItem(oAuth2StorageKey)\n\n const [_state, _setState] = useState<string>()\n\n useEffect(() => {\n let state: string\n if (storageValue && storageValue.length === length) {\n state = storageValue\n } else {\n state = generateSecureRandomString(length)\n sessionStorage.setItem(oAuth2StorageKey, state)\n }\n\n _setState(state)\n }, [oAuth2StorageKey, storageValue, length])\n\n const resetState = useCallback(() => {\n sessionStorage.removeItem(oAuth2StorageKey)\n _setState(undefined)\n }, [oAuth2StorageKey])\n\n return [_state, resetState]\n}\n\nexport function useOAuth2CodeChallenge(\n provider: string,\n length: OAuth2CodeChallengeLengths = 128,\n storageKey: string = \"codeChallenge\",\n): [OAuth2CodeChallenge | undefined, () => void] {\n const oAuth2StorageKey = makeOAuth2StorageKey(provider, storageKey)\n const storageValue = sessionStorage.getItem(oAuth2StorageKey)\n\n const [_codeChallenge, _setCodeChallenge] = useState<OAuth2CodeChallenge>()\n\n useEffect(() => {\n let codeChallenge: OAuth2CodeChallenge | undefined\n if (storageValue) {\n const storageJsonValue: unknown = JSON.parse(storageValue)\n if (\n typeof storageJsonValue === \"object\" &&\n storageJsonValue &&\n \"verifier\" in storageJsonValue &&\n typeof storageJsonValue.verifier == \"string\" &&\n storageJsonValue.verifier.length === length &&\n \"challenge\" in storageJsonValue &&\n typeof storageJsonValue.challenge === \"string\" &&\n \"method\" in storageJsonValue &&\n storageJsonValue.method === \"S256\"\n ) {\n codeChallenge = {\n verifier: storageJsonValue.verifier,\n challenge: storageJsonValue.challenge,\n method: storageJsonValue.method,\n }\n }\n }\n\n if (codeChallenge) _setCodeChallenge(codeChallenge)\n else {\n generateOAuth2CodeChallenge(length)\n .then(codeChallenge => {\n sessionStorage.setItem(\n oAuth2StorageKey,\n JSON.stringify(codeChallenge),\n )\n\n _setCodeChallenge(codeChallenge)\n })\n .catch(error => {\n if (error) console.error(error)\n })\n }\n }, [oAuth2StorageKey, storageValue, length])\n\n const resetCodeChallenge = useCallback(() => {\n sessionStorage.removeItem(oAuth2StorageKey)\n _setCodeChallenge(undefined)\n }, [oAuth2StorageKey])\n\n return [_codeChallenge, resetCodeChallenge]\n}\n\ninterface BaseUseOAuth2KwArgs<SessionMetadata> {\n provider: string\n authUri: string\n clientId: string\n redirectUri: string\n scope: string\n responseType?: \"code\"\n accessType?: \"offline\"\n prompt?: string\n useLoginMutation: TypedUseMutation<\n SessionMetadata,\n ExchangeOAuth2CodeArg,\n any\n >\n onCreateSession: (result: SessionMetadata) => void\n onRetrieveSession: (metadata: SessionMetadata) => void\n}\n\ninterface UseOAuth2KwArgs<SessionMetadata>\n extends BaseUseOAuth2KwArgs<SessionMetadata> {\n useSessionMetadata: () => SessionMetadata | undefined\n}\n\nexport type OAuth2 = [string, OAuth2RequestCodeUrlSearchParams] | []\n\n// https://datatracker.ietf.org/doc/html/rfc7636\nfunction useOAuth2Internal<SessionMetadata>({\n provider,\n authUri,\n clientId,\n redirectUri,\n scope,\n responseType = \"code\",\n accessType = \"offline\",\n prompt,\n useSessionMetadata,\n useLoginMutation,\n onCreateSession,\n onRetrieveSession,\n}: UseOAuth2KwArgs<SessionMetadata>): OAuth2 {\n const [state, resetState] = useOAuth2State(provider)\n const [\n {\n verifier: codeVerifier,\n challenge: codeChallenge,\n method: codeChallengeMethod,\n } = {},\n resetCodeChallenge,\n ] = useOAuth2CodeChallenge(provider)\n const [\n login,\n {\n originalArgs: loginArgs = {} as ExchangeOAuth2CodeArg,\n isLoading: loginIsLoading,\n isError: loginIsError,\n },\n ] = useLoginMutation()\n const sessionMetadata = useSessionMetadata()\n const navigate = useNavigate()\n const searchParams =\n useSearchParams({ code: yup.string(), state: yup.string() }) || {}\n const location = useLocation<OAuth2ReceiveCodeUrlSearchParams>()\n\n const locationState = location.state || {}\n\n useEffect(() => {\n // If the the auth provider has redirected back to our site with the\n // expected search params, we redirect to the current page to remove them.\n if (searchParams.code && searchParams.state) {\n navigate<OAuth2ReceiveCodeUrlSearchParams>(\".\", {\n // Removes the URL containing the search params from the history stack.\n replace: true,\n // Ensure we don't break the auth flow by navigating to another page.\n next: false,\n // Store the search params in the page's state instead.\n state: { code: searchParams.code, state: searchParams.state },\n })\n }\n }, [searchParams.code, searchParams.state, navigate])\n\n useEffect(() => {\n // If we're already logged in, no need to log in again.\n if (sessionMetadata) onRetrieveSession(sessionMetadata)\n else if (\n // If the state and code verifier have been generated...\n state &&\n codeVerifier &&\n // ...and the page's state contains a code...\n locationState.code &&\n // ...and the page's state contains the stored state...\n locationState.state === state &&\n // ...and the login endpoint was not called with the current values or has\n // not returned an error...\n (loginArgs.code !== locationState.code ||\n loginArgs.code_verifier !== codeVerifier ||\n loginArgs.redirect_uri !== redirectUri ||\n !loginIsError) &&\n // ...and the login endpoint is not currently being called...\n !loginIsLoading\n ) {\n // ...call the login endpoint.\n login({\n code: locationState.code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n })\n .unwrap()\n .then(onCreateSession)\n .catch(() => {\n navigate(\".\", {\n replace: true,\n state: {\n notifications: [\n {\n props: {\n error: true,\n children: \"Failed to login. Please try again.\",\n },\n },\n ],\n },\n })\n })\n .finally(() => {\n resetState()\n resetCodeChallenge()\n })\n }\n }, [\n navigate,\n redirectUri,\n // State\n state,\n locationState.state,\n resetState,\n // Code\n codeVerifier,\n locationState.code,\n resetCodeChallenge,\n // Login\n login,\n loginIsLoading,\n loginIsError,\n loginArgs.code,\n loginArgs.code_verifier,\n loginArgs.redirect_uri,\n // Session\n sessionMetadata,\n onCreateSession,\n onRetrieveSession,\n ])\n\n if (state && codeChallenge && codeChallengeMethod) {\n const urlSearchParams: OAuth2RequestCodeUrlSearchParams = {\n client_id: clientId,\n redirect_uri: redirectUri,\n scope,\n response_type: responseType,\n access_type: accessType,\n state,\n code_challenge: codeChallenge,\n code_challenge_method: codeChallengeMethod,\n }\n\n if (prompt) urlSearchParams[\"prompt\"] = prompt\n\n return [\n authUri + \"?\" + new URLSearchParams(urlSearchParams).toString(),\n urlSearchParams,\n ]\n }\n\n return []\n}\n\nexport const useOAuth2: {\n <SessionMetadata>(kwargs: UseOAuth2KwArgs<SessionMetadata>): OAuth2\n (kwargs: BaseUseOAuth2KwArgs<SessionMetadata>): OAuth2\n} = <_SessionMetadata,>(\n kwargs:\n | UseOAuth2KwArgs<_SessionMetadata>\n | BaseUseOAuth2KwArgs<SessionMetadata>,\n): OAuth2 => {\n return useOAuth2Internal(\n // @ts-expect-error value is assignable\n \"useSessionMetadata\" in kwargs ? kwargs : { ...kwargs, useSessionMetadata },\n )\n}\n"],"names":["useNavigate","navigate","_useNavigate","searchParams","useSearchParams","toOrDelta","options","next","_options","useLocation","_useLocation","shape","validateOptions","_useSearchParams","tryValidateSync","objectSchema","useParams","params","_useParams","useParamsRequired","children","onValidationError","onValidationSuccess","useEffect","jsx","Fragment","useSessionMetadata","cookieName","SESSION_METADATA_COOKIE_NAME","useSelector","selectIsLoggedIn","Cookies","useSession","userType","pathname","sessionMetadata","loginRequired","createSearchParams","useOAuth2State","provider","length","storageKey","oAuth2StorageKey","makeOAuth2StorageKey","storageValue","_state","_setState","useState","state","generateSecureRandomString","resetState","useCallback","useOAuth2CodeChallenge","_codeChallenge","_setCodeChallenge","codeChallenge","storageJsonValue","generateOAuth2CodeChallenge","error","resetCodeChallenge","useOAuth2Internal","authUri","clientId","redirectUri","scope","responseType","accessType","prompt","useLoginMutation","onCreateSession","onRetrieveSession","codeVerifier","codeChallengeMethod","login","loginArgs","loginIsLoading","loginIsError","yup","locationState","urlSearchParams","useOAuth2","kwargs"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../index-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../index-CIj5ef8a.cjs");exports.ApiAutocompleteField=e.ApiAutocompleteField;exports.AutocompleteField=e.AutocompleteField;exports.CheckboxField=e.CheckboxField;exports.CountryField=e.CountryField;exports.DatePickerField=e.DatePickerField;exports.EmailField=e.EmailField;exports.FirstNameField=e.FirstNameField;exports.Form=e.Form;exports.OtpField=e.OtpField;exports.PasswordField=e.PasswordField;exports.RepeatField=e.RepeatField;exports.SubmitButton=e.SubmitButton;exports.TextField=e.TextField;exports.UkCountyField=e.UkCountyField;
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as i, a as s, C as l, b as t, D as F, E as d, F as o, c as m, O as r, P as p, R as u, S as c, T as A, U as C } from "../../index-
|
|
1
|
+
import { A as i, a as s, C as l, b as t, D as F, E as d, F as o, c as m, O as r, P as p, R as u, S as c, T as A, U as C } from "../../index-C-3iPCa4.js";
|
|
2
2
|
export {
|
|
3
3
|
i as ApiAutocompleteField,
|
|
4
4
|
s as AutocompleteField,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const w=require("../index-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const w=require("../index-CIj5ef8a.cjs"),C=require("../index-CBPn0wyX.cjs"),R=require("../Navigate-C_sgy8Xs.cjs"),S=require("../LinkButton-BOPjG7_2.cjs"),_=require("../index-B6aNVvMr.cjs"),n=require("../jsx-runtime-Dszzpdy0.cjs"),L=require("react-router"),u=require("@mui/material"),j=require("react"),M=require("react-redux"),F=require("../Countdown-CyJ-01oU.cjs"),U=require("../auth-B7Vdot4N.cjs"),A=require("../utils/general.cjs.js"),T=require("@mui/icons-material"),$=require("../Image-CgYjq-tA.cjs"),b=require("../api-CaeeoZaI.cjs"),D=require("../api-DIgp_6Vr.cjs"),q=({path:e,routes:s,header:t=n.jsxRuntimeExports.jsx(n.jsxRuntimeExports.Fragment,{}),footer:r=n.jsxRuntimeExports.jsx(n.jsxRuntimeExports.Fragment,{}),headerExcludePaths:o=[],footerExcludePaths:i=[]})=>n.jsxRuntimeExports.jsxs(n.jsxRuntimeExports.Fragment,{children:[!o.includes(e)&&t,n.jsxRuntimeExports.jsx(L.Routes,{children:s}),!i.includes(e)&&r]}),G=e=>{const{pathname:s}=U.useLocation();return n.jsxRuntimeExports.jsx(q,{path:s,...e})},N=({path:e,theme:s,store:t,maxIdleSeconds:r=3600,maxTotalSeconds:o=3600,...i})=>n.jsxRuntimeExports.jsxs(u.ThemeProvider,{theme:s,children:[n.jsxRuntimeExports.jsx(u.CssBaseline,{}),n.jsxRuntimeExports.jsx(M.Provider,{store:t,children:e!==void 0?n.jsxRuntimeExports.jsx(L.StaticRouter,{location:e,children:n.jsxRuntimeExports.jsx(q,{path:e,...i})}):n.jsxRuntimeExports.jsx(L.BrowserRouter,{children:n.jsxRuntimeExports.jsx(G,{...i})})})]}),V=({open:e=!1,onClick:s,...t})=>{const[r,o]=j.useState(e);return j.useEffect(()=>{o(e)},[e]),n.jsxRuntimeExports.jsx(u.Tooltip,{open:r,onMouseOver:()=>{r||o(!0)},onMouseLeave:()=>{o(!1)},onClick:A.wrap({after:()=>{o(!r)}},s),...t})},Y=({content:e,children:s=n.jsxRuntimeExports.jsx(T.ContentCopy,{}),...t})=>n.jsxRuntimeExports.jsx(u.IconButton,{"data-testid":"copy-icon-button",onClick:()=>{navigator.clipboard.writeText(e)},...t,children:s}),P=({children:e="Download",endIcon:s=n.jsxRuntimeExports.jsx(T.Download,{}),file:t,...r})=>{let o,i;if("mimeType"in t){const{text:a,mimeType:l,name:c,charset:m="utf-8"}=t;let{extension:d}=t;d||(d="."+{plain:"txt",csv:"csv"}[l]),i={download:c+d,href:`data:text/${l};charset=${m},${encodeURIComponent(a)}`}}else o=URL.createObjectURL(t),i={href:o};return j.useEffect(()=>()=>{o&&URL.revokeObjectURL(o)},[o]),n.jsxRuntimeExports.jsx(u.Button,{endIcon:s,...r,...i,children:e})},z=({containerProps:e,toolbarProps:s,elevation:t=4,children:r,...o})=>{const i=u.useScrollTrigger({disableHysteresis:!0,threshold:0});return j.cloneElement(n.jsxRuntimeExports.jsx(u.AppBar,{elevation:t,...o,children:n.jsxRuntimeExports.jsx(u.Container,{...e,children:n.jsxRuntimeExports.jsx(u.Toolbar,{...s,children:r})})}),{position:i?"fixed":"sticky"})},H=({children:e,inputProps:s,...t})=>n.jsxRuntimeExports.jsxs(u.Button,{component:"label",...t,children:[e,n.jsxRuntimeExports.jsx("input",{type:"file",hidden:!0,...s})]}),I=({styleType:e,listProps:s={},pl:t=4,children:r})=>{const{sx:o,...i}=s,a={display:"list-item"};return n.jsxRuntimeExports.jsx(u.List,{sx:{listStyleType:e,pl:t,".MuiListItem-root":a,".MuiListItemText-root":a,...o},...i,children:r})},J=({rows:e,containerProps:s={},globalItemProps:t})=>{const r=Number(s.columns??12),o=l=>Math.floor(r/l),i=(l,c,m)=>Math.floor(c/o(m))*e.length+l,a=(l,c)=>{const m=e[0].length%o(c);return m!==0&&l===e[0].length-1?(r-m*c)/2:0};return n.jsxRuntimeExports.jsx(u.Unstable_Grid2,{container:!0,...s,children:e.map((l,c)=>l.map(({element:m,itemProps:d={}},x)=>n.jsxRuntimeExports.jsx(u.Unstable_Grid2,{order:{xs:i(c,x,t.xs),sm:i(c,x,t.sm),md:i(c,x,t.md),lg:i(c,x,t.lg),xl:i(c,x,t.xl)},xsOffset:a(x,t.xs),smOffset:a(x,t.sm),mdOffset:a(x,t.md),lgOffset:a(x,t.lg),xlOffset:a(x,t.xl),...t,...d,children:m},`${c}-${x}`)))})},K=({elementId:e,options:s,...t})=>n.jsxRuntimeExports.jsx(u.Link,{...t,onClick:()=>{document.getElementById(e)?.scrollIntoView(s)}}),Q=({children:e,useLazyListQuery:s,preferCacheValue:t,filters:r,page:o=0,rowsPerPage:i=50,rowsPerPageOptions:a=[50,100,150],stackProps:l,onRowsPerPageChange:c,onPageChange:m,...d})=>{const[x,k]=s(),[{limit:E,page:v,offset:g},y]=D.usePagination({page:o,limit:i});j.useEffect(()=>{x({limit:E,offset:g,...r},t)},[x,E,g,...Object.values(r||{}),t]);const{count:B,max_limit:h}=k.data||{};return h&&(a=a.filter(p=>p<=h)),n.jsxRuntimeExports.jsxs(u.Stack,{...l,children:[b.handleResultState(k,({data:p})=>e(p,{limit:E,page:v,offset:g,count:B,maxLimit:h})),n.jsxRuntimeExports.jsx(u.TablePagination,{component:"div",count:B??0,rowsPerPage:E,onRowsPerPageChange:p=>{y({limit:parseInt(p.target.value),page:0}),c&&c(p)},page:v,onPageChange:(p,f)=>{y(({limit:O})=>({limit:O,page:f})),m&&m(p,f)},rowsPerPageOptions:a.sort((p,f)=>p-f),...d})]})},W=({src:e,style:s={},...t})=>n.jsxRuntimeExports.jsx(u.Box,{component:"iframe",width:"100%",src:e,title:"YouTube video player",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen",style:{border:"0px",aspectRatio:"16 / 9",...s},...t});exports.forms=w.index;exports.pages=C.index;exports.Link=R.Link;exports.LinkIconButton=R.LinkIconButton;exports.LinkListItem=R.LinkListItem;exports.LinkTab=R.LinkTab;exports.Navigate=R.Navigate;exports.LinkButton=S.LinkButton;exports.tables=_.index;exports.Countdown=F.Countdown;exports.Image=$.Image;exports.SyncError=b.SyncError;exports.App=N;exports.ClickableTooltip=V;exports.CopyIconButton=Y;exports.DownloadFileButton=P;exports.ElevatedAppBar=z;exports.InputFileButton=H;exports.ItemizedList=I;exports.OrderedGrid=J;exports.ScrollIntoViewLink=K;exports.TablePagination=Q;exports.YouTubeVideo=W;
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { i as Rt } from "../index-
|
|
2
|
-
import { i as kt } from "../index-
|
|
3
|
-
import { L as Ot, a as bt, b as Ct, c as St, N as wt } from "../Navigate-
|
|
4
|
-
import { L as $t } from "../LinkButton-
|
|
5
|
-
import { i as Ut } from "../index-
|
|
6
|
-
import { j as o } from "../jsx-runtime-
|
|
1
|
+
import { i as Rt } from "../index-C-3iPCa4.js";
|
|
2
|
+
import { i as kt } from "../index-DcmDxIXA.js";
|
|
3
|
+
import { L as Ot, a as bt, b as Ct, c as St, N as wt } from "../Navigate-SL_oMjPc.js";
|
|
4
|
+
import { L as $t } from "../LinkButton-Bk50AHHg.js";
|
|
5
|
+
import { i as Ut } from "../index-Dfo744Sb.js";
|
|
6
|
+
import { j as o } from "../jsx-runtime-C7wFtzyj.js";
|
|
7
7
|
import { StaticRouter as C, BrowserRouter as S, Routes as w } from "react-router";
|
|
8
8
|
import { ThemeProvider as E, CssBaseline as $, Tooltip as M, IconButton as U, Button as k, useScrollTrigger as F, AppBar as _, Container as A, Toolbar as D, List as N, Unstable_Grid2 as R, Link as G, Stack as V, TablePagination as Y, Box as H } from "@mui/material";
|
|
9
9
|
import T, { useEffect as B, cloneElement as P } from "react";
|
|
10
10
|
import { Provider as q } from "react-redux";
|
|
11
|
-
import { C as _t } from "../Countdown-
|
|
12
|
-
import { f as z } from "../auth-
|
|
11
|
+
import { C as _t } from "../Countdown-BTyB1rrK.js";
|
|
12
|
+
import { f as z } from "../auth-CQ1InCxP.js";
|
|
13
13
|
import { wrap as J } from "../utils/general.es.js";
|
|
14
14
|
import { ContentCopy as K, Download as Q } from "@mui/icons-material";
|
|
15
|
-
import { I as Dt } from "../Image-
|
|
16
|
-
import { h as W } from "../api-
|
|
17
|
-
import { S as Gt } from "../api-
|
|
15
|
+
import { I as Dt } from "../Image-C-f2ChBh.js";
|
|
16
|
+
import { h as W } from "../api-BvUiTeR7.js";
|
|
17
|
+
import { S as Gt } from "../api-BvUiTeR7.js";
|
|
18
18
|
import { u as X } from "../api-Cs4Y-WeI.js";
|
|
19
19
|
const O = ({
|
|
20
20
|
path: e,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../index-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../index-CBPn0wyX.cjs");exports.Banner=e.Banner;exports.Notification=e.Notification;exports.Page=e.Page;exports.Section=e.Section;exports.TabBar=e.TabBar;
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("../../Navigate-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("../../Navigate-C_sgy8Xs.cjs"),n=require("../../LinkButton-BOPjG7_2.cjs");exports.Link=t.Link;exports.LinkIconButton=t.LinkIconButton;exports.LinkListItem=t.LinkListItem;exports.LinkTab=t.LinkTab;exports.Navigate=t.Navigate;exports.LinkButton=n.LinkButton;
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { L as n, a as L, b as i, c as o, N as s } from "../../Navigate-
|
|
2
|
-
import { L as e } from "../../LinkButton-
|
|
1
|
+
import { L as n, a as L, b as i, c as o, N as s } from "../../Navigate-SL_oMjPc.js";
|
|
2
|
+
import { L as e } from "../../LinkButton-Bk50AHHg.js";
|
|
3
3
|
export {
|
|
4
4
|
n as Link,
|
|
5
5
|
e as LinkButton,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../index-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../index-B6aNVvMr.cjs"),t=require("@mui/material");exports.CellStack=e.CellStack;exports.Table=e.Table;Object.defineProperty(exports,"BodyRow",{enumerable:!0,get:()=>t.TableRow});Object.defineProperty(exports,"Cell",{enumerable:!0,get:()=>t.TableCell});
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("../jsx-runtime-CeSfJrVB.cjs"),e=require("@mui/material");require("react");require("@mui/icons-material");require("formik");require("yup");require("../en-gb-CpyEkKq3.cjs");require("@mui/x-date-pickers");require("dayjs");require("../settings/index.cjs.js");require("../session-CE2U7oL1.cjs");require("js-cookie");require("../schemas-BZbJpkD5.cjs");require("../urls-MaVXL_C2.cjs");require("react-router");require("../palette-BnIdHKDE.cjs");require("../auth-C_aSIrwD.cjs");require("react-redux");const t=require("../Countdown-7-Mzftzr.cjs"),a=require("../Image-mgT45r_B.cjs"),r=({open:s,onClose:l})=>c.jsxRuntimeExports.jsxs(e.Dialog,{open:s,onClose:l,children:[c.jsxRuntimeExports.jsx(e.Typography,{variant:"h5",textAlign:"center",children:"Where did you go? 👀"}),c.jsxRuntimeExports.jsx(e.Typography,{textAlign:"center",children:"We noticed that you have been inactive for a while. Are you still there? For your online safety we will log you out in:"}),c.jsxRuntimeExports.jsx(t.Countdown,{textAlign:"center",variant:"h5",seconds:120,onEnd:()=>{l(),alert("TODO: call logout endpoint")}}),c.jsxRuntimeExports.jsx(e.Typography,{textAlign:"center",children:"You may lose progress unless you continue or save."}),c.jsxRuntimeExports.jsx(e.Button,{onClick:l,autoFocus:!0,children:"Wait, I'm still here!"})]}),i="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20511.91%20423.62'%3e%3cdefs%3e%3cstyle%3e.d{fill:%23f9c5db;}.e{fill:%23fff;}.f{fill:%23666;}.g{fill:%23db5d90;}.h{fill:%23afafaf;}.i{fill:%235b5a5b;}.j{opacity:.2;}%3c/style%3e%3c/defs%3e%3cg%20id='a'/%3e%3cg%20id='b'%3e%3cpath%20class='d'%20d='M442.29,190.69c-4.39-18.43-13.61-35.22-22.63-51.72-2.21-4.04-4.38-8.11-6.49-12.2-.07-.13-.15-.37-.24-.62-.09-.56-.22-1.26-.27-1.5-.35-1.67-.71-3.47-.94-5.22,.17,.84,.17-2.04,.07-3.29-.21-2.8-.49-5.71-1.13-8.45-1.27-5.43-4.12-9.99-7.23-14.49-2.25-3.27-4.6-6.48-6.59-9.92-.51-.88-.98-1.79-1.46-2.69-.01-.03-.03-.06-.04-.09-.1-.52-.3-1.36-.42-1.68,0-.08,0-.15,0-.24-.25-7.47-1.39-15.18-3.36-22.4-4.34-15.9-13.85-30.79-29.48-37.38-10.06-4.25-21.31-5.05-31.65-1.16-5.07,1.91-9.75,4.4-14.44,7.09-.67,.38-1.33,.76-2,1.14-.09-.07-.17-.13-.24-.18-.89-.7-1.77-1.4-2.66-2.09-4.9-3.81-9.64-7.47-15.34-10-12.16-5.41-25.49-7.1-38.72-7.13-6-3.36-12.68-5.63-20.27-6.29-19.81-1.71-35.07,9.1-50.05,19.98-1.84,.87-3.65,1.79-5.43,2.76-11.73-2.88-23.23-6.51-35.37-7.64-16.82-1.56-32.38,3.66-45.25,14.38-5.58,4.65-10.45,10.7-14,17.38-11.73-2.99-24.82-.3-33.89,8.54-2.85,2.78-5.27,6.15-6.98,9.75-.74,1.55-1.52,3.11-2.19,4.69-6.99,3.63-13.43,6.54-18.48,13.08-5.54,7.17-8.17,15.32-9.36,24.21-.58,4.3-.78,8.52-.87,12.85-.03,1.77-.06,3.54-.14,5.32-.05,1.17-.2,2.35-.22,3.52,0,.05,0,.07,0,.11-.02,.05-.03,.09-.05,.16-.27,.86-1.49,4.85-.87,3.73-.57,1.18-1.24,2.31-1.87,3.45-2.45,4.43-4.95,9.05-6.21,13.98-2.6,10.17-.92,20.53,1.19,30.62,1.99,9.53,5.06,19.27,9.72,28.06-.18,.57-.32,1.16-.42,1.77-2.48,14.32-4.41,28.45-1.82,42.89,2.62,14.62,11.3,25.55,22.21,35.04,2.12,1.85,4.25,3.69,6.2,5.72,.6,.63,3.12,4.22,1.03,.93,.88,1.38,1.76,2.72,2.57,4.15,3.65,6.37,7.45,12.39,12.6,17.71,5.44,5.63,12.04,12.23,19.71,14.34,1.1,.3,2.19,.49,3.27,.58,1.27,1.04,2.59,2.03,3.93,3,.49,1.1,1.04,2.17,1.63,3.23,2.77,4.92,7.75,7.89,13.06,8.76,.6,.65,1.2,1.31,1.79,1.97,3.76,4.21,7.45,8.48,11.09,12.8,1.53,1.81,3.04,3.64,4.52,5.49,.29,.36,1.27,1.64,1.56,2,.5,.66,.99,1.33,1.48,2,3.11,4.29,6.03,8.73,8.6,13.37,5.42,9.78,8.61,19.81,17.84,26.94,10.02,7.75,22.28,10.02,34.59,11.32,12.11,1.27,25.35,.72,34.91-7.83,21.04-18.81,.59-49.34-14.08-65.08-8.43-9.04-18.2-16.49-28.57-23.08,9.77-2.69,18.56-7.88,24.67-16.9,2.18-3.21,3.76-6.87,4.87-10.57,.23-.78,.41-1.57,.57-2.36,1.78-1.12,3.91-2.13,5.26-3.14,4.02-3.01,7.77-6.12,11.24-9.74,4.61-4.8,6.41-12.13,4.66-18.46,2.6-.17,5.2-.64,7.81-1.01,9.57-1.35,19.14-2.8,28.66-4.47,18.7-3.27,37.29-7.36,55.41-13.08,12.41-3.92,24.3-9.45,36.49-14.02,4.91,.32,9.79-1.21,13.52-4.49,.5-.14,.99-.29,1.49-.42,17.65-4.73,36.7,1.28,53.41-7.59,4.09-2.17,7.51-5.13,10.14-8.66,7.9-3.99,12.07-12.5,9.92-21.51Zm-161.74-110.32c.03-.22,.05-.45,.08-.71,.06,.04,.01,.32-.08,.71Zm-116.35,174.2l-.05-.28c.14,.03,.27,.05,.41,.07-.12,.07-.24,.14-.36,.21Zm217.74-50.6c0,.43,0,.86,.03,1.28-.22,0-.44,.02-.66,.03,.21-.44,.42-.87,.63-1.31ZM313.52,25.5s-.03-.02,0,0h0ZM43.06,70.85c-.27,.26-.42,.24,0,0h0Zm160.22,227.41c-.17,.09-.71,.52-1.66,1.28,.47-.68,1.21-1.3,2.08-1.89-.13,.21-.27,.41-.42,.61Z'/%3e%3cpath%20class='f'%20d='M151.43,412.81c-21.81-28.05-42.03-56.46-67.07-81.79l.29-.41c22.02,15.35,39.34,36.47,53.86,58.84,4.84,7.49,9.37,15.17,13.38,23.14l-.45,.22h0Z'/%3e%3cpath%20class='f'%20d='M137.94,258.21c17.21,15.87,21.48,40.05,4.62,57.96-8.03,8.83-18.23,15.19-28.93,20.23-1.05,.49-2.13,.96-3.3,1.43-.68,.12-1.32,.3-1.87,.36-30.97,3.76-53.28-17.65-62.97-45.27l2.16,2.23c-.95-.43-1.69-.81-2.51-1.23-14.65-7.92-28.03-20.03-34-35.9-3.7-9.79-3.97-20.93-1.03-30.81l.49,.1c-1.11,5.8-1.49,11.76-.59,17.61,3.02,21.31,20.64,37.47,39.34,46.21l.16,.07,.06,.16c2.39,6.17,5.35,12.12,9.04,17.59,3.64,5.46,8.13,10.45,13.32,14.47,10.28,7.99,24.34,11.99,36.99,9.88,14.78-6.28,30.14-15.16,38.07-29.65,5.83-11.05,4.01-24.66-2.15-35.19-2.02-3.56-4.43-6.94-7.24-9.9l.35-.36h0Z'/%3e%3cpath%20class='f'%20d='M27.46,222.17c-8.91-6.16-15.79-14.98-20.61-24.63-15.83-30.94-2.67-67.45,23.43-88.04l.37,.33c-3.06,3.58-7.03,8.52-9.64,12.33-19.27,27.09-22.14,59.5-3.07,87.55,2.88,4.34,6.14,8.46,9.86,12.09l-.33,.37h0Z'/%3e%3cpath%20class='f'%20d='M22.29,119.02c-3.79-12.15-4.93-27.75,2.01-39.02,2.02-3.31,5.16-6.1,8.75-7.72,2.72-1.24,5.28-2.55,7.75-4.04,4.52-2.89,8.94-6.32,11.66-10.9,.44-1.01,1.09-1.78,1.7-2.61,7.74-9.88,20.64-13.83,30.48-4.47l-.27,.42c-7.43-4.82-16.18-4.26-22.64,1.9-2.02,1.85-3.81,4.01-5.19,6.35-.5,1.23-1.54,2.88-2.46,4.08-2.88,3.82-6.63,6.9-10.64,9.45-5.14,3.49-11.89,4.55-15.37,10.16-6.63,10.14-6.39,24.65-5.28,36.34l-.49,.07h0Z'/%3e%3cpath%20class='f'%20d='M101.06,97.94c-16.06-4.22-25.06-17.92-19.42-34.18,3.35-9.68,8.2-19.07,14.86-26.9,7.87-9.22,18.31-16.7,30.21-19.57,7.99-1.66,16.54-.12,23.9,2.21,5.9,1.98,11.57,4.42,16.77,7.71l-.21,.45c-5.53-2.37-11.31-4.21-17.17-5.54-5.85-1.35-11.9-2.06-17.86-1.54-19.17,2.75-34.69,19.81-42.92,36.44-1.4,2.91-3.37,7.3-4.37,10.37-2.09,6.36-1.5,13.63,2.44,19.16,3.38,4.92,8.47,8.6,13.93,10.92l-.17,.47h0Z'/%3e%3cpath%20class='f'%20d='M222.86,8.58c-20.62-.37-39.77,10.41-49.37,28.44-4.75,8.27-7.95,17.74-6.82,27.2,1.23,9.55,6.94,18.16,14.57,23.91,4.25,4.33,10.56,7.19,16.69,6.2,.72-.1,2.24-.35,2.97-.45,3.74,5.24,4.49,13.15-.44,17.83-.56,.59-1.23,1.06-1.82,1.58l-.34-.37c.51-.57,1.08-1.09,1.54-1.7,3.55-4.25,2.88-10.56-.25-14.86l.33,.11c-7.4,2.48-16.1-.49-21.36-5.5-13.67-9.24-20.29-25.92-15.53-41.88,4.54-15.12,14.77-28.97,29.08-36.04,9.5-4.65,20.36-6.44,30.84-4.94l-.09,.49h0Z'/%3e%3cpath%20class='f'%20d='M208.82,29.72c3.06-6.17,8.58-11.41,15.39-13.1,2.3-.67,4.72-.73,7.11-.68l-.77,.11c16.73-7,45.75-16.61,61.69-4.02,7.33,5.02,15.97,7.39,23.17,12.95,4.68,3.47,8.18,8.46,10.46,13.78,1.22,3.08,2.03,5.92,2.74,9.13,.71,3.17,1.3,7.92,1.74,11.16,.83,5.5,1.47,11.05,2.98,16.39,.04,.11,.06,.12,.08,.18l.03,.08v.04l.12,.23c.58,1.26,.96,2.72,1.27,3.99,1.87,8.86,3.6,21.66-2.41,29.43-1.54,1.93-4.03,3.42-6.55,3.93-.42,.12-.86,.19-1.3,.35-16.56,5.08-47.28,23.42-63.2,11.85-6.73-4.79-10.14-12.9-11.28-20.77-.78-6.24-.79-12.78,2.13-18.55l2.06,2.61c-2.85,.53-5.61,.37-8.39-.26-8.19-1.76-13.79-8.51-16.56-16.05l.46-.2c.8,1.65,1.73,3.49,2.78,5.01,3.07,4.79,7.98,8.53,13.64,9.53,2.69,.52,5.51,.46,8.14-.19-1.47,2.7-1.91,5.86-2.05,8.95-.25,8.56,1.87,17.79,7.81,24.18,3.98,4.42,9.75,6.23,15.6,5.58,11.62-1.15,22.5-6.08,33.19-10.54,5.41-2.24,10.71-4.85,16.43-6.3,1.33-.34,2.51-1.12,3.38-2.19,4.89-6.41,2.84-20.94,.33-28.21-2.14-5.93-2.56-12.25-3.53-18.42-.41-3.14-.94-7.72-1.61-10.81-1.55-7.71-4.88-15.51-11.3-20.37-4.54-3.65-10.02-5.9-15.15-8.62-3.91-1.96-7.52-4.61-11.12-7.04-11.31-6.02-26.41-3-38.37-.24-5.68,1.43-11.3,3.16-16.76,5.24-2.22-.14-4.47-.2-6.64,.34-6.51,1.35-11.99,6.1-15.28,11.76l-.44-.23h0Z'/%3e%3cpath%20class='f'%20d='M311.48,27.06c7.57-7.87,18.84-16.99,30.49-16.05,19.31,2.51,43.75,14.12,48.92,34.68,2.45,10.77,3.61,23.1-1.2,33.42l.56-2.4c.1,1.11,.37,2.25,.78,3.27,.7,1.67,1.64,2.83,3.15,3.59,2.07,.77,4.18,1.3,6.27,2.21,10.93,4.24,17.68,15.08,15.89,26.8-1.25,10.43-9.13,19.74-18.77,22.96l-.21-.45c2.92-1.43,5.63-3.28,7.95-5.55,9.36-8.81,11.67-25.51,1.81-34.8-2.35-2.21-5.2-3.83-8.23-4.98-3.02-1.32-6.58-1.49-9.14-3.79-2.58-2.27-3.91-5.6-4.27-8.97-.02-.13,0-.14,.06-.25,3.97-9.4,2.6-20.19,.56-29.93-3.84-15.21-18.86-24.21-32.65-29.45-4.77-1.63-9.71-3.37-14.79-3.43-5.09,.17-9.93,2.26-14.35,4.67-4.45,2.49-8.65,5.48-12.5,8.81l-.34-.37h0Z'/%3e%3cpath%20class='f'%20d='M359.05,101.57c13.08,1.53,24.07,11.47,26.11,24.71,.67,3.96,.78,8.16,1.35,12.13,1.07,7.82,2.37,15.62,4.23,23.29,1.25,6.09,3.42,11.85,4.34,17.9,2.43,14.92-1.95,31.82-15.54,40.1-1.26,.74-2.86,1.69-4.15,2.37-11.26,5.92-28.2,16.39-39.67,21.84-3.69,1.7-7.55,3.38-11.68,3.84l-.09-.49c3.87-.87,7.44-2.86,10.92-4.83,13.81-8.27,26.97-17.62,40.96-25.61,10.81-6.29,15.41-18.47,14.87-30.57-.02-8.12-3.05-15.71-4.56-23.57-2.06-9.87-3.46-19.9-3.93-29.97,.25-15.5-8.16-26.76-23.25-30.64l.09-.49h0Z'/%3e%3cpath%20class='f'%20d='M408.01,132.23c6.68-3.19,14.64-.21,18.26,6.23,1.17,1.85,2.09,4.26,2.89,6.27,1.48,3.8,2.98,8.11,4.41,11.95,2.12,6.22,4.76,13.86,6.71,20.1,1.85,5.6,3.4,11.49,3.76,17.45,.28,4.71,.02,10.32-2.47,14.72-2.31,3.88-4.61,7.65-7.83,11.03-8.16,9.08-21.38,12.19-33.04,10.72l-.02-.5c8.38-.47,16.91-2.31,23.87-7.15,6.1-4.2,10.11-10.66,13.43-17.15,2.27-6.27,1.15-13.21-.15-19.59-2.42-9.3-6.87-23.16-9.55-32.51-1.22-3.7-2.83-10.58-4.58-14.01-2.71-5.92-9.27-8.91-15.53-7.09l-.16-.47h0Z'/%3e%3cpath%20class='f'%20d='M221.65,273.51c2.26,9.89-2.86,20.36-10.84,26.3-8.02,5.94-18.74,7.75-28.08,4.56l-.02-.5c2.02-.15,4.73-.37,6.68-.71,13.4-1.78,25.65-10.16,30.09-23.24,.76-2.09,1.38-4.26,1.67-6.45l.5,.04h0Z'/%3e%3cpath%20class='f'%20d='M200.07,300.72c3.54,4.74,5.27,12.19,.36,16.88-1.33,1.29-2.95,2.41-4.44,3.5-8.96,6.27-19.78,11.25-31.01,10.18-8.27-.2-18.35-1.37-22.86-9.37-1.38-2.44-2.16-5.13-2.46-7.88l.47-.17c2.37,6.69,7.42,11.59,14.64,12.33,3.36,.49,6.8,.35,10.25,.37,3.47,.14,6.78-.08,10.12-.96,7.46-1.85,14.5-5.27,21.05-9.25,.7-.44,1.46-.88,2.1-1.42,4.09-3.36,2.96-9.61,1.32-14l.46-.2h0Z'/%3e%3cpath%20class='f'%20d='M176.12,326.86c24.94,11.54,50.15,41.47,49.33,70.03l-.49,.09c-4.51-21.44-17.93-39.76-32.96-55.19-5.11-5.13-10.46-10.07-16.17-14.53l.3-.4h0Z'/%3e%3cpath%20class='f'%20d='M137.61,234.31c-12.87-5.26-28.97-12.85-41.88-7.04-1.34,.62-3.31,1.96-4.59,2.75-11.69,7.35-22.74,15.2-34.81,22.2l-.34-.37c5.77-5.42,11.8-10.57,18.04-15.44,4.67-3.67,9.46-7.19,14.4-10.49,1.66-1.08,3.28-2.22,5.1-3.14,3.65-1.77,7.74-2.47,11.74-2.33,12.02,.6,23.14,6.48,32.65,13.46l-.31,.4h0Z'/%3e%3cpath%20class='f'%20d='M90.49,123.12c6.33,13.05,6.79,31.3-5.1,41.5-10.92,8.88-24.57,16.5-39.18,15.65-4.18-.4-8.44-1.75-11.45-4.52l.24-.44c6.92,3.68,15.23,2.4,22.36-.05,7.28-2.54,14.04-6.47,20.3-10.98,3.08-2.25,6.3-4.46,8.52-7.63,4.53-6.27,5.59-14.37,5.32-21.95-.14-3.85-.61-7.72-1.49-11.46l.48-.13h0Z'/%3e%3cpath%20class='f'%20d='M76.79,174.22c3.7,1.29,6.73,4.02,9.14,7.02,7.21,9.2,8.66,21.88,5.65,32.96l-.13-1.32c.12,.93,.23,1.85,.32,2.79,.25,2.86,.4,5.72,.17,8.61l-.48,.15c-1.04-3.12-2.49-7.38-3.46-10.47,1.28-13.81-1.06-29.39-11.54-39.35l.31-.39h0Z'/%3e%3cpath%20class='f'%20d='M161.1,151.64c18.17-8.77,42.86,4.98,40,26.29l-.49,.11c-1.08-4.19-2.72-8.24-5.15-11.81-6.15-9.08-17.16-13.47-27.83-14.07-2.16-.15-4.34-.19-6.48-.02l-.06-.5h0Z'/%3e%3cpath%20class='f'%20d='M195.26,197.53c9.79-9.84,24.22-14.13,37.94-13.48,1.11,.1,3.32,.32,4.42,.46,7.16,1.13,14.35,2.25,21.07,5.18,1.06,.51,2.08,1.12,2.81,2.1,1.44,1.78,1.05,4.71-.91,5.97l-4.67-6.12c4.01-2.82,8.54-4.73,13.23-6.02,4.5-1.22,9.21-1.75,13.86-1.45l.08,.49c-6.59,1.14-13.01,3.31-18.85,6.56-1.93,1.09-3.84,2.29-5.53,3.67l-.52-.68c-.19,.12-.03,.28-.13,.16-.82-.7-2-.99-3.03-1.34-3.93-1.17-8-1.9-12.05-2.61-5.43-.94-10.83-1.83-16.31-1.67-10.9,.26-21.85,3.41-31.11,9.19l-.29-.41h0Z'/%3e%3cpath%20class='f'%20d='M280.33,149.53c21.07,10.79,41.84,14.23,63.49,3.14,4.86-2.38,9.69-5.07,14.86-7l.29,.41-8.8,6.36c-8.7,6.56-19.03,11.36-30.03,11.98-14.62,.82-29.2-4.98-40.14-14.52l.34-.37h0Z'/%3e%3cpath%20class='f'%20d='M181.26,213.67c9.93,6.09,14.18,19.54,8.98,30.15-2.37,5.24-6.32,9.39-10.53,13.13-.7,.55-2.55,1.99-3.24,2.52-.76,.57-2.62,1.68-3.41,2.24-8.4,4.91-18.22,8-27.95,7.45l-.08-.49c7.4-1.54,14.6-4.36,21.17-8.09,2.82-1.6,5.82-3.63,8.32-5.7,6.91-5.72,13.87-13.25,13.91-22.75,.06-6.69-3.05-13.21-7.53-18.09l.35-.36h0Z'/%3e%3cpath%20class='f'%20d='M167.22,124.02c16.67-8.3,39.6-10.49,56.5-1.46,1.18,.63,2.62,1.58,3.71,2.33,6.81,5.05,13.4,10.22,19.4,16.43l-.27,.42-9.05-5.51c-3.22-1.95-10.39-6.51-13.52-8.33-1.47-.86-3.13-1.66-4.7-2.3-13.13-5.17-27.76-4.86-41.56-2.99-3.49,.48-6.97,1.08-10.39,1.89l-.13-.48h0Z'/%3e%3cpath%20class='g'%20d='M340.25,209.52c-25.34,51.85-74.22,96.17-129.16,52.06-5.91-4.68-11.34-9.88-16.4-15.37,16.15,14.34,36.02,27.42,58.32,26.95,29.45-1,49.96-26.56,62.8-50.65,3.26-6.21,6.29-12.71,8.64-19.29,1.48-4.46,6.3-6.88,10.76-5.4,4.81,1.56,7.2,7.13,5.03,11.69h0Z'/%3e%3cpath%20class='g'%20d='M450.9,222.82c-3.86,14.01-12.5,26.41-23.37,35.88-8.87,7.57-19.71,13.2-30.75,16.3-38.57,10.56-80.42-1.74-116.27-16.32,22.35,6.65,45.15,11.56,68.41,12.15,1.99,0,6.67-.07,8.57-.09,1.81-.07,6.59-.45,8.5-.58l5.59-.75c17.07-2.47,33.77-9.13,45.66-21.69,7.23-7.71,12.77-17.29,14.99-27.65,.57-5.45,5.76-9.39,11.19-8.31,5.12,.99,8.48,5.94,7.49,11.06h0Z'/%3e%3cg%3e%3cpath%20class='e'%20d='M328.57,220.35c-.65,0-1.3-.03-1.94-.08-16.21-1.28-28.15-18.25-26.61-37.84,1.47-18.67,14.76-33.29,30.26-33.29,.65,0,1.3,.03,1.94,.08,16.21,1.28,28.15,18.25,26.61,37.84-1.47,18.67-14.76,33.29-30.26,33.29Z'/%3e%3cpath%20class='h'%20d='M330.28,147.64v3h0c.6,0,1.22,.02,1.82,.07,15.39,1.21,26.71,17.46,25.23,36.23-1.41,17.89-14.04,31.91-28.76,31.91-.61,0-1.22-.02-1.83-.07-15.39-1.21-26.71-17.46-25.23-36.23,1.41-17.89,14.04-31.91,28.76-31.91v-3m0,0c-16.21,0-30.21,15.05-31.75,34.67-1.61,20.45,10.92,38.11,27.98,39.46,.69,.05,1.38,.08,2.06,.08,16.21,0,30.21-15.05,31.75-34.67,1.61-20.45-10.92-38.11-27.98-39.46-.69-.05-1.38-.08-2.06-.08h0Z'/%3e%3c/g%3e%3cellipse%20class='i'%20cx='334.82'%20cy='199.39'%20rx='13.2'%20ry='9.39'%20transform='translate(39%20453.06)%20rotate(-71.39)'/%3e%3cg%3e%3cpath%20class='e'%20d='M446.3,231.11c-1.21,0-2.43-.1-3.63-.29-15.09-2.39-25.01-19.17-22.12-37.41,2.62-16.55,15.08-29.03,28.97-29.03,1.21,0,2.43,.1,3.63,.29,15.09,2.39,25.01,19.17,22.12,37.41-2.62,16.55-15.08,29.03-28.97,29.03Z'/%3e%3cpath%20class='h'%20d='M449.52,165.88h0c1.13,0,2.27,.09,3.39,.27,14.27,2.26,23.63,18.27,20.87,35.7-2.51,15.83-14.33,27.77-27.49,27.77-1.13,0-2.27-.09-3.39-.27-14.27-2.26-23.63-18.27-20.87-35.7,2.51-15.83,14.33-27.76,27.49-27.77m0-3c-14.48,0-27.67,12.76-30.45,30.3-3.02,19.09,7.44,36.61,23.37,39.13,1.29,.2,2.58,.3,3.86,.3,14.48,0,27.67-12.76,30.45-30.3,3.02-19.09-7.44-36.61-23.37-39.13-1.29-.2-2.58-.3-3.86-.3h0Z'/%3e%3c/g%3e%3cellipse%20class='i'%20cx='446.51'%20cy='209.6'%20rx='12.44'%20ry='8.84'%20transform='translate(78.46%20537.99)%20rotate(-66.89)'/%3e%3c/g%3e%3cg%20id='c'%3e%3cg%20class='j'%3e%3cpolygon%20class='e'%20points='329.42%20118.98%20367.62%20124.71%20301.63%20213.52%20283.04%20209.6%20267.19%20191.08%20329.42%20118.98'/%3e%3c/g%3e%3cg%20class='j'%3e%3cpolygon%20class='e'%20points='265.79%20162.67%20265.79%20110.28%20280.5%20109.04%20306.96%20113.1%20265.79%20162.67'/%3e%3c/g%3e%3cg%20class='j'%3e%3cpolygon%20class='e'%20points='469.91%20148.92%20504.3%20154.03%20444.89%20233.05%20428.16%20229.56%20413.89%20213.08%20469.91%20148.92'/%3e%3c/g%3e%3cg%3e%3cpath%20d='M510.06,159.47c-1.72-6.02-6.83-10.58-13.04-11.65l-69.11-14.88c-.07-.01-.14-.03-.21-.04-.22-.04-.87-.14-1.8-.2,.43-.03,.68-.02,.68-.02l-63.81-15.39s.09,.05,.14,.08c-.13-.02-.26-.06-.39-.08l-81.21-13.19c-.51-.08-3-.45-6.09-.21-.4-.09-.8-.14-1.22-.12-3.73,.15-92.16,3.94-158.51,31.15-1.6,.65-2.74,2.09-3.03,3.79-.17,.98-3.97,24.18,5.96,42.8,2.22,4.17,5,7.83,8.25,10.88,.7,.66,1.58,1.1,2.53,1.28,1.15,.21,2.92,.46,4.89,.46,3.22,0,6.94-.67,9.21-3.26,1.08-1.23,2.68-3.9,1.36-7.97-.85-2.63-3.66-4.03-6.29-3.18-1.97,.64-3.27,2.41-3.43,4.37-.72,.04-1.62,.02-2.51-.06-1.99-2.08-3.73-4.5-5.18-7.22-6.52-12.22-5.86-27.59-5.26-33.71,49.43-19.59,112.16-26.35,139.12-28.46-.19,.94-.32,1.95-.32,3.07v66.73c0,.12,0,.24,.01,.36,.06,.88,1.75,21.62,20.3,29.43,11.43,4.81,43.5,6.74,68.38,7.52,.28,0,.55,.01,.82,.01,11.7,0,21.98-7.74,25.19-19.07l.23-.84c3.05-11.22,3.54-40.64,3.62-51.05,1.2-3.01,3.1-4.63,5.93-6.52,7.68-5.14,18.12-2.75,22.92,5.14,.42,.69,.82,1.4,1.21,2.11v53.78c0,.1,0,.21,.01,.31,.06,.79,1.55,19.46,18.05,26.51,10.37,4.43,37.17,6.13,57.82,6.78,.25,0,.49,.01,.74,.01,10.42,0,19.58-6.98,22.43-17.2l.2-.74c3.21-11.98,3.23-47.01,3.23-49.25,.02-.85,.04-5.71-1.84-12.26Zm-140.69-12.46s0,.09,0,.13c.02,11.06-.54,41.98-3.28,52.06l-.21,.75c-2.03,7.17-8.61,12.03-16.08,11.78-33.48-1.04-57.11-3.49-64.81-6.74-12.31-5.19-14.03-19.14-14.19-20.79V117.69c0-1.77,.62-2.3,.88-2.52,1.65-1.41,5.77-1.54,8.03-1.19l81.22,13.19c3.23,.53,5.9,2.83,6.78,5.87,1.83,6.29,1.67,13.9,1.67,13.97Zm133.58,24.48c0,.06,0,.12,0,.19,.01,9.98-.49,37.88-2.93,46.98l-.18,.67c-1.8,6.47-7.66,10.83-14.26,10.63-27.7-.87-47.6-3.08-54.59-6.07-10.96-4.68-12.48-17.3-12.62-18.78v-59.99c0-1.64,.57-2.12,.81-2.33,1.44-1.23,4.99-1.36,6.97-1.06l69.08,14.87c.07,.02,.14,.03,.21,.04,2.86,.47,5.22,2.55,6.01,5.3,1.6,5.58,1.49,9.53,1.49,9.55Z'/%3e%3cpath%20d='M431.58,118.93c2.88-2.73,6.23-4.98,9.71-6.86,10.9-6.05,23.5-5.13,33.14,2.88,1.88,2.01,4.26,4.78,6,7.27,1.74,2.53,3.65,5.26,4.1,8.34,.03,.36,.57,.4,.66,.06,1.36-5.31-1.24-10.84-3.68-15.43-1-1.64-1.88-3.43-3.32-4.86-3.2-3.28-7.29-6.04-11.99-7.63-13.51-4.78-29.72,2.7-35.13,15.74l-.04,.11c-.15,.32,.31,.63,.55,.37Z'/%3e%3cpath%20d='M297.47,90.2c2.88-2.73,6.23-4.98,9.71-6.86,10.9-6.05,23.5-5.13,33.14,2.88,1.88,2.01,4.26,4.78,6,7.27,1.74,2.53,3.65,5.26,4.1,8.34,.03,.36,.57,.4,.66,.06,1.36-5.31-1.24-10.84-3.68-15.43-1-1.64-1.88-3.43-3.32-4.86-3.2-3.28-7.29-6.04-11.99-7.63-13.51-4.78-29.72,2.7-35.13,15.74l-.04,.11c-.15,.32,.31,.63,.55,.37Z'/%3e%3c/g%3e%3cpath%20class='d'%20d='M246.7,141.54s-45.89-33.79-87.25-15.71c-41.36,18.08-12.08,29.13-12.08,29.13l39-19.62,60.33,6.21Z'/%3e%3c/g%3e%3c/svg%3e",h=({open:s,onClose:l})=>c.jsxRuntimeExports.jsxs(e.Dialog,{open:s,onClose:l,maxWidth:"sm",children:[c.jsxRuntimeExports.jsx(a.Image,{src:i,alt:"brain",maxWidth:100,marginY:3}),c.jsxRuntimeExports.jsx(e.Typography,{variant:"h5",textAlign:"center",children:"Time for a break?"}),c.jsxRuntimeExports.jsx(e.Typography,{textAlign:"center",children:"You have been using the Code for Life website for a while. Remember to take regular screen breaks to recharge those brain cells!"}),c.jsxRuntimeExports.jsx(e.Button,{onClick:l,autoFocus:!0,children:"Continue"})]});exports.InactiveDialog=r;exports.ScreenTimeDialog=h;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("../jsx-runtime-Dszzpdy0.cjs"),e=require("@mui/material");require("react");require("@mui/icons-material");require("formik");require("yup");require("../en-gb-CpyEkKq3.cjs");require("@mui/x-date-pickers");require("dayjs");require("../settings/index.cjs.js");require("../session-CE2U7oL1.cjs");require("js-cookie");require("../schemas-CpAWhNsP.cjs");require("../urls-RtSTEZfW.cjs");require("react-router");require("../palette-BnIdHKDE.cjs");require("../auth-B7Vdot4N.cjs");require("react-redux");const t=require("../Countdown-CyJ-01oU.cjs"),a=require("../Image-CgYjq-tA.cjs"),r=({open:s,onClose:l})=>c.jsxRuntimeExports.jsxs(e.Dialog,{open:s,onClose:l,children:[c.jsxRuntimeExports.jsx(e.Typography,{variant:"h5",textAlign:"center",children:"Where did you go? 👀"}),c.jsxRuntimeExports.jsx(e.Typography,{textAlign:"center",children:"We noticed that you have been inactive for a while. Are you still there? For your online safety we will log you out in:"}),c.jsxRuntimeExports.jsx(t.Countdown,{textAlign:"center",variant:"h5",seconds:120,onEnd:()=>{l(),alert("TODO: call logout endpoint")}}),c.jsxRuntimeExports.jsx(e.Typography,{textAlign:"center",children:"You may lose progress unless you continue or save."}),c.jsxRuntimeExports.jsx(e.Button,{onClick:l,autoFocus:!0,children:"Wait, I'm still here!"})]}),i="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20511.91%20423.62'%3e%3cdefs%3e%3cstyle%3e.d{fill:%23f9c5db;}.e{fill:%23fff;}.f{fill:%23666;}.g{fill:%23db5d90;}.h{fill:%23afafaf;}.i{fill:%235b5a5b;}.j{opacity:.2;}%3c/style%3e%3c/defs%3e%3cg%20id='a'/%3e%3cg%20id='b'%3e%3cpath%20class='d'%20d='M442.29,190.69c-4.39-18.43-13.61-35.22-22.63-51.72-2.21-4.04-4.38-8.11-6.49-12.2-.07-.13-.15-.37-.24-.62-.09-.56-.22-1.26-.27-1.5-.35-1.67-.71-3.47-.94-5.22,.17,.84,.17-2.04,.07-3.29-.21-2.8-.49-5.71-1.13-8.45-1.27-5.43-4.12-9.99-7.23-14.49-2.25-3.27-4.6-6.48-6.59-9.92-.51-.88-.98-1.79-1.46-2.69-.01-.03-.03-.06-.04-.09-.1-.52-.3-1.36-.42-1.68,0-.08,0-.15,0-.24-.25-7.47-1.39-15.18-3.36-22.4-4.34-15.9-13.85-30.79-29.48-37.38-10.06-4.25-21.31-5.05-31.65-1.16-5.07,1.91-9.75,4.4-14.44,7.09-.67,.38-1.33,.76-2,1.14-.09-.07-.17-.13-.24-.18-.89-.7-1.77-1.4-2.66-2.09-4.9-3.81-9.64-7.47-15.34-10-12.16-5.41-25.49-7.1-38.72-7.13-6-3.36-12.68-5.63-20.27-6.29-19.81-1.71-35.07,9.1-50.05,19.98-1.84,.87-3.65,1.79-5.43,2.76-11.73-2.88-23.23-6.51-35.37-7.64-16.82-1.56-32.38,3.66-45.25,14.38-5.58,4.65-10.45,10.7-14,17.38-11.73-2.99-24.82-.3-33.89,8.54-2.85,2.78-5.27,6.15-6.98,9.75-.74,1.55-1.52,3.11-2.19,4.69-6.99,3.63-13.43,6.54-18.48,13.08-5.54,7.17-8.17,15.32-9.36,24.21-.58,4.3-.78,8.52-.87,12.85-.03,1.77-.06,3.54-.14,5.32-.05,1.17-.2,2.35-.22,3.52,0,.05,0,.07,0,.11-.02,.05-.03,.09-.05,.16-.27,.86-1.49,4.85-.87,3.73-.57,1.18-1.24,2.31-1.87,3.45-2.45,4.43-4.95,9.05-6.21,13.98-2.6,10.17-.92,20.53,1.19,30.62,1.99,9.53,5.06,19.27,9.72,28.06-.18,.57-.32,1.16-.42,1.77-2.48,14.32-4.41,28.45-1.82,42.89,2.62,14.62,11.3,25.55,22.21,35.04,2.12,1.85,4.25,3.69,6.2,5.72,.6,.63,3.12,4.22,1.03,.93,.88,1.38,1.76,2.72,2.57,4.15,3.65,6.37,7.45,12.39,12.6,17.71,5.44,5.63,12.04,12.23,19.71,14.34,1.1,.3,2.19,.49,3.27,.58,1.27,1.04,2.59,2.03,3.93,3,.49,1.1,1.04,2.17,1.63,3.23,2.77,4.92,7.75,7.89,13.06,8.76,.6,.65,1.2,1.31,1.79,1.97,3.76,4.21,7.45,8.48,11.09,12.8,1.53,1.81,3.04,3.64,4.52,5.49,.29,.36,1.27,1.64,1.56,2,.5,.66,.99,1.33,1.48,2,3.11,4.29,6.03,8.73,8.6,13.37,5.42,9.78,8.61,19.81,17.84,26.94,10.02,7.75,22.28,10.02,34.59,11.32,12.11,1.27,25.35,.72,34.91-7.83,21.04-18.81,.59-49.34-14.08-65.08-8.43-9.04-18.2-16.49-28.57-23.08,9.77-2.69,18.56-7.88,24.67-16.9,2.18-3.21,3.76-6.87,4.87-10.57,.23-.78,.41-1.57,.57-2.36,1.78-1.12,3.91-2.13,5.26-3.14,4.02-3.01,7.77-6.12,11.24-9.74,4.61-4.8,6.41-12.13,4.66-18.46,2.6-.17,5.2-.64,7.81-1.01,9.57-1.35,19.14-2.8,28.66-4.47,18.7-3.27,37.29-7.36,55.41-13.08,12.41-3.92,24.3-9.45,36.49-14.02,4.91,.32,9.79-1.21,13.52-4.49,.5-.14,.99-.29,1.49-.42,17.65-4.73,36.7,1.28,53.41-7.59,4.09-2.17,7.51-5.13,10.14-8.66,7.9-3.99,12.07-12.5,9.92-21.51Zm-161.74-110.32c.03-.22,.05-.45,.08-.71,.06,.04,.01,.32-.08,.71Zm-116.35,174.2l-.05-.28c.14,.03,.27,.05,.41,.07-.12,.07-.24,.14-.36,.21Zm217.74-50.6c0,.43,0,.86,.03,1.28-.22,0-.44,.02-.66,.03,.21-.44,.42-.87,.63-1.31ZM313.52,25.5s-.03-.02,0,0h0ZM43.06,70.85c-.27,.26-.42,.24,0,0h0Zm160.22,227.41c-.17,.09-.71,.52-1.66,1.28,.47-.68,1.21-1.3,2.08-1.89-.13,.21-.27,.41-.42,.61Z'/%3e%3cpath%20class='f'%20d='M151.43,412.81c-21.81-28.05-42.03-56.46-67.07-81.79l.29-.41c22.02,15.35,39.34,36.47,53.86,58.84,4.84,7.49,9.37,15.17,13.38,23.14l-.45,.22h0Z'/%3e%3cpath%20class='f'%20d='M137.94,258.21c17.21,15.87,21.48,40.05,4.62,57.96-8.03,8.83-18.23,15.19-28.93,20.23-1.05,.49-2.13,.96-3.3,1.43-.68,.12-1.32,.3-1.87,.36-30.97,3.76-53.28-17.65-62.97-45.27l2.16,2.23c-.95-.43-1.69-.81-2.51-1.23-14.65-7.92-28.03-20.03-34-35.9-3.7-9.79-3.97-20.93-1.03-30.81l.49,.1c-1.11,5.8-1.49,11.76-.59,17.61,3.02,21.31,20.64,37.47,39.34,46.21l.16,.07,.06,.16c2.39,6.17,5.35,12.12,9.04,17.59,3.64,5.46,8.13,10.45,13.32,14.47,10.28,7.99,24.34,11.99,36.99,9.88,14.78-6.28,30.14-15.16,38.07-29.65,5.83-11.05,4.01-24.66-2.15-35.19-2.02-3.56-4.43-6.94-7.24-9.9l.35-.36h0Z'/%3e%3cpath%20class='f'%20d='M27.46,222.17c-8.91-6.16-15.79-14.98-20.61-24.63-15.83-30.94-2.67-67.45,23.43-88.04l.37,.33c-3.06,3.58-7.03,8.52-9.64,12.33-19.27,27.09-22.14,59.5-3.07,87.55,2.88,4.34,6.14,8.46,9.86,12.09l-.33,.37h0Z'/%3e%3cpath%20class='f'%20d='M22.29,119.02c-3.79-12.15-4.93-27.75,2.01-39.02,2.02-3.31,5.16-6.1,8.75-7.72,2.72-1.24,5.28-2.55,7.75-4.04,4.52-2.89,8.94-6.32,11.66-10.9,.44-1.01,1.09-1.78,1.7-2.61,7.74-9.88,20.64-13.83,30.48-4.47l-.27,.42c-7.43-4.82-16.18-4.26-22.64,1.9-2.02,1.85-3.81,4.01-5.19,6.35-.5,1.23-1.54,2.88-2.46,4.08-2.88,3.82-6.63,6.9-10.64,9.45-5.14,3.49-11.89,4.55-15.37,10.16-6.63,10.14-6.39,24.65-5.28,36.34l-.49,.07h0Z'/%3e%3cpath%20class='f'%20d='M101.06,97.94c-16.06-4.22-25.06-17.92-19.42-34.18,3.35-9.68,8.2-19.07,14.86-26.9,7.87-9.22,18.31-16.7,30.21-19.57,7.99-1.66,16.54-.12,23.9,2.21,5.9,1.98,11.57,4.42,16.77,7.71l-.21,.45c-5.53-2.37-11.31-4.21-17.17-5.54-5.85-1.35-11.9-2.06-17.86-1.54-19.17,2.75-34.69,19.81-42.92,36.44-1.4,2.91-3.37,7.3-4.37,10.37-2.09,6.36-1.5,13.63,2.44,19.16,3.38,4.92,8.47,8.6,13.93,10.92l-.17,.47h0Z'/%3e%3cpath%20class='f'%20d='M222.86,8.58c-20.62-.37-39.77,10.41-49.37,28.44-4.75,8.27-7.95,17.74-6.82,27.2,1.23,9.55,6.94,18.16,14.57,23.91,4.25,4.33,10.56,7.19,16.69,6.2,.72-.1,2.24-.35,2.97-.45,3.74,5.24,4.49,13.15-.44,17.83-.56,.59-1.23,1.06-1.82,1.58l-.34-.37c.51-.57,1.08-1.09,1.54-1.7,3.55-4.25,2.88-10.56-.25-14.86l.33,.11c-7.4,2.48-16.1-.49-21.36-5.5-13.67-9.24-20.29-25.92-15.53-41.88,4.54-15.12,14.77-28.97,29.08-36.04,9.5-4.65,20.36-6.44,30.84-4.94l-.09,.49h0Z'/%3e%3cpath%20class='f'%20d='M208.82,29.72c3.06-6.17,8.58-11.41,15.39-13.1,2.3-.67,4.72-.73,7.11-.68l-.77,.11c16.73-7,45.75-16.61,61.69-4.02,7.33,5.02,15.97,7.39,23.17,12.95,4.68,3.47,8.18,8.46,10.46,13.78,1.22,3.08,2.03,5.92,2.74,9.13,.71,3.17,1.3,7.92,1.74,11.16,.83,5.5,1.47,11.05,2.98,16.39,.04,.11,.06,.12,.08,.18l.03,.08v.04l.12,.23c.58,1.26,.96,2.72,1.27,3.99,1.87,8.86,3.6,21.66-2.41,29.43-1.54,1.93-4.03,3.42-6.55,3.93-.42,.12-.86,.19-1.3,.35-16.56,5.08-47.28,23.42-63.2,11.85-6.73-4.79-10.14-12.9-11.28-20.77-.78-6.24-.79-12.78,2.13-18.55l2.06,2.61c-2.85,.53-5.61,.37-8.39-.26-8.19-1.76-13.79-8.51-16.56-16.05l.46-.2c.8,1.65,1.73,3.49,2.78,5.01,3.07,4.79,7.98,8.53,13.64,9.53,2.69,.52,5.51,.46,8.14-.19-1.47,2.7-1.91,5.86-2.05,8.95-.25,8.56,1.87,17.79,7.81,24.18,3.98,4.42,9.75,6.23,15.6,5.58,11.62-1.15,22.5-6.08,33.19-10.54,5.41-2.24,10.71-4.85,16.43-6.3,1.33-.34,2.51-1.12,3.38-2.19,4.89-6.41,2.84-20.94,.33-28.21-2.14-5.93-2.56-12.25-3.53-18.42-.41-3.14-.94-7.72-1.61-10.81-1.55-7.71-4.88-15.51-11.3-20.37-4.54-3.65-10.02-5.9-15.15-8.62-3.91-1.96-7.52-4.61-11.12-7.04-11.31-6.02-26.41-3-38.37-.24-5.68,1.43-11.3,3.16-16.76,5.24-2.22-.14-4.47-.2-6.64,.34-6.51,1.35-11.99,6.1-15.28,11.76l-.44-.23h0Z'/%3e%3cpath%20class='f'%20d='M311.48,27.06c7.57-7.87,18.84-16.99,30.49-16.05,19.31,2.51,43.75,14.12,48.92,34.68,2.45,10.77,3.61,23.1-1.2,33.42l.56-2.4c.1,1.11,.37,2.25,.78,3.27,.7,1.67,1.64,2.83,3.15,3.59,2.07,.77,4.18,1.3,6.27,2.21,10.93,4.24,17.68,15.08,15.89,26.8-1.25,10.43-9.13,19.74-18.77,22.96l-.21-.45c2.92-1.43,5.63-3.28,7.95-5.55,9.36-8.81,11.67-25.51,1.81-34.8-2.35-2.21-5.2-3.83-8.23-4.98-3.02-1.32-6.58-1.49-9.14-3.79-2.58-2.27-3.91-5.6-4.27-8.97-.02-.13,0-.14,.06-.25,3.97-9.4,2.6-20.19,.56-29.93-3.84-15.21-18.86-24.21-32.65-29.45-4.77-1.63-9.71-3.37-14.79-3.43-5.09,.17-9.93,2.26-14.35,4.67-4.45,2.49-8.65,5.48-12.5,8.81l-.34-.37h0Z'/%3e%3cpath%20class='f'%20d='M359.05,101.57c13.08,1.53,24.07,11.47,26.11,24.71,.67,3.96,.78,8.16,1.35,12.13,1.07,7.82,2.37,15.62,4.23,23.29,1.25,6.09,3.42,11.85,4.34,17.9,2.43,14.92-1.95,31.82-15.54,40.1-1.26,.74-2.86,1.69-4.15,2.37-11.26,5.92-28.2,16.39-39.67,21.84-3.69,1.7-7.55,3.38-11.68,3.84l-.09-.49c3.87-.87,7.44-2.86,10.92-4.83,13.81-8.27,26.97-17.62,40.96-25.61,10.81-6.29,15.41-18.47,14.87-30.57-.02-8.12-3.05-15.71-4.56-23.57-2.06-9.87-3.46-19.9-3.93-29.97,.25-15.5-8.16-26.76-23.25-30.64l.09-.49h0Z'/%3e%3cpath%20class='f'%20d='M408.01,132.23c6.68-3.19,14.64-.21,18.26,6.23,1.17,1.85,2.09,4.26,2.89,6.27,1.48,3.8,2.98,8.11,4.41,11.95,2.12,6.22,4.76,13.86,6.71,20.1,1.85,5.6,3.4,11.49,3.76,17.45,.28,4.71,.02,10.32-2.47,14.72-2.31,3.88-4.61,7.65-7.83,11.03-8.16,9.08-21.38,12.19-33.04,10.72l-.02-.5c8.38-.47,16.91-2.31,23.87-7.15,6.1-4.2,10.11-10.66,13.43-17.15,2.27-6.27,1.15-13.21-.15-19.59-2.42-9.3-6.87-23.16-9.55-32.51-1.22-3.7-2.83-10.58-4.58-14.01-2.71-5.92-9.27-8.91-15.53-7.09l-.16-.47h0Z'/%3e%3cpath%20class='f'%20d='M221.65,273.51c2.26,9.89-2.86,20.36-10.84,26.3-8.02,5.94-18.74,7.75-28.08,4.56l-.02-.5c2.02-.15,4.73-.37,6.68-.71,13.4-1.78,25.65-10.16,30.09-23.24,.76-2.09,1.38-4.26,1.67-6.45l.5,.04h0Z'/%3e%3cpath%20class='f'%20d='M200.07,300.72c3.54,4.74,5.27,12.19,.36,16.88-1.33,1.29-2.95,2.41-4.44,3.5-8.96,6.27-19.78,11.25-31.01,10.18-8.27-.2-18.35-1.37-22.86-9.37-1.38-2.44-2.16-5.13-2.46-7.88l.47-.17c2.37,6.69,7.42,11.59,14.64,12.33,3.36,.49,6.8,.35,10.25,.37,3.47,.14,6.78-.08,10.12-.96,7.46-1.85,14.5-5.27,21.05-9.25,.7-.44,1.46-.88,2.1-1.42,4.09-3.36,2.96-9.61,1.32-14l.46-.2h0Z'/%3e%3cpath%20class='f'%20d='M176.12,326.86c24.94,11.54,50.15,41.47,49.33,70.03l-.49,.09c-4.51-21.44-17.93-39.76-32.96-55.19-5.11-5.13-10.46-10.07-16.17-14.53l.3-.4h0Z'/%3e%3cpath%20class='f'%20d='M137.61,234.31c-12.87-5.26-28.97-12.85-41.88-7.04-1.34,.62-3.31,1.96-4.59,2.75-11.69,7.35-22.74,15.2-34.81,22.2l-.34-.37c5.77-5.42,11.8-10.57,18.04-15.44,4.67-3.67,9.46-7.19,14.4-10.49,1.66-1.08,3.28-2.22,5.1-3.14,3.65-1.77,7.74-2.47,11.74-2.33,12.02,.6,23.14,6.48,32.65,13.46l-.31,.4h0Z'/%3e%3cpath%20class='f'%20d='M90.49,123.12c6.33,13.05,6.79,31.3-5.1,41.5-10.92,8.88-24.57,16.5-39.18,15.65-4.18-.4-8.44-1.75-11.45-4.52l.24-.44c6.92,3.68,15.23,2.4,22.36-.05,7.28-2.54,14.04-6.47,20.3-10.98,3.08-2.25,6.3-4.46,8.52-7.63,4.53-6.27,5.59-14.37,5.32-21.95-.14-3.85-.61-7.72-1.49-11.46l.48-.13h0Z'/%3e%3cpath%20class='f'%20d='M76.79,174.22c3.7,1.29,6.73,4.02,9.14,7.02,7.21,9.2,8.66,21.88,5.65,32.96l-.13-1.32c.12,.93,.23,1.85,.32,2.79,.25,2.86,.4,5.72,.17,8.61l-.48,.15c-1.04-3.12-2.49-7.38-3.46-10.47,1.28-13.81-1.06-29.39-11.54-39.35l.31-.39h0Z'/%3e%3cpath%20class='f'%20d='M161.1,151.64c18.17-8.77,42.86,4.98,40,26.29l-.49,.11c-1.08-4.19-2.72-8.24-5.15-11.81-6.15-9.08-17.16-13.47-27.83-14.07-2.16-.15-4.34-.19-6.48-.02l-.06-.5h0Z'/%3e%3cpath%20class='f'%20d='M195.26,197.53c9.79-9.84,24.22-14.13,37.94-13.48,1.11,.1,3.32,.32,4.42,.46,7.16,1.13,14.35,2.25,21.07,5.18,1.06,.51,2.08,1.12,2.81,2.1,1.44,1.78,1.05,4.71-.91,5.97l-4.67-6.12c4.01-2.82,8.54-4.73,13.23-6.02,4.5-1.22,9.21-1.75,13.86-1.45l.08,.49c-6.59,1.14-13.01,3.31-18.85,6.56-1.93,1.09-3.84,2.29-5.53,3.67l-.52-.68c-.19,.12-.03,.28-.13,.16-.82-.7-2-.99-3.03-1.34-3.93-1.17-8-1.9-12.05-2.61-5.43-.94-10.83-1.83-16.31-1.67-10.9,.26-21.85,3.41-31.11,9.19l-.29-.41h0Z'/%3e%3cpath%20class='f'%20d='M280.33,149.53c21.07,10.79,41.84,14.23,63.49,3.14,4.86-2.38,9.69-5.07,14.86-7l.29,.41-8.8,6.36c-8.7,6.56-19.03,11.36-30.03,11.98-14.62,.82-29.2-4.98-40.14-14.52l.34-.37h0Z'/%3e%3cpath%20class='f'%20d='M181.26,213.67c9.93,6.09,14.18,19.54,8.98,30.15-2.37,5.24-6.32,9.39-10.53,13.13-.7,.55-2.55,1.99-3.24,2.52-.76,.57-2.62,1.68-3.41,2.24-8.4,4.91-18.22,8-27.95,7.45l-.08-.49c7.4-1.54,14.6-4.36,21.17-8.09,2.82-1.6,5.82-3.63,8.32-5.7,6.91-5.72,13.87-13.25,13.91-22.75,.06-6.69-3.05-13.21-7.53-18.09l.35-.36h0Z'/%3e%3cpath%20class='f'%20d='M167.22,124.02c16.67-8.3,39.6-10.49,56.5-1.46,1.18,.63,2.62,1.58,3.71,2.33,6.81,5.05,13.4,10.22,19.4,16.43l-.27,.42-9.05-5.51c-3.22-1.95-10.39-6.51-13.52-8.33-1.47-.86-3.13-1.66-4.7-2.3-13.13-5.17-27.76-4.86-41.56-2.99-3.49,.48-6.97,1.08-10.39,1.89l-.13-.48h0Z'/%3e%3cpath%20class='g'%20d='M340.25,209.52c-25.34,51.85-74.22,96.17-129.16,52.06-5.91-4.68-11.34-9.88-16.4-15.37,16.15,14.34,36.02,27.42,58.32,26.95,29.45-1,49.96-26.56,62.8-50.65,3.26-6.21,6.29-12.71,8.64-19.29,1.48-4.46,6.3-6.88,10.76-5.4,4.81,1.56,7.2,7.13,5.03,11.69h0Z'/%3e%3cpath%20class='g'%20d='M450.9,222.82c-3.86,14.01-12.5,26.41-23.37,35.88-8.87,7.57-19.71,13.2-30.75,16.3-38.57,10.56-80.42-1.74-116.27-16.32,22.35,6.65,45.15,11.56,68.41,12.15,1.99,0,6.67-.07,8.57-.09,1.81-.07,6.59-.45,8.5-.58l5.59-.75c17.07-2.47,33.77-9.13,45.66-21.69,7.23-7.71,12.77-17.29,14.99-27.65,.57-5.45,5.76-9.39,11.19-8.31,5.12,.99,8.48,5.94,7.49,11.06h0Z'/%3e%3cg%3e%3cpath%20class='e'%20d='M328.57,220.35c-.65,0-1.3-.03-1.94-.08-16.21-1.28-28.15-18.25-26.61-37.84,1.47-18.67,14.76-33.29,30.26-33.29,.65,0,1.3,.03,1.94,.08,16.21,1.28,28.15,18.25,26.61,37.84-1.47,18.67-14.76,33.29-30.26,33.29Z'/%3e%3cpath%20class='h'%20d='M330.28,147.64v3h0c.6,0,1.22,.02,1.82,.07,15.39,1.21,26.71,17.46,25.23,36.23-1.41,17.89-14.04,31.91-28.76,31.91-.61,0-1.22-.02-1.83-.07-15.39-1.21-26.71-17.46-25.23-36.23,1.41-17.89,14.04-31.91,28.76-31.91v-3m0,0c-16.21,0-30.21,15.05-31.75,34.67-1.61,20.45,10.92,38.11,27.98,39.46,.69,.05,1.38,.08,2.06,.08,16.21,0,30.21-15.05,31.75-34.67,1.61-20.45-10.92-38.11-27.98-39.46-.69-.05-1.38-.08-2.06-.08h0Z'/%3e%3c/g%3e%3cellipse%20class='i'%20cx='334.82'%20cy='199.39'%20rx='13.2'%20ry='9.39'%20transform='translate(39%20453.06)%20rotate(-71.39)'/%3e%3cg%3e%3cpath%20class='e'%20d='M446.3,231.11c-1.21,0-2.43-.1-3.63-.29-15.09-2.39-25.01-19.17-22.12-37.41,2.62-16.55,15.08-29.03,28.97-29.03,1.21,0,2.43,.1,3.63,.29,15.09,2.39,25.01,19.17,22.12,37.41-2.62,16.55-15.08,29.03-28.97,29.03Z'/%3e%3cpath%20class='h'%20d='M449.52,165.88h0c1.13,0,2.27,.09,3.39,.27,14.27,2.26,23.63,18.27,20.87,35.7-2.51,15.83-14.33,27.77-27.49,27.77-1.13,0-2.27-.09-3.39-.27-14.27-2.26-23.63-18.27-20.87-35.7,2.51-15.83,14.33-27.76,27.49-27.77m0-3c-14.48,0-27.67,12.76-30.45,30.3-3.02,19.09,7.44,36.61,23.37,39.13,1.29,.2,2.58,.3,3.86,.3,14.48,0,27.67-12.76,30.45-30.3,3.02-19.09-7.44-36.61-23.37-39.13-1.29-.2-2.58-.3-3.86-.3h0Z'/%3e%3c/g%3e%3cellipse%20class='i'%20cx='446.51'%20cy='209.6'%20rx='12.44'%20ry='8.84'%20transform='translate(78.46%20537.99)%20rotate(-66.89)'/%3e%3c/g%3e%3cg%20id='c'%3e%3cg%20class='j'%3e%3cpolygon%20class='e'%20points='329.42%20118.98%20367.62%20124.71%20301.63%20213.52%20283.04%20209.6%20267.19%20191.08%20329.42%20118.98'/%3e%3c/g%3e%3cg%20class='j'%3e%3cpolygon%20class='e'%20points='265.79%20162.67%20265.79%20110.28%20280.5%20109.04%20306.96%20113.1%20265.79%20162.67'/%3e%3c/g%3e%3cg%20class='j'%3e%3cpolygon%20class='e'%20points='469.91%20148.92%20504.3%20154.03%20444.89%20233.05%20428.16%20229.56%20413.89%20213.08%20469.91%20148.92'/%3e%3c/g%3e%3cg%3e%3cpath%20d='M510.06,159.47c-1.72-6.02-6.83-10.58-13.04-11.65l-69.11-14.88c-.07-.01-.14-.03-.21-.04-.22-.04-.87-.14-1.8-.2,.43-.03,.68-.02,.68-.02l-63.81-15.39s.09,.05,.14,.08c-.13-.02-.26-.06-.39-.08l-81.21-13.19c-.51-.08-3-.45-6.09-.21-.4-.09-.8-.14-1.22-.12-3.73,.15-92.16,3.94-158.51,31.15-1.6,.65-2.74,2.09-3.03,3.79-.17,.98-3.97,24.18,5.96,42.8,2.22,4.17,5,7.83,8.25,10.88,.7,.66,1.58,1.1,2.53,1.28,1.15,.21,2.92,.46,4.89,.46,3.22,0,6.94-.67,9.21-3.26,1.08-1.23,2.68-3.9,1.36-7.97-.85-2.63-3.66-4.03-6.29-3.18-1.97,.64-3.27,2.41-3.43,4.37-.72,.04-1.62,.02-2.51-.06-1.99-2.08-3.73-4.5-5.18-7.22-6.52-12.22-5.86-27.59-5.26-33.71,49.43-19.59,112.16-26.35,139.12-28.46-.19,.94-.32,1.95-.32,3.07v66.73c0,.12,0,.24,.01,.36,.06,.88,1.75,21.62,20.3,29.43,11.43,4.81,43.5,6.74,68.38,7.52,.28,0,.55,.01,.82,.01,11.7,0,21.98-7.74,25.19-19.07l.23-.84c3.05-11.22,3.54-40.64,3.62-51.05,1.2-3.01,3.1-4.63,5.93-6.52,7.68-5.14,18.12-2.75,22.92,5.14,.42,.69,.82,1.4,1.21,2.11v53.78c0,.1,0,.21,.01,.31,.06,.79,1.55,19.46,18.05,26.51,10.37,4.43,37.17,6.13,57.82,6.78,.25,0,.49,.01,.74,.01,10.42,0,19.58-6.98,22.43-17.2l.2-.74c3.21-11.98,3.23-47.01,3.23-49.25,.02-.85,.04-5.71-1.84-12.26Zm-140.69-12.46s0,.09,0,.13c.02,11.06-.54,41.98-3.28,52.06l-.21,.75c-2.03,7.17-8.61,12.03-16.08,11.78-33.48-1.04-57.11-3.49-64.81-6.74-12.31-5.19-14.03-19.14-14.19-20.79V117.69c0-1.77,.62-2.3,.88-2.52,1.65-1.41,5.77-1.54,8.03-1.19l81.22,13.19c3.23,.53,5.9,2.83,6.78,5.87,1.83,6.29,1.67,13.9,1.67,13.97Zm133.58,24.48c0,.06,0,.12,0,.19,.01,9.98-.49,37.88-2.93,46.98l-.18,.67c-1.8,6.47-7.66,10.83-14.26,10.63-27.7-.87-47.6-3.08-54.59-6.07-10.96-4.68-12.48-17.3-12.62-18.78v-59.99c0-1.64,.57-2.12,.81-2.33,1.44-1.23,4.99-1.36,6.97-1.06l69.08,14.87c.07,.02,.14,.03,.21,.04,2.86,.47,5.22,2.55,6.01,5.3,1.6,5.58,1.49,9.53,1.49,9.55Z'/%3e%3cpath%20d='M431.58,118.93c2.88-2.73,6.23-4.98,9.71-6.86,10.9-6.05,23.5-5.13,33.14,2.88,1.88,2.01,4.26,4.78,6,7.27,1.74,2.53,3.65,5.26,4.1,8.34,.03,.36,.57,.4,.66,.06,1.36-5.31-1.24-10.84-3.68-15.43-1-1.64-1.88-3.43-3.32-4.86-3.2-3.28-7.29-6.04-11.99-7.63-13.51-4.78-29.72,2.7-35.13,15.74l-.04,.11c-.15,.32,.31,.63,.55,.37Z'/%3e%3cpath%20d='M297.47,90.2c2.88-2.73,6.23-4.98,9.71-6.86,10.9-6.05,23.5-5.13,33.14,2.88,1.88,2.01,4.26,4.78,6,7.27,1.74,2.53,3.65,5.26,4.1,8.34,.03,.36,.57,.4,.66,.06,1.36-5.31-1.24-10.84-3.68-15.43-1-1.64-1.88-3.43-3.32-4.86-3.2-3.28-7.29-6.04-11.99-7.63-13.51-4.78-29.72,2.7-35.13,15.74l-.04,.11c-.15,.32,.31,.63,.55,.37Z'/%3e%3c/g%3e%3cpath%20class='d'%20d='M246.7,141.54s-45.89-33.79-87.25-15.71c-41.36,18.08-12.08,29.13-12.08,29.13l39-19.62,60.33,6.21Z'/%3e%3c/g%3e%3c/svg%3e",h=({open:s,onClose:l})=>c.jsxRuntimeExports.jsxs(e.Dialog,{open:s,onClose:l,maxWidth:"sm",children:[c.jsxRuntimeExports.jsx(a.Image,{src:i,alt:"brain",maxWidth:100,marginY:3}),c.jsxRuntimeExports.jsx(e.Typography,{variant:"h5",textAlign:"center",children:"Time for a break?"}),c.jsxRuntimeExports.jsx(e.Typography,{textAlign:"center",children:"You have been using the Code for Life website for a while. Remember to take regular screen breaks to recharge those brain cells!"}),c.jsxRuntimeExports.jsx(e.Button,{onClick:l,autoFocus:!0,children:"Continue"})]});exports.InactiveDialog=r;exports.ScreenTimeDialog=h;
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { j as c } from "../jsx-runtime-
|
|
1
|
+
import { j as c } from "../jsx-runtime-C7wFtzyj.js";
|
|
2
2
|
import { Dialog as t, Typography as l, Button as a } from "@mui/material";
|
|
3
3
|
import "react";
|
|
4
4
|
import "@mui/icons-material";
|
|
@@ -10,14 +10,14 @@ import "dayjs";
|
|
|
10
10
|
import "../settings/index.es.js";
|
|
11
11
|
import "../session-oI-Ht2C8.js";
|
|
12
12
|
import "js-cookie";
|
|
13
|
-
import "../schemas-
|
|
14
|
-
import "../urls-
|
|
13
|
+
import "../schemas-D3tO0rys.js";
|
|
14
|
+
import "../urls-5m9PgoEX.js";
|
|
15
15
|
import "react-router";
|
|
16
16
|
import "../palette-CYwuLBW7.js";
|
|
17
|
-
import "../auth-
|
|
17
|
+
import "../auth-CQ1InCxP.js";
|
|
18
18
|
import "react-redux";
|
|
19
|
-
import { C as i } from "../Countdown-
|
|
20
|
-
import { I as r } from "../Image-
|
|
19
|
+
import { C as i } from "../Countdown-BTyB1rrK.js";
|
|
20
|
+
import { I as r } from "../Image-C-f2ChBh.js";
|
|
21
21
|
const W = ({ open: s, onClose: e }) => /* @__PURE__ */ c.jsxs(t, { open: s, onClose: e, children: [
|
|
22
22
|
/* @__PURE__ */ c.jsx(l, { variant: "h5", textAlign: "center", children: "Where did you go? 👀" }),
|
|
23
23
|
/* @__PURE__ */ c.jsx(l, { textAlign: "center", children: "We noticed that you have been inactive for a while. Are you still there? For your online safety we will log you out in:" }),
|
package/dist/hooks/index.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("../api-DIgp_6Vr.cjs"),e=require("../auth-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("../api-DIgp_6Vr.cjs"),e=require("../auth-B7Vdot4N.cjs"),t=require("react"),u=require("../general-BPbbmkeX.cjs");function a(){return t.useRef(null)}exports.usePagination=s.usePagination;exports.useLocation=e.useLocation;exports.useNavigate=e.useNavigate;exports.useOAuth2=e.useOAuth2;exports.useOAuth2CodeChallenge=e.useOAuth2CodeChallenge;exports.useOAuth2State=e.useOAuth2State;exports.useParams=e.useParams;exports.useParamsRequired=e.useParamsRequired;exports.useSearchParams=e.useSearchParams;exports.useSession=e.useSession;exports.useSessionMetadata=e.useSessionMetadata;exports.useCountdown=u.useCountdown;exports.useEventListener=u.useEventListener;exports.useExternalScript=u.useExternalScript;exports.useInputRef=a;
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
package/dist/hooks/index.es.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { u as r } from "../api-Cs4Y-WeI.js";
|
|
2
|
-
import { f as n, e as i, d as f, c as m, b as p, h, i as c, g as d, a as l, u as x } from "../auth-
|
|
2
|
+
import { f as n, e as i, d as f, c as m, b as p, h, i as c, g as d, a as l, u as x } from "../auth-CQ1InCxP.js";
|
|
3
3
|
import { useRef as e } from "react";
|
|
4
4
|
import { a as g, b as P, u as A } from "../general-CtTJPCJn.js";
|
|
5
5
|
function a() {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const t=require("./jsx-runtime-
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
"use strict";const t=require("./jsx-runtime-Dszzpdy0.cjs"),m=require("react"),e=require("@mui/material"),i=({headers:s,children:n,containerProps:r,headProps:a,headRowProps:c,bodyProps:j,...u})=>t.jsxRuntimeExports.jsx(e.TableContainer,{...r,children:t.jsxRuntimeExports.jsxs(e.Table,{...u,children:[t.jsxRuntimeExports.jsx(e.TableHead,{...a,children:t.jsxRuntimeExports.jsx(e.TableRow,{...c,children:s.map((l,b)=>{const x=`table-head-cell-${b}`;return typeof l=="string"||m.isValidElement(l)?t.jsxRuntimeExports.jsx(e.TableCell,{children:l},x):t.jsxRuntimeExports.jsx(e.TableCell,{...l},x)})})}),t.jsxRuntimeExports.jsx(e.TableBody,{...j,children:n})]})}),o=({cellProps:s,...n})=>t.jsxRuntimeExports.jsx(e.TableCell,{...s,children:t.jsxRuntimeExports.jsx(e.Stack,{...n})}),R=Object.freeze(Object.defineProperty({__proto__:null,BodyRow:e.TableRow,Cell:e.TableCell,CellStack:o,Table:i},Symbol.toStringTag,{value:"Module"}));exports.CellStack=o;exports.Table=i;exports.index=R;
|
|
2
|
+
//# sourceMappingURL=index-B6aNVvMr.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-B6aNVvMr.cjs","sources":["../src/components/table/Table.tsx","../src/components/table/CellStack.tsx"],"sourcesContent":["import { type FC, type ReactNode, isValidElement } from \"react\"\nimport {\n Table as MuiTable,\n type TableProps as MuiTableProps,\n TableBody,\n type TableBodyProps,\n TableCell,\n type TableCellProps,\n TableContainer,\n type TableContainerProps,\n TableHead,\n type TableHeadProps,\n TableRow,\n type TableRowProps,\n} from \"@mui/material\"\n\nexport interface TableProps extends MuiTableProps {\n headers: Array<ReactNode | TableCellProps>\n children: ReactNode\n containerProps?: TableContainerProps\n headProps?: TableHeadProps\n headRowProps?: TableRowProps\n bodyProps?: TableBodyProps\n}\n\nconst Table: FC<TableProps> = ({\n headers,\n children,\n containerProps,\n headProps,\n headRowProps,\n bodyProps,\n ...tableProps\n}) => (\n <TableContainer {...containerProps}>\n <MuiTable {...tableProps}>\n <TableHead {...headProps}>\n <TableRow {...headRowProps}>\n {headers.map((header, index) => {\n const key = `table-head-cell-${index}`\n\n return typeof header === \"string\" || isValidElement(header) ? (\n <TableCell key={key}>{header}</TableCell>\n ) : (\n <TableCell key={key} {...(header as TableCellProps)} />\n )\n })}\n </TableRow>\n </TableHead>\n <TableBody {...bodyProps}>{children}</TableBody>\n </MuiTable>\n </TableContainer>\n)\n\nexport default Table\n","import {\n Stack,\n type StackProps,\n TableCell,\n type TableCellProps,\n} from \"@mui/material\"\nimport { type FC } from \"react\"\n\nexport interface CellStackProps extends StackProps {\n cellProps?: TableCellProps\n}\n\nconst CellStack: FC<CellStackProps> = ({ cellProps, ...stackProps }) => (\n <TableCell {...cellProps}>\n <Stack {...stackProps} />\n </TableCell>\n)\n\nexport default CellStack\n"],"names":["Table","headers","children","containerProps","headProps","headRowProps","bodyProps","tableProps","TableContainer","jsxs","MuiTable","jsx","TableHead","TableRow","header","index","key","isValidElement","TableCell","TableBody","CellStack","cellProps","stackProps","Stack"],"mappings":"yGAyBMA,EAAwB,CAAC,CAC7B,QAAAC,EACA,SAAAC,EACA,eAAAC,EACA,UAAAC,EACA,aAAAC,EACA,UAAAC,EACA,GAAGC,CACL,4BACGC,EAAAA,eAAA,CAAgB,GAAGL,EAClB,SAAAM,EAAAA,kBAAAA,KAACC,QAAA,CAAU,GAAGH,EACZ,SAAA,CAAAI,EAAAA,kBAAAA,IAACC,EAAAA,UAAA,CAAW,GAAGR,EACb,SAAAO,EAAAA,kBAAAA,IAACE,EAAAA,SAAA,CAAU,GAAGR,EACX,SAAAJ,EAAQ,IAAI,CAACa,EAAQC,IAAU,CAC9B,MAAMC,EAAM,mBAAmBD,CAAK,GAEpC,OAAO,OAAOD,GAAW,UAAYG,EAAAA,eAAeH,CAAM,EACxDH,EAAAA,kBAAAA,IAACO,EAAAA,UAAA,CAAqB,SAAAJ,CAAA,EAANE,CAAa,EAE7BL,EAAAA,kBAAAA,IAACO,EAAAA,UAAA,CAAqB,GAAIJ,GAAVE,CAAqC,CAEzD,CAAC,EACH,EACF,EACAL,EAAAA,kBAAAA,IAACQ,EAAAA,UAAA,CAAW,GAAGb,EAAY,SAAAJ,CAAA,CAAS,CAAA,CAAA,CACtC,CAAA,CACF,ECvCIkB,EAAgC,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,IACrDX,EAAAA,kBAAAA,IAACO,EAAAA,UAAA,CAAW,GAAGG,EACb,SAAAV,EAAAA,kBAAAA,IAACY,EAAAA,MAAA,CAAO,GAAGD,EAAY,CAAA,CACzB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { j as l } from "./jsx-runtime-
|
|
1
|
+
import { j as l } from "./jsx-runtime-C7wFtzyj.js";
|
|
2
2
|
import { CircularProgress as zt, Button as Dt, Autocomplete as At, TextField as ft, FormControl as Et, FormControlLabel as Bt, Checkbox as _t, FormHelperText as wt, InputAdornment as mt, IconButton as $t } from "@mui/material";
|
|
3
3
|
import { useState as U, useEffect as I, forwardRef as Ut, Children as It, useRef as Vt } from "react";
|
|
4
|
-
import { S as Ht } from "./api-
|
|
4
|
+
import { S as Ht } from "./api-BvUiTeR7.js";
|
|
5
5
|
import { u as Nt } from "./api-Cs4Y-WeI.js";
|
|
6
6
|
import { Field as $, Formik as Wt, Form as qt } from "formik";
|
|
7
7
|
import { string as V, number as Rt, bool as Gt, date as Zt, array as Xt } from "yup";
|
|
@@ -14,8 +14,8 @@ import { EmailOutlined as ne, PersonOutlined as ie, Visibility as oe, Visibility
|
|
|
14
14
|
import "./settings/index.es.js";
|
|
15
15
|
import "./session-oI-Ht2C8.js";
|
|
16
16
|
import "js-cookie";
|
|
17
|
-
import { u as ue } from "./schemas-
|
|
18
|
-
import "./urls-
|
|
17
|
+
import { u as ue } from "./schemas-D3tO0rys.js";
|
|
18
|
+
import "./urls-5m9PgoEX.js";
|
|
19
19
|
function N(n) {
|
|
20
20
|
return n && n.__esModule && Object.prototype.hasOwnProperty.call(n, "default") ? n.default : n;
|
|
21
21
|
}
|
|
@@ -1108,4 +1108,4 @@ export {
|
|
|
1108
1108
|
Ve as c,
|
|
1109
1109
|
fr as i
|
|
1110
1110
|
};
|
|
1111
|
-
//# sourceMappingURL=index-
|
|
1111
|
+
//# sourceMappingURL=index-C-3iPCa4.js.map
|