{"version":3,"file":"auth-C8Z3B8UZ.js","names":["s","t"],"sources":["../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ArrowClockwise.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ArrowClockwise.es.js","../../src/app/hooks/useAuthFlows.ts","../../src/app/components/AuthFlowsLoader.tsx","../../src/app/hooks/useAuthServer.ts","../../src/app/pages/auth/ServerPicker.tsx","../../src/app/pages/auth/styles.css.ts","../../src/app/pages/auth/AuthFooter.tsx","../../src/app/hooks/usePathWithOrigin.ts","../../src/app/pages/auth/AuthLayout.tsx","../../src/app/hooks/useParsedLoginFlows.ts","../../src/app/pages/auth/SSOLogin.tsx","../../src/app/pages/auth/OrDivider.tsx","../../src/app/pages/auth/FiledError.tsx","../../src/app/pages/auth/login/slidingSyncLogin.ts","../../src/app/pages/auth/login/loginUtil.ts","../../src/app/pages/auth/login/PasswordLoginForm.tsx","../../src/app/pages/auth/login/TokenLogin.tsx","../../src/app/pages/auth/login/OidcLogin.tsx","../../src/app/pages/auth/login/Login.tsx","../../src/app/components/SupportedUIAFlowsLoader.tsx","../../src/app/hooks/useRegisterEmail.ts","../../src/app/pages/auth/register/registerUtil.ts","../../src/app/pages/auth/register/PasswordRegisterForm.tsx","../../src/app/pages/auth/register/Register.tsx","../../src/app/hooks/usePasswordEmail.ts","../../src/app/pages/auth/reset-password/resetPasswordUtil.ts","../../src/app/pages/auth/reset-password/PasswordResetForm.tsx","../../src/app/pages/auth/reset-password/ResetPassword.tsx"],"sourcesContent":["import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M244,56v48a12,12,0,0,1-12,12H184a12,12,0,1,1,0-24H201.1l-19-17.38c-.13-.12-.26-.24-.38-.37A76,76,0,1,0,127,204h1a75.53,75.53,0,0,0,52.15-20.72,12,12,0,0,1,16.49,17.45A99.45,99.45,0,0,1,128,228h-1.37A100,100,0,1,1,198.51,57.06L220,76.72V56a12,12,0,0,1,24,0Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M216,128a88,88,0,1,1-88-88A88,88,0,0,1,216,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16H211.4L184.81,71.64l-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,0,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60L224,85.8V56a8,8,0,1,1,16,0Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1-5.66-13.66l17-17-10.55-9.65-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,1,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60l10.93,10L226.34,50.3A8,8,0,0,1,240,56Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M238,56v48a6,6,0,0,1-6,6H184a6,6,0,0,1,0-12h32.55l-30.38-27.8c-.06-.06-.12-.13-.19-.19a82,82,0,1,0-1.7,117.65,6,6,0,0,1,8.24,8.73A93.46,93.46,0,0,1,128,222h-1.28A94,94,0,1,1,194.37,61.4L226,90.35V56a6,6,0,1,1,12,0Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16H211.4L184.81,71.64l-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,0,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60L224,85.8V56a8,8,0,1,1,16,0Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M236,56v48a4,4,0,0,1-4,4H184a4,4,0,0,1,0-8h37.7L187.53,68.69l-.13-.12a84,84,0,1,0-1.75,120.51,4,4,0,0,1,5.5,5.82A91.43,91.43,0,0,1,128,220h-1.26A92,92,0,1,1,193,62.84l35,32.05V56a4,4,0,1,1,8,0Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as o from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/ArrowClockwise.es.js\";\nconst r = o.forwardRef((e, c) => /* @__PURE__ */ o.createElement(s, { ref: c, ...e, weights: t }));\nr.displayName = \"ArrowClockwiseIcon\";\nconst m = r;\nexport {\n  m as ArrowClockwise,\n  r as ArrowClockwiseIcon\n};\n","import { createContext, useContext } from 'react';\nimport type {\n  IAuthData,\n  MatrixError,\n  ILoginFlowsResponse,\n  ValidatedAuthMetadata,\n} from '$types/matrix-sdk';\n\nexport enum RegisterFlowStatus {\n  FlowRequired = 401,\n  InvalidRequest = 400,\n  RegistrationDisabled = 403,\n  RateLimited = 429,\n}\n\nexport type RegisterFlowsResponse =\n  | {\n      status: RegisterFlowStatus.FlowRequired;\n      data: IAuthData;\n    }\n  | {\n      status: Exclude<RegisterFlowStatus, RegisterFlowStatus.FlowRequired>;\n    };\n\nexport const parseRegisterErrResp = (matrixError: MatrixError): RegisterFlowsResponse => {\n  switch (matrixError.httpStatus) {\n    case RegisterFlowStatus.InvalidRequest: {\n      return { status: RegisterFlowStatus.InvalidRequest };\n    }\n    case RegisterFlowStatus.RateLimited: {\n      return { status: RegisterFlowStatus.RateLimited };\n    }\n    case RegisterFlowStatus.RegistrationDisabled: {\n      return { status: RegisterFlowStatus.RegistrationDisabled };\n    }\n    case RegisterFlowStatus.FlowRequired: {\n      return {\n        status: RegisterFlowStatus.FlowRequired,\n        data: matrixError.data as IAuthData,\n      };\n    }\n    default: {\n      return { status: RegisterFlowStatus.InvalidRequest };\n    }\n  }\n};\n\nexport type AuthFlows = {\n  loginFlows: ILoginFlowsResponse;\n  registerFlows: RegisterFlowsResponse;\n  authMetadata?: ValidatedAuthMetadata;\n};\n\n/** True only when the homeserver advertises the OAuth authorization-code flow Sable uses. */\nexport const isUsableOAuthMetadata = (metadata: ValidatedAuthMetadata | undefined): boolean =>\n  metadata !== undefined &&\n  metadata.grant_types_supported.includes('authorization_code') &&\n  metadata.grant_types_supported.includes('refresh_token') &&\n  metadata.response_types_supported.includes('code') &&\n  metadata.response_modes_supported.includes('fragment') &&\n  metadata.code_challenge_methods_supported.includes('S256');\n\nconst AuthFlowsContext = createContext<AuthFlows | null>(null);\n\nexport const AuthFlowsProvider = AuthFlowsContext.Provider;\n\nexport const useAuthFlows = (): AuthFlows => {\n  const authFlows = useContext(AuthFlowsContext);\n  if (!authFlows) {\n    throw new Error('Auth Flow info is not loaded!');\n  }\n  return authFlows;\n};\n","import type { ReactNode } from 'react';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport type { MatrixError } from '$types/matrix-sdk';\nimport { createClient } from '$types/matrix-sdk';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo';\nimport { promiseFulfilledResult, promiseRejectedResult } from '$utils/common';\nimport {\n  isUsableOAuthMetadata,\n  type AuthFlows,\n  RegisterFlowStatus,\n  parseRegisterErrResp,\n  type RegisterFlowsResponse,\n} from '$hooks/useAuthFlows';\nimport { fetch } from '$utils/fetch';\n\ntype AuthFlowsLoaderProps = {\n  fallback?: () => ReactNode;\n  error?: (err: unknown, retry: () => void) => ReactNode;\n  children: (authFlows: AuthFlows) => ReactNode;\n};\nexport function AuthFlowsLoader({ fallback, error, children }: AuthFlowsLoaderProps) {\n  const autoDiscoveryInfo = useAutoDiscoveryInfo();\n  const baseUrl = autoDiscoveryInfo['m.homeserver'].base_url;\n\n  const mx = useMemo(() => createClient({ baseUrl, fetchFn: fetch }), [baseUrl]);\n\n  const [state, load] = useAsyncCallback(\n    useCallback(async () => {\n      const result = await Promise.allSettled([\n        mx.loginFlows(),\n        mx.registerRequest({}),\n        mx.getAuthMetadata(),\n      ]);\n      const loginFlows = promiseFulfilledResult(result[0]);\n      const registerResp = promiseRejectedResult(result[1]) as MatrixError | undefined;\n      const discoveredAuthMetadata = promiseFulfilledResult(result[2]);\n      const authMetadata = isUsableOAuthMetadata(discoveredAuthMetadata)\n        ? discoveredAuthMetadata\n        : undefined;\n      let registerFlows: RegisterFlowsResponse = {\n        status: RegisterFlowStatus.InvalidRequest,\n      };\n\n      if (typeof registerResp === 'object' && registerResp.httpStatus) {\n        registerFlows = parseRegisterErrResp(registerResp);\n      }\n\n      const validLoginFlows = loginFlows && !('errcode' in loginFlows) ? loginFlows : undefined;\n\n      // OIDC-only servers reject GET /login; that is fine when the OAuth 2.0 API is available.\n      if (!validLoginFlows && !authMetadata) {\n        throw new Error('Missing auth flow!');\n      }\n\n      const authFlows: AuthFlows = {\n        loginFlows: validLoginFlows ?? { flows: [] },\n        registerFlows,\n        authMetadata,\n      };\n\n      return authFlows;\n    }, [mx])\n  );\n\n  useEffect(() => {\n    load();\n  }, [load]);\n\n  if (state.status === AsyncStatus.Idle || state.status === AsyncStatus.Loading) {\n    return fallback?.();\n  }\n\n  if (state.status === AsyncStatus.Error) {\n    return error?.(state.error, load);\n  }\n\n  return children(state.data);\n}\n","import { createContext, useContext } from 'react';\n\nconst AuthServerContext = createContext<string | null>(null);\n\nexport const AuthServerProvider = AuthServerContext.Provider;\n\nexport const useAuthServer = (): string => {\n  const server = useContext(AuthServerContext);\n  if (server === null) {\n    throw new Error('Auth server is not provided!');\n  }\n\n  return server;\n};\n","import type {\n  ChangeEventHandler,\n  FocusEventHandler,\n  KeyboardEventHandler,\n  MouseEventHandler,\n} from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport type { RectCords } from 'folds';\nimport { Header, IconButton, Input, Menu, MenuItem, Text, config } from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport { composerIcon, CaretDown } from '$components/icons/phosphor';\nimport FocusTrap from 'focus-trap-react';\n\nimport { useDebounce } from '$hooks/useDebounce';\nimport { stopPropagation } from '$utils/keyboard';\n\nexport function ServerPicker({\n  server,\n  serverList,\n  allowCustomServer,\n  onServerChange,\n}: {\n  server: string;\n  serverList: string[];\n  allowCustomServer?: boolean;\n  onServerChange: (server: string) => void;\n}) {\n  const [serverMenuAnchor, setServerMenuAnchor] = useState<RectCords>();\n  const serverInputRef = useRef<HTMLInputElement>(null);\n  const inputFocusedRef = useRef(false);\n\n  useEffect(() => {\n    // sync input with outside server changes, but only when not focused\n    // (on iOS, syncing while focused causes the deleted text to reappear)\n    if (\n      !inputFocusedRef.current &&\n      serverInputRef.current &&\n      serverInputRef.current.value !== server\n    ) {\n      serverInputRef.current.value = server;\n    }\n  }, [server]);\n\n  const debounceServerSelect = useDebounce(onServerChange, { wait: 700 });\n\n  const handleServerChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const inputServer = evt.target.value.trim();\n    if (inputServer) debounceServerSelect(inputServer);\n  };\n\n  const handleInputFocus: FocusEventHandler<HTMLInputElement> = () => {\n    inputFocusedRef.current = true;\n  };\n\n  const handleInputBlur: FocusEventHandler<HTMLInputElement> = () => {\n    inputFocusedRef.current = false;\n    // restore the server value if the input was cleared without selecting a new one\n    if (serverInputRef.current && serverInputRef.current.value.trim() === '') {\n      serverInputRef.current.value = server;\n    }\n  };\n\n  const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (evt) => {\n    if (evt.key === 'ArrowDown') {\n      evt.preventDefault();\n      setServerMenuAnchor(undefined);\n    }\n    if (evt.key === 'Enter') {\n      evt.preventDefault();\n      const inputServer = evt.currentTarget.value.trim();\n      if (inputServer) onServerChange(inputServer);\n    }\n  };\n\n  const handleServerSelect: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    const selectedServer = evt.currentTarget.getAttribute('data-server');\n    if (selectedServer) {\n      onServerChange(selectedServer);\n    }\n    setServerMenuAnchor(undefined);\n  };\n\n  const handleOpenServerMenu: MouseEventHandler<HTMLElement> = (evt) => {\n    const target = evt.currentTarget.parentElement ?? evt.currentTarget;\n    setServerMenuAnchor(target.getBoundingClientRect());\n  };\n\n  return (\n    <Input\n      ref={serverInputRef}\n      style={{ paddingRight: config.space.S200 }}\n      variant={allowCustomServer ? 'Background' : 'Surface'}\n      outlined\n      defaultValue={server}\n      onChange={handleServerChange}\n      onKeyDown={handleKeyDown}\n      onFocus={handleInputFocus}\n      onBlur={handleInputBlur}\n      size=\"500\"\n      readOnly={!allowCustomServer}\n      onClick={allowCustomServer ? undefined : handleOpenServerMenu}\n      // disable auto-capitalization, which is usually undesirable for server name input.\n      autoCapitalize=\"off\"\n      // disable spell-check and auto-correction\n      spellCheck={false}\n      autoCorrect=\"off\"\n      after={\n        serverList.length === 0 || (serverList.length === 1 && !allowCustomServer) ? undefined : (\n          <PopOut\n            anchor={serverMenuAnchor}\n            position=\"Bottom\"\n            align=\"End\"\n            offset={4}\n            content={\n              <FocusTrap\n                focusTrapOptions={{\n                  initialFocus: false,\n                  onDeactivate: () => setServerMenuAnchor(undefined),\n                  clickOutsideDeactivates: true,\n                  isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown',\n                  isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp',\n                  escapeDeactivates: stopPropagation,\n                }}\n              >\n                <Menu>\n                  <Header size=\"300\" style={{ padding: `0 ${config.space.S200}` }}>\n                    <Text size=\"L400\">Homeserver List</Text>\n                  </Header>\n                  <div style={{ padding: config.space.S100, paddingTop: 0 }}>\n                    {serverList?.map((serverName) => (\n                      <MenuItem\n                        key={serverName}\n                        radii=\"300\"\n                        aria-pressed={serverName === server}\n                        data-server={serverName}\n                        onClick={handleServerSelect}\n                      >\n                        <Text>{serverName}</Text>\n                      </MenuItem>\n                    ))}\n                  </div>\n                </Menu>\n              </FocusTrap>\n            }\n          >\n            <IconButton\n              onClick={handleOpenServerMenu}\n              variant={allowCustomServer ? 'Background' : 'Surface'}\n              size=\"300\"\n              aria-pressed={!!serverMenuAnchor}\n              radii=\"300\"\n            >\n              {composerIcon(CaretDown)}\n            </IconButton>\n          </PopOut>\n        )\n      }\n    />\n  );\n}\n","import { style } from '@vanilla-extract/css';\nimport { DefaultReset, color, config, toRem } from 'folds';\n\nexport const AuthLayout = style({\n  minHeight: '100%',\n  backgroundColor: color.Background.Container,\n  color: color.Background.OnContainer,\n  padding: config.space.S400,\n  paddingRight: config.space.S200,\n  paddingBottom: 0,\n  position: 'relative',\n});\n\nexport const AuthCard = style({\n  marginTop: '1vh',\n  maxWidth: toRem(460),\n  width: '100%',\n  backgroundColor: color.Surface.Container,\n  color: color.Surface.OnContainer,\n  borderRadius: config.radii.R400,\n  boxShadow: config.shadow.E100,\n  border: `${config.borderWidth.B300} solid ${color.Surface.ContainerLine}`,\n  overflow: 'hidden',\n});\n\nexport const AuthLogo = style([\n  DefaultReset,\n  {\n    width: toRem(26),\n    height: toRem(26),\n\n    borderRadius: '50%',\n  },\n]);\n\nexport const AuthHeader = style({\n  padding: `0 ${config.space.S400}`,\n  borderBottomWidth: config.borderWidth.B300,\n});\n\nexport const AuthCardContent = style({\n  maxWidth: toRem(402),\n  width: '100%',\n  margin: 'auto',\n  padding: config.space.S400,\n  paddingTop: config.space.S700,\n  paddingBottom: toRem(44),\n  gap: toRem(44),\n});\n\nexport const AuthFooter = style({\n  padding: config.space.S200,\n});\n","import { Box, Text } from 'folds';\nimport { versionLabel } from '$utils/platform';\nimport * as css from './styles.css';\n\nexport function AuthFooter() {\n  return (\n    <Box className={css.AuthFooter} justifyContent=\"Center\" gap=\"400\" wrap=\"Wrap\">\n      <Text as=\"a\" size=\"T300\" href=\"https://app.sable.moe\" target=\"_blank\" rel=\"noreferrer\">\n        About\n      </Text>\n      <Text\n        as=\"a\"\n        size=\"T300\"\n        href=\"https://github.com/SableClient/Sable\"\n        target=\"_blank\"\n        rel=\"noreferrer\"\n      >\n        {versionLabel()}\n      </Text>\n      <Text as=\"a\" size=\"T300\" href=\"https://matrix.org\" target=\"_blank\" rel=\"noreferrer\">\n        Powered by Matrix\n      </Text>\n    </Box>\n  );\n}\n","import { useMemo } from 'react';\nimport { trimLeadingSlash, trimSlash, trimTrailingSlash } from '$utils/common';\nimport { useClientConfig } from './useClientConfig';\n\nexport const usePathWithOrigin = (\n  path: string,\n  options?: {\n    /** OAuth redirect URIs must not contain a fragment (RFC 6749). */\n    ignoreHashRouter?: boolean;\n  }\n): string => {\n  const { hashRouter } = useClientConfig();\n  const { origin } = window.location;\n  const ignoreHashRouter = options?.ignoreHashRouter ?? false;\n\n  const pathWithOrigin = useMemo(() => {\n    let url: string = trimSlash(origin);\n\n    url += `/${trimSlash(import.meta.env.BASE_URL ?? '')}`;\n    url = trimTrailingSlash(url);\n\n    if (hashRouter?.enabled && !ignoreHashRouter) {\n      url += `/#/${trimSlash(hashRouter.basename ?? '')}`;\n      url = trimTrailingSlash(url);\n    }\n\n    url += `/${trimLeadingSlash(path)}`;\n\n    return url;\n  }, [path, hashRouter, origin, ignoreHashRouter]);\n\n  return pathWithOrigin;\n};\n","import type { ReactNode } from 'react';\nimport { useCallback, useEffect } from 'react';\nimport { Box, Chip, Header, IconButton, Scroll, Spinner, Text, color } from 'folds';\nimport { ArrowClockwiseIcon } from '@phosphor-icons/react';\nimport { Outlet, matchPath, useLocation, useNavigate, useSearchParams } from 'react-router';\nimport classNames from 'classnames';\n\nimport * as PatternsCss from '$styles/Patterns.css';\nimport { clientAllowedServer, clientDefaultServer, useClientConfig } from '$hooks/useClientConfig';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport LogoSVG from '$public/res/svg/logo.svg';\nimport { SpecVersionsLoader } from '$components/SpecVersionsLoader';\nimport { SpecVersionsProvider } from '$hooks/useSpecVersions';\nimport { AutoDiscoveryInfoProvider } from '$hooks/useAutoDiscoveryInfo';\nimport { AuthFlowsLoader } from '$components/AuthFlowsLoader';\nimport { AuthFlowsProvider } from '$hooks/useAuthFlows';\nimport type { AuthFlows } from '$hooks/useAuthFlows';\nimport { AuthServerProvider } from '$hooks/useAuthServer';\nimport { LOGIN_PATH, REGISTER_PATH, RESET_PASSWORD_PATH, SERVER_SEARCH_PARAM } from '$pages/paths';\nimport { getHomePath } from '$pages/pathUtils';\nimport { fetch } from '$utils/fetch';\nimport { sizedIcon } from '$components/icons/phosphor';\nimport { AutoDiscoveryAction, autoDiscovery } from '../../cs-api';\nimport type { SpecVersions } from '../../cs-api';\nimport { ServerPicker } from './ServerPicker';\nimport * as css from './styles.css';\nimport { AuthFooter } from './AuthFooter';\nimport { usePathWithOrigin } from '$hooks/usePathWithOrigin';\n\nconst currentAuthPath = (pathname: string): string => {\n  if (matchPath(LOGIN_PATH, pathname)) {\n    return LOGIN_PATH;\n  }\n  if (matchPath(RESET_PASSWORD_PATH, pathname)) {\n    return RESET_PASSWORD_PATH;\n  }\n  if (matchPath(REGISTER_PATH, pathname)) {\n    return REGISTER_PATH;\n  }\n  return LOGIN_PATH;\n};\n\nconst authPathWithServer = (\n  pathname: string,\n  searchParams: URLSearchParams,\n  server: string\n): string => {\n  const params = new URLSearchParams(searchParams);\n  params.set(SERVER_SEARCH_PARAM, server);\n  return `${currentAuthPath(pathname)}?${params}`;\n};\n\nfunction AuthLayoutLoading({ message }: { message: string }) {\n  return (\n    <Box justifyContent=\"Center\" alignItems=\"Center\" gap=\"200\">\n      <Spinner size=\"100\" variant=\"Secondary\" />\n      <Text align=\"Center\" size=\"T300\">\n        {message}\n      </Text>\n    </Box>\n  );\n}\n\nfunction AuthLayoutError({ message, retry }: { message: string; retry: () => void }) {\n  return (\n    <Box justifyContent=\"Center\" alignItems=\"Center\" gap=\"200\">\n      <Text align=\"Center\" style={{ color: color.Critical.Main }} size=\"T300\">\n        {message}\n      </Text>\n      <IconButton\n        type=\"button\"\n        size=\"300\"\n        variant=\"Critical\"\n        fill=\"None\"\n        onClick={retry}\n        aria-label=\"Retry\"\n        radii=\"300\"\n      >\n        {sizedIcon(ArrowClockwiseIcon, '100')}\n      </IconButton>\n    </Box>\n  );\n}\n\nfunction AuthHomeserverConnectFallback({ baseUrl }: { baseUrl: string }) {\n  return <AuthLayoutLoading message={`Connecting to ${baseUrl}`} />;\n}\n\nfunction authHomeserverConnectError(_error: unknown, retry: () => void) {\n  return (\n    <AuthLayoutError\n      message=\"Failed to connect. Either homeserver is unavailable at this moment or does not exist.\"\n      retry={retry}\n    />\n  );\n}\n\nfunction authFlowsLoadingFallback() {\n  return <AuthLayoutLoading message=\"Loading authentication flow...\" />;\n}\n\nfunction authFlowsError(_error: unknown, retry: () => void) {\n  return <AuthLayoutError message=\"Failed to get authentication flow information.\" retry={retry} />;\n}\n\nfunction AuthFlowsOutlet({ authFlows }: { authFlows: AuthFlows }) {\n  return (\n    <AuthFlowsProvider value={authFlows}>\n      <Outlet />\n    </AuthFlowsProvider>\n  );\n}\n\nfunction AuthSpecVersionsContent({\n  specVersions,\n  renderAuthFlows,\n}: {\n  specVersions: SpecVersions;\n  renderAuthFlows: (authFlows: AuthFlows) => ReactNode;\n}) {\n  return (\n    <SpecVersionsProvider value={specVersions}>\n      <AuthFlowsLoader fallback={authFlowsLoadingFallback} error={authFlowsError}>\n        {renderAuthFlows}\n      </AuthFlowsLoader>\n    </SpecVersionsProvider>\n  );\n}\n\nexport function AuthLayout() {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const [searchParams] = useSearchParams();\n  const urlServer = searchParams.get(SERVER_SEARCH_PARAM) ?? undefined;\n\n  const isAddingAccount = searchParams.get('addAccount') === '1';\n\n  const clientConfig = useClientConfig();\n\n  const homeUrl = usePathWithOrigin(getHomePath());\n\n  const defaultServer = clientDefaultServer(clientConfig);\n  let server: string = urlServer ?? defaultServer;\n\n  if (!clientAllowedServer(clientConfig, server)) {\n    server = defaultServer;\n  }\n\n  const [discoveryState, discoverServer] = useAsyncCallback(\n    useCallback(async (serverName: string) => {\n      const response = await autoDiscovery(fetch, serverName);\n      return {\n        serverName,\n        response,\n      };\n    }, [])\n  );\n  const retryHomeserverDiscovery = () => discoverServer(server);\n\n  useEffect(() => {\n    if (server) discoverServer(server);\n  }, [discoverServer, server]);\n\n  // if server is mismatched with url server, update url — preserve all search params\n  useEffect(() => {\n    if (urlServer !== server) {\n      navigate(authPathWithServer(location.pathname, searchParams, server), { replace: true });\n    }\n  }, [urlServer, navigate, location, server, searchParams]);\n\n  const selectServer = useCallback(\n    (newServer: string) => {\n      if (newServer === server) {\n        if (discoveryState.status === AsyncStatus.Loading) return;\n        discoverServer(server);\n        return;\n      }\n      navigate(authPathWithServer(location.pathname, searchParams, newServer));\n    },\n    [navigate, location, discoveryState, server, discoverServer, searchParams]\n  );\n\n  const [autoDiscoveryError, autoDiscoveryInfo] =\n    discoveryState.status === AsyncStatus.Success ? discoveryState.data.response : [];\n\n  const homeserverBaseUrl = autoDiscoveryInfo?.['m.homeserver']?.base_url;\n\n  const renderHomeserverConnectFallback = useCallback(() => {\n    if (!homeserverBaseUrl) return null;\n    return <AuthHomeserverConnectFallback baseUrl={homeserverBaseUrl} />;\n  }, [homeserverBaseUrl]);\n\n  const renderAuthFlows = useCallback(\n    (authFlows: AuthFlows) => <AuthFlowsOutlet authFlows={authFlows} />,\n    []\n  );\n\n  const renderSpecVersions = useCallback(\n    (specVersions: SpecVersions) => (\n      <AuthSpecVersionsContent specVersions={specVersions} renderAuthFlows={renderAuthFlows} />\n    ),\n    [renderAuthFlows]\n  );\n\n  return (\n    <Scroll variant=\"Background\" visibility=\"Hover\" size=\"300\" hideTrack>\n      <Box\n        className={classNames(css.AuthLayout, PatternsCss.BackgroundDotPattern)}\n        direction=\"Column\"\n        alignItems=\"Center\"\n        justifyContent=\"SpaceBetween\"\n        gap=\"400\"\n      >\n        <Box direction=\"Column\" className={css.AuthCard}>\n          <Header className={css.AuthHeader} size=\"600\" variant=\"Surface\">\n            <Box grow=\"Yes\" direction=\"Row\" gap=\"300\" alignItems=\"Center\">\n              <img className={css.AuthLogo} src={LogoSVG} alt=\"Sable Logo\" />\n              <Text size=\"H3\">Sable</Text>\n            </Box>\n            {isAddingAccount && (\n              <Box gap=\"200\" alignItems=\"Center\" style={{ marginLeft: 'auto' }}>\n                <Text size=\"T200\" priority=\"300\">\n                  Adding account\n                </Text>\n                <Chip variant=\"Surface\" radii=\"300\" onClick={() => window.location.assign(homeUrl)}>\n                  <Text size=\"T200\">Cancel</Text>\n                </Chip>\n              </Box>\n            )}\n          </Header>\n          <Box className={css.AuthCardContent} direction=\"Column\">\n            <Box direction=\"Column\" gap=\"100\">\n              <Text as=\"label\" size=\"L400\" priority=\"300\">\n                Homeserver\n              </Text>\n              <ServerPicker\n                server={server}\n                serverList={clientConfig.homeserverList ?? []}\n                allowCustomServer={clientConfig.allowCustomHomeservers}\n                onServerChange={selectServer}\n              />\n            </Box>\n            {discoveryState.status === AsyncStatus.Loading && (\n              <AuthLayoutLoading message=\"Looking for homeserver...\" />\n            )}\n            {discoveryState.status === AsyncStatus.Error && (\n              <AuthLayoutError\n                message=\"Failed to find homeserver.\"\n                retry={retryHomeserverDiscovery}\n              />\n            )}\n            {autoDiscoveryError?.action === AutoDiscoveryAction.FAIL_PROMPT && (\n              <AuthLayoutError\n                message={`Failed to connect. Homeserver configuration found with ${autoDiscoveryError.host} appears unusable.`}\n                retry={retryHomeserverDiscovery}\n              />\n            )}\n            {autoDiscoveryError?.action === AutoDiscoveryAction.FAIL_ERROR && (\n              <AuthLayoutError\n                message=\"Failed to connect. Homeserver configuration base_url appears invalid.\"\n                retry={retryHomeserverDiscovery}\n              />\n            )}\n            {discoveryState.status === AsyncStatus.Success && autoDiscoveryInfo && (\n              <AuthServerProvider value={discoveryState.data.serverName}>\n                <AutoDiscoveryInfoProvider value={autoDiscoveryInfo}>\n                  <SpecVersionsLoader\n                    baseUrl={autoDiscoveryInfo['m.homeserver'].base_url}\n                    fallback={renderHomeserverConnectFallback}\n                    error={authHomeserverConnectError}\n                  >\n                    {renderSpecVersions}\n                  </SpecVersionsLoader>\n                </AutoDiscoveryInfoProvider>\n              </AuthServerProvider>\n            )}\n          </Box>\n        </Box>\n        <AuthFooter />\n      </Box>\n    </Scroll>\n  );\n}\n","import { useMemo } from 'react';\nimport type { ILoginFlow, IPasswordFlow, ISSOFlow, LoginFlow } from '$types/matrix-sdk';\nimport { OAUTH_AWARE_PREFERRED_FLOW_FIELD } from '$types/matrix-sdk';\n\nconst getSSOFlow = (loginFlows: LoginFlow[]): ISSOFlow | undefined =>\n  loginFlows.find((flow) => flow.type === 'm.login.sso' || flow.type === 'm.login.cas') as\n    | ISSOFlow\n    | undefined;\n\nexport const isOauthAwarePreferred = (ssoFlow: ISSOFlow | undefined): boolean =>\n  Boolean(\n    ssoFlow?.[OAUTH_AWARE_PREFERRED_FLOW_FIELD.name] ??\n    ssoFlow?.[OAUTH_AWARE_PREFERRED_FLOW_FIELD.altName]\n  );\n\nconst getPasswordFlow = (loginFlows: LoginFlow[]): IPasswordFlow | undefined =>\n  loginFlows.find((flow) => flow.type === 'm.login.password') as IPasswordFlow;\nconst getTokenFlow = (loginFlows: LoginFlow[]): LoginFlow | undefined =>\n  loginFlows.find((flow) => flow.type === 'm.login.token') as ILoginFlow & {\n    type: 'm.login.token';\n  };\n\nexport type ParsedLoginFlows = {\n  password?: LoginFlow;\n  token?: LoginFlow;\n  sso?: ISSOFlow;\n};\nexport const useParsedLoginFlows = (loginFlows: LoginFlow[]) => {\n  const parsedFlow: ParsedLoginFlows = useMemo<ParsedLoginFlows>(\n    () => ({\n      password: getPasswordFlow(loginFlows),\n      token: getTokenFlow(loginFlows),\n      sso: getSSOFlow(loginFlows),\n    }),\n    [loginFlows]\n  );\n\n  return parsedFlow;\n};\n","import { Avatar, AvatarImage, Box, Button, Text } from 'folds';\nimport type { IIdentityProvider, SSOAction } from '$types/matrix-sdk';\nimport { createClient } from '$types/matrix-sdk';\nimport type { MouseEvent } from 'react';\nimport { useMemo } from 'react';\nimport { isTauri } from '@tauri-apps/api/core';\nimport { openUrl } from '@tauri-apps/plugin-opener';\nimport { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo';\nimport { type as osType } from '@tauri-apps/plugin-os';\nimport { fetch } from '$utils/fetch';\n\ntype SSOLoginProps = {\n  providers?: IIdentityProvider[];\n  redirectUrl: string;\n  action?: SSOAction;\n  saveScreenSpace?: boolean;\n};\nconst openSso = async (event: MouseEvent, url: string) => {\n  if (!isTauri()) return;\n  event.preventDefault();\n  const os = osType();\n  const urlProgram = os === 'ios' || os === 'android' ? 'inAppBrowser' : undefined;\n  await openUrl(url, urlProgram);\n};\n\nexport function SSOLogin({ providers, redirectUrl, action, saveScreenSpace }: SSOLoginProps) {\n  const discovery = useAutoDiscoveryInfo();\n  const baseUrl = discovery['m.homeserver'].base_url;\n  const mx = useMemo(() => createClient({ baseUrl, fetchFn: fetch }), [baseUrl]);\n\n  const getSSOIdUrl = (ssoId?: string): string =>\n    mx.getSsoLoginUrl(redirectUrl, 'sso', ssoId, action);\n\n  const withoutIcon = providers\n    ? providers.find(\n        (provider) => !provider.icon || !mx.mxcUrlToHttp(provider.icon, 96, 96, 'crop', false)\n      )\n    : true;\n\n  const renderAsIcons = withoutIcon ? false : saveScreenSpace && providers && providers.length > 2;\n\n  return (\n    <Box justifyContent=\"Center\" gap=\"600\" wrap=\"Wrap\">\n      {providers ? (\n        providers.map((provider) => {\n          const { id, name, icon } = provider;\n          const iconUrl = icon && mx.mxcUrlToHttp(icon, 96, 96, 'crop', false);\n\n          const buttonTitle = `Continue with ${name}`;\n\n          if (renderAsIcons) {\n            return (\n              <Avatar\n                style={{ cursor: 'pointer' }}\n                key={id}\n                as=\"a\"\n                href={getSSOIdUrl(id)}\n                onClick={(event) => openSso(event, getSSOIdUrl(id))}\n                aria-label={buttonTitle}\n                size=\"300\"\n                radii=\"300\"\n              >\n                <AvatarImage src={iconUrl!} alt={name} title={buttonTitle} />\n              </Avatar>\n            );\n          }\n\n          return (\n            <Button\n              style={{ width: '100%' }}\n              key={id}\n              as=\"a\"\n              href={getSSOIdUrl(id)}\n              onClick={(event) => openSso(event, getSSOIdUrl(id))}\n              size=\"500\"\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              outlined\n              before={\n                iconUrl && (\n                  <Avatar size=\"200\" radii=\"300\">\n                    <AvatarImage src={iconUrl} alt={name} />\n                  </Avatar>\n                )\n              }\n            >\n              <Text align=\"Center\" size=\"B500\" truncate>\n                {buttonTitle}\n              </Text>\n            </Button>\n          );\n        })\n      ) : (\n        <Button\n          style={{ width: '100%' }}\n          as=\"a\"\n          href={getSSOIdUrl()}\n          onClick={(event) => openSso(event, getSSOIdUrl())}\n          size=\"500\"\n          variant=\"Secondary\"\n          fill=\"Soft\"\n          outlined\n        >\n          <Text align=\"Center\" size=\"B500\" truncate>\n            Continue with SSO\n          </Text>\n        </Button>\n      )}\n    </Box>\n  );\n}\n","import { Box, Line, Text } from 'folds';\n\nexport function OrDivider() {\n  return (\n    <Box gap=\"400\" alignItems=\"Center\">\n      <Line style={{ flexGrow: 1 }} direction=\"Horizontal\" size=\"300\" variant=\"Surface\" />\n      <Text>OR</Text>\n      <Line style={{ flexGrow: 1 }} direction=\"Horizontal\" size=\"300\" variant=\"Surface\" />\n    </Box>\n  );\n}\n","import { Box, color, Text } from 'folds';\nimport { sizedIcon, Warning } from '$components/icons/phosphor';\n\nexport function FieldError({ message }: { message: string }) {\n  return (\n    <Box style={{ color: color.Critical.Main }} alignItems=\"Center\" gap=\"100\">\n      {sizedIcon(Warning, '50', { filled: true })}\n      <Text size=\"T200\">\n        <b>{message}</b>\n      </Text>\n    </Box>\n  );\n}\n","const SLIDING_SYNC_LOGIN_KEY = 'sable.login.slidingSync';\n\nexport const getPendingSlidingSyncLogin = (): boolean => {\n  try {\n    return globalThis.sessionStorage?.getItem(SLIDING_SYNC_LOGIN_KEY) === 'true';\n  } catch {\n    return false;\n  }\n};\n\nexport const setPendingSlidingSyncLogin = (enabled: boolean): void => {\n  try {\n    globalThis.sessionStorage?.setItem(SLIDING_SYNC_LOGIN_KEY, String(enabled));\n  } catch {\n    // Storage can be disabled for this origin.\n  }\n};\n\nexport const clearPendingSlidingSyncLogin = (): void => {\n  try {\n    globalThis.sessionStorage?.removeItem(SLIDING_SYNC_LOGIN_KEY);\n  } catch {\n    // Storage can be disabled for this origin.\n  }\n};\n","import to from 'await-to-js';\nimport type { LoginRequest, LoginResponse } from '$types/matrix-sdk';\nimport { createClient, MatrixError } from '$types/matrix-sdk';\nimport { useCallback, useEffect } from 'react';\nimport { useNavigate } from 'react-router';\nimport { useSetAtom } from 'jotai';\nimport * as Sentry from '@sentry/react';\nimport type { ClientConfig } from '$hooks/useClientConfig';\nimport { clientAllowedServer } from '$hooks/useClientConfig';\nimport {\n  deleteAfterLoginRedirectPath,\n  getAfterLoginRedirectPath,\n} from '$pages/afterLoginRedirectPath';\nimport { clearPendingSlidingSyncLogin } from './slidingSyncLogin';\nimport { getHomePath } from '$pages/pathUtils';\nimport { activeSessionIdAtom, sessionsAtom, type Session } from '$state/sessions';\nimport { createLogger } from '$utils/debug';\nimport { createDebugLogger } from '$utils/debugLogger';\nimport { fetch } from '$utils/fetch';\nimport { ErrorCode } from '../../../cs-errorcode';\nimport { autoDiscovery, specVersions } from '../../../cs-api';\n\nconst log = createLogger('loginUtil');\nconst debugLog = createDebugLogger('loginUtil');\n\nenum GetBaseUrlError {\n  NotAllow = 'NotAllow',\n  NotFound = 'NotFound',\n}\nexport const factoryGetBaseUrl =\n  (clientConfig: ClientConfig, server: string) => async (): Promise<string> => {\n    if (!clientAllowedServer(clientConfig, server)) {\n      throw new Error(GetBaseUrlError.NotAllow);\n    }\n\n    const [, discovery] = await to(autoDiscovery(fetch, server));\n\n    let mxIdBaseUrl: string | undefined;\n    const [, discoveryInfo] = discovery ?? [];\n\n    if (discoveryInfo) {\n      mxIdBaseUrl = discoveryInfo['m.homeserver'].base_url;\n    }\n\n    if (!mxIdBaseUrl) {\n      throw new Error(GetBaseUrlError.NotFound);\n    }\n    const [, versions] = await to(specVersions(fetch, mxIdBaseUrl));\n    if (!versions) {\n      throw new Error(GetBaseUrlError.NotFound);\n    }\n    return mxIdBaseUrl;\n  };\n\nexport enum LoginError {\n  ServerNotAllowed = 'ServerNotAllowed',\n  InvalidServer = 'InvalidServer',\n  Forbidden = 'Forbidden',\n  UserDeactivated = 'UserDeactivated',\n  InvalidRequest = 'InvalidRequest',\n  RateLimited = 'RateLimited',\n  Unknown = 'Unknown',\n}\n\nexport type CustomLoginResponse = {\n  baseUrl: string;\n  response: LoginResponse;\n};\nexport const login = async (\n  serverBaseUrl: string | (() => Promise<string>),\n  data: LoginRequest\n): Promise<CustomLoginResponse> => {\n  const [urlError, url] =\n    typeof serverBaseUrl === 'function' ? await to(serverBaseUrl()) : [undefined, serverBaseUrl];\n  if (urlError) {\n    throw new MatrixError({\n      errcode:\n        urlError.message === (GetBaseUrlError.NotAllow as string)\n          ? LoginError.ServerNotAllowed\n          : LoginError.InvalidServer,\n    });\n  }\n\n  const mx = createClient({ baseUrl: url, fetchFn: fetch });\n  debugLog.info('general', 'Attempting login', { baseUrl: url, loginType: data.type });\n\n  return Sentry.startSpan(\n    { name: 'auth.login', op: 'auth', attributes: { 'auth.method': data.type } },\n    async (span) => {\n      const [err, res] = await to<LoginResponse, MatrixError>(mx.loginRequest(data));\n\n      if (err) {\n        span.setAttribute('auth.error', err.errcode ?? 'unknown');\n        Sentry.metrics.count('sable.auth.login_failed', 1, {\n          attributes: { errcode: err.errcode ?? 'unknown' },\n        });\n        if (err.httpStatus === 400) {\n          debugLog.error('general', 'Login failed - invalid request', {\n            httpStatus: 400,\n          });\n          throw new MatrixError({\n            errcode: LoginError.InvalidRequest,\n          });\n        }\n        if (err.httpStatus === 429) {\n          debugLog.error('general', 'Login failed - rate limited', { httpStatus: 429 });\n          throw new MatrixError({\n            errcode: LoginError.RateLimited,\n          });\n        }\n        if (err.errcode === (ErrorCode.M_USER_DEACTIVATED as string)) {\n          debugLog.error('general', 'Login failed - user deactivated', {\n            errcode: err.errcode,\n          });\n          throw new MatrixError({\n            errcode: LoginError.UserDeactivated,\n          });\n        }\n\n        if (err.httpStatus === 403) {\n          debugLog.error('general', 'Login failed - forbidden', { httpStatus: 403 });\n          throw new MatrixError({\n            errcode: LoginError.Forbidden,\n          });\n        }\n\n        debugLog.error('general', 'Login failed - unknown error', {\n          error: err.message,\n          httpStatus: err.httpStatus,\n        });\n        throw new MatrixError({\n          error: err.message,\n          errcode: LoginError.Unknown,\n        });\n      }\n\n      span.setAttribute('auth.success', true);\n      debugLog.info('general', 'Login successful', {\n        userId: res.user_id,\n        deviceId: res.device_id,\n      });\n      return {\n        baseUrl: url,\n        response: res,\n      };\n    }\n  );\n};\n\n/**\n * Commits a session to the store, makes it active, and navigates into the app. Shared by the\n * password/token login path and the OIDC callback.\n */\nexport const useCommitLoginSession = () => {\n  const navigate = useNavigate();\n  const setSessions = useSetAtom(sessionsAtom);\n  const setActiveSessionId = useSetAtom(activeSessionIdAtom);\n\n  return useCallback(\n    (session: Session, slidingSyncOptIn?: boolean) => {\n      const committedSession =\n        slidingSyncOptIn === undefined ? session : { ...session, slidingSyncOptIn };\n      setSessions({ type: 'PUT', session: committedSession });\n      setActiveSessionId(committedSession.userId);\n      clearPendingSlidingSyncLogin();\n      const afterLoginRedirectUrl = getAfterLoginRedirectPath();\n      deleteAfterLoginRedirectPath();\n      const destination = afterLoginRedirectUrl ?? getHomePath();\n      log.log('commitLoginSession: navigating to', destination);\n      navigate(destination, { replace: true });\n    },\n    [navigate, setSessions, setActiveSessionId]\n  );\n};\n\nexport const useLoginComplete = (data?: CustomLoginResponse, slidingSyncOptIn?: boolean) => {\n  const commitSession = useCommitLoginSession();\n\n  useEffect(() => {\n    if (data) {\n      const { response: loginRes, baseUrl: loginBaseUrl } = data;\n      log.log('useLoginComplete: login success', {\n        userId: loginRes.user_id,\n        baseUrl: loginBaseUrl,\n      });\n      const newSession: Session = {\n        baseUrl: loginBaseUrl,\n        userId: loginRes.user_id,\n        deviceId: loginRes.device_id,\n        accessToken: loginRes.access_token,\n      };\n      commitSession(newSession, slidingSyncOptIn);\n    }\n  }, [data, slidingSyncOptIn, commitSession]);\n};\n","import type { FormEventHandler, MouseEventHandler, ReactNode } from 'react';\nimport { useCallback, useState } from 'react';\nimport type { RectCords } from 'folds';\nimport {\n  Box,\n  Button,\n  Header,\n  IconButton,\n  Input,\n  Menu,\n  OverlayBackdrop,\n  OverlayCenter,\n  Spinner,\n  Text,\n  config,\n} from 'folds';\nimport { Overlay, PopOut } from '$components/overlay-stack';\nimport { sizedIcon, Info } from '$components/icons/phosphor';\nimport FocusTrap from 'focus-trap-react';\nimport { Link } from 'react-router';\nimport { getMxIdLocalPart, isUserId } from '$utils/matrix';\nimport type { MatrixError } from '$types/matrix-sdk';\nimport { EMAIL_REGEX } from '$utils/regex';\nimport { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useAuthServer } from '$hooks/useAuthServer';\nimport { useClientConfig } from '$hooks/useClientConfig';\nimport { PasswordInput } from '$components/password-input';\nimport { getResetPasswordPath } from '$pages/pathUtils';\nimport { stopPropagation } from '$utils/keyboard';\nimport { FieldError } from '$pages/auth/FiledError';\nimport { deviceDisplayName } from '$utils/platform';\nimport { getMxIdServer } from '$utils/mxIdHelper';\nimport type { CustomLoginResponse } from './loginUtil';\nimport { LoginError, factoryGetBaseUrl, login, useLoginComplete } from './loginUtil';\n\nfunction UsernameHint({ server }: { server: string }) {\n  const [anchor, setAnchor] = useState<RectCords>();\n\n  const handleOpenMenu: MouseEventHandler<HTMLElement> = (evt) => {\n    setAnchor(evt.currentTarget.getBoundingClientRect());\n  };\n  return (\n    <PopOut\n      anchor={anchor}\n      position=\"Top\"\n      align=\"End\"\n      content={\n        <FocusTrap\n          focusTrapOptions={{\n            initialFocus: false,\n            onDeactivate: () => setAnchor(undefined),\n            clickOutsideDeactivates: true,\n            escapeDeactivates: stopPropagation,\n          }}\n        >\n          <Menu>\n            <Header size=\"300\" style={{ padding: `0 ${config.space.S200}` }}>\n              <Text size=\"L400\">Hint</Text>\n            </Header>\n            <Box\n              style={{ padding: config.space.S200, paddingTop: 0 }}\n              direction=\"Column\"\n              tabIndex={0}\n              gap=\"100\"\n            >\n              <Text size=\"T300\">\n                <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                  Username:\n                </Text>{' '}\n                user123\n              </Text>\n              <Text size=\"T300\">\n                <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                  Matrix ID:\n                </Text>\n                {` @user123:${server}`}\n              </Text>\n              <Text size=\"T300\">\n                <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                  Email:\n                </Text>\n                {` user123@${server}`}\n              </Text>\n            </Box>\n          </Menu>\n        </FocusTrap>\n      }\n    >\n      <IconButton\n        tabIndex={-1}\n        onClick={handleOpenMenu}\n        type=\"button\"\n        variant=\"Background\"\n        size=\"300\"\n        radii=\"300\"\n        aria-pressed={!!anchor}\n      >\n        {sizedIcon(Info, '100', { style: { opacity: config.opacity.P300 } })}\n      </IconButton>\n    </PopOut>\n  );\n}\n\ntype PasswordLoginFormProps = {\n  defaultUsername?: string;\n  defaultEmail?: string;\n  slidingSyncOptIn: boolean;\n  slidingSyncOption?: ReactNode;\n};\nexport function PasswordLoginForm({\n  defaultUsername,\n  defaultEmail,\n  slidingSyncOptIn,\n  slidingSyncOption,\n}: PasswordLoginFormProps) {\n  const server = useAuthServer();\n  const clientConfig = useClientConfig();\n\n  const serverDiscovery = useAutoDiscoveryInfo();\n  const baseUrl = serverDiscovery['m.homeserver'].base_url;\n\n  const [loginState, startLogin] = useAsyncCallback<\n    CustomLoginResponse,\n    MatrixError,\n    Parameters<typeof login>\n  >(useCallback(login, []));\n\n  useLoginComplete(\n    loginState.status === AsyncStatus.Success ? loginState.data : undefined,\n    slidingSyncOptIn\n  );\n\n  const handleUsernameLogin = (username: string, password: string) => {\n    startLogin(baseUrl, {\n      type: 'm.login.password',\n      identifier: {\n        type: 'm.id.user',\n        user: username,\n      },\n      password,\n      initial_device_display_name: deviceDisplayName(),\n    });\n  };\n\n  const handleMxIdLogin = async (mxId: string, password: string) => {\n    const mxIdServer = getMxIdServer(mxId);\n    const mxIdUsername = getMxIdLocalPart(mxId);\n    if (!mxIdServer || !mxIdUsername) return;\n\n    const getBaseUrl = factoryGetBaseUrl(clientConfig, mxIdServer);\n\n    startLogin(getBaseUrl, {\n      type: 'm.login.password',\n      identifier: {\n        type: 'm.id.user',\n        user: mxIdUsername,\n      },\n      password,\n      initial_device_display_name: deviceDisplayName(),\n    });\n  };\n  const handleEmailLogin = (email: string, password: string) => {\n    startLogin(baseUrl, {\n      type: 'm.login.password',\n      identifier: {\n        type: 'm.id.thirdparty',\n        medium: 'email',\n        address: email,\n      },\n      password,\n      initial_device_display_name: deviceDisplayName(),\n    });\n  };\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    const { usernameInput, passwordInput } = evt.target as HTMLFormElement & {\n      usernameInput: HTMLInputElement;\n      passwordInput: HTMLInputElement;\n    };\n\n    const username = usernameInput.value.trim();\n    const password = passwordInput.value;\n    if (!username) {\n      usernameInput.focus();\n      return;\n    }\n    if (!password) {\n      passwordInput.focus();\n      return;\n    }\n\n    if (isUserId(username)) {\n      handleMxIdLogin(username, password);\n      return;\n    }\n    if (EMAIL_REGEX.test(username)) {\n      handleEmailLogin(username, password);\n      return;\n    }\n    handleUsernameLogin(username, password);\n  };\n\n  return (\n    <Box as=\"form\" onSubmit={handleSubmit} direction=\"Inherit\" gap=\"400\">\n      <Box direction=\"Column\" gap=\"100\">\n        <Text as=\"label\" htmlFor=\"login-username-input\" size=\"L400\" priority=\"300\">\n          Username\n        </Text>\n        <Input\n          id=\"login-username-input\"\n          defaultValue={defaultUsername ?? defaultEmail}\n          style={{ paddingRight: config.space.S300 }}\n          name=\"usernameInput\"\n          variant=\"Background\"\n          size=\"500\"\n          required\n          outlined\n          // disable auto-capitalization, which is usually undesirable for username input.\n          autoCapitalize=\"off\"\n          // disable spell-check and auto-correction\n          spellCheck={false}\n          autoCorrect=\"off\"\n          after={<UsernameHint server={server} />}\n        />\n        {loginState.status === AsyncStatus.Error && (\n          <>\n            {loginState.error.errcode === LoginError.ServerNotAllowed && (\n              <FieldError message=\"Login with custom server not allowed by your client instance.\" />\n            )}\n            {loginState.error.errcode === LoginError.InvalidServer && (\n              <FieldError message=\"Failed to find your Matrix ID server.\" />\n            )}\n          </>\n        )}\n      </Box>\n      <Box direction=\"Column\" gap=\"100\">\n        <Text as=\"label\" htmlFor=\"login-password-input\" size=\"L400\" priority=\"300\">\n          Password\n        </Text>\n        <PasswordInput\n          id=\"login-password-input\"\n          name=\"passwordInput\"\n          variant=\"Background\"\n          size=\"500\"\n          outlined\n          required\n        />\n        <Box alignItems=\"Start\" justifyContent=\"SpaceBetween\" gap=\"200\">\n          {loginState.status === AsyncStatus.Error && (\n            <>\n              {loginState.error.errcode === LoginError.Forbidden && (\n                <FieldError message=\"Invalid Username or Password.\" />\n              )}\n              {loginState.error.errcode === LoginError.UserDeactivated && (\n                <FieldError message=\"This account has been deactivated.\" />\n              )}\n              {loginState.error.errcode === LoginError.InvalidRequest && (\n                <FieldError message=\"Failed to login. Part of your request data is invalid.\" />\n              )}\n              {loginState.error.errcode === LoginError.RateLimited && (\n                <FieldError message=\"Failed to login. Your login request has been rate-limited by server, Please try after some time.\" />\n              )}\n              {loginState.error.errcode === LoginError.Unknown && (\n                <FieldError message={`Failed to login: ${loginState.error.data.error}`} />\n              )}\n            </>\n          )}\n          <Box grow=\"Yes\" shrink=\"No\" justifyContent=\"End\">\n            <Text as=\"span\" size=\"T200\" priority=\"400\" align=\"Right\">\n              <Link to={getResetPasswordPath(server)}>Forget Password?</Link>\n            </Text>\n          </Box>\n        </Box>\n      </Box>\n      {slidingSyncOption}\n      <Button type=\"submit\" variant=\"Primary\" size=\"500\">\n        <Text as=\"span\" size=\"B500\">\n          Login\n        </Text>\n      </Button>\n\n      <Overlay\n        open={\n          loginState.status === AsyncStatus.Loading || loginState.status === AsyncStatus.Success\n        }\n        backdrop={<OverlayBackdrop />}\n      >\n        <OverlayCenter>\n          <Spinner variant=\"Secondary\" size=\"600\" />\n        </OverlayCenter>\n      </Overlay>\n    </Box>\n  );\n}\n","import { Box, OverlayBackdrop, OverlayCenter, Spinner, Text, color, config } from 'folds';\nimport { Overlay } from '$components/overlay-stack';\nimport { sizedIcon, Warning } from '$components/icons/phosphor';\nimport { useCallback, useEffect } from 'react';\nimport type { MatrixError } from '$types/matrix-sdk';\nimport { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { deviceDisplayName } from '$utils/platform';\nimport type { CustomLoginResponse } from './loginUtil';\nimport { LoginError, login, useLoginComplete } from './loginUtil';\n\nfunction LoginTokenError({ message }: { message: string }) {\n  return (\n    <Box\n      style={{\n        backgroundColor: color.Critical.Container,\n        color: color.Critical.OnContainer,\n        padding: config.space.S300,\n        borderRadius: config.radii.R400,\n      }}\n      justifyContent=\"Start\"\n      alignItems=\"Start\"\n      gap=\"300\"\n    >\n      {sizedIcon(Warning, '300', { filled: true })}\n      <Box direction=\"Column\" gap=\"100\">\n        <Text size=\"L400\">Token Login</Text>\n        <Text size=\"T300\">\n          <b>{message}</b>\n        </Text>\n      </Box>\n    </Box>\n  );\n}\n\ntype TokenLoginProps = {\n  token: string;\n  slidingSyncOptIn: boolean;\n};\nexport function TokenLogin({ token, slidingSyncOptIn }: TokenLoginProps) {\n  const discovery = useAutoDiscoveryInfo();\n  const baseUrl = discovery['m.homeserver'].base_url;\n\n  const [loginState, startLogin] = useAsyncCallback<\n    CustomLoginResponse,\n    MatrixError,\n    Parameters<typeof login>\n  >(useCallback(login, []));\n\n  useEffect(() => {\n    startLogin(baseUrl, {\n      type: 'm.login.token',\n      token,\n      initial_device_display_name: deviceDisplayName(),\n    });\n  }, [baseUrl, token, startLogin]);\n\n  useLoginComplete(\n    loginState.status === AsyncStatus.Success ? loginState.data : undefined,\n    slidingSyncOptIn\n  );\n\n  return (\n    <>\n      {loginState.status === AsyncStatus.Error && (\n        <>\n          {loginState.error.errcode === LoginError.Forbidden && (\n            <LoginTokenError message=\"Invalid login token.\" />\n          )}\n          {loginState.error.errcode === LoginError.UserDeactivated && (\n            <LoginTokenError message=\"This account has been deactivated.\" />\n          )}\n          {loginState.error.errcode === LoginError.InvalidRequest && (\n            <LoginTokenError message=\"Failed to login. Part of your request data is invalid.\" />\n          )}\n          {loginState.error.errcode === LoginError.RateLimited && (\n            <LoginTokenError message=\"Failed to login. Your login request has been rate-limited by server, Please try after some time.\" />\n          )}\n          {loginState.error.errcode === LoginError.Unknown && (\n            <LoginTokenError message={`Failed to login: ${loginState.error.data.error}`} />\n          )}\n        </>\n      )}\n      <Overlay open={loginState.status !== AsyncStatus.Error} backdrop={<OverlayBackdrop />}>\n        <OverlayCenter>\n          <Spinner size=\"600\" variant=\"Secondary\" />\n        </OverlayCenter>\n      </Overlay>\n    </>\n  );\n}\n","import { Box, OverlayBackdrop, OverlayCenter, Spinner, Text } from 'folds';\nimport { Overlay } from '$components/overlay-stack';\nimport { useCallback, useEffect } from 'react';\nimport { useNavigate } from 'react-router';\nimport type { ValidatedAuthMetadata } from '$types/matrix-sdk';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useAuthServer } from '$hooks/useAuthServer';\nimport { InfoCard } from '$components/info-card';\nimport { getLoginPath } from '$pages/pathUtils';\nimport { useCommitLoginSession } from './loginUtil';\nimport type { OidcLoginResult } from './oidcLoginUtil';\nimport {\n  OidcLoginError,\n  OidcLoginFailure,\n  completeOidcLogin,\n  startOidcLogin,\n} from './oidcLoginUtil';\nimport { Button } from '$components/button';\n\nconst ERROR_TITLE = 'Single sign-on';\n\nconst oidcErrorMessage = (error: unknown): string => {\n  const code = error instanceof OidcLoginFailure ? error.code : OidcLoginError.Unknown;\n  switch (code) {\n    case OidcLoginError.RegistrationFailed:\n      return 'Could not register with the homeserver for single sign-on.';\n    case OidcLoginError.CodeExchangeFailed:\n      return 'Sign-in could not be completed. Please try again.';\n    case OidcLoginError.MissingDeviceId:\n      return 'The homeserver did not grant a device for this session.';\n    case OidcLoginError.MissingRefreshToken:\n      return 'The authorization server did not issue the required refresh token.';\n    default:\n      return 'Failed to sign in with single sign-on.';\n  }\n};\n\ntype OidcLoginButtonProps = {\n  authMetadata: ValidatedAuthMetadata;\n  homeserverUrl: string;\n  redirectUri: string;\n  label: string;\n  prompt?: string;\n  notice?: string;\n  server?: string;\n};\nexport function OidcLoginButton({\n  authMetadata,\n  homeserverUrl,\n  redirectUri,\n  label,\n  prompt,\n  notice,\n  server,\n}: OidcLoginButtonProps) {\n  const [state, start] = useAsyncCallback(\n    useCallback(\n      () => startOidcLogin(authMetadata, homeserverUrl, redirectUri, { prompt, server }),\n      [authMetadata, homeserverUrl, redirectUri, prompt, server]\n    )\n  );\n\n  const loading = state.status === AsyncStatus.Loading || state.status === AsyncStatus.Success;\n  const errorMessage = state.status === AsyncStatus.Error ? oidcErrorMessage(state.error) : notice;\n\n  return (\n    <Box direction=\"Column\" gap=\"300\">\n      {errorMessage && (\n        <InfoCard variant=\"Critical\" title={ERROR_TITLE} description={errorMessage} />\n      )}\n      <Button\n        style={{ width: '100%' }}\n        size=\"500\"\n        variant=\"Secondary\"\n        fill=\"Soft\"\n        outlined\n        loading={loading}\n        spinnerSize=\"200\"\n        spinnerVariant=\"Secondary\"\n        onClick={() => start()}\n      >\n        <Text align=\"Center\" size=\"B500\" truncate>\n          {label}\n        </Text>\n      </Button>\n    </Box>\n  );\n}\n\ntype OidcCallbackProps = {\n  code: string;\n  state: string;\n  slidingSyncOptIn: boolean;\n};\nexport function OidcCallback({ code, state, slidingSyncOptIn }: OidcCallbackProps) {\n  const commitSession = useCommitLoginSession();\n  const server = useAuthServer();\n  const navigate = useNavigate();\n\n  const [loginState, complete] = useAsyncCallback<OidcLoginResult, unknown, [string, string]>(\n    useCallback(completeOidcLogin, [])\n  );\n\n  useEffect(() => {\n    complete(code, state);\n  }, [code, state, complete]);\n\n  useEffect(() => {\n    if (loginState.status === AsyncStatus.Success) {\n      commitSession(loginState.data.session, slidingSyncOptIn);\n    }\n  }, [loginState, slidingSyncOptIn, commitSession]);\n\n  return (\n    <>\n      {loginState.status === AsyncStatus.Error && (\n        <Box direction=\"Column\" gap=\"300\">\n          <InfoCard\n            variant=\"Critical\"\n            title={ERROR_TITLE}\n            description={oidcErrorMessage(loginState.error)}\n          />\n          <Button\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            outlined\n            onClick={() => navigate(getLoginPath(server), { replace: true })}\n          >\n            <Text align=\"Center\" size=\"B400\">\n              Back to Login\n            </Text>\n          </Button>\n        </Box>\n      )}\n      <Overlay open={loginState.status !== AsyncStatus.Error} backdrop={<OverlayBackdrop />}>\n        <OverlayCenter>\n          <Spinner size=\"600\" variant=\"Secondary\" />\n        </OverlayCenter>\n      </Overlay>\n    </>\n  );\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { Box, OverlayBackdrop, OverlayCenter, Spinner, Switch, Text, Tooltip, color, config } from 'folds';\nimport { Overlay, TooltipProvider } from '$components/overlay-stack';\nimport { Link, useSearchParams } from 'react-router';\nimport { SSOAction } from '$types/matrix-sdk';\nimport { isUsableOAuthMetadata, RegisterFlowStatus, useAuthFlows } from '$hooks/useAuthFlows';\nimport { useAuthServer } from '$hooks/useAuthServer';\nimport { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo';\nimport { useParsedLoginFlows } from '$hooks/useParsedLoginFlows';\nimport { getLoginPath, getRegisterPath, withSearchParam } from '$pages/pathUtils';\nimport { usePathWithOrigin } from '$hooks/usePathWithOrigin';\nimport type { LoginPathSearchParams } from '$pages/paths';\nimport { useClientConfig } from '$hooks/useClientConfig';\nimport { SSOLogin } from '$pages/auth/SSOLogin';\nimport { isTauri } from '@tauri-apps/api/core';\nimport { buildTauriSsoRedirectUrl } from '$pages/auth/SSOTauri';\nimport { OrDivider } from '$pages/auth/OrDivider';\nimport { PasswordLoginForm } from './PasswordLoginForm';\nimport { TokenLogin } from './TokenLogin';\nimport { OidcLoginButton, OidcCallback } from './OidcLogin';\nimport { sizedIcon, Info } from '$components/icons/phosphor';\nimport { getPendingSlidingSyncLogin, setPendingSlidingSyncLogin } from './slidingSyncLogin';\nimport { startOidcLogin } from './oidcLoginUtil';\n\n// react-router ignores the real query string in hashRouter mode, so read callback params direct.\nconst getExternalSearchParams = () => {\n  const params = new URLSearchParams(window.location.search);\n  return {\n    loginToken: params.get('loginToken') ?? undefined,\n    code: params.get('code') ?? undefined,\n    state: params.get('state') ?? undefined,\n    error: params.get('error') ?? undefined,\n    errorDescription: params.get('error_description') ?? undefined,\n  };\n};\n\nconst useLoginSearchParams = (searchParams: URLSearchParams): LoginPathSearchParams =>\n  useMemo(\n    () => ({\n      username: searchParams.get('username') ?? undefined,\n      email: searchParams.get('email') ?? undefined,\n      loginToken: searchParams.get('loginToken') ?? undefined,\n    }),\n    [searchParams]\n  );\n\ntype SlidingSyncLoginOptionProps = {\n  value: boolean;\n  onChange: (value: boolean) => void;\n};\n\nfunction SlidingSyncLoginOption({ value, onChange }: SlidingSyncLoginOptionProps) {\n  return (\n    <Box alignItems=\"Center\" justifyContent=\"SpaceBetween\" gap=\"300\">\n      <Box alignItems=\"Center\" gap=\"100\">\n        <Text as=\"label\" htmlFor=\"login-sliding-sync\" priority=\"400\">\n          Use sliding sync\n        </Text>\n        <TooltipProvider\n          delay={300}\n          tooltip={\n            <Tooltip style={{ maxWidth: '240px', padding: config.space.S200 }}>\n              <Text size=\"T200\">\n                Sliding sync is faster and uses less bandwidth, but it can be buggier. You can\n                toggle it later in Settings at any time.\n              </Text>\n            </Tooltip>\n          }\n        >\n          {(triggerRef) => (\n            <span\n              ref={triggerRef}\n              role=\"img\"\n              aria-label=\"About sliding sync\"\n              style={{ display: 'inline-flex', color: color.Surface.OnContainer }}\n            >\n              {sizedIcon(Info, '100')}\n            </span>\n          )}\n        </TooltipProvider>\n      </Box>\n      <Switch variant=\"Primary\" value={value} onChange={onChange} id=\"login-sliding-sync\" />\n    </Box>\n  );\n}\n\nexport function Login() {\n  const server = useAuthServer();\n  const { hashRouter } = useClientConfig();\n  const { hideUsernamePasswordFields } = useClientConfig();\n  const { loginFlows, registerFlows, authMetadata } = useAuthFlows();\n  const discovery = useAutoDiscoveryInfo();\n  const baseUrl = discovery['m.homeserver'].base_url;\n  const [searchParams] = useSearchParams();\n  const loginSearchParams = useLoginSearchParams(searchParams);\n  const webSsoRedirectUrl = usePathWithOrigin(getLoginPath(server));\n  const ssoRedirectUrl = isTauri() ? buildTauriSsoRedirectUrl(server) : webSsoRedirectUrl;\n  const oidcRedirectUri = usePathWithOrigin(getLoginPath(server), { ignoreHashRouter: true });\n  const external = getExternalSearchParams();\n  const absoluteLoginPath = usePathWithOrigin(getLoginPath(server));\n  const [useSlidingSync, setUseSlidingSync] = useState(getPendingSlidingSyncLogin);\n\n  const handleSlidingSyncChange = (enabled: boolean) => {\n    setUseSlidingSync(enabled);\n    setPendingSlidingSyncLogin(enabled);\n  };\n\n  if (hashRouter?.enabled && (external.loginToken || (external.code && external.state))) {\n    window.location.replace(\n      withSearchParam(absoluteLoginPath, {\n        ...(external.loginToken ? { loginToken: external.loginToken } : {}),\n        ...(external.code && external.state ? { code: external.code, state: external.state } : {}),\n      })\n    );\n  }\n\n  const parsedFlows = useParsedLoginFlows(loginFlows.flows);\n\n  const isAddingAccount = searchParams.get('addAccount') === '1';\n\n  const registerUrl = isAddingAccount\n    ? withSearchParam(getRegisterPath(server), { addAccount: '1' })\n    : getRegisterPath(server);\n\n  const registrationUnavailable =\n    registerFlows.status === RegisterFlowStatus.RegistrationDisabled && !parsedFlows.sso;\n\n  const oidcCode = searchParams.get('code') ?? undefined;\n  const oidcState = searchParams.get('state') ?? undefined;\n  const oidcError = searchParams.get('error') ?? external.error;\n  const oidcErrorDescription = searchParams.get('error_description') ?? external.errorDescription;\n  const oidcNotice = oidcError\n    ? (oidcErrorDescription ?? `Sign-in was not completed (${oidcError}).`)\n    : undefined;\n\n  const oidcMetadata = isUsableOAuthMetadata(authMetadata) ? authMetadata : undefined;\n  const showOidc = oidcMetadata !== undefined;\n  const hidePassword = hideUsernamePasswordFields;\n  const showPassword = !hidePassword && parsedFlows.password !== undefined;\n  const showLegacySso = parsedFlows.sso !== undefined;\n\n  if (showOidc && oidcCode && oidcState) {\n    return <OidcCallback code={oidcCode} state={oidcState} slidingSyncOptIn={useSlidingSync} />;\n  } else if (showOidc && hidePassword && !showLegacySso) {\n    useEffect(() => {\n      startOidcLogin(oidcMetadata, baseUrl, oidcRedirectUri, { prompt: undefined, server })\n    })\n  \treturn <>\n\t\t  <Overlay open backdrop={<OverlayBackdrop />}>\n\t\t    <OverlayCenter>\n\t\t      <Spinner size=\"600\" variant=\"Secondary\" />\n\t\t    </OverlayCenter>\n\t\t  </Overlay>\n    </>\n  }\n\n  return (\n    <Box direction=\"Column\" gap=\"500\">\n      <Text size=\"H2\" priority=\"400\">\n        Login\n      </Text>\n      <SlidingSyncLoginOption value={useSlidingSync} onChange={handleSlidingSyncChange} />\n      {parsedFlows.token && loginSearchParams.loginToken && (\n        <TokenLogin token={loginSearchParams.loginToken} slidingSyncOptIn={useSlidingSync} />\n      )}\n      {showOidc && (\n        <>\n          <OidcLoginButton\n            authMetadata={oidcMetadata}\n            homeserverUrl={baseUrl}\n            redirectUri={oidcRedirectUri}\n            label={`Continue with ${server}`}\n            notice={oidcNotice}\n            server={server}\n          />\n          <span data-spacing-node />\n        </>\n      )}\n      {showLegacySso && (\n        <>\n          {showOidc && <OrDivider />}\n          <SSOLogin\n            providers={parsedFlows.sso!.identity_providers}\n            redirectUrl={ssoRedirectUrl}\n            action={SSOAction.LOGIN}\n            saveScreenSpace={showPassword || showOidc}\n          />\n          <span data-spacing-node />\n        </>\n      )}\n      {showPassword && (\n        <>\n          {(showLegacySso || (showOidc && !showLegacySso)) && <OrDivider />}\n          <PasswordLoginForm\n            defaultUsername={loginSearchParams.username}\n            defaultEmail={loginSearchParams.email}\n            slidingSyncOptIn={useSlidingSync}\n          />\n          <span data-spacing-node />\n        </>\n      )}\n      {!showPassword && !showLegacySso && !showOidc && (\n        <>\n          <Text style={{ color: color.Critical.Main }}>\n            {`This client does not support login on \"${server}\" homeserver. Password and SSO based login method not found.`}\n          </Text>\n          <span data-spacing-node />\n        </>\n      )}\n      {!registrationUnavailable && (\n        <Text align=\"Center\">\n          Do not have an account? <Link to={registerUrl}>Register</Link>\n        </Text>\n      )}\n    </Box>\n  );\n}\n","import type { ReactNode } from 'react';\nimport type { UIAFlow } from '$types/matrix-sdk';\nimport { useSupportedUIAFlows } from '$hooks/useUIAFlows';\n\nexport function SupportedUIAFlowsLoader({\n  flows,\n  supportedStages,\n  children,\n}: {\n  supportedStages: string[];\n  flows: UIAFlow[];\n  children: (supportedFlows: UIAFlow[]) => ReactNode;\n}) {\n  const supportedFlows = useSupportedUIAFlows(flows, supportedStages);\n\n  return children(supportedFlows);\n}\n","import type { MatrixClient, MatrixError } from '$types/matrix-sdk';\nimport { useCallback, useRef } from 'react';\nimport type { AsyncState } from './useAsyncCallback';\nimport { useAsyncCallback } from './useAsyncCallback';\nimport type { RequestEmailTokenCallback, RequestEmailTokenResponse } from './types';\n\nexport const useRegisterEmail = (\n  mx: MatrixClient\n): [AsyncState<RequestEmailTokenResponse, MatrixError>, RequestEmailTokenCallback] => {\n  const sendAttemptRef = useRef(1);\n\n  const registerEmailCallback: RequestEmailTokenCallback = useCallback(\n    async (email, clientSecret, nextLink) => {\n      const sendAttempt = sendAttemptRef.current;\n      sendAttemptRef.current += 1;\n      const result = await mx.requestRegisterEmailToken(email, clientSecret, sendAttempt, nextLink);\n      return {\n        email,\n        clientSecret,\n        result,\n      };\n    },\n    [mx]\n  );\n\n  const [registerEmailState, registerEmail] = useAsyncCallback<\n    RequestEmailTokenResponse,\n    MatrixError,\n    Parameters<RequestEmailTokenCallback>\n  >(registerEmailCallback);\n\n  return [registerEmailState, registerEmail];\n};\n","import to from 'await-to-js';\nimport type { IAuthData, MatrixClient, RegisterRequest, RegisterResponse } from '$types/matrix-sdk';\nimport { MatrixError } from '$types/matrix-sdk';\nimport { useEffect } from 'react';\nimport { useNavigate } from 'react-router';\nimport { useSetAtom } from 'jotai';\nimport {\n  deleteAfterLoginRedirectPath,\n  getAfterLoginRedirectPath,\n} from '$pages/afterLoginRedirectPath';\nimport { getHomePath, getLoginPath, withSearchParam } from '$pages/pathUtils';\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport { activeSessionIdAtom, sessionsAtom, setFallbackSession } from '$state/sessions';\nimport { getMxIdServer } from '$utils/mxIdHelper';\nimport { ErrorCode } from '../../../cs-errorcode';\n\nexport enum RegisterError {\n  UserTaken = 'UserTaken',\n  UserInvalid = 'UserInvalid',\n  UserExclusive = 'UserExclusive',\n  PasswordWeak = 'PasswordWeak',\n  PasswordShort = 'PasswordShort',\n  InvalidRequest = 'InvalidRequest',\n  Forbidden = 'Forbidden',\n  RateLimited = 'RateLimited',\n  Unknown = 'Unknown',\n}\n\nexport type CustomRegisterResponse = {\n  baseUrl: string;\n  response: RegisterResponse;\n};\nexport type RegisterResult = [IAuthData, undefined] | [undefined, CustomRegisterResponse];\nexport const register = async (\n  mx: MatrixClient,\n  requestData: RegisterRequest\n): Promise<RegisterResult> => {\n  const [err, res] = await to<RegisterResponse, MatrixError>(mx.registerRequest(requestData));\n\n  if (err) {\n    if (err.httpStatus === 401) {\n      const authData = err.data as IAuthData;\n      return [authData, undefined];\n    }\n\n    if (err.errcode === ErrorCode.M_USER_IN_USE) {\n      throw new MatrixError({\n        errcode: RegisterError.UserTaken,\n      });\n    }\n    if (err.errcode === ErrorCode.M_INVALID_USERNAME) {\n      throw new MatrixError({\n        errcode: RegisterError.UserInvalid,\n      });\n    }\n    if (err.errcode === ErrorCode.M_EXCLUSIVE) {\n      throw new MatrixError({\n        errcode: RegisterError.UserExclusive,\n      });\n    }\n    if (err.errcode === ErrorCode.M_WEAK_PASSWORD) {\n      throw new MatrixError({\n        errcode: RegisterError.PasswordWeak,\n        error: err.data.error,\n      });\n    }\n    if (err.errcode === ErrorCode.M_PASSWORD_TOO_SHORT) {\n      throw new MatrixError({\n        errcode: RegisterError.PasswordShort,\n        error: err.data.error,\n      });\n    }\n\n    if (err.httpStatus === 429) {\n      throw new MatrixError({\n        errcode: RegisterError.RateLimited,\n      });\n    }\n\n    if (err.httpStatus === 400) {\n      throw new MatrixError({\n        errcode: RegisterError.InvalidRequest,\n      });\n    }\n\n    if (err.httpStatus === 403) {\n      throw new MatrixError({\n        errcode: RegisterError.Forbidden,\n      });\n    }\n\n    throw new MatrixError({\n      errcode: RegisterError.Unknown,\n      error: err.data.error,\n    });\n  }\n  return [\n    undefined,\n    {\n      baseUrl: mx.baseUrl,\n      response: res,\n    },\n  ];\n};\n\nexport const useRegisterComplete = (data?: CustomRegisterResponse) => {\n  const navigate = useNavigate();\n  const setSessions = useSetAtom(sessionsAtom);\n  const setActiveSessionId = useSetAtom(activeSessionIdAtom);\n\n  useEffect(() => {\n    if (data) {\n      const { response, baseUrl } = data;\n\n      const userId = response.user_id;\n      const accessToken = response.access_token;\n      const deviceId = response.device_id;\n\n      if (accessToken && deviceId) {\n        setSessions({\n          type: 'PUT',\n          session: {\n            baseUrl,\n            userId,\n            deviceId,\n            accessToken,\n          },\n        });\n        setActiveSessionId(userId);\n        // Keep legacy keys for SW/backward-compat paths still reading cinny_* values.\n        setFallbackSession(accessToken, deviceId, userId, baseUrl);\n        const afterLoginRedirectPath = getAfterLoginRedirectPath();\n        deleteAfterLoginRedirectPath();\n        navigate(afterLoginRedirectPath ?? getHomePath(), { replace: true });\n      } else {\n        const username = getMxIdLocalPart(userId);\n        const userServer = getMxIdServer(userId);\n        navigate(\n          withSearchParam(getLoginPath(userServer), {\n            username: username ?? '',\n          }),\n          { replace: true }\n        );\n      }\n    }\n  }, [data, navigate, setSessions, setActiveSessionId]);\n};\n","import {\n  Box,\n  Button,\n  Checkbox,\n  Input,\n  OverlayBackdrop,\n  OverlayCenter,\n  Spinner,\n  Text,\n  color,\n} from 'folds';\nimport { Overlay } from '$components/overlay-stack';\nimport type { ChangeEventHandler } from 'react';\nimport { useCallback, useMemo, useState } from 'react';\nimport type { AuthDict, IAuthData, MatrixError, RegisterRequest, UIAFlow } from '$types/matrix-sdk';\nimport { AuthType, createClient } from '$types/matrix-sdk';\nimport { PasswordInput } from '$components/password-input';\nimport {\n  getLoginTermUrl,\n  getUIAFlowForStages,\n  hasStageInFlows,\n  requiredStageInFlows,\n} from '$utils/matrix-uia';\nimport { useUIACompleted, useUIAFlow, useUIAParams } from '$hooks/useUIAFlows';\nimport type { AsyncState } from '$hooks/useAsyncCallback';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo';\nimport {\n  AutoDummyStageDialog,\n  AutoTermsStageDialog,\n  EmailStageDialog,\n  ReCaptchaStageDialog,\n  RegistrationTokenStageDialog,\n} from '$components/uia-stages';\nimport { useRegisterEmail } from '$hooks/useRegisterEmail';\nimport { ConfirmPasswordMatch } from '$components/ConfirmPasswordMatch';\nimport { UIAFlowOverlay } from '$components/UIAFlowOverlay';\nimport type { RequestEmailTokenCallback, RequestEmailTokenResponse } from '$hooks/types';\nimport { FieldError } from '$pages/auth/FiledError';\nimport { deviceDisplayName } from '$utils/platform';\nimport { fetch } from '$utils/fetch';\nimport type { RegisterResult } from './registerUtil';\nimport { RegisterError, register, useRegisterComplete } from './registerUtil';\n\nexport const SUPPORTED_REGISTER_STAGES = [\n  AuthType.RegistrationToken,\n  AuthType.Terms,\n  AuthType.Recaptcha,\n  AuthType.Email,\n  AuthType.Dummy,\n];\ntype RegisterFormInputs = {\n  usernameInput: HTMLInputElement;\n  passwordInput: HTMLInputElement;\n  confirmPasswordInput: HTMLInputElement;\n  tokenInput?: HTMLInputElement;\n  emailInput?: HTMLInputElement;\n  termsInput?: HTMLInputElement;\n};\n\ntype FormData = {\n  username: string;\n  password: string;\n  token?: string;\n  email?: string;\n  terms?: boolean;\n  clientSecret: string;\n};\n\nconst pickStages = (uiaFlows: UIAFlow[], formData: FormData): string[] => {\n  const pickedStages: string[] = [];\n  if (formData.token) pickedStages.push(AuthType.RegistrationToken);\n  if (formData.email) pickedStages.push(AuthType.Email);\n  if (formData.terms) pickedStages.push(AuthType.Terms);\n  if (hasStageInFlows(uiaFlows, AuthType.Recaptcha)) {\n    pickedStages.push(AuthType.Recaptcha);\n  }\n\n  return pickedStages;\n};\n\ntype RegisterUIAFlowProps = {\n  formData: FormData;\n  flow: UIAFlow;\n  authData: IAuthData;\n  registerEmailState: AsyncState<RequestEmailTokenResponse, MatrixError>;\n  registerEmail: RequestEmailTokenCallback;\n  onRegister: (registerReqData: RegisterRequest) => void;\n};\nfunction RegisterUIAFlow({\n  formData,\n  flow,\n  authData,\n  registerEmailState,\n  registerEmail,\n  onRegister,\n}: RegisterUIAFlowProps) {\n  const completed = useUIACompleted(authData);\n  const { getStageToComplete } = useUIAFlow(authData, flow);\n\n  const stageToComplete = getStageToComplete();\n\n  const handleAuthDict = useCallback(\n    (authDict: AuthDict) => {\n      const { password, username } = formData;\n      onRegister({\n        auth: authDict,\n        password,\n        username,\n        initial_device_display_name: deviceDisplayName(),\n      });\n    },\n    [onRegister, formData]\n  );\n\n  const handleCancel = useCallback(() => {\n    window.location.reload();\n  }, []);\n\n  if (!stageToComplete) return null;\n  return (\n    <UIAFlowOverlay\n      currentStep={completed.length + 1}\n      stepCount={flow.stages.length}\n      onCancel={handleCancel}\n    >\n      {stageToComplete.type === (AuthType.RegistrationToken as string) && (\n        <RegistrationTokenStageDialog\n          token={formData.token}\n          stageData={stageToComplete}\n          submitAuthDict={handleAuthDict}\n          onCancel={handleCancel}\n        />\n      )}\n      {stageToComplete.type === (AuthType.Terms as string) && (\n        <AutoTermsStageDialog\n          stageData={stageToComplete}\n          submitAuthDict={handleAuthDict}\n          onCancel={handleCancel}\n        />\n      )}\n      {stageToComplete.type === (AuthType.Recaptcha as string) && (\n        <ReCaptchaStageDialog\n          stageData={stageToComplete}\n          submitAuthDict={handleAuthDict}\n          onCancel={handleCancel}\n        />\n      )}\n      {stageToComplete.type === (AuthType.Email as string) && (\n        <EmailStageDialog\n          email={formData.email}\n          clientSecret={formData.clientSecret}\n          stageData={stageToComplete}\n          requestEmailToken={registerEmail}\n          emailTokenState={registerEmailState}\n          submitAuthDict={handleAuthDict}\n          onCancel={handleCancel}\n        />\n      )}\n      {stageToComplete.type === (AuthType.Dummy as string) && (\n        <AutoDummyStageDialog\n          stageData={stageToComplete}\n          submitAuthDict={handleAuthDict}\n          onCancel={handleCancel}\n        />\n      )}\n    </UIAFlowOverlay>\n  );\n}\n\ntype PasswordRegisterFormProps = {\n  authData: IAuthData;\n  uiaFlows: UIAFlow[];\n  defaultUsername?: string;\n  defaultEmail?: string;\n  defaultRegisterToken?: string;\n};\nexport function PasswordRegisterForm({\n  authData,\n  uiaFlows,\n  defaultUsername,\n  defaultEmail,\n  defaultRegisterToken,\n}: PasswordRegisterFormProps) {\n  const serverDiscovery = useAutoDiscoveryInfo();\n  const baseUrl = serverDiscovery['m.homeserver'].base_url;\n  const mx = useMemo(() => createClient({ baseUrl, fetchFn: fetch }), [baseUrl]);\n  const params = useUIAParams(authData);\n  const termUrl = getLoginTermUrl(params);\n  const [formData, setFormData] = useState<FormData>();\n\n  const [ongoingFlow, setOngoingFlow] = useState<UIAFlow>();\n\n  const [registerEmailState, registerEmail] = useRegisterEmail(mx);\n\n  const [registerState, handleRegister] = useAsyncCallback<\n    RegisterResult,\n    MatrixError,\n    [RegisterRequest]\n  >(useCallback(async (registerReqData) => register(mx, registerReqData), [mx]));\n  const [ongoingAuthData, customRegisterResp] =\n    registerState.status === AsyncStatus.Success ? registerState.data : [];\n  const registerError =\n    registerState.status === AsyncStatus.Error ? registerState.error : undefined;\n\n  useRegisterComplete(customRegisterResp);\n\n  const handleSubmit: ChangeEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    const {\n      usernameInput,\n      passwordInput,\n      confirmPasswordInput,\n      emailInput,\n      tokenInput,\n      termsInput,\n    } = evt.target as HTMLFormElement & RegisterFormInputs;\n    const token = tokenInput?.value.trim();\n    const username = usernameInput.value.trim();\n    const password = passwordInput.value;\n    const confirmPassword = confirmPasswordInput.value;\n    if (password !== confirmPassword) {\n      return;\n    }\n    const email = emailInput?.value.trim();\n    const terms = termsInput?.value === 'on';\n\n    if (!username) {\n      usernameInput.focus();\n      return;\n    }\n\n    const fData: FormData = {\n      username,\n      password,\n      token,\n      email,\n      terms,\n      clientSecret: mx.generateClientSecret(),\n    };\n    const pickedStages = pickStages(uiaFlows, fData);\n    const pickedFlow = getUIAFlowForStages(uiaFlows, pickedStages);\n    setOngoingFlow(pickedFlow);\n    setFormData(fData);\n    handleRegister({\n      username,\n      password,\n      auth: {\n        session: authData.session,\n      },\n      initial_device_display_name: deviceDisplayName(),\n    });\n  };\n\n  return (\n    <>\n      <Box as=\"form\" onSubmit={handleSubmit} direction=\"Inherit\" gap=\"400\">\n        <Box direction=\"Column\" gap=\"100\">\n          <Text as=\"label\" htmlFor=\"register-username-input\" size=\"L400\" priority=\"300\">\n            Username\n          </Text>\n          <Input\n            id=\"register-username-input\"\n            variant=\"Background\"\n            defaultValue={defaultUsername}\n            name=\"usernameInput\"\n            size=\"500\"\n            outlined\n            required\n          />\n          {registerError?.errcode === RegisterError.UserTaken && (\n            <FieldError message=\"This username is already taken.\" />\n          )}\n          {registerError?.errcode === RegisterError.UserInvalid && (\n            <FieldError message=\"This username contains invalid characters.\" />\n          )}\n          {registerError?.errcode === RegisterError.UserExclusive && (\n            <FieldError message=\"This username is reserved.\" />\n          )}\n        </Box>\n        <ConfirmPasswordMatch initialValue>\n          {(match, doMatch, passRef, confPassRef) => (\n            <>\n              <Box direction=\"Column\" gap=\"100\">\n                <Text as=\"label\" htmlFor=\"register-password-input\" size=\"L400\" priority=\"300\">\n                  Password\n                </Text>\n                <PasswordInput\n                  id=\"register-password-input\"\n                  ref={passRef}\n                  onChange={doMatch}\n                  name=\"passwordInput\"\n                  variant=\"Background\"\n                  size=\"500\"\n                  outlined\n                  required\n                />\n                {registerError?.errcode === RegisterError.PasswordWeak && (\n                  <FieldError\n                    message={\n                      registerError.data.error ??\n                      'Weak Password. Password rejected by server please choosing more strong Password.'\n                    }\n                  />\n                )}\n                {registerError?.errcode === RegisterError.PasswordShort && (\n                  <FieldError\n                    message={\n                      registerError.data.error ??\n                      'Short Password. Password rejected by server please choosing more long Password.'\n                    }\n                  />\n                )}\n              </Box>\n              <Box direction=\"Column\" gap=\"100\">\n                <Text\n                  as=\"label\"\n                  htmlFor=\"register-confirm-password-input\"\n                  size=\"L400\"\n                  priority=\"300\"\n                >\n                  Confirm Password\n                </Text>\n                <PasswordInput\n                  id=\"register-confirm-password-input\"\n                  ref={confPassRef}\n                  onChange={doMatch}\n                  name=\"confirmPasswordInput\"\n                  variant=\"Background\"\n                  size=\"500\"\n                  style={{ color: match ? undefined : color.Critical.Main }}\n                  outlined\n                  required\n                />\n              </Box>\n            </>\n          )}\n        </ConfirmPasswordMatch>\n        {hasStageInFlows(uiaFlows, AuthType.RegistrationToken) && (\n          <Box direction=\"Column\" gap=\"100\">\n            <Text as=\"label\" htmlFor=\"register-token-input\" size=\"L400\" priority=\"300\">\n              {requiredStageInFlows(uiaFlows, AuthType.RegistrationToken)\n                ? 'Registration Token'\n                : 'Registration Token (Optional)'}\n            </Text>\n            <Input\n              id=\"register-token-input\"\n              variant=\"Background\"\n              defaultValue={defaultRegisterToken}\n              name=\"tokenInput\"\n              size=\"500\"\n              required={requiredStageInFlows(uiaFlows, AuthType.RegistrationToken)}\n              outlined\n            />\n          </Box>\n        )}\n        {hasStageInFlows(uiaFlows, AuthType.Email) && (\n          <Box direction=\"Column\" gap=\"100\">\n            <Text as=\"label\" htmlFor=\"register-email-input\" size=\"L400\" priority=\"300\">\n              {requiredStageInFlows(uiaFlows, AuthType.Email) ? 'Email' : 'Email (Optional)'}\n            </Text>\n            <Input\n              id=\"register-email-input\"\n              variant=\"Background\"\n              defaultValue={defaultEmail}\n              name=\"emailInput\"\n              type=\"email\"\n              size=\"500\"\n              required={requiredStageInFlows(uiaFlows, AuthType.Email)}\n              outlined\n            />\n          </Box>\n        )}\n\n        {hasStageInFlows(uiaFlows, AuthType.Terms) && termUrl && (\n          <Box alignItems=\"Center\" gap=\"200\">\n            <Checkbox name=\"termsInput\" size=\"300\" variant=\"Primary\" required />\n            <Text size=\"T300\">\n              I accept server{' '}\n              <a href={termUrl} target=\"_blank\" rel=\"noreferrer\">\n                Terms and Conditions\n              </a>\n              .\n            </Text>\n          </Box>\n        )}\n        {registerError?.errcode === RegisterError.RateLimited && (\n          <FieldError message=\"Failed to register. Your register request has been rate-limited by server, Please try after some time.\" />\n        )}\n        {registerError?.errcode === RegisterError.Forbidden && (\n          <FieldError message=\"Failed to register. The homeserver does not permit registration.\" />\n        )}\n        {registerError?.errcode === RegisterError.InvalidRequest && (\n          <FieldError message=\"Failed to register. Invalid request.\" />\n        )}\n        {registerError?.errcode === RegisterError.Unknown && (\n          <FieldError message={registerError.data.error ?? 'Failed to register. Unknown Reason.'} />\n        )}\n        <span data-spacing-node />\n        <Button variant=\"Primary\" size=\"500\" type=\"submit\">\n          <Text as=\"span\" size=\"B500\">\n            Register\n          </Text>\n        </Button>\n      </Box>\n      {registerState.status === AsyncStatus.Success &&\n        formData &&\n        ongoingFlow &&\n        ongoingAuthData && (\n          <RegisterUIAFlow\n            formData={formData}\n            flow={ongoingFlow}\n            authData={ongoingAuthData}\n            registerEmail={registerEmail}\n            registerEmailState={registerEmailState}\n            onRegister={handleRegister}\n          />\n        )}\n      {registerState.status === AsyncStatus.Loading && (\n        <Overlay open backdrop={<OverlayBackdrop />}>\n          <OverlayCenter>\n            <Spinner variant=\"Secondary\" size=\"600\" />\n          </OverlayCenter>\n        </Overlay>\n      )}\n    </>\n  );\n}\n","import { useMemo } from 'react';\nimport { Box, Text, color } from 'folds';\nimport { Link, useSearchParams } from 'react-router';\nimport { SSOAction } from '$types/matrix-sdk';\nimport { useAuthServer } from '$hooks/useAuthServer';\nimport { RegisterFlowStatus, useAuthFlows } from '$hooks/useAuthFlows';\nimport { useParsedLoginFlows } from '$hooks/useParsedLoginFlows';\nimport { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo';\nimport { SupportedUIAFlowsLoader } from '$components/SupportedUIAFlowsLoader';\nimport { getLoginPath, withSearchParam } from '$pages/pathUtils';\nimport { usePathWithOrigin } from '$hooks/usePathWithOrigin';\nimport type { RegisterPathSearchParams } from '$pages/paths';\nimport { SSOLogin } from '$pages/auth/SSOLogin';\nimport { isTauri } from '@tauri-apps/api/core';\nimport { buildTauriSsoRedirectUrl } from '$pages/auth/SSOTauri';\nimport { OrDivider } from '$pages/auth/OrDivider';\nimport { OidcLoginButton } from '$pages/auth/login/OidcLogin';\nimport { PasswordRegisterForm, SUPPORTED_REGISTER_STAGES } from './PasswordRegisterForm';\n\nconst useRegisterSearchParams = (searchParams: URLSearchParams): RegisterPathSearchParams =>\n  useMemo(\n    () => ({\n      username: searchParams.get('username') ?? undefined,\n      email: searchParams.get('email') ?? undefined,\n      token: searchParams.get('token') ?? undefined,\n    }),\n    [searchParams]\n  );\n\nexport function Register() {\n  const server = useAuthServer();\n  const { loginFlows, registerFlows, authMetadata } = useAuthFlows();\n  const discovery = useAutoDiscoveryInfo();\n  const baseUrl = discovery['m.homeserver'].base_url;\n  const [searchParams] = useSearchParams();\n  const registerSearchParams = useRegisterSearchParams(searchParams);\n  const { sso } = useParsedLoginFlows(loginFlows.flows);\n\n  // redirect to /login because only that path handle m.login.token and the OIDC callback\n  const webSsoRedirectUrl = usePathWithOrigin(getLoginPath(server));\n  const ssoRedirectUrl = isTauri() ? buildTauriSsoRedirectUrl(server) : webSsoRedirectUrl;\n  const oidcRedirectUri = usePathWithOrigin(getLoginPath(server), { ignoreHashRouter: true });\n\n  const isAddingAccount = searchParams.get('addAccount') === '1';\n  const loginUrl = isAddingAccount\n    ? withSearchParam(getLoginPath(server), { addAccount: '1' })\n    : getLoginPath(server);\n\n  const showOidc = authMetadata?.prompt_values_supported?.includes('create') === true;\n\n  if (showOidc) {\n    return (\n      <Box direction=\"Column\" gap=\"500\">\n        <Text size=\"H2\" priority=\"400\">\n          Register\n        </Text>\n        <OidcLoginButton\n          authMetadata={authMetadata}\n          homeserverUrl={baseUrl}\n          redirectUri={oidcRedirectUri}\n          label={`Continue with ${server}`}\n          prompt=\"create\"\n          server={server}\n        />\n        <span data-spacing-node />\n        <Text align=\"Center\">\n          Already have an account? <Link to={loginUrl}>Login</Link>\n        </Text>\n      </Box>\n    );\n  }\n\n  return (\n    <Box direction=\"Column\" gap=\"500\">\n      <Text size=\"H2\" priority=\"400\">\n        Register\n      </Text>\n      {registerFlows.status === RegisterFlowStatus.RegistrationDisabled && !sso && (\n        <Text style={{ color: color.Critical.Main }} size=\"T300\">\n          Registration has been disabled on this homeserver.\n        </Text>\n      )}\n      {registerFlows.status === RegisterFlowStatus.RateLimited && !sso && (\n        <Text style={{ color: color.Critical.Main }} size=\"T300\">\n          You have been rate-limited! Please try after some time.\n        </Text>\n      )}\n      {registerFlows.status === RegisterFlowStatus.InvalidRequest && !sso && (\n        <Text style={{ color: color.Critical.Main }} size=\"T300\">\n          Invalid Request! Failed to get any registration options.\n        </Text>\n      )}\n      {registerFlows.status === RegisterFlowStatus.FlowRequired && (\n        <>\n          <SupportedUIAFlowsLoader\n            flows={registerFlows.data.flows ?? []}\n            supportedStages={SUPPORTED_REGISTER_STAGES}\n          >\n            {(supportedFlows) =>\n              supportedFlows.length === 0 ? (\n                <Text style={{ color: color.Critical.Main }} size=\"T300\">\n                  This application does not support registration on this homeserver.\n                </Text>\n              ) : (\n                <PasswordRegisterForm\n                  authData={registerFlows.data}\n                  uiaFlows={supportedFlows}\n                  defaultUsername={registerSearchParams.username}\n                  defaultEmail={registerSearchParams.email}\n                  defaultRegisterToken={registerSearchParams.token}\n                />\n              )\n            }\n          </SupportedUIAFlowsLoader>\n          <span data-spacing-node />\n          {sso && <OrDivider />}\n        </>\n      )}\n      {sso && (\n        <>\n          <SSOLogin\n            providers={sso.identity_providers}\n            redirectUrl={ssoRedirectUrl}\n            action={SSOAction.REGISTER}\n            saveScreenSpace={registerFlows.status === RegisterFlowStatus.FlowRequired}\n          />\n          <span data-spacing-node />\n        </>\n      )}\n      <Text align=\"Center\">\n        Already have an account? <Link to={loginUrl}>Login</Link>\n      </Text>\n    </Box>\n  );\n}\n","import type { MatrixClient, MatrixError } from '$types/matrix-sdk';\nimport { useCallback, useRef } from 'react';\nimport type { AsyncState } from './useAsyncCallback';\nimport { useAsyncCallback } from './useAsyncCallback';\nimport type { RequestEmailTokenCallback, RequestEmailTokenResponse } from './types';\n\nexport const usePasswordEmail = (\n  mx: MatrixClient\n): [AsyncState<RequestEmailTokenResponse, MatrixError>, RequestEmailTokenCallback] => {\n  const sendAttemptRef = useRef(1);\n\n  const passwordEmailCallback: RequestEmailTokenCallback = useCallback(\n    async (email, clientSecret, nextLink) => {\n      const sendAttempt = sendAttemptRef.current;\n      sendAttemptRef.current += 1;\n      const result = await mx.requestPasswordEmailToken(email, clientSecret, sendAttempt, nextLink);\n      return {\n        email,\n        clientSecret,\n        result,\n      };\n    },\n    [mx]\n  );\n\n  const [passwordEmailState, passwordEmail] = useAsyncCallback<\n    RequestEmailTokenResponse,\n    MatrixError,\n    Parameters<RequestEmailTokenCallback>\n  >(passwordEmailCallback);\n\n  return [passwordEmailState, passwordEmail];\n};\n","import to from 'await-to-js';\nimport type { AuthDict, IAuthData, MatrixClient, MatrixError } from '$types/matrix-sdk';\n\nexport type ResetPasswordResponse = Record<string, never>;\nexport type ResetPasswordResult = [IAuthData, undefined] | [undefined, ResetPasswordResponse];\nexport const resetPassword = async (\n  mx: MatrixClient,\n  authDict: AuthDict,\n  newPassword: string\n): Promise<ResetPasswordResult> => {\n  const [err, res] = await to<ResetPasswordResponse, MatrixError>(\n    mx.setPassword(authDict, newPassword, false)\n  );\n\n  if (err) {\n    if (err.httpStatus === 401) {\n      const authData = err.data as IAuthData;\n      return [authData, undefined];\n    }\n    throw err;\n  }\n  return [undefined, res];\n};\n","import type { FormEventHandler } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n  Box,\n  Button,\n  Dialog,\n  Input,\n  OverlayBackdrop,\n  OverlayCenter,\n  Spinner,\n  Text,\n  color,\n  config,\n} from 'folds';\nimport { Overlay } from '$components/overlay-stack';\nimport { useNavigate } from 'react-router';\nimport FocusTrap from 'focus-trap-react';\nimport type { AuthDict, MatrixError } from '$types/matrix-sdk';\nimport { AuthType, createClient } from '$types/matrix-sdk';\nimport { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useAuthServer } from '$hooks/useAuthServer';\nimport { usePasswordEmail } from '$hooks/usePasswordEmail';\nimport { PasswordInput } from '$components/password-input';\nimport { ConfirmPasswordMatch } from '$components/ConfirmPasswordMatch';\nimport { UIAFlowOverlay } from '$components/UIAFlowOverlay';\nimport { EmailStageDialog } from '$components/uia-stages';\nimport { getLoginPath, withSearchParam } from '$pages/pathUtils';\nimport { getUIAError, getUIAErrorCode } from '$utils/matrix-uia';\nimport { FieldError } from '$pages/auth/FiledError';\nimport { fetch } from '$utils/fetch';\nimport type { ResetPasswordResult } from './resetPasswordUtil';\nimport { resetPassword } from './resetPasswordUtil';\n\ntype FormData = {\n  email: string;\n  password: string;\n  clientSecret: string;\n};\n\nfunction ResetPasswordComplete({ email }: { email?: string }) {\n  const server = useAuthServer();\n\n  const navigate = useNavigate();\n\n  const handleClick = () => {\n    const path = getLoginPath(server);\n    if (email) {\n      navigate(withSearchParam(path, { email }));\n      return;\n    }\n    navigate(path);\n  };\n\n  return (\n    <Overlay open backdrop={<OverlayBackdrop />}>\n      <OverlayCenter>\n        <FocusTrap>\n          <Dialog>\n            <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n              <Text>\n                Password has been reset successfully. Please login with your new password.\n              </Text>\n              <Button variant=\"Primary\" onClick={handleClick}>\n                <Text size=\"B400\" as=\"span\">\n                  Login\n                </Text>\n              </Button>\n            </Box>\n          </Dialog>\n        </FocusTrap>\n      </OverlayCenter>\n    </Overlay>\n  );\n}\n\ntype PasswordResetFormProps = {\n  defaultEmail?: string;\n};\n\nconst handleCancel = () => {\n  window.location.reload();\n};\nexport function PasswordResetForm({ defaultEmail }: PasswordResetFormProps) {\n  const server = useAuthServer();\n\n  const serverDiscovery = useAutoDiscoveryInfo();\n  const baseUrl = serverDiscovery['m.homeserver'].base_url;\n  const mx = useMemo(() => createClient({ baseUrl, fetchFn: fetch }), [baseUrl]);\n\n  const [formData, setFormData] = useState<FormData>();\n\n  const [passwordEmailState, passwordEmail] = usePasswordEmail(mx);\n\n  const [resetPasswordState, handleResetPassword] = useAsyncCallback<\n    ResetPasswordResult,\n    MatrixError,\n    [AuthDict, string]\n  >(useCallback(async (authDict, newPassword) => resetPassword(mx, authDict, newPassword), [mx]));\n\n  const [ongoingAuthData, resetPasswordResult] =\n    resetPasswordState.status === AsyncStatus.Success ? resetPasswordState.data : [];\n  const resetPasswordError =\n    resetPasswordState.status === AsyncStatus.Error ? resetPasswordState.error : undefined;\n\n  const flowErrorCode = ongoingAuthData && getUIAErrorCode(ongoingAuthData);\n  const flowError = ongoingAuthData && getUIAError(ongoingAuthData);\n\n  let waitingToVerifyEmail = true;\n  if (resetPasswordResult) waitingToVerifyEmail = false;\n  if (ongoingAuthData && flowErrorCode === undefined) waitingToVerifyEmail = false;\n  if (resetPasswordError) waitingToVerifyEmail = false;\n  if (resetPasswordState.status === AsyncStatus.Loading) waitingToVerifyEmail = false;\n\n  // We only support UIA m.login.password stage for reset password\n  // So we will assume to process it as soon as\n  // we have 401 with no error on initial request.\n  useEffect(() => {\n    if (formData && ongoingAuthData && !flowErrorCode) {\n      handleResetPassword(\n        {\n          type: AuthType.Password,\n          identifier: {\n            type: 'm.id.thirdparty',\n            medium: 'email',\n            address: formData.email,\n          },\n          password: formData.password,\n        },\n        formData.password\n      );\n    }\n  }, [ongoingAuthData, flowErrorCode, formData, handleResetPassword]);\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    const { emailInput, passwordInput, confirmPasswordInput } = evt.target as HTMLFormElement & {\n      emailInput: HTMLInputElement;\n      passwordInput: HTMLInputElement;\n      confirmPasswordInput: HTMLInputElement;\n    };\n\n    const email = emailInput.value.trim();\n    const password = passwordInput.value;\n    const confirmPassword = confirmPasswordInput.value;\n    if (!email) {\n      emailInput.focus();\n      return;\n    }\n    if (password !== confirmPassword) return;\n\n    const clientSecret = mx.generateClientSecret();\n    passwordEmail(email, clientSecret);\n    setFormData({\n      email,\n      password,\n      clientSecret,\n    });\n  };\n\n  const handleSubmitRequest = useCallback(\n    (authDict: AuthDict) => {\n      if (!formData) return;\n      const { password } = formData;\n      handleResetPassword(authDict, password);\n    },\n    [formData, handleResetPassword]\n  );\n\n  return (\n    <Box as=\"form\" onSubmit={handleSubmit} direction=\"Inherit\" gap=\"400\">\n      <Text size=\"T300\" priority=\"400\">\n        Homeserver <strong>{server}</strong> will send you an email to let you reset your password.\n      </Text>\n      <Box direction=\"Column\" gap=\"100\">\n        <Text as=\"label\" size=\"L400\" priority=\"300\">\n          Email\n        </Text>\n        <Input\n          defaultValue={defaultEmail}\n          type=\"email\"\n          name=\"emailInput\"\n          variant=\"Background\"\n          size=\"500\"\n          required\n          outlined\n        />\n        {passwordEmailState.status === AsyncStatus.Error && (\n          <FieldError\n            message={`${passwordEmailState.error.errcode}: ${passwordEmailState.error.data?.error}`}\n          />\n        )}\n      </Box>\n      <ConfirmPasswordMatch initialValue>\n        {(match, doMatch, passRef, confPassRef) => (\n          <>\n            <Box direction=\"Column\" gap=\"100\">\n              <Text as=\"label\" size=\"L400\" priority=\"300\">\n                New Password\n              </Text>\n              <PasswordInput\n                ref={passRef}\n                onChange={doMatch}\n                name=\"passwordInput\"\n                variant=\"Background\"\n                size=\"500\"\n                outlined\n                required\n              />\n            </Box>\n            <Box direction=\"Column\" gap=\"100\">\n              <Text as=\"label\" size=\"L400\" priority=\"300\">\n                Confirm Password\n              </Text>\n              <PasswordInput\n                ref={confPassRef}\n                onChange={doMatch}\n                name=\"confirmPasswordInput\"\n                variant=\"Background\"\n                size=\"500\"\n                style={{ color: match ? undefined : color.Critical.Main }}\n                outlined\n                required\n              />\n            </Box>\n          </>\n        )}\n      </ConfirmPasswordMatch>\n      {resetPasswordError && (\n        <FieldError\n          message={`${resetPasswordError.errcode}: ${\n            resetPasswordError.data?.error ?? 'Failed to reset password.'\n          }`}\n        />\n      )}\n      <span data-spacing-node />\n      <Button type=\"submit\" variant=\"Primary\" size=\"500\">\n        <Text as=\"span\" size=\"B500\">\n          Reset Password\n        </Text>\n      </Button>\n\n      {resetPasswordResult && <ResetPasswordComplete email={formData?.email} />}\n\n      {passwordEmailState.status === AsyncStatus.Success && formData && waitingToVerifyEmail && (\n        <UIAFlowOverlay currentStep={1} stepCount={1} onCancel={handleCancel}>\n          <EmailStageDialog\n            stageData={{\n              type: AuthType.Email,\n              errorCode: flowErrorCode,\n              error: flowError,\n              session: ongoingAuthData?.session,\n            }}\n            submitAuthDict={handleSubmitRequest}\n            email={formData.email}\n            clientSecret={formData.clientSecret}\n            requestEmailToken={passwordEmail}\n            emailTokenState={passwordEmailState}\n            onCancel={handleCancel}\n          />\n        </UIAFlowOverlay>\n      )}\n\n      <Overlay\n        open={\n          passwordEmailState.status === AsyncStatus.Loading ||\n          resetPasswordState.status === AsyncStatus.Loading\n        }\n        backdrop={<OverlayBackdrop />}\n      >\n        <OverlayCenter>\n          <Spinner variant=\"Secondary\" size=\"600\" />\n        </OverlayCenter>\n      </Overlay>\n    </Box>\n  );\n}\n","import { Box, Text } from 'folds';\nimport { useMemo } from 'react';\nimport { Link, useSearchParams } from 'react-router';\nimport { getLoginPath } from '$pages/pathUtils';\nimport { useAuthServer } from '$hooks/useAuthServer';\nimport type { ResetPasswordPathSearchParams } from '$pages/paths';\nimport { PasswordResetForm } from './PasswordResetForm';\n\nconst useResetPasswordSearchParams = (\n  searchParams: URLSearchParams\n): ResetPasswordPathSearchParams =>\n  useMemo(\n    () => ({\n      email: searchParams.get('email') ?? undefined,\n    }),\n    [searchParams]\n  );\n\nexport function ResetPassword() {\n  const server = useAuthServer();\n  const [searchParams] = useSearchParams();\n  const resetPasswordSearchParams = useResetPasswordSearchParams(searchParams);\n\n  return (\n    <Box direction=\"Column\" gap=\"500\">\n      <Text size=\"H2\" priority=\"400\">\n        Reset Password\n      </Text>\n      <PasswordResetForm defaultEmail={resetPasswordSearchParams.email} />\n      <span data-spacing-node />\n\n      <Text align=\"Center\">\n        Remember your password? <Link to={getLoginPath(server)}>Login</Link>\n      </Text>\n    </Box>\n  );\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}