@plumile/backoffice-react 0.1.201 → 0.1.206
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -4
- package/lib/esm/auth/login/LoginFlow.js.map +1 -1
- package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +28 -28
- package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js.map +1 -1
- package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +123 -70
- package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +206 -204
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
- package/lib/esm/hooks/useAuth.js +56 -56
- package/lib/esm/hooks/useAuth.js.map +1 -1
- package/lib/esm/hooks/useConditionalSubscription.js +18 -18
- package/lib/esm/hooks/useConditionalSubscription.js.map +1 -1
- package/lib/esm/hooks/useInfiniteConnection.js +40 -38
- package/lib/esm/hooks/useInfiniteConnection.js.map +1 -1
- package/lib/esm/i18n/locales/en/backofficeReact.js +1 -0
- package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
- package/lib/esm/i18n/locales/fr/backofficeReact.js +1 -0
- package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
- package/lib/esm/index.js +56 -64
- package/lib/esm/pages/BackofficeEntityDetailPage.js +97 -97
- package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListDataPage.js +39 -31
- package/lib/esm/pages/BackofficeEntityListDataPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListPage.js +2 -0
- package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
- package/lib/esm/pages/BackofficeLayoutPage.js +19 -19
- package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
- package/lib/esm/provider/BackofficeProvider.js +33 -33
- package/lib/esm/router/createBackofficeRoutes.js +26 -28
- package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
- package/lib/esm/storybook/relay/RelayStory.js +32 -32
- package/lib/esm/storybook/relay/RelayStory.js.map +1 -1
- package/lib/esm/storybook/relay/mockResolvers.js.map +1 -1
- package/lib/esm/style.css +1 -1
- package/lib/types/components/backoffice/detail/BackofficeEntitySummaryHeader.d.ts +1 -1
- package/lib/types/components/backoffice/detail/BackofficeEntitySummaryHeader.d.ts.map +1 -1
- package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts +2 -0
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
- package/lib/types/hooks/useAuth.d.ts.map +1 -1
- package/lib/types/hooks/useConditionalSubscription.d.ts.map +1 -1
- package/lib/types/hooks/useInfiniteConnection.d.ts +3 -2
- package/lib/types/hooks/useInfiniteConnection.d.ts.map +1 -1
- package/lib/types/i18n/locales/en/backofficeReact.d.ts +5 -0
- package/lib/types/i18n/locales/fr/backofficeReact.d.ts +5 -0
- package/lib/types/i18n/resources.d.ts +2 -0
- package/lib/types/i18n/resources.d.ts.map +1 -1
- package/lib/types/index.d.ts +1 -9
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListDataPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeLayoutPage.d.ts.map +1 -1
- package/lib/types/router/createBackofficeRoutes.d.ts +3 -3
- package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
- package/lib/types/storybook/relay/RelayStory.d.ts +1 -1
- package/lib/types/storybook/relay/RelayStory.d.ts.map +1 -1
- package/lib/types/storybook/relay/mockResolvers.d.ts +9 -1
- package/lib/types/storybook/relay/mockResolvers.d.ts.map +1 -1
- package/package.json +12 -15
- package/lib/esm/_virtual/_rolldown/runtime.js +0 -7
- package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js +0 -13
- package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js.map +0 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js +0 -12
- package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js.map +0 -1
- package/lib/esm/components/backoffice/detail/BackofficeEnumLabel.js +0 -16
- package/lib/esm/components/backoffice/detail/BackofficeEnumLabel.js.map +0 -1
- package/lib/esm/components/backoffice/detail/BackofficeReferenceValue.js +0 -17
- package/lib/esm/components/backoffice/detail/BackofficeReferenceValue.js.map +0 -1
- package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js +0 -8
- package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js.map +0 -1
- package/lib/esm/components/backoffice/detail/BackofficeStatusMetaBadge.js +0 -16
- package/lib/esm/components/backoffice/detail/BackofficeStatusMetaBadge.js.map +0 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js +0 -6
- package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js.map +0 -1
- package/lib/esm/components/backoffice/refs/backofficeEntityIdRef.css.js +0 -6
- package/lib/esm/components/backoffice/refs/backofficeEntityIdRef.css.js.map +0 -1
- package/lib/esm/components/backoffice/routing/BackofficeRoutePendingBar.js +0 -12
- package/lib/esm/components/backoffice/routing/BackofficeRoutePendingBar.js.map +0 -1
- package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js +0 -7
- package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js.map +0 -1
- package/lib/esm/hooks/useBackofficeLoadMore.js +0 -18
- package/lib/esm/hooks/useBackofficeLoadMore.js.map +0 -1
- package/lib/esm/modules/base64.js +0 -21
- package/lib/esm/modules/base64.js.map +0 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/arrayLikeToArray.js +0 -15
- package/lib/esm/node_modules/@babel/runtime/helpers/arrayLikeToArray.js.map +0 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js +0 -15
- package/lib/esm/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js.map +0 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/defineProperty.js +0 -20
- package/lib/esm/node_modules/@babel/runtime/helpers/defineProperty.js.map +0 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/interopRequireDefault.js +0 -13
- package/lib/esm/node_modules/@babel/runtime/helpers/interopRequireDefault.js.map +0 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/iterableToArray.js +0 -13
- package/lib/esm/node_modules/@babel/runtime/helpers/iterableToArray.js.map +0 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/nonIterableSpread.js +0 -13
- package/lib/esm/node_modules/@babel/runtime/helpers/nonIterableSpread.js.map +0 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/objectSpread2.js +0 -33
- package/lib/esm/node_modules/@babel/runtime/helpers/objectSpread2.js.map +0 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js +0 -19
- package/lib/esm/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js.map +0 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/toConsumableArray.js +0 -18
- package/lib/esm/node_modules/@babel/runtime/helpers/toConsumableArray.js.map +0 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/toPrimitive.js +0 -22
- package/lib/esm/node_modules/@babel/runtime/helpers/toPrimitive.js.map +0 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/toPropertyKey.js +0 -17
- package/lib/esm/node_modules/@babel/runtime/helpers/toPropertyKey.js.map +0 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/typeof.js +0 -18
- package/lib/esm/node_modules/@babel/runtime/helpers/typeof.js.map +0 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js +0 -19
- package/lib/esm/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js.map +0 -1
- package/lib/esm/node_modules/fbjs/lib/areEqual.js +0 -42
- package/lib/esm/node_modules/fbjs/lib/areEqual.js.map +0 -1
- package/lib/esm/node_modules/invariant/browser.js +0 -30
- package/lib/esm/node_modules/invariant/browser.js.map +0 -1
- package/lib/esm/node_modules/relay-test-utils/index.js +0 -11
- package/lib/esm/node_modules/relay-test-utils/index.js.map +0 -1
- package/lib/esm/node_modules/relay-test-utils/lib/RelayMockPayloadGenerator.js +0 -288
- package/lib/esm/node_modules/relay-test-utils/lib/RelayMockPayloadGenerator.js.map +0 -1
- package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js +0 -183
- package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js.map +0 -1
- package/lib/esm/node_modules/relay-test-utils/lib/RelayResolverTestUtils.js +0 -19
- package/lib/esm/node_modules/relay-test-utils/lib/RelayResolverTestUtils.js.map +0 -1
- package/lib/esm/node_modules/relay-test-utils/lib/index.js +0 -21
- package/lib/esm/node_modules/relay-test-utils/lib/index.js.map +0 -1
- package/lib/esm/node_modules/relay-test-utils/lib/unwrapContainer.js +0 -16
- package/lib/esm/node_modules/relay-test-utils/lib/unwrapContainer.js.map +0 -1
- package/lib/esm/relay/RelayProvider.js +0 -2
- package/lib/esm/relay/envHelpers.js +0 -63
- package/lib/esm/relay/envHelpers.js.map +0 -1
- package/lib/esm/relay/environment.js +0 -2
- package/lib/esm/relay/shortAccessTokenEnvironment.js +0 -2
- package/lib/esm/relay/useRelayOperationActivity.js +0 -2
- package/lib/esm/storybook/relay/relay-test-utils.d.js +0 -0
- package/lib/types/auth/AuthFlows.stories.d.ts +0 -19
- package/lib/types/auth/AuthFlows.stories.d.ts.map +0 -1
- package/lib/types/components/backoffice/billing/BackofficeBillingUsageChart.stories.d.ts +0 -41
- package/lib/types/components/backoffice/billing/BackofficeBillingUsageChart.stories.d.ts.map +0 -1
- package/lib/types/components/backoffice/detail/BackofficeDetailFlagTag.d.ts +0 -11
- package/lib/types/components/backoffice/detail/BackofficeDetailFlagTag.d.ts.map +0 -1
- package/lib/types/components/backoffice/detail/BackofficeDetailPrimitives.stories.d.ts +0 -17
- package/lib/types/components/backoffice/detail/BackofficeDetailPrimitives.stories.d.ts.map +0 -1
- package/lib/types/components/backoffice/detail/BackofficeDetailTaggedValue.d.ts +0 -13
- package/lib/types/components/backoffice/detail/BackofficeDetailTaggedValue.d.ts.map +0 -1
- package/lib/types/components/backoffice/detail/BackofficeEnumLabel.d.ts +0 -9
- package/lib/types/components/backoffice/detail/BackofficeEnumLabel.d.ts.map +0 -1
- package/lib/types/components/backoffice/detail/BackofficeReferenceValue.d.ts +0 -10
- package/lib/types/components/backoffice/detail/BackofficeReferenceValue.d.ts.map +0 -1
- package/lib/types/components/backoffice/detail/BackofficeStatusGroup.d.ts +0 -8
- package/lib/types/components/backoffice/detail/BackofficeStatusGroup.d.ts.map +0 -1
- package/lib/types/components/backoffice/detail/BackofficeStatusMetaBadge.d.ts +0 -11
- package/lib/types/components/backoffice/detail/BackofficeStatusMetaBadge.d.ts.map +0 -1
- package/lib/types/components/backoffice/detail/backofficeDetailRelationLink.css.d.ts +0 -6
- package/lib/types/components/backoffice/detail/backofficeDetailRelationLink.css.d.ts.map +0 -1
- package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.stories.d.ts +0 -12
- package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.stories.d.ts.map +0 -1
- package/lib/types/components/backoffice/filters/EntityIdFilterField.stories.d.ts +0 -12
- package/lib/types/components/backoffice/filters/EntityIdFilterField.stories.d.ts.map +0 -1
- package/lib/types/components/backoffice/hub/BackofficeHubTemplate.stories.d.ts +0 -49
- package/lib/types/components/backoffice/hub/BackofficeHubTemplate.stories.d.ts.map +0 -1
- package/lib/types/components/backoffice/overview/BackofficeOverviewLayout.stories.d.ts +0 -11
- package/lib/types/components/backoffice/overview/BackofficeOverviewLayout.stories.d.ts.map +0 -1
- package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.stories.d.ts +0 -12
- package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.stories.d.ts.map +0 -1
- package/lib/types/components/backoffice/refs/backofficeEntityIdRef.css.d.ts +0 -2
- package/lib/types/components/backoffice/refs/backofficeEntityIdRef.css.d.ts.map +0 -1
- package/lib/types/components/backoffice/routing/BackofficeRoutePendingBar.d.ts +0 -4
- package/lib/types/components/backoffice/routing/BackofficeRoutePendingBar.d.ts.map +0 -1
- package/lib/types/components/backoffice/routing/backofficeRoutePendingBar.css.d.ts +0 -3
- package/lib/types/components/backoffice/routing/backofficeRoutePendingBar.css.d.ts.map +0 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.stories.d.ts +0 -11
- package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.stories.d.ts.map +0 -1
- package/lib/types/components/backoffice/tools/BackofficeTools.stories.d.ts +0 -17
- package/lib/types/components/backoffice/tools/BackofficeTools.stories.d.ts.map +0 -1
- package/lib/types/hooks/useBackofficeLoadMore.d.ts +0 -9
- package/lib/types/hooks/useBackofficeLoadMore.d.ts.map +0 -1
- package/lib/types/modules/base64.d.ts +0 -3
- package/lib/types/modules/base64.d.ts.map +0 -1
- package/lib/types/pages/BackofficeDashboardPage.stories.d.ts +0 -9
- package/lib/types/pages/BackofficeDashboardPage.stories.d.ts.map +0 -1
- package/lib/types/relay/RelayProvider.d.ts +0 -2
- package/lib/types/relay/RelayProvider.d.ts.map +0 -1
- package/lib/types/relay/envHelpers.d.ts +0 -25
- package/lib/types/relay/envHelpers.d.ts.map +0 -1
- package/lib/types/relay/environment.d.ts +0 -2
- package/lib/types/relay/environment.d.ts.map +0 -1
- package/lib/types/relay/shortAccessTokenEnvironment.d.ts +0 -5
- package/lib/types/relay/shortAccessTokenEnvironment.d.ts.map +0 -1
- package/lib/types/relay/useRelayOperationActivity.d.ts +0 -2
- package/lib/types/relay/useRelayOperationActivity.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuth.js","names":[],"sources":["../../../src/hooks/useAuth.ts"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { useCallback, useState } from 'react';\n\nimport {\n type MutationPayloadBase,\n requireField,\n resolveMutationOutcome,\n} from '../relay/mutationResult.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\n\nimport { resetRelayStore } from '../relay/environment.js';\nimport type { PayloadError } from 'relay-runtime';\n\nimport type {\n AuthMethod,\n LoginNextStep,\n MfaLevel,\n} from '../modules/sharedSchemaTypes.js';\nimport {\n base64UrlToBuffer,\n bufferToBase64Url,\n parseSignCount,\n} from '../modules/webauthn.js';\n\nexport type AuthPayload = {\n authMethod: AuthMethod | null | undefined;\n challengeToken: string | null | undefined;\n loggedInUser: { id: string } | null | undefined;\n mfaLevel: MfaLevel | null | undefined;\n nextStep: LoginNextStep | null | undefined;\n};\n\ntype LoginErrorReason =\n 'INVALID_CREDENTIALS' | 'ACCOUNT_LOCKED' | 'RATE_LIMITED' | 'INTERNAL_ERROR';\n\ntype LogoutErrorReason =\n 'UNAUTHENTICATED' | 'SESSION_NOT_FOUND' | 'INTERNAL_ERROR';\n\ntype BeginAuthenticationErrorReason = 'INVALID_EMAIL' | 'INTERNAL_ERROR';\n\ntype BeginPasskeyLoginErrorReason =\n | 'INVALID_EMAIL'\n | 'PASSKEY_NOT_FOUND'\n | 'PASSKEY_NOT_SUPPORTED'\n | 'INTERNAL_ERROR';\n\ntype FinishPasskeyLoginErrorReason =\n | 'INVALID_CHALLENGE_TOKEN'\n | 'CHALLENGE_EXPIRED'\n | 'INVALID_ASSERTION'\n | 'INTERNAL_ERROR';\n\ntype CompleteMfaErrorReason =\n | 'INVALID_CHALLENGE_TOKEN'\n | 'CHALLENGE_EXPIRED'\n | 'INVALID_CODE'\n | 'TOO_MANY_ATTEMPTS'\n | 'INTERNAL_ERROR';\n\ntype AcceptInvitationErrorReason =\n | 'INVALID_TOKEN'\n | 'TOKEN_EXPIRED'\n | 'ALREADY_ACCEPTED'\n | 'PASSWORD_MISMATCH'\n | 'PASSWORD_POLICY_VIOLATION'\n | 'RATE_LIMITED'\n | 'EMAIL_MISMATCH'\n | 'INTERNAL_ERROR';\n\nexport type BeginAuthenticationPayload =\n MutationPayloadBase<BeginAuthenticationErrorReason> & {\n lockedUntil: string | null | undefined;\n methods: readonly {\n method: AuthMethod;\n mfaEnforced?: boolean | null | undefined;\n }[];\n };\n\nexport type BeginPasskeyLoginPayload =\n MutationPayloadBase<BeginPasskeyLoginErrorReason> & {\n allowCredentials: readonly string[];\n challenge: string;\n challengeToken: string;\n rpId: string;\n };\n\ntype LoginMutationPayload = MutationPayloadBase<LoginErrorReason> & {\n payload?: AuthPayload | null | undefined;\n};\n\ntype LogoutPayload = {\n loggedOut?: boolean | null | undefined;\n};\n\ntype LogoutMutationPayload = MutationPayloadBase<LogoutErrorReason> & {\n payload?: LogoutPayload | null | undefined;\n};\n\ntype CompleteMfaMutationPayload =\n MutationPayloadBase<CompleteMfaErrorReason> & {\n payload?: AuthPayload | null | undefined;\n };\n\ntype FinishPasskeyLoginMutationPayload =\n MutationPayloadBase<FinishPasskeyLoginErrorReason> & {\n payload?: AuthPayload | null | undefined;\n };\n\ntype AcceptInvitationMutationPayload =\n MutationPayloadBase<AcceptInvitationErrorReason> & {\n payload?: AuthPayload | null | undefined;\n };\n\nexport type LoginResponse = { login: AuthPayload | LoginMutationPayload };\nexport type LogoutResponse = { logout: LogoutPayload | LogoutMutationPayload };\nexport type CompleteMfaResponse = {\n completeMfa: AuthPayload | CompleteMfaMutationPayload;\n};\nexport type FinishPasskeyLoginResponse = {\n finishPasskeyLogin: AuthPayload | FinishPasskeyLoginMutationPayload;\n};\nexport type AcceptInvitationResponse = {\n acceptInvitation: AuthPayload | AcceptInvitationMutationPayload;\n};\nexport type BeginAuthenticationResponse = {\n beginAuthentication: BeginAuthenticationPayload;\n};\nexport type BeginPasskeyLoginResponse = {\n beginPasskeyLogin: BeginPasskeyLoginPayload;\n};\n\nexport type LoginVariables = {\n input: LoginCredentials;\n};\n\nexport type LogoutVariables = Record<PropertyKey, never>;\n\nexport type CompleteMfaVariables = {\n input: {\n challengeToken: string;\n code: string;\n };\n};\n\nexport type BeginPasskeyLoginVariables = {\n email: string;\n};\n\nexport type FinishPasskeyLoginVariables = {\n input: {\n challenge: string;\n challengeToken: string;\n credentialId: string;\n signCount: number;\n userHandle?: string | null;\n };\n};\n\nexport type AcceptInvitationVariables = {\n input: {\n token: string;\n password: string;\n passwordConfirmation: string;\n };\n};\n\nexport type BeginAuthenticationVariables = {\n email: string;\n};\n\ntype MutationCommitConfig<TVariables, TResponse> = {\n variables: TVariables;\n onCompleted?: (\n response: TResponse,\n errors: readonly PayloadError[] | null,\n ) => void;\n onError?: (error: Error) => void;\n};\n\ntype MutationCommit<TVariables, TResponse> = (\n config: MutationCommitConfig<TVariables, TResponse>,\n) => void;\n\ntype MutationEntry<TVariables, TResponse> = {\n commit: MutationCommit<TVariables, TResponse>;\n isInFlight: boolean;\n};\n\nexport type AuthMutationHooks = {\n login: MutationEntry<LoginVariables, LoginResponse>;\n logout: MutationEntry<LogoutVariables, LogoutResponse>;\n completeMfa: MutationEntry<CompleteMfaVariables, CompleteMfaResponse>;\n beginPasskeyLogin: MutationEntry<\n BeginPasskeyLoginVariables,\n BeginPasskeyLoginResponse\n >;\n finishPasskeyLogin: MutationEntry<\n FinishPasskeyLoginVariables,\n FinishPasskeyLoginResponse\n >;\n acceptInvitation?: MutationEntry<\n AcceptInvitationVariables,\n AcceptInvitationResponse\n >;\n beginAuthentication: MutationEntry<\n BeginAuthenticationVariables,\n BeginAuthenticationResponse\n >;\n};\n\ninterface User {\n id: string;\n}\n\nexport type LoginStatus = 'success' | 'mfa-required' | 'error';\n\nexport interface LoginCredentials {\n email: string;\n password: string;\n}\n\nexport interface TotpCredentials {\n code: string;\n}\n\nexport interface AcceptInvitationCredentials {\n token: string;\n password: string;\n passwordConfirmation: string;\n}\n\nexport interface AuthError {\n message: string;\n code?: string;\n}\n\nexport interface UseAuthReturn {\n authMethod: AuthMethod | null;\n challengeToken: string | null;\n nextStep: LoginNextStep | null;\n mfaLevel: MfaLevel | null;\n emailHint: string | null;\n lockedUntil: string | null;\n availableMethods: AuthMethod[];\n login: (credentials: LoginCredentials) => Promise<LoginStatus>;\n loginWithPasskey: (params: { email: string }) => Promise<LoginStatus>;\n completeMfa: (credentials: TotpCredentials) => Promise<void>;\n acceptInvitation: (\n credentials: AcceptInvitationCredentials,\n ) => Promise<LoginStatus>;\n beginAuthentication: (\n email: string,\n ) => Promise<{ methods: AuthMethod[]; lockedUntil: string | null }>;\n logout: () => Promise<void>;\n reset: () => void;\n clearError: () => void;\n isLoading: boolean;\n error: AuthError | null;\n user: User | null;\n}\n\nconst initialState = {\n authMethod: null as AuthMethod | null,\n challengeToken: null as string | null,\n emailHint: null as string | null,\n mfaLevel: null as MfaLevel | null,\n nextStep: null as LoginNextStep | null,\n};\n\nexport const createUseAuth = (mutations: AuthMutationHooks) => {\n return (): UseAuthReturn => {\n const { t } = useBackofficeReactTranslation();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n const [user, setUser] = useState<User | null>(null);\n const [lockedUntil, setLockedUntil] = useState<string | null>(null);\n const [availableMethods, setAvailableMethods] = useState<AuthMethod[]>([]);\n const [authState, setAuthState] = useState(initialState);\n\n const commitLoginMutation = mutations.login.commit;\n const commitLogoutMutation = mutations.logout.commit;\n const commitCompleteMfaMutation = mutations.completeMfa.commit;\n const commitBeginPasskeyLoginMutation = mutations.beginPasskeyLogin.commit;\n const commitFinishPasskeyLoginMutation =\n mutations.finishPasskeyLogin.commit;\n const commitAcceptInvitationMutation = mutations.acceptInvitation?.commit;\n const commitBeginAuthenticationMutation =\n mutations.beginAuthentication.commit;\n\n const defaultLoginErrorMessage = t('auth.loginFlow.errors.tryAgain');\n const defaultBeginAuthenticationErrorMessage = t(\n 'auth.loginFlow.errors.tryAgain',\n );\n const defaultPasskeyErrorMessage = t('auth.passkey.errors.failed');\n const defaultMfaErrorMessage = t('auth.mfa.errors.verificationFailed');\n const defaultInvitationErrorMessage = t(\n 'auth.acceptInvitation.errors.default',\n );\n const mfaInvalidChallengeMessage = t('auth.mfa.errors.invalidChallenge');\n const passkeyNotAvailableMessage = t('auth.passkey.errors.notAvailable');\n const defaultLogoutErrorMessage = t('auth.logout.errors.default');\n const passkeyCancelledMessage = t('auth.passkey.errors.cancelled');\n const passkeyNoCredentialMessage = t('auth.passkey.errors.noCredential');\n const invitationUnavailableMessage = t(\n 'auth.acceptInvitation.errors.unavailable',\n );\n\n const reset = useCallback(() => {\n setError(null);\n setUser(null);\n setLockedUntil(null);\n setAvailableMethods([]);\n setAuthState(initialState);\n }, []);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const updateAuthStateFromPayload = useCallback(\n (payload: AuthPayload): LoginStatus => {\n const authMethod = payload.authMethod ?? null;\n const challengeToken = payload.challengeToken ?? null;\n const mfaLevel = payload.mfaLevel ?? null;\n const nextStep = payload.nextStep ?? null;\n\n setAuthState((prev) => {\n return {\n ...prev,\n authMethod,\n challengeToken,\n mfaLevel,\n nextStep,\n };\n });\n\n if (payload.loggedInUser != null && nextStep == null) {\n setUser({\n id: payload.loggedInUser.id,\n });\n return 'success';\n }\n\n if (nextStep === 'TOTP' && challengeToken != null) {\n return 'mfa-required';\n }\n\n return 'error';\n },\n [],\n );\n\n const isMutationPayload = useCallback(\n (value: unknown): value is MutationPayloadBase => {\n return (\n value != null &&\n typeof value === 'object' &&\n ('status' in value || 'result' in value)\n );\n },\n [],\n );\n\n const mapLoginReason = useCallback(\n (reason: LoginErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_CREDENTIALS':\n return t('auth.loginFlow.errors.invalidCredentials');\n case 'ACCOUNT_LOCKED':\n return t('auth.loginFlow.errors.accountLocked');\n case 'RATE_LIMITED':\n return t('auth.loginFlow.errors.rateLimited');\n case 'INTERNAL_ERROR':\n return t('auth.loginFlow.errors.tryAgain');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapBeginAuthenticationReason = useCallback(\n (reason: BeginAuthenticationErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_EMAIL':\n return t('auth.loginFlow.errors.invalidEmail');\n case 'INTERNAL_ERROR':\n return t('auth.loginFlow.errors.tryAgain');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapBeginPasskeyLoginReason = useCallback(\n (reason: BeginPasskeyLoginErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_EMAIL':\n return t('auth.passkey.errors.invalidEmail');\n case 'PASSKEY_NOT_FOUND':\n return t('auth.passkey.errors.notFound');\n case 'PASSKEY_NOT_SUPPORTED':\n return t('auth.passkey.errors.notAvailable');\n case 'INTERNAL_ERROR':\n return t('auth.passkey.errors.failed');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapFinishPasskeyLoginReason = useCallback(\n (reason: FinishPasskeyLoginErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_CHALLENGE_TOKEN':\n return t('auth.passkey.errors.invalidChallenge');\n case 'CHALLENGE_EXPIRED':\n return t('auth.passkey.errors.challengeExpired');\n case 'INVALID_ASSERTION':\n return t('auth.passkey.errors.invalidAssertion');\n case 'INTERNAL_ERROR':\n return t('auth.passkey.errors.failed');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapCompleteMfaReason = useCallback(\n (reason: CompleteMfaErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_CHALLENGE_TOKEN':\n return t('auth.mfa.errors.invalidChallenge');\n case 'CHALLENGE_EXPIRED':\n return t('auth.mfa.errors.expired');\n case 'INVALID_CODE':\n return t('auth.mfa.errors.invalidCode');\n case 'TOO_MANY_ATTEMPTS':\n return t('auth.mfa.errors.tooManyAttempts');\n case 'INTERNAL_ERROR':\n return t('auth.mfa.errors.verificationFailed');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapAcceptInvitationReason = useCallback(\n (reason: AcceptInvitationErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_TOKEN':\n return t('auth.acceptInvitation.errors.invalidToken');\n case 'TOKEN_EXPIRED':\n return t('auth.acceptInvitation.errors.expired');\n case 'ALREADY_ACCEPTED':\n return t('auth.acceptInvitation.errors.alreadyAccepted');\n case 'PASSWORD_MISMATCH':\n return t('auth.acceptInvitation.errors.passwordMismatch');\n case 'PASSWORD_POLICY_VIOLATION':\n return t('auth.acceptInvitation.errors.passwordPolicyViolation');\n case 'RATE_LIMITED':\n return t('auth.acceptInvitation.errors.rateLimited');\n case 'EMAIL_MISMATCH':\n return t('auth.acceptInvitation.errors.emailMismatch');\n case 'INTERNAL_ERROR':\n return t('auth.acceptInvitation.errors.default');\n default:\n return null;\n }\n },\n [t],\n );\n\n const beginAuthentication = useCallback(\n async (\n email: string,\n ): Promise<{ methods: AuthMethod[]; lockedUntil: string | null }> => {\n return new Promise((resolve, reject) => {\n commitBeginAuthenticationMutation({\n variables: { email },\n onCompleted: (response) => {\n const rawPayload = response.beginAuthentication;\n let payload = rawPayload;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultBeginAuthenticationErrorMessage,\n mapReason: mapBeginAuthenticationReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n payload = outcome.payload;\n }\n\n const methods = payload.methods.map((item) => {\n return item.method;\n });\n const locked = payload.lockedUntil ?? null;\n setAvailableMethods(methods);\n setLockedUntil(locked);\n resolve({ methods, lockedUntil: locked });\n },\n onError: () => {\n const authError: AuthError = {\n message: defaultBeginAuthenticationErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n commitBeginAuthenticationMutation,\n defaultBeginAuthenticationErrorMessage,\n isMutationPayload,\n mapBeginAuthenticationReason,\n ],\n );\n\n const login = useCallback(\n async (credentials: LoginCredentials): Promise<LoginStatus> => {\n setIsLoading(true);\n setError(null);\n setAuthState((prev) => {\n return {\n ...prev,\n emailHint: credentials.email,\n };\n });\n\n return new Promise((resolve, reject) => {\n commitLoginMutation({\n variables: {\n input: credentials,\n },\n onCompleted: (response) => {\n setIsLoading(false);\n const rawPayload = response.login;\n let authPayload: AuthPayload | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultLoginErrorMessage,\n mapReason: mapLoginReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n authPayload = rawPayload.payload ?? null;\n } else {\n authPayload = rawPayload;\n }\n\n if (authPayload == null) {\n const authError: AuthError = {\n message: defaultLoginErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n const status = updateAuthStateFromPayload(authPayload);\n if (status === 'success' || status === 'mfa-required') {\n resolve(status);\n return;\n }\n\n const authError: AuthError = {\n message: defaultLoginErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultLoginErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n commitLoginMutation,\n defaultLoginErrorMessage,\n isMutationPayload,\n mapLoginReason,\n updateAuthStateFromPayload,\n ],\n );\n\n const completeMfa = useCallback(\n async (credentials: TotpCredentials): Promise<void> => {\n const { challengeToken } = authState;\n if (challengeToken == null) {\n const authError: AuthError = {\n message: mfaInvalidChallengeMessage,\n };\n setError(authError);\n return Promise.reject(authError);\n }\n\n setIsLoading(true);\n setError(null);\n\n return new Promise((resolve, reject) => {\n commitCompleteMfaMutation({\n variables: {\n input: {\n challengeToken,\n code: credentials.code,\n },\n },\n onCompleted: (response) => {\n setIsLoading(false);\n const rawPayload = response.completeMfa;\n let authPayload: AuthPayload | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultMfaErrorMessage,\n mapReason: mapCompleteMfaReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n authPayload = rawPayload.payload ?? null;\n } else {\n authPayload = rawPayload;\n }\n\n if (authPayload == null) {\n const authError: AuthError = {\n message: defaultMfaErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n const status = updateAuthStateFromPayload(authPayload);\n if (status === 'success') {\n resolve();\n return;\n }\n\n const authError: AuthError = {\n message: defaultMfaErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultMfaErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n authState,\n commitCompleteMfaMutation,\n defaultMfaErrorMessage,\n isMutationPayload,\n mapCompleteMfaReason,\n mfaInvalidChallengeMessage,\n updateAuthStateFromPayload,\n ],\n );\n\n const loginWithPasskey = useCallback(\n async ({ email }: { email: string }): Promise<LoginStatus> => {\n if (typeof window === 'undefined') {\n const authError: AuthError = {\n message: passkeyNotAvailableMessage,\n };\n setError(authError);\n return Promise.reject(authError);\n }\n\n setIsLoading(true);\n setError(null);\n setAuthState((prev) => {\n return {\n ...prev,\n emailHint: email,\n };\n });\n\n return new Promise((resolve, reject) => {\n commitBeginPasskeyLoginMutation({\n variables: {\n email,\n },\n onCompleted: (response) => {\n const rawOptions = response.beginPasskeyLogin;\n let options = rawOptions;\n\n if (isMutationPayload(rawOptions)) {\n const outcome = resolveMutationOutcome(rawOptions, {\n defaultErrorMessage: defaultPasskeyErrorMessage,\n mapReason: mapBeginPasskeyLoginReason,\n });\n if (!outcome.ok) {\n setIsLoading(false);\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n options = outcome.payload;\n }\n\n const continuePasskeyLogin = async (): Promise<void> => {\n try {\n const assertion = (await navigator.credentials.get({\n publicKey: {\n allowCredentials: options.allowCredentials.map(\n (credentialId) => {\n return {\n id: base64UrlToBuffer(credentialId),\n type: 'public-key' as const,\n };\n },\n ),\n challenge: base64UrlToBuffer(options.challenge),\n rpId: options.rpId,\n userVerification: 'preferred',\n },\n })) as PublicKeyCredential | null;\n\n if (assertion == null) {\n throw new Error('PASSKEY_NO_CREDENTIAL');\n }\n\n const assertionResponse =\n assertion.response as AuthenticatorAssertionResponse;\n const signCount = parseSignCount(\n assertionResponse.authenticatorData,\n );\n\n commitFinishPasskeyLoginMutation({\n variables: {\n input: {\n challenge: options.challenge,\n challengeToken: options.challengeToken,\n credentialId: assertion.id,\n signCount,\n userHandle:\n assertionResponse.userHandle != null\n ? bufferToBase64Url(assertionResponse.userHandle)\n : null,\n },\n },\n onCompleted: (finishResponse) => {\n setIsLoading(false);\n const rawPayload = finishResponse.finishPasskeyLogin;\n let authPayload: AuthPayload | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultPasskeyErrorMessage,\n mapReason: mapFinishPasskeyLoginReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n authPayload = rawPayload.payload ?? null;\n } else {\n authPayload = rawPayload;\n }\n\n if (authPayload == null) {\n const authError: AuthError = {\n message: defaultPasskeyErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n const status = updateAuthStateFromPayload(authPayload);\n if (status === 'success') {\n resolve(status);\n return;\n }\n const authError: AuthError = {\n message: defaultPasskeyErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultPasskeyErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n } catch (credentialError) {\n setIsLoading(false);\n let message = defaultPasskeyErrorMessage;\n if (\n credentialError instanceof Error &&\n credentialError.message === 'PASSKEY_NO_CREDENTIAL'\n ) {\n message = passkeyNoCredentialMessage;\n } else if (\n typeof DOMException !== 'undefined' &&\n credentialError instanceof DOMException\n ) {\n if (\n credentialError.name === 'AbortError' ||\n credentialError.name === 'NotAllowedError'\n ) {\n message = passkeyCancelledMessage;\n } else if (\n credentialError.name === 'InvalidStateError' ||\n credentialError.name === 'NotSupportedError' ||\n credentialError.name === 'SecurityError'\n ) {\n message = passkeyNotAvailableMessage;\n }\n }\n const authError: AuthError = {\n message,\n };\n setError(authError);\n reject(authError);\n }\n };\n\n continuePasskeyLogin().catch(() => {\n return undefined;\n });\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultPasskeyErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n commitBeginPasskeyLoginMutation,\n commitFinishPasskeyLoginMutation,\n defaultPasskeyErrorMessage,\n isMutationPayload,\n mapBeginPasskeyLoginReason,\n mapFinishPasskeyLoginReason,\n passkeyCancelledMessage,\n passkeyNoCredentialMessage,\n passkeyNotAvailableMessage,\n updateAuthStateFromPayload,\n ],\n );\n\n const acceptInvitation = useCallback(\n async (\n credentials: AcceptInvitationCredentials,\n ): Promise<LoginStatus> => {\n if (commitAcceptInvitationMutation == null) {\n const authError: AuthError = {\n message: invitationUnavailableMessage,\n };\n setError(authError);\n return Promise.reject(authError);\n }\n\n setIsLoading(true);\n setError(null);\n\n return new Promise((resolve, reject) => {\n commitAcceptInvitationMutation({\n variables: {\n input: {\n token: credentials.token,\n password: credentials.password,\n passwordConfirmation: credentials.passwordConfirmation,\n },\n },\n onCompleted: (response) => {\n setIsLoading(false);\n const rawPayload = response.acceptInvitation;\n let authPayload: AuthPayload | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultInvitationErrorMessage,\n mapReason: mapAcceptInvitationReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n authPayload = rawPayload.payload ?? null;\n } else {\n authPayload = rawPayload;\n }\n\n if (authPayload == null) {\n const authError: AuthError = {\n message: defaultInvitationErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n const status = updateAuthStateFromPayload(authPayload);\n if (status === 'success' || status === 'mfa-required') {\n resolve(status);\n return;\n }\n const authError: AuthError = {\n message: defaultInvitationErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultInvitationErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n commitAcceptInvitationMutation,\n defaultInvitationErrorMessage,\n invitationUnavailableMessage,\n isMutationPayload,\n mapAcceptInvitationReason,\n updateAuthStateFromPayload,\n ],\n );\n\n const logout = useCallback(async (): Promise<void> => {\n setIsLoading(true);\n\n return new Promise((resolve, reject) => {\n commitLogoutMutation({\n variables: {},\n onCompleted: (response) => {\n setIsLoading(false);\n const rawPayload = response.logout;\n let loggedOutValue: boolean | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultLogoutErrorMessage,\n });\n if (!outcome.ok) {\n const authError: AuthError = { message: outcome.message };\n setError(authError);\n reject(authError);\n return;\n }\n\n const loggedOutResult = requireField(\n rawPayload.payload?.loggedOut ?? null,\n defaultLogoutErrorMessage,\n );\n if (!loggedOutResult.ok) {\n const authError: AuthError = {\n message: loggedOutResult.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n loggedOutValue = loggedOutResult.value;\n } else {\n const loggedOutResult = requireField(\n rawPayload.loggedOut ?? null,\n defaultLogoutErrorMessage,\n );\n if (!loggedOutResult.ok) {\n const authError: AuthError = {\n message: loggedOutResult.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n loggedOutValue = loggedOutResult.value;\n }\n\n if (!loggedOutValue) {\n const authError: AuthError = {\n message: defaultLogoutErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n localStorage.removeItem('auth_token');\n localStorage.removeItem('remember_me');\n setUser(null);\n setAuthState(initialState);\n resetRelayStore();\n\n resolve();\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultLogoutErrorMessage,\n };\n setError(authError);\n resetRelayStore();\n\n reject(authError);\n },\n });\n });\n }, [commitLogoutMutation, defaultLogoutErrorMessage, isMutationPayload]);\n\n const combinedIsLoading =\n isLoading ||\n mutations.login.isInFlight ||\n mutations.logout.isInFlight ||\n mutations.completeMfa.isInFlight ||\n mutations.beginPasskeyLogin.isInFlight ||\n mutations.finishPasskeyLogin.isInFlight ||\n (mutations.acceptInvitation?.isInFlight ?? false) ||\n mutations.beginAuthentication.isInFlight;\n\n return {\n authMethod: authState.authMethod,\n challengeToken: authState.challengeToken,\n nextStep: authState.nextStep,\n mfaLevel: authState.mfaLevel,\n emailHint: authState.emailHint,\n login,\n loginWithPasskey,\n completeMfa,\n acceptInvitation,\n beginAuthentication,\n logout,\n reset,\n clearError,\n isLoading: combinedIsLoading,\n error,\n user,\n lockedUntil,\n availableMethods,\n };\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useAuth.js","names":[],"sources":["../../../src/hooks/useAuth.ts"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { useCallback, useState } from 'react';\nimport { resetRelayStore } from '@plumile/relay/environment.js';\n\nimport {\n type MutationPayloadBase,\n requireField,\n resolveMutationOutcome,\n} from '../relay/mutationResult.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\n\nimport type { PayloadError } from 'relay-runtime';\n\nimport type {\n AuthMethod,\n LoginNextStep,\n MfaLevel,\n} from '../modules/sharedSchemaTypes.js';\nimport {\n base64UrlToBuffer,\n bufferToBase64Url,\n parseSignCount,\n} from '../modules/webauthn.js';\n\nexport type AuthPayload = {\n authMethod: AuthMethod | null | undefined;\n challengeToken: string | null | undefined;\n loggedInUser: { id: string } | null | undefined;\n mfaLevel: MfaLevel | null | undefined;\n nextStep: LoginNextStep | null | undefined;\n};\n\ntype LoginErrorReason =\n 'INVALID_CREDENTIALS' | 'ACCOUNT_LOCKED' | 'RATE_LIMITED' | 'INTERNAL_ERROR';\n\ntype LogoutErrorReason =\n 'UNAUTHENTICATED' | 'SESSION_NOT_FOUND' | 'INTERNAL_ERROR';\n\ntype BeginAuthenticationErrorReason = 'INVALID_EMAIL' | 'INTERNAL_ERROR';\n\ntype BeginPasskeyLoginErrorReason =\n | 'INVALID_EMAIL'\n | 'PASSKEY_NOT_FOUND'\n | 'PASSKEY_NOT_SUPPORTED'\n | 'INTERNAL_ERROR';\n\ntype FinishPasskeyLoginErrorReason =\n | 'INVALID_CHALLENGE_TOKEN'\n | 'CHALLENGE_EXPIRED'\n | 'INVALID_ASSERTION'\n | 'INTERNAL_ERROR';\n\ntype CompleteMfaErrorReason =\n | 'INVALID_CHALLENGE_TOKEN'\n | 'CHALLENGE_EXPIRED'\n | 'INVALID_CODE'\n | 'TOO_MANY_ATTEMPTS'\n | 'INTERNAL_ERROR';\n\ntype AcceptInvitationErrorReason =\n | 'INVALID_TOKEN'\n | 'TOKEN_EXPIRED'\n | 'ALREADY_ACCEPTED'\n | 'PASSWORD_MISMATCH'\n | 'PASSWORD_POLICY_VIOLATION'\n | 'RATE_LIMITED'\n | 'EMAIL_MISMATCH'\n | 'INTERNAL_ERROR';\n\nexport type BeginAuthenticationPayload =\n MutationPayloadBase<BeginAuthenticationErrorReason> & {\n lockedUntil: string | null | undefined;\n methods: readonly {\n method: AuthMethod;\n mfaEnforced?: boolean | null | undefined;\n }[];\n };\n\nexport type BeginPasskeyLoginPayload =\n MutationPayloadBase<BeginPasskeyLoginErrorReason> & {\n allowCredentials: readonly string[];\n challenge: string;\n challengeToken: string;\n rpId: string;\n };\n\ntype LoginMutationPayload = MutationPayloadBase<LoginErrorReason> & {\n payload?: AuthPayload | null | undefined;\n};\n\ntype LogoutPayload = {\n loggedOut?: boolean | null | undefined;\n};\n\ntype LogoutMutationPayload = MutationPayloadBase<LogoutErrorReason> & {\n payload?: LogoutPayload | null | undefined;\n};\n\ntype CompleteMfaMutationPayload =\n MutationPayloadBase<CompleteMfaErrorReason> & {\n payload?: AuthPayload | null | undefined;\n };\n\ntype FinishPasskeyLoginMutationPayload =\n MutationPayloadBase<FinishPasskeyLoginErrorReason> & {\n payload?: AuthPayload | null | undefined;\n };\n\ntype AcceptInvitationMutationPayload =\n MutationPayloadBase<AcceptInvitationErrorReason> & {\n payload?: AuthPayload | null | undefined;\n };\n\nexport type LoginResponse = { login: AuthPayload | LoginMutationPayload };\nexport type LogoutResponse = { logout: LogoutPayload | LogoutMutationPayload };\nexport type CompleteMfaResponse = {\n completeMfa: AuthPayload | CompleteMfaMutationPayload;\n};\nexport type FinishPasskeyLoginResponse = {\n finishPasskeyLogin: AuthPayload | FinishPasskeyLoginMutationPayload;\n};\nexport type AcceptInvitationResponse = {\n acceptInvitation: AuthPayload | AcceptInvitationMutationPayload;\n};\nexport type BeginAuthenticationResponse = {\n beginAuthentication: BeginAuthenticationPayload;\n};\nexport type BeginPasskeyLoginResponse = {\n beginPasskeyLogin: BeginPasskeyLoginPayload;\n};\n\nexport type LoginVariables = {\n input: LoginCredentials;\n};\n\nexport type LogoutVariables = Record<PropertyKey, never>;\n\nexport type CompleteMfaVariables = {\n input: {\n challengeToken: string;\n code: string;\n };\n};\n\nexport type BeginPasskeyLoginVariables = {\n email: string;\n};\n\nexport type FinishPasskeyLoginVariables = {\n input: {\n challenge: string;\n challengeToken: string;\n credentialId: string;\n signCount: number;\n userHandle?: string | null;\n };\n};\n\nexport type AcceptInvitationVariables = {\n input: {\n token: string;\n password: string;\n passwordConfirmation: string;\n };\n};\n\nexport type BeginAuthenticationVariables = {\n email: string;\n};\n\ntype MutationCommitConfig<TVariables, TResponse> = {\n variables: TVariables;\n onCompleted?: (\n response: TResponse,\n errors: readonly PayloadError[] | null,\n ) => void;\n onError?: (error: Error) => void;\n};\n\ntype MutationCommit<TVariables, TResponse> = (\n config: MutationCommitConfig<TVariables, TResponse>,\n) => void;\n\ntype MutationEntry<TVariables, TResponse> = {\n commit: MutationCommit<TVariables, TResponse>;\n isInFlight: boolean;\n};\n\nexport type AuthMutationHooks = {\n login: MutationEntry<LoginVariables, LoginResponse>;\n logout: MutationEntry<LogoutVariables, LogoutResponse>;\n completeMfa: MutationEntry<CompleteMfaVariables, CompleteMfaResponse>;\n beginPasskeyLogin: MutationEntry<\n BeginPasskeyLoginVariables,\n BeginPasskeyLoginResponse\n >;\n finishPasskeyLogin: MutationEntry<\n FinishPasskeyLoginVariables,\n FinishPasskeyLoginResponse\n >;\n acceptInvitation?: MutationEntry<\n AcceptInvitationVariables,\n AcceptInvitationResponse\n >;\n beginAuthentication: MutationEntry<\n BeginAuthenticationVariables,\n BeginAuthenticationResponse\n >;\n};\n\ninterface User {\n id: string;\n}\n\nexport type LoginStatus = 'success' | 'mfa-required' | 'error';\n\nexport interface LoginCredentials {\n email: string;\n password: string;\n}\n\nexport interface TotpCredentials {\n code: string;\n}\n\nexport interface AcceptInvitationCredentials {\n token: string;\n password: string;\n passwordConfirmation: string;\n}\n\nexport interface AuthError {\n message: string;\n code?: string;\n}\n\nexport interface UseAuthReturn {\n authMethod: AuthMethod | null;\n challengeToken: string | null;\n nextStep: LoginNextStep | null;\n mfaLevel: MfaLevel | null;\n emailHint: string | null;\n lockedUntil: string | null;\n availableMethods: AuthMethod[];\n login: (credentials: LoginCredentials) => Promise<LoginStatus>;\n loginWithPasskey: (params: { email: string }) => Promise<LoginStatus>;\n completeMfa: (credentials: TotpCredentials) => Promise<void>;\n acceptInvitation: (\n credentials: AcceptInvitationCredentials,\n ) => Promise<LoginStatus>;\n beginAuthentication: (\n email: string,\n ) => Promise<{ methods: AuthMethod[]; lockedUntil: string | null }>;\n logout: () => Promise<void>;\n reset: () => void;\n clearError: () => void;\n isLoading: boolean;\n error: AuthError | null;\n user: User | null;\n}\n\nconst initialState = {\n authMethod: null as AuthMethod | null,\n challengeToken: null as string | null,\n emailHint: null as string | null,\n mfaLevel: null as MfaLevel | null,\n nextStep: null as LoginNextStep | null,\n};\n\nexport const createUseAuth = (mutations: AuthMutationHooks) => {\n return (): UseAuthReturn => {\n const { t } = useBackofficeReactTranslation();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n const [user, setUser] = useState<User | null>(null);\n const [lockedUntil, setLockedUntil] = useState<string | null>(null);\n const [availableMethods, setAvailableMethods] = useState<AuthMethod[]>([]);\n const [authState, setAuthState] = useState(initialState);\n\n const commitLoginMutation = mutations.login.commit;\n const commitLogoutMutation = mutations.logout.commit;\n const commitCompleteMfaMutation = mutations.completeMfa.commit;\n const commitBeginPasskeyLoginMutation = mutations.beginPasskeyLogin.commit;\n const commitFinishPasskeyLoginMutation =\n mutations.finishPasskeyLogin.commit;\n const commitAcceptInvitationMutation = mutations.acceptInvitation?.commit;\n const commitBeginAuthenticationMutation =\n mutations.beginAuthentication.commit;\n\n const defaultLoginErrorMessage = t('auth.loginFlow.errors.tryAgain');\n const defaultBeginAuthenticationErrorMessage = t(\n 'auth.loginFlow.errors.tryAgain',\n );\n const defaultPasskeyErrorMessage = t('auth.passkey.errors.failed');\n const defaultMfaErrorMessage = t('auth.mfa.errors.verificationFailed');\n const defaultInvitationErrorMessage = t(\n 'auth.acceptInvitation.errors.default',\n );\n const mfaInvalidChallengeMessage = t('auth.mfa.errors.invalidChallenge');\n const passkeyNotAvailableMessage = t('auth.passkey.errors.notAvailable');\n const defaultLogoutErrorMessage = t('auth.logout.errors.default');\n const passkeyCancelledMessage = t('auth.passkey.errors.cancelled');\n const passkeyNoCredentialMessage = t('auth.passkey.errors.noCredential');\n const invitationUnavailableMessage = t(\n 'auth.acceptInvitation.errors.unavailable',\n );\n\n const reset = useCallback(() => {\n setError(null);\n setUser(null);\n setLockedUntil(null);\n setAvailableMethods([]);\n setAuthState(initialState);\n }, []);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const updateAuthStateFromPayload = useCallback(\n (payload: AuthPayload): LoginStatus => {\n const authMethod = payload.authMethod ?? null;\n const challengeToken = payload.challengeToken ?? null;\n const mfaLevel = payload.mfaLevel ?? null;\n const nextStep = payload.nextStep ?? null;\n\n setAuthState((prev) => {\n return {\n ...prev,\n authMethod,\n challengeToken,\n mfaLevel,\n nextStep,\n };\n });\n\n if (payload.loggedInUser != null && nextStep == null) {\n setUser({\n id: payload.loggedInUser.id,\n });\n return 'success';\n }\n\n if (nextStep === 'TOTP' && challengeToken != null) {\n return 'mfa-required';\n }\n\n return 'error';\n },\n [],\n );\n\n const isMutationPayload = useCallback(\n (value: unknown): value is MutationPayloadBase => {\n return (\n value != null &&\n typeof value === 'object' &&\n ('status' in value || 'result' in value)\n );\n },\n [],\n );\n\n const mapLoginReason = useCallback(\n (reason: LoginErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_CREDENTIALS':\n return t('auth.loginFlow.errors.invalidCredentials');\n case 'ACCOUNT_LOCKED':\n return t('auth.loginFlow.errors.accountLocked');\n case 'RATE_LIMITED':\n return t('auth.loginFlow.errors.rateLimited');\n case 'INTERNAL_ERROR':\n return t('auth.loginFlow.errors.tryAgain');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapBeginAuthenticationReason = useCallback(\n (reason: BeginAuthenticationErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_EMAIL':\n return t('auth.loginFlow.errors.invalidEmail');\n case 'INTERNAL_ERROR':\n return t('auth.loginFlow.errors.tryAgain');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapBeginPasskeyLoginReason = useCallback(\n (reason: BeginPasskeyLoginErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_EMAIL':\n return t('auth.passkey.errors.invalidEmail');\n case 'PASSKEY_NOT_FOUND':\n return t('auth.passkey.errors.notFound');\n case 'PASSKEY_NOT_SUPPORTED':\n return t('auth.passkey.errors.notAvailable');\n case 'INTERNAL_ERROR':\n return t('auth.passkey.errors.failed');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapFinishPasskeyLoginReason = useCallback(\n (reason: FinishPasskeyLoginErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_CHALLENGE_TOKEN':\n return t('auth.passkey.errors.invalidChallenge');\n case 'CHALLENGE_EXPIRED':\n return t('auth.passkey.errors.challengeExpired');\n case 'INVALID_ASSERTION':\n return t('auth.passkey.errors.invalidAssertion');\n case 'INTERNAL_ERROR':\n return t('auth.passkey.errors.failed');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapCompleteMfaReason = useCallback(\n (reason: CompleteMfaErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_CHALLENGE_TOKEN':\n return t('auth.mfa.errors.invalidChallenge');\n case 'CHALLENGE_EXPIRED':\n return t('auth.mfa.errors.expired');\n case 'INVALID_CODE':\n return t('auth.mfa.errors.invalidCode');\n case 'TOO_MANY_ATTEMPTS':\n return t('auth.mfa.errors.tooManyAttempts');\n case 'INTERNAL_ERROR':\n return t('auth.mfa.errors.verificationFailed');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapAcceptInvitationReason = useCallback(\n (reason: AcceptInvitationErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_TOKEN':\n return t('auth.acceptInvitation.errors.invalidToken');\n case 'TOKEN_EXPIRED':\n return t('auth.acceptInvitation.errors.expired');\n case 'ALREADY_ACCEPTED':\n return t('auth.acceptInvitation.errors.alreadyAccepted');\n case 'PASSWORD_MISMATCH':\n return t('auth.acceptInvitation.errors.passwordMismatch');\n case 'PASSWORD_POLICY_VIOLATION':\n return t('auth.acceptInvitation.errors.passwordPolicyViolation');\n case 'RATE_LIMITED':\n return t('auth.acceptInvitation.errors.rateLimited');\n case 'EMAIL_MISMATCH':\n return t('auth.acceptInvitation.errors.emailMismatch');\n case 'INTERNAL_ERROR':\n return t('auth.acceptInvitation.errors.default');\n default:\n return null;\n }\n },\n [t],\n );\n\n const beginAuthentication = useCallback(\n async (\n email: string,\n ): Promise<{ methods: AuthMethod[]; lockedUntil: string | null }> => {\n return new Promise((resolve, reject) => {\n commitBeginAuthenticationMutation({\n variables: { email },\n onCompleted: (response) => {\n const rawPayload = response.beginAuthentication;\n let payload = rawPayload;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultBeginAuthenticationErrorMessage,\n mapReason: mapBeginAuthenticationReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n payload = outcome.payload;\n }\n\n const methods = payload.methods.map((item) => {\n return item.method;\n });\n const locked = payload.lockedUntil ?? null;\n setAvailableMethods(methods);\n setLockedUntil(locked);\n resolve({ methods, lockedUntil: locked });\n },\n onError: () => {\n const authError: AuthError = {\n message: defaultBeginAuthenticationErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n commitBeginAuthenticationMutation,\n defaultBeginAuthenticationErrorMessage,\n isMutationPayload,\n mapBeginAuthenticationReason,\n ],\n );\n\n const login = useCallback(\n async (credentials: LoginCredentials): Promise<LoginStatus> => {\n setIsLoading(true);\n setError(null);\n setAuthState((prev) => {\n return {\n ...prev,\n emailHint: credentials.email,\n };\n });\n\n return new Promise((resolve, reject) => {\n commitLoginMutation({\n variables: {\n input: credentials,\n },\n onCompleted: (response) => {\n setIsLoading(false);\n const rawPayload = response.login;\n let authPayload: AuthPayload | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultLoginErrorMessage,\n mapReason: mapLoginReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n authPayload = rawPayload.payload ?? null;\n } else {\n authPayload = rawPayload;\n }\n\n if (authPayload == null) {\n const authError: AuthError = {\n message: defaultLoginErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n const status = updateAuthStateFromPayload(authPayload);\n if (status === 'success' || status === 'mfa-required') {\n resolve(status);\n return;\n }\n\n const authError: AuthError = {\n message: defaultLoginErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultLoginErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n commitLoginMutation,\n defaultLoginErrorMessage,\n isMutationPayload,\n mapLoginReason,\n updateAuthStateFromPayload,\n ],\n );\n\n const completeMfa = useCallback(\n async (credentials: TotpCredentials): Promise<void> => {\n const { challengeToken } = authState;\n if (challengeToken == null) {\n const authError: AuthError = {\n message: mfaInvalidChallengeMessage,\n };\n setError(authError);\n return Promise.reject(authError);\n }\n\n setIsLoading(true);\n setError(null);\n\n return new Promise((resolve, reject) => {\n commitCompleteMfaMutation({\n variables: {\n input: {\n challengeToken,\n code: credentials.code,\n },\n },\n onCompleted: (response) => {\n setIsLoading(false);\n const rawPayload = response.completeMfa;\n let authPayload: AuthPayload | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultMfaErrorMessage,\n mapReason: mapCompleteMfaReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n authPayload = rawPayload.payload ?? null;\n } else {\n authPayload = rawPayload;\n }\n\n if (authPayload == null) {\n const authError: AuthError = {\n message: defaultMfaErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n const status = updateAuthStateFromPayload(authPayload);\n if (status === 'success') {\n resolve();\n return;\n }\n\n const authError: AuthError = {\n message: defaultMfaErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultMfaErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n authState,\n commitCompleteMfaMutation,\n defaultMfaErrorMessage,\n isMutationPayload,\n mapCompleteMfaReason,\n mfaInvalidChallengeMessage,\n updateAuthStateFromPayload,\n ],\n );\n\n const loginWithPasskey = useCallback(\n async ({ email }: { email: string }): Promise<LoginStatus> => {\n if (typeof window === 'undefined') {\n const authError: AuthError = {\n message: passkeyNotAvailableMessage,\n };\n setError(authError);\n return Promise.reject(authError);\n }\n\n setIsLoading(true);\n setError(null);\n setAuthState((prev) => {\n return {\n ...prev,\n emailHint: email,\n };\n });\n\n return new Promise((resolve, reject) => {\n commitBeginPasskeyLoginMutation({\n variables: {\n email,\n },\n onCompleted: (response) => {\n const rawOptions = response.beginPasskeyLogin;\n let options = rawOptions;\n\n if (isMutationPayload(rawOptions)) {\n const outcome = resolveMutationOutcome(rawOptions, {\n defaultErrorMessage: defaultPasskeyErrorMessage,\n mapReason: mapBeginPasskeyLoginReason,\n });\n if (!outcome.ok) {\n setIsLoading(false);\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n options = outcome.payload;\n }\n\n const continuePasskeyLogin = async (): Promise<void> => {\n try {\n const assertion = (await navigator.credentials.get({\n publicKey: {\n allowCredentials: options.allowCredentials.map(\n (credentialId) => {\n return {\n id: base64UrlToBuffer(credentialId),\n type: 'public-key' as const,\n };\n },\n ),\n challenge: base64UrlToBuffer(options.challenge),\n rpId: options.rpId,\n userVerification: 'preferred',\n },\n })) as PublicKeyCredential | null;\n\n if (assertion == null) {\n throw new Error('PASSKEY_NO_CREDENTIAL');\n }\n\n const assertionResponse =\n assertion.response as AuthenticatorAssertionResponse;\n const signCount = parseSignCount(\n assertionResponse.authenticatorData,\n );\n\n commitFinishPasskeyLoginMutation({\n variables: {\n input: {\n challenge: options.challenge,\n challengeToken: options.challengeToken,\n credentialId: assertion.id,\n signCount,\n userHandle:\n assertionResponse.userHandle != null\n ? bufferToBase64Url(assertionResponse.userHandle)\n : null,\n },\n },\n onCompleted: (finishResponse) => {\n setIsLoading(false);\n const rawPayload = finishResponse.finishPasskeyLogin;\n let authPayload: AuthPayload | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultPasskeyErrorMessage,\n mapReason: mapFinishPasskeyLoginReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n authPayload = rawPayload.payload ?? null;\n } else {\n authPayload = rawPayload;\n }\n\n if (authPayload == null) {\n const authError: AuthError = {\n message: defaultPasskeyErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n const status = updateAuthStateFromPayload(authPayload);\n if (status === 'success') {\n resolve(status);\n return;\n }\n const authError: AuthError = {\n message: defaultPasskeyErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultPasskeyErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n } catch (credentialError) {\n setIsLoading(false);\n let message = defaultPasskeyErrorMessage;\n if (\n credentialError instanceof Error &&\n credentialError.message === 'PASSKEY_NO_CREDENTIAL'\n ) {\n message = passkeyNoCredentialMessage;\n } else if (\n typeof DOMException !== 'undefined' &&\n credentialError instanceof DOMException\n ) {\n if (\n credentialError.name === 'AbortError' ||\n credentialError.name === 'NotAllowedError'\n ) {\n message = passkeyCancelledMessage;\n } else if (\n credentialError.name === 'InvalidStateError' ||\n credentialError.name === 'NotSupportedError' ||\n credentialError.name === 'SecurityError'\n ) {\n message = passkeyNotAvailableMessage;\n }\n }\n const authError: AuthError = {\n message,\n };\n setError(authError);\n reject(authError);\n }\n };\n\n continuePasskeyLogin().catch(() => {\n return undefined;\n });\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultPasskeyErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n commitBeginPasskeyLoginMutation,\n commitFinishPasskeyLoginMutation,\n defaultPasskeyErrorMessage,\n isMutationPayload,\n mapBeginPasskeyLoginReason,\n mapFinishPasskeyLoginReason,\n passkeyCancelledMessage,\n passkeyNoCredentialMessage,\n passkeyNotAvailableMessage,\n updateAuthStateFromPayload,\n ],\n );\n\n const acceptInvitation = useCallback(\n async (\n credentials: AcceptInvitationCredentials,\n ): Promise<LoginStatus> => {\n if (commitAcceptInvitationMutation == null) {\n const authError: AuthError = {\n message: invitationUnavailableMessage,\n };\n setError(authError);\n return Promise.reject(authError);\n }\n\n setIsLoading(true);\n setError(null);\n\n return new Promise((resolve, reject) => {\n commitAcceptInvitationMutation({\n variables: {\n input: {\n token: credentials.token,\n password: credentials.password,\n passwordConfirmation: credentials.passwordConfirmation,\n },\n },\n onCompleted: (response) => {\n setIsLoading(false);\n const rawPayload = response.acceptInvitation;\n let authPayload: AuthPayload | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultInvitationErrorMessage,\n mapReason: mapAcceptInvitationReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n authPayload = rawPayload.payload ?? null;\n } else {\n authPayload = rawPayload;\n }\n\n if (authPayload == null) {\n const authError: AuthError = {\n message: defaultInvitationErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n const status = updateAuthStateFromPayload(authPayload);\n if (status === 'success' || status === 'mfa-required') {\n resolve(status);\n return;\n }\n const authError: AuthError = {\n message: defaultInvitationErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultInvitationErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n commitAcceptInvitationMutation,\n defaultInvitationErrorMessage,\n invitationUnavailableMessage,\n isMutationPayload,\n mapAcceptInvitationReason,\n updateAuthStateFromPayload,\n ],\n );\n\n const logout = useCallback(async (): Promise<void> => {\n setIsLoading(true);\n\n return new Promise((resolve, reject) => {\n commitLogoutMutation({\n variables: {},\n onCompleted: (response) => {\n setIsLoading(false);\n const rawPayload = response.logout;\n let loggedOutValue: boolean | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultLogoutErrorMessage,\n });\n if (!outcome.ok) {\n const authError: AuthError = { message: outcome.message };\n setError(authError);\n reject(authError);\n return;\n }\n\n const loggedOutResult = requireField(\n rawPayload.payload?.loggedOut ?? null,\n defaultLogoutErrorMessage,\n );\n if (!loggedOutResult.ok) {\n const authError: AuthError = {\n message: loggedOutResult.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n loggedOutValue = loggedOutResult.value;\n } else {\n const loggedOutResult = requireField(\n rawPayload.loggedOut ?? null,\n defaultLogoutErrorMessage,\n );\n if (!loggedOutResult.ok) {\n const authError: AuthError = {\n message: loggedOutResult.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n loggedOutValue = loggedOutResult.value;\n }\n\n if (!loggedOutValue) {\n const authError: AuthError = {\n message: defaultLogoutErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n localStorage.removeItem('auth_token');\n localStorage.removeItem('remember_me');\n setUser(null);\n setAuthState(initialState);\n resetRelayStore();\n\n resolve();\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultLogoutErrorMessage,\n };\n setError(authError);\n resetRelayStore();\n\n reject(authError);\n },\n });\n });\n }, [commitLogoutMutation, defaultLogoutErrorMessage, isMutationPayload]);\n\n const combinedIsLoading =\n isLoading ||\n mutations.login.isInFlight ||\n mutations.logout.isInFlight ||\n mutations.completeMfa.isInFlight ||\n mutations.beginPasskeyLogin.isInFlight ||\n mutations.finishPasskeyLogin.isInFlight ||\n (mutations.acceptInvitation?.isInFlight ?? false) ||\n mutations.beginAuthentication.isInFlight;\n\n return {\n authMethod: authState.authMethod,\n challengeToken: authState.challengeToken,\n nextStep: authState.nextStep,\n mfaLevel: authState.mfaLevel,\n emailHint: authState.emailHint,\n login,\n loginWithPasskey,\n completeMfa,\n acceptInvitation,\n beginAuthentication,\n logout,\n reset,\n clearError,\n isLoading: combinedIsLoading,\n error,\n user,\n lockedUntil,\n availableMethods,\n };\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import { useCallback as e, useEffect as t, useMemo as n, useRef as r, useState as i, useSyncExternalStore as a } from "react";
|
|
2
|
+
import * as o from "react-relay";
|
|
3
|
+
import { getRelayTransportSnapshot as s, subscribeRelayTransport as c } from "@plumile/relay/environment.js";
|
|
4
4
|
//#region src/hooks/useConditionalSubscription.ts
|
|
5
5
|
var l = [];
|
|
6
6
|
function u() {
|
|
7
|
-
return Reflect.get(
|
|
7
|
+
return Reflect.get(o, "default") ?? o;
|
|
8
8
|
}
|
|
9
9
|
var d = u();
|
|
10
|
-
function f(
|
|
11
|
-
let f = d.useRelayEnvironment(), [p, m] =
|
|
10
|
+
function f(o, u) {
|
|
11
|
+
let f = d.useRelayEnvironment(), [p, m] = i(null), [h, g] = i(!1), [_, v] = i(!1), y = a(c, () => s().generation, () => s().generation), { enabled: b = !0, deps: x = l, getVariables: S } = u, C = e(() => {
|
|
12
12
|
try {
|
|
13
|
-
return S == null ?
|
|
13
|
+
return S == null ? o.variables : S();
|
|
14
14
|
} catch {
|
|
15
15
|
return null;
|
|
16
16
|
}
|
|
17
|
-
}, [
|
|
17
|
+
}, [o.variables, S]), w = n(() => C(), [C]), T = n(() => {
|
|
18
18
|
if (w == null) return null;
|
|
19
19
|
try {
|
|
20
20
|
return JSON.stringify(w);
|
|
21
21
|
} catch {
|
|
22
22
|
return null;
|
|
23
23
|
}
|
|
24
|
-
}, [w]), E = !!b, D = E && w != null && h && p == null && !_, O =
|
|
25
|
-
return
|
|
24
|
+
}, [w]), E = !!b, D = E && w != null && h && p == null && !_, O = r(null);
|
|
25
|
+
return t(() => {
|
|
26
26
|
let e = null, t = C();
|
|
27
27
|
return E && t != null && (m(null), v(!1), g(!0), e = d.requestSubscription(f, {
|
|
28
|
-
subscription:
|
|
28
|
+
subscription: o.subscription,
|
|
29
29
|
variables: t,
|
|
30
|
-
cacheConfig:
|
|
31
|
-
configs:
|
|
30
|
+
cacheConfig: o.cacheConfig,
|
|
31
|
+
configs: o.configs,
|
|
32
32
|
onCompleted: () => {
|
|
33
|
-
v(!0), g(!1),
|
|
33
|
+
v(!0), g(!1), o.onCompleted?.();
|
|
34
34
|
},
|
|
35
35
|
onError: (e) => {
|
|
36
|
-
m(e), g(!1),
|
|
36
|
+
m(e), g(!1), o.onError?.(e);
|
|
37
37
|
},
|
|
38
|
-
onNext:
|
|
39
|
-
updater:
|
|
38
|
+
onNext: o.onNext,
|
|
39
|
+
updater: o.updater
|
|
40
40
|
}), O.current = e), () => {
|
|
41
41
|
if (g(!1), e != null) try {
|
|
42
42
|
e.dispose();
|
|
@@ -44,7 +44,7 @@ function f(c, u) {
|
|
|
44
44
|
O.current === e && (O.current = null);
|
|
45
45
|
};
|
|
46
46
|
}, [
|
|
47
|
-
|
|
47
|
+
o,
|
|
48
48
|
x,
|
|
49
49
|
f,
|
|
50
50
|
E,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConditionalSubscription.js","names":[],"sources":["../../../src/hooks/useConditionalSubscription.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { GraphQLSubscriptionConfig, OperationType } from 'relay-runtime';\
|
|
1
|
+
{"version":3,"file":"useConditionalSubscription.js","names":[],"sources":["../../../src/hooks/useConditionalSubscription.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { GraphQLSubscriptionConfig, OperationType } from 'relay-runtime';\nimport {\n getRelayTransportSnapshot,\n subscribeRelayTransport,\n} from '@plumile/relay/environment.js';\n\ntype ConditionalOptions<T extends OperationType> = {\n enabled: boolean;\n deps?: readonly unknown[];\n getVariables?: () => T['variables'];\n};\n\ntype UseConditionalSubscriptionReturn = {\n active: boolean;\n completed: boolean;\n error: Error | null;\n};\n\ntype Hop = { dispose: () => void } | null;\n\nconst EMPTY_DEPS: readonly unknown[] = [];\n\n/** Resolve the Relay module regardless of whether the package exposes a default export shim. */\nfunction resolveRelayApi(): typeof ReactRelay {\n const relayDefault: unknown = Reflect.get(ReactRelay, 'default');\n if (relayDefault != null) {\n return relayDefault as typeof ReactRelay;\n }\n return ReactRelay;\n}\n\nconst relayApi = resolveRelayApi();\n\n/** Subscribe only when the caller enables the subscription and variables exist. */\nexport function useConditionalSubscription<T extends OperationType>(\n config: GraphQLSubscriptionConfig<T>,\n options: ConditionalOptions<T>,\n): UseConditionalSubscriptionReturn {\n const environment = relayApi.useRelayEnvironment();\n const [error, setError] = useState<Error | null>(null);\n const [isSubscribed, setIsSubscribed] = useState(false);\n const [completed, setCompleted] = useState(false);\n const transportGeneration = useSyncExternalStore(\n subscribeRelayTransport,\n () => {\n return getRelayTransportSnapshot().generation;\n },\n () => {\n return getRelayTransportSnapshot().generation;\n },\n );\n\n const { enabled = true, deps = EMPTY_DEPS, getVariables } = options;\n\n const resolveVariables = useCallback((): T['variables'] | null => {\n try {\n if (getVariables != null) {\n return getVariables();\n }\n return config.variables;\n } catch {\n return null;\n }\n }, [config.variables, getVariables]);\n\n const resolvedVariables = useMemo<T['variables'] | null>(() => {\n return resolveVariables();\n }, [resolveVariables]);\n\n const stableVarsString = useMemo(() => {\n if (resolvedVariables == null) {\n return null;\n }\n try {\n return JSON.stringify(resolvedVariables);\n } catch {\n return null;\n }\n }, [resolvedVariables]);\n\n const isEnabled = Boolean(enabled);\n const variables = resolvedVariables;\n const canSubscribe = isEnabled && variables != null;\n const active = canSubscribe && isSubscribed && error == null && !completed;\n\n const disposableRef = useRef<Hop>(null);\n\n useEffect(() => {\n let disposable: Hop = null;\n const variables = resolveVariables();\n\n if (isEnabled && variables != null) {\n setError(null);\n setCompleted(false);\n setIsSubscribed(true);\n\n disposable = relayApi.requestSubscription<T>(environment, {\n subscription: config.subscription,\n variables,\n cacheConfig: config.cacheConfig,\n configs: config.configs,\n onCompleted: () => {\n setCompleted(true);\n setIsSubscribed(false);\n config.onCompleted?.();\n },\n onError: (nextError) => {\n setError(nextError);\n setIsSubscribed(false);\n config.onError?.(nextError);\n },\n onNext: config.onNext,\n updater: config.updater,\n });\n\n disposableRef.current = disposable;\n }\n\n return () => {\n setIsSubscribed(false);\n if (disposable != null) {\n try {\n disposable.dispose();\n } catch {\n // ignore cleanup failures\n }\n }\n if (disposableRef.current === disposable) {\n disposableRef.current = null;\n }\n };\n }, [\n config,\n deps,\n environment,\n isEnabled,\n resolveVariables,\n stableVarsString,\n transportGeneration,\n ]);\n\n return { active, completed, error };\n}\n"],"mappings":";;;;AA6BA,IAAM,IAAiC,CAAC;AAGxC,SAAS,IAAqC;CAK5C,OAJ8B,QAAQ,IAAI,GAAY,SAClD,KAGG;AACT;AAEA,IAAM,IAAW,EAAgB;AAGjC,SAAgB,EACd,GACA,GACkC;CAClC,IAAM,IAAc,EAAS,oBAAoB,GAC3C,CAAC,GAAO,KAAY,EAAuB,IAAI,GAC/C,CAAC,GAAc,KAAmB,EAAS,EAAK,GAChD,CAAC,GAAW,KAAgB,EAAS,EAAK,GAC1C,IAAsB,EAC1B,SAES,EAA0B,CAAC,CAAC,kBAG5B,EAA0B,CAAC,CAAC,UAEvC,GAEM,EAAE,aAAU,IAAM,UAAO,GAAY,oBAAiB,GAEtD,IAAmB,QAAyC;EAChE,IAAI;GAIF,OAHI,KAAgB,OAGb,EAAO,YAFL,EAAa;EAGxB,QAAQ;GACN,OAAO;EACT;CACF,GAAG,CAAC,EAAO,WAAW,CAAY,CAAC,GAE7B,IAAoB,QACjB,EAAiB,GACvB,CAAC,CAAgB,CAAC,GAEf,IAAmB,QAAc;EACrC,IAAI,KAAqB,MACvB,OAAO;EAET,IAAI;GACF,OAAO,KAAK,UAAU,CAAiB;EACzC,QAAQ;GACN,OAAO;EACT;CACF,GAAG,CAAC,CAAiB,CAAC,GAEhB,IAAY,EAAQ,GAGpB,IADe,KAAa,KAAa,QAChB,KAAgB,KAAS,QAAQ,CAAC,GAE3D,IAAgB,EAAY,IAAI;CAwDtC,OAtDA,QAAgB;EACd,IAAI,IAAkB,MAChB,IAAY,EAAiB;EA6BnC,OA3BI,KAAa,KAAa,SAC5B,EAAS,IAAI,GACb,EAAa,EAAK,GAClB,EAAgB,EAAI,GAEpB,IAAa,EAAS,oBAAuB,GAAa;GACxD,cAAc,EAAO;GACrB;GACA,aAAa,EAAO;GACpB,SAAS,EAAO;GAChB,mBAAmB;IAGjB,AAFA,EAAa,EAAI,GACjB,EAAgB,EAAK,GACrB,EAAO,cAAc;GACvB;GACA,UAAU,MAAc;IAGtB,AAFA,EAAS,CAAS,GAClB,EAAgB,EAAK,GACrB,EAAO,UAAU,CAAS;GAC5B;GACA,QAAQ,EAAO;GACf,SAAS,EAAO;EAClB,CAAC,GAED,EAAc,UAAU,UAGb;GAEX,IADA,EAAgB,EAAK,GACjB,KAAc,MAChB,IAAI;IACF,EAAW,QAAQ;GACrB,QAAQ,CAER;GAEF,AAAI,EAAc,YAAY,MAC5B,EAAc,UAAU;EAE5B;CACF,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,GAEM;EAAE;EAAQ;EAAW;CAAM;AACpC"}
|
|
@@ -1,92 +1,94 @@
|
|
|
1
1
|
import { startTransition as e, useCallback as t, useEffect as n, useMemo as r, useRef as i, useState as a } from "react";
|
|
2
2
|
//#region src/hooks/useInfiniteConnection.ts
|
|
3
|
-
var o = ({ nodes: o, hasNext: s, isLoadingNext: c, runLoadMore: l, surface: u
|
|
4
|
-
let [
|
|
5
|
-
|
|
3
|
+
var o = ({ nodes: o, hasNext: s, isLoadingNext: c, runLoadMore: l, surface: u, resetKey: d, timeoutMs: f = 15e3, onTelemetry: p, onUiError: m, onError: h }) => {
|
|
4
|
+
let [g, _] = a(null), v = i(!1), y = i(null), b = i(0), x = t(() => {
|
|
5
|
+
y.current != null && (clearTimeout(y.current), y.current = null);
|
|
6
6
|
}, []);
|
|
7
7
|
n(() => () => {
|
|
8
|
-
|
|
9
|
-
}, [
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
8
|
+
x();
|
|
9
|
+
}, [x]), n(() => {
|
|
10
|
+
b.current += 1, v.current = !1, x(), _(null);
|
|
11
|
+
}, [x, d]);
|
|
12
|
+
let S = t(() => {
|
|
13
|
+
if (!s || c || v.current) return;
|
|
14
|
+
v.current = !0;
|
|
15
|
+
let t = b.current + 1;
|
|
16
|
+
b.current = t, _(null);
|
|
15
17
|
let n = Date.now();
|
|
16
|
-
|
|
18
|
+
p?.("list_load_more_requested", {
|
|
17
19
|
surface: u,
|
|
18
20
|
loadedCount: o.length
|
|
19
|
-
}),
|
|
20
|
-
|
|
21
|
+
}), x(), y.current = setTimeout(() => {
|
|
22
|
+
b.current === t && (b.current = t + 1, v.current = !1, _(/* @__PURE__ */ Error("timeout")), p?.("list_load_more_failed", {
|
|
21
23
|
surface: u,
|
|
22
|
-
durationMs:
|
|
23
|
-
}),
|
|
24
|
+
durationMs: f
|
|
25
|
+
}), h?.({
|
|
24
26
|
scope: "infinite_scroll_timeout",
|
|
25
27
|
message: "Load more timed out",
|
|
26
28
|
payload: {
|
|
27
29
|
surface: u,
|
|
28
|
-
durationMs:
|
|
30
|
+
durationMs: f
|
|
29
31
|
}
|
|
30
|
-
}),
|
|
32
|
+
}), m?.("infinite_scroll_timeout", "Load more timed out", {
|
|
31
33
|
surface: u,
|
|
32
|
-
durationMs:
|
|
34
|
+
durationMs: f
|
|
33
35
|
}));
|
|
34
|
-
},
|
|
36
|
+
}, f), e(() => {
|
|
35
37
|
l((e) => {
|
|
36
|
-
if (
|
|
37
|
-
|
|
38
|
+
if (b.current !== t) return;
|
|
39
|
+
b.current = t + 1, v.current = !1, x();
|
|
38
40
|
let r = Date.now() - n;
|
|
39
41
|
if (e != null) {
|
|
40
|
-
|
|
42
|
+
_(e), p?.("list_load_more_failed", {
|
|
41
43
|
surface: u,
|
|
42
44
|
durationMs: r
|
|
43
|
-
}),
|
|
45
|
+
}), h?.({
|
|
44
46
|
scope: "infinite_scroll",
|
|
45
47
|
message: e.message,
|
|
46
48
|
payload: {
|
|
47
49
|
surface: u,
|
|
48
50
|
durationMs: r
|
|
49
51
|
}
|
|
50
|
-
}),
|
|
52
|
+
}), m?.("infinite_scroll", e.message, {
|
|
51
53
|
surface: u,
|
|
52
54
|
durationMs: r
|
|
53
55
|
});
|
|
54
56
|
return;
|
|
55
57
|
}
|
|
56
|
-
|
|
58
|
+
p?.("list_load_more_succeeded", {
|
|
57
59
|
surface: u,
|
|
58
60
|
durationMs: r
|
|
59
61
|
});
|
|
60
62
|
});
|
|
61
63
|
});
|
|
62
64
|
}, [
|
|
63
|
-
|
|
65
|
+
x,
|
|
64
66
|
s,
|
|
65
67
|
c,
|
|
66
68
|
o.length,
|
|
67
|
-
|
|
68
|
-
f,
|
|
69
|
+
h,
|
|
69
70
|
p,
|
|
71
|
+
m,
|
|
70
72
|
l,
|
|
71
73
|
u,
|
|
72
|
-
|
|
73
|
-
]),
|
|
74
|
-
|
|
75
|
-
}, [
|
|
74
|
+
f
|
|
75
|
+
]), C = t(() => {
|
|
76
|
+
S();
|
|
77
|
+
}, [S]);
|
|
76
78
|
return r(() => ({
|
|
77
79
|
nodes: o,
|
|
78
80
|
hasNext: s,
|
|
79
81
|
isLoadingNext: c,
|
|
80
|
-
incrementalError:
|
|
81
|
-
loadMoreSafe:
|
|
82
|
-
retryLoadMore:
|
|
82
|
+
incrementalError: g,
|
|
83
|
+
loadMoreSafe: S,
|
|
84
|
+
retryLoadMore: C
|
|
83
85
|
}), [
|
|
84
86
|
o,
|
|
85
87
|
s,
|
|
86
88
|
c,
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
89
|
+
g,
|
|
90
|
+
S,
|
|
91
|
+
C
|
|
90
92
|
]);
|
|
91
93
|
};
|
|
92
94
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInfiniteConnection.js","names":[],"sources":["../../../src/hooks/useInfiniteConnection.ts"],"sourcesContent":["import {\n startTransition,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nexport type LoadMoreRunner = (\n onComplete: (error: Error | null) => void,\n) => void;\n\nexport type InfiniteConnectionTelemetryPayload = {\n surface: string;\n loadedCount?: number;\n durationMs?: number;\n};\n\nexport type InfiniteConnectionTelemetryEvent =\n | 'list_load_more_requested'\n | 'list_load_more_failed'\n | 'list_load_more_succeeded';\n\nexport type InfiniteConnectionErrorEvent = {\n scope: 'infinite_scroll' | 'infinite_scroll_timeout';\n message: string;\n payload: {\n surface: string;\n durationMs: number;\n };\n};\n\nexport type UseInfiniteConnectionParams<TNode> = {\n nodes: readonly TNode[];\n hasNext: boolean;\n isLoadingNext: boolean;\n runLoadMore: LoadMoreRunner;\n surface
|
|
1
|
+
{"version":3,"file":"useInfiniteConnection.js","names":[],"sources":["../../../src/hooks/useInfiniteConnection.ts"],"sourcesContent":["import {\n startTransition,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nexport type LoadMoreRunner = (\n onComplete: (error: Error | null) => void,\n) => void;\n\nexport type InfiniteConnectionTelemetryPayload = {\n surface: string;\n loadedCount?: number;\n durationMs?: number;\n};\n\nexport type InfiniteConnectionTelemetryEvent =\n | 'list_load_more_requested'\n | 'list_load_more_failed'\n | 'list_load_more_succeeded';\n\nexport type InfiniteConnectionErrorEvent = {\n scope: 'infinite_scroll' | 'infinite_scroll_timeout';\n message: string;\n payload: {\n surface: string;\n durationMs: number;\n };\n};\n\nexport type UseInfiniteConnectionParams<TNode> = {\n nodes: readonly TNode[];\n hasNext: boolean;\n isLoadingNext: boolean;\n runLoadMore: LoadMoreRunner;\n surface: string;\n resetKey: string | number;\n timeoutMs?: number;\n onTelemetry?: (\n event: InfiniteConnectionTelemetryEvent,\n payload: InfiniteConnectionTelemetryPayload,\n ) => void;\n onUiError?: (\n scope: InfiniteConnectionErrorEvent['scope'],\n message: string,\n payload: InfiniteConnectionErrorEvent['payload'],\n ) => void;\n onError?: (event: InfiniteConnectionErrorEvent) => void;\n};\n\nexport type UseInfiniteConnectionResult<TNode> = {\n nodes: readonly TNode[];\n hasNext: boolean;\n isLoadingNext: boolean;\n incrementalError: Error | null;\n loadMoreSafe: () => void;\n retryLoadMore: () => void;\n};\n\nexport const useInfiniteConnection = <TNode>({\n nodes,\n hasNext,\n isLoadingNext,\n runLoadMore,\n surface,\n resetKey,\n timeoutMs = 15_000,\n onTelemetry,\n onUiError,\n onError,\n}: UseInfiniteConnectionParams<TNode>): UseInfiniteConnectionResult<TNode> => {\n const [incrementalError, setIncrementalError] = useState<Error | null>(null);\n const inFlightRef = useRef(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const requestTokenRef = useRef(0);\n\n const clearPendingTimeout = useCallback(() => {\n if (timeoutRef.current == null) {\n return;\n }\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }, []);\n\n useEffect(() => {\n return () => {\n clearPendingTimeout();\n };\n }, [clearPendingTimeout]);\n\n useEffect(() => {\n requestTokenRef.current += 1;\n inFlightRef.current = false;\n clearPendingTimeout();\n setIncrementalError(null);\n }, [clearPendingTimeout, resetKey]);\n\n const loadMoreSafe = useCallback(() => {\n if (!hasNext || isLoadingNext || inFlightRef.current) {\n return;\n }\n inFlightRef.current = true;\n const requestToken = requestTokenRef.current + 1;\n requestTokenRef.current = requestToken;\n setIncrementalError(null);\n const startedAt = Date.now();\n onTelemetry?.('list_load_more_requested', {\n surface,\n loadedCount: nodes.length,\n });\n clearPendingTimeout();\n timeoutRef.current = setTimeout(() => {\n if (requestTokenRef.current !== requestToken) {\n return;\n }\n requestTokenRef.current = requestToken + 1;\n inFlightRef.current = false;\n setIncrementalError(new Error('timeout'));\n onTelemetry?.('list_load_more_failed', {\n surface,\n durationMs: timeoutMs,\n });\n onError?.({\n scope: 'infinite_scroll_timeout',\n message: 'Load more timed out',\n payload: {\n surface,\n durationMs: timeoutMs,\n },\n });\n onUiError?.('infinite_scroll_timeout', 'Load more timed out', {\n surface,\n durationMs: timeoutMs,\n });\n }, timeoutMs);\n\n startTransition(() => {\n runLoadMore((error) => {\n if (requestTokenRef.current !== requestToken) {\n return;\n }\n requestTokenRef.current = requestToken + 1;\n inFlightRef.current = false;\n clearPendingTimeout();\n const durationMs = Date.now() - startedAt;\n if (error != null) {\n setIncrementalError(error);\n onTelemetry?.('list_load_more_failed', {\n surface,\n durationMs,\n });\n onError?.({\n scope: 'infinite_scroll',\n message: error.message,\n payload: {\n surface,\n durationMs,\n },\n });\n onUiError?.('infinite_scroll', error.message, {\n surface,\n durationMs,\n });\n return;\n }\n onTelemetry?.('list_load_more_succeeded', {\n surface,\n durationMs,\n });\n });\n });\n }, [\n clearPendingTimeout,\n hasNext,\n isLoadingNext,\n nodes.length,\n onError,\n onTelemetry,\n onUiError,\n runLoadMore,\n surface,\n timeoutMs,\n ]);\n\n const retryLoadMore = useCallback(() => {\n loadMoreSafe();\n }, [loadMoreSafe]);\n\n return useMemo(() => {\n return {\n nodes,\n hasNext,\n isLoadingNext,\n incrementalError,\n loadMoreSafe,\n retryLoadMore,\n };\n }, [\n nodes,\n hasNext,\n isLoadingNext,\n incrementalError,\n loadMoreSafe,\n retryLoadMore,\n ]);\n};\n\nexport default useInfiniteConnection;\n"],"mappings":";;AA8DA,IAAa,KAAgC,EAC3C,UACA,YACA,kBACA,gBACA,YACA,aACA,eAAY,MACZ,gBACA,cACA,iBAC4E;CAC5E,IAAM,CAAC,GAAkB,KAAuB,EAAuB,IAAI,GACrE,IAAc,EAAO,EAAK,GAC1B,IAAa,EAA6C,IAAI,GAC9D,IAAkB,EAAO,CAAC,GAE1B,IAAsB,QAAkB;EACxC,EAAW,WAAW,SAG1B,aAAa,EAAW,OAAO,GAC/B,EAAW,UAAU;CACvB,GAAG,CAAC,CAAC;CAQL,AANA,cACe;EACX,EAAoB;CACtB,GACC,CAAC,CAAmB,CAAC,GAExB,QAAgB;EAId,AAHA,EAAgB,WAAW,GAC3B,EAAY,UAAU,IACtB,EAAoB,GACpB,EAAoB,IAAI;CAC1B,GAAG,CAAC,GAAqB,CAAQ,CAAC;CAElC,IAAM,IAAe,QAAkB;EACrC,IAAI,CAAC,KAAW,KAAiB,EAAY,SAC3C;EAEF,EAAY,UAAU;EACtB,IAAM,IAAe,EAAgB,UAAU;EAE/C,AADA,EAAgB,UAAU,GAC1B,EAAoB,IAAI;EACxB,IAAM,IAAY,KAAK,IAAI;EA+B3B,AA9BA,IAAc,4BAA4B;GACxC;GACA,aAAa,EAAM;EACrB,CAAC,GACD,EAAoB,GACpB,EAAW,UAAU,iBAAiB;GAChC,EAAgB,YAAY,MAGhC,EAAgB,UAAU,IAAe,GACzC,EAAY,UAAU,IACtB,EAAoB,gBAAI,MAAM,SAAS,CAAC,GACxC,IAAc,yBAAyB;IACrC;IACA,YAAY;GACd,CAAC,GACD,IAAU;IACR,OAAO;IACP,SAAS;IACT,SAAS;KACP;KACA,YAAY;IACd;GACF,CAAC,GACD,IAAY,2BAA2B,uBAAuB;IAC5D;IACA,YAAY;GACd,CAAC;EACH,GAAG,CAAS,GAEZ,QAAsB;GACpB,GAAa,MAAU;IACrB,IAAI,EAAgB,YAAY,GAC9B;IAIF,AAFA,EAAgB,UAAU,IAAe,GACzC,EAAY,UAAU,IACtB,EAAoB;IACpB,IAAM,IAAa,KAAK,IAAI,IAAI;IAChC,IAAI,KAAS,MAAM;KAcjB,AAbA,EAAoB,CAAK,GACzB,IAAc,yBAAyB;MACrC;MACA;KACF,CAAC,GACD,IAAU;MACR,OAAO;MACP,SAAS,EAAM;MACf,SAAS;OACP;OACA;MACF;KACF,CAAC,GACD,IAAY,mBAAmB,EAAM,SAAS;MAC5C;MACA;KACF,CAAC;KACD;IACF;IACA,IAAc,4BAA4B;KACxC;KACA;IACF,CAAC;GACH,CAAC;EACH,CAAC;CACH,GAAG;EACD;EACA;EACA;EACA,EAAM;EACN;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,GAEK,IAAgB,QAAkB;EACtC,EAAa;CACf,GAAG,CAAC,CAAY,CAAC;CAEjB,OAAO,SACE;EACL;EACA;EACA;EACA;EACA;EACA;CACF,IACC;EACD;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backofficeReact.js","names":[],"sources":["../../../../../src/i18n/locales/en/backofficeReact.json"],"sourcesContent":["{\n \"actions\": {\n \"form\": {\n \"cancel\": \"Cancel\",\n \"errors\": {\n \"invalidJson\": \"{{label}} must be valid JSON.\",\n \"invalidJsonArray\": \"{{label}} must be a valid JSON array.\",\n \"invalidJsonObject\": \"{{label}} must be a valid JSON object.\",\n \"invalidNumber\": \"{{label}} must be a valid number.\",\n \"invalidPayload\": \"The submitted payload is invalid.\",\n \"required\": \"{{label}} is required.\",\n \"submitFailed\": \"Unable to complete this action. Please try again.\"\n },\n \"submitting\": \"Submitting...\"\n },\n \"view\": \"View\"\n },\n \"auth\": {\n \"acceptInvitation\": {\n \"actions\": {\n \"backToLogin\": \"Back to login\"\n },\n \"errors\": {\n \"alreadyAccepted\": \"This invitation has already been accepted.\",\n \"default\": \"Unable to accept invitation.\",\n \"emailMismatch\": \"This invitation was sent to a different email address.\",\n \"expired\": \"Invitation link has expired.\",\n \"invalidToken\": \"Invitation link is invalid.\",\n \"missingToken\": \"Invitation link is missing or invalid.\",\n \"passwordMismatch\": \"Password and confirmation do not match.\",\n \"passwordPolicyViolation\": \"Your password does not meet policy requirements.\",\n \"rateLimited\": \"Too many attempts. Please try again later.\",\n \"unavailable\": \"Invitation acceptance is not available.\"\n },\n \"form\": {\n \"confirmLabel\": \"Confirm password\",\n \"confirmPlaceholder\": \"Confirm your password\",\n \"passwordLabel\": \"Password\",\n \"passwordPlaceholder\": \"Create a password\",\n \"submit\": \"Accept invitation\"\n },\n \"mfaSubtitle\": \"Enter the verification code to continue.\",\n \"mfaTitle\": \"Verify your identity\",\n \"status\": {\n \"success\": \"Invitation accepted.\",\n \"workingButton\": \"Working...\"\n },\n \"subtitle\": \"Create your account to join.\",\n \"title\": \"Accept invitation\"\n },\n \"emailCapture\": {\n \"continue\": \"Continue\",\n \"description\": \"Enter your work email to continue.\",\n \"emailLabel\": \"Work email\",\n \"emailPlaceholder\": \"you@company.com\",\n \"forgotPassword\": \"Forgot your password?\"\n },\n \"loginFlow\": {\n \"errors\": {\n \"accountLocked\": \"Too many attempts. Try again later.\",\n \"emailRequired\": \"Enter an email address to continue.\",\n \"invalidCredentials\": \"Email or password is incorrect.\",\n \"invalidEmail\": \"Enter a valid email address.\",\n \"passkeyUnavailable\": \"Passkeys are not available.\",\n \"rateLimited\": \"Too many attempts. Please try again later.\",\n \"tryAgain\": \"Something went wrong. Please try again.\"\n },\n \"methods\": {\n \"title\": \"Choose a sign-in method\"\n },\n \"passkey\": {\n \"description\": \"Use the passkey associated with {{email}}.\",\n \"title\": \"Use a passkey\"\n },\n \"subtitle\": {\n \"default\": \"Choose a sign-in method to continue.\",\n \"mfa\": \"Enter the verification code to continue.\"\n },\n \"title\": {\n \"default\": \"Sign in\",\n \"mfa\": \"Two-factor authentication\"\n }\n },\n \"logout\": {\n \"errors\": {\n \"default\": \"Logout failed.\"\n }\n },\n \"methodChooser\": {\n \"actions\": {\n \"back\": \"Back\"\n },\n \"locked\": \"Too many attempts. Try again later.\",\n \"lockedWithTime\": \"Too many attempts. Try again at {{time}}.\",\n \"methods\": {\n \"other\": \"{{method}}\",\n \"passkey\": \"Passkey\",\n \"password\": \"Password\"\n },\n \"prompt\": \"Choose how to sign in for <strong>{{email}}</strong>.\"\n },\n \"mfa\": {\n \"actions\": {\n \"back\": \"Back\",\n \"submit\": \"Verify\"\n },\n \"errors\": {\n \"expired\": \"Verification session expired. Please try again.\",\n \"invalidChallenge\": \"Verification session is invalid. Restart the login.\",\n \"invalidCode\": \"Invalid code. Try again.\",\n \"shortCode\": \"Enter the 6-digit code.\",\n \"tooManyAttempts\": \"Too many attempts. Try again later.\",\n \"verificationFailed\": \"Verification failed. Try again.\"\n },\n \"form\": {\n \"label\": \"Verification code\",\n \"placeholder\": \"123456\"\n },\n \"helper\": {\n \"default\": \"Enter the 6-digit code from your authenticator.\",\n \"withEmail\": \"Enter the 6-digit code sent to {{email}}.\"\n }\n },\n \"oidc\": {\n \"buttons\": {\n \"apple\": \"Continue with Apple\",\n \"generic\": \"Continue with single sign-on\",\n \"google\": \"Continue with Google\"\n }\n },\n \"passkey\": {\n \"actions\": {\n \"showMethods\": \"Use another method\",\n \"submit\": \"Continue with passkey\",\n \"submitting\": \"Waiting for passkey...\"\n },\n \"errors\": {\n \"cancelled\": \"Passkey sign-in was cancelled.\",\n \"challengeExpired\": \"Passkey request expired. Try again.\",\n \"emailRequired\": \"Enter your email to continue.\",\n \"failed\": \"Passkey sign-in failed.\",\n \"invalidAssertion\": \"Passkey response is invalid. Try again.\",\n \"invalidChallenge\": \"Passkey request is invalid. Try again.\",\n \"invalidEmail\": \"Enter a valid email address.\",\n \"locked\": \"Too many attempts. Try again later.\",\n \"lockedWithTime\": \"Too many attempts. Try again at {{time}}.\",\n \"noCredential\": \"No credential was returned by the authenticator.\",\n \"notAvailable\": \"Passkeys are not available on this device.\",\n \"notFound\": \"No passkey found for this account.\"\n },\n \"form\": {\n \"emailLabel\": \"Email\",\n \"emailPlaceholder\": \"you@company.com\"\n },\n \"helper\": \"Use a passkey instead of your password.\"\n },\n \"passwordLogin\": {\n \"forgotPassword\": \"Forgot your password?\",\n \"title\": \"Sign in\"\n },\n \"passwordResetComplete\": {\n \"errors\": {\n \"expired\": \"This reset link has expired.\",\n \"invalid\": \"Reset link is invalid or expired.\",\n \"minLength\": \"Password must be at least {{minLength}} characters.\",\n \"mismatch\": \"Passwords do not match.\",\n \"missingToken\": \"Reset link is missing or invalid.\",\n \"policyViolation\": \"Your new password does not meet policy requirements.\"\n },\n \"form\": {\n \"confirmLabel\": \"Confirm password\",\n \"confirmPlaceholder\": \"Re-enter your password\",\n \"description\": \"Enter a new password for your account.\",\n \"passwordLabel\": \"Password\",\n \"passwordPlaceholder\": \"Enter a new password\",\n \"submit\": \"Update password\",\n \"title\": \"New password\"\n },\n \"subtitle\": \"Choose a strong password to secure your account.\",\n \"success\": {\n \"action\": \"Back to login\",\n \"description\": \"Your password has been changed.\",\n \"helper\": \"You can now sign in with your new password.\",\n \"title\": \"Password updated\"\n },\n \"title\": \"Set a new password\"\n },\n \"passwordResetRequest\": {\n \"errors\": {\n \"emailRequired\": \"Enter an email address.\",\n \"invalidEmail\": \"Please enter a valid email address.\",\n \"rateLimited\": \"Too many requests. Please wait and try again.\",\n \"startFailed\": \"Unable to start password reset.\"\n },\n \"form\": {\n \"description\": \"Enter the email for your account.\",\n \"emailLabel\": \"Email\",\n \"emailPlaceholder\": \"you@company.com\",\n \"submit\": \"Send reset link\"\n },\n \"sent\": {\n \"action\": \"Send another email\",\n \"description\": \"We sent a reset link to {{email}}.\",\n \"helper\": \"If you don't see it, check spam or try again.\",\n \"title\": \"Check your email\"\n },\n \"title\": \"Reset your password\"\n },\n \"verifyEmail\": {\n \"actions\": {\n \"continue\": \"Continue\",\n \"return\": \"Back to login\"\n },\n \"errors\": {\n \"alreadyVerified\": \"This email address is already verified.\",\n \"expired\": \"This verification link has expired.\",\n \"invalid\": \"Verification link is invalid or expired.\",\n \"missingToken\": \"Verification link is missing or invalid.\"\n },\n \"status\": {\n \"success\": \"Email verified. You can continue.\",\n \"verifying\": \"Verifying...\",\n \"verifyingButton\": \"Verifying\"\n },\n \"subtitle\": \"Confirm your email address to continue.\",\n \"title\": \"Verify your email\"\n }\n },\n \"common\": {\n \"actions\": {\n \"close\": \"Close\",\n \"copied\": \"Copied\",\n \"copy\": \"Copy\",\n \"pick\": \"Pick\",\n \"retry\": \"Retry\"\n },\n \"boolean\": {\n \"no\": \"No\",\n \"yes\": \"Yes\"\n },\n \"breadcrumb\": \"Breadcrumb\",\n \"errors\": {\n \"unexpected\": \"An unexpected error occurred.\"\n },\n \"loading\": \"Loading...\",\n \"notAvailable\": \"N/A\",\n \"time\": {\n \"lastDay\": \"24 h\",\n \"lastHour\": \"1 h\",\n \"lastSevenDays\": \"7 j\",\n \"lastThirtyDays\": \"30 j\"\n }\n },\n \"dashboard\": {\n \"actions\": {\n \"openList\": \"Open list\",\n \"openTool\": \"Open tool\"\n },\n \"subtitle\": \"Overview of the Work context.\",\n \"title\": \"Dashboard\"\n },\n \"detail\": {\n \"actionResult\": {\n \"message\": \"Message\",\n \"status\": \"Status\"\n },\n \"actions\": {\n \"backToList\": \"Back to list\",\n \"viewDetails\": \"View details\"\n },\n \"columns\": {\n \"charged\": \"Charged\",\n \"events\": \"Events\",\n \"markup\": \"Markup\",\n \"name\": \"Name\",\n \"rawCost\": \"Raw cost\"\n },\n \"loadingTitle\": \"Detail\",\n \"notFound\": \"Not found\",\n \"notFoundDescription\": \"This item does not exist or is no longer available.\"\n },\n \"emptyState\": {\n \"listEmpty\": {\n \"description\": \"There are no records to display.\",\n \"title\": \"No results\"\n },\n \"listEmptyFiltered\": {\n \"actions\": {\n \"reset\": \"Reset filters\"\n },\n \"description\": \"No results match the current filters.\"\n }\n },\n \"filters\": {\n \"actions\": {\n \"applyFilter\": \"Apply {{label}} filter\",\n \"changeFilterValue\": \"Change {{label}}\",\n \"clearFilter\": \"Clear {{label}} filter\",\n \"filterBy\": \"Filter by {{label}}\",\n \"removeFilterValue\": \"Remove {{label}} value\"\n },\n \"all\": \"All {{label}}\",\n \"boolean\": {\n \"no\": \"No\",\n \"yes\": \"Yes\"\n },\n \"drawer\": {\n \"emptySearchResults\": \"No filters match this search.\"\n },\n \"placeholders\": {\n \"anyEntity\": \"All\",\n \"search\": \"Search {{label}}\",\n \"unresolved\": \"Unresolved ID\"\n },\n \"sections\": {\n \"default\": \"Filters\"\n },\n \"selectedEntities_one\": \"{{count}} selected\",\n \"selectedEntities_other\": \"{{count}} selected\",\n \"trigger\": \"Filters\",\n \"triggerWithCount_one\": \"Filters ({{count}})\",\n \"triggerWithCount_other\": \"Filters ({{count}})\"\n },\n \"flags\": {\n \"agentManaged\": {\n \"agentManaged\": \"Agent managed\",\n \"userManaged\": \"User managed\"\n },\n \"capability\": {\n \"allowed\": \"Allowed\",\n \"denied\": \"Denied\"\n },\n \"default\": {\n \"default\": \"Default\",\n \"notDefault\": \"Not default\"\n },\n \"deployedProduction\": {\n \"deployed\": \"Deployed\",\n \"notDeployed\": \"Not deployed\"\n },\n \"enabled\": {\n \"disabled\": \"Disabled\",\n \"enabled\": \"Enabled\"\n },\n \"encrypted\": {\n \"encrypted\": \"Encrypted\",\n \"notEncrypted\": \"Not encrypted\"\n },\n \"failure\": {\n \"failed\": \"Failed\",\n \"ok\": \"OK\"\n },\n \"forced\": {\n \"forced\": \"Forced\",\n \"normal\": \"Normal\"\n },\n \"locked\": {\n \"locked\": \"Locked\",\n \"unlocked\": \"Unlocked\"\n }\n },\n \"format\": {\n \"currency\": \"{{value, currency}}\",\n \"number\": \"{{value, number}}\",\n \"percent\": \"{{value, percent}}\"\n },\n \"history\": \"\",\n \"hub\": {\n \"empty\": {\n \"description\": \"No available item matches the current filters.\",\n \"title\": \"No items\"\n },\n \"itemKinds\": {\n \"entity\": \"List\",\n \"tool\": \"Tool\"\n },\n \"search\": {\n \"placeholder\": \"Search\"\n },\n \"subtitle\": \"Choose an item to continue.\"\n },\n \"list\": {\n \"actions\": {\n \"refresh\": \"Refresh\",\n \"refreshing\": \"Refreshing…\",\n \"retry\": \"Retry\"\n },\n \"errors\": {\n \"tableFailed\": \"The table failed to load.\",\n \"title\": \"Table error\"\n },\n \"loaded_one\": \"{{count, number}} item loaded\",\n \"loaded_other\": \"{{count, number}} items loaded\",\n \"loadMore\": {\n \"end\": \"End of results\",\n \"loading\": \"Loading more…\"\n },\n \"refreshingRows\": \"Filtering…\",\n \"showing\": \"Showing {{shown, number}} of {{total, number}}\",\n \"sort\": {\n \"label\": \"Sort order\"\n },\n \"title\": \"\"\n },\n \"overview\": \"\",\n \"picker\": {\n \"errors\": {\n \"loadFailed\": \"Failed to load.\"\n },\n \"searchRequired\": \"Enter an ID to search.\",\n \"title\": \"Select an ID\",\n \"unavailable\": \"Picker not available for {{entity}}.\"\n },\n \"relations\": {\n \"menu\": {\n \"label\": \"Relations\"\n },\n \"openFilteredList\": \"Open filtered list: {{label}}\"\n },\n \"review\": {\n \"status\": {\n \"approved\": \"Approved\",\n \"changesRequested\": \"Changes requested\",\n \"pending\": \"Pending\",\n \"unknown\": \"Unknown\"\n }\n },\n \"sidebar\": {\n \"actions\": {\n \"collapseSidebar\": \"Close\",\n \"expandSidebar\": \"Open\",\n \"pin\": \"Pin\",\n \"reorder\": \"Reorder\",\n \"unpin\": \"Unpin\"\n },\n \"items\": {\n \"dashboard\": \"Dashboard\"\n },\n \"navigationAriaLabel\": \"Backoffice navigation\",\n \"profile\": {\n \"actions\": {\n \"signOut\": \"Sign out\"\n },\n \"menuAriaLabel\": \"Open profile menu\",\n \"title\": \"Profile\",\n \"unknownUser\": \"Unknown user\"\n },\n \"search\": {\n \"placeholder\": \"Search…\"\n },\n \"sections\": {\n \"pinned\": \"Pinned\",\n \"recent\": \"Recent\"\n }\n },\n \"tools\": {\n \"errors\": {\n \"description\": \"We couldn't run this tool.\",\n \"details\": \"Error details\",\n \"label\": \"Error\",\n \"title\": \"Tool error\",\n \"unknown\": \"Unknown error\"\n },\n \"forms\": {\n \"actions\": {\n \"insertExample\": \"Insert example\",\n \"run\": \"Run\"\n },\n \"inputJsonLabel\": \"Input JSON\"\n },\n \"loading\": {\n \"description\": \"Running tool...\"\n },\n \"output\": \"Output\"\n }\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"backofficeReact.js","names":[],"sources":["../../../../../src/i18n/locales/en/backofficeReact.json"],"sourcesContent":["{\n \"actions\": {\n \"form\": {\n \"cancel\": \"Cancel\",\n \"errors\": {\n \"invalidJson\": \"{{label}} must be valid JSON.\",\n \"invalidJsonArray\": \"{{label}} must be a valid JSON array.\",\n \"invalidJsonObject\": \"{{label}} must be a valid JSON object.\",\n \"invalidNumber\": \"{{label}} must be a valid number.\",\n \"invalidPayload\": \"The submitted payload is invalid.\",\n \"required\": \"{{label}} is required.\",\n \"submitFailed\": \"Unable to complete this action. Please try again.\"\n },\n \"submitting\": \"Submitting...\"\n },\n \"view\": \"View\"\n },\n \"auth\": {\n \"acceptInvitation\": {\n \"actions\": {\n \"backToLogin\": \"Back to login\"\n },\n \"errors\": {\n \"alreadyAccepted\": \"This invitation has already been accepted.\",\n \"default\": \"Unable to accept invitation.\",\n \"emailMismatch\": \"This invitation was sent to a different email address.\",\n \"expired\": \"Invitation link has expired.\",\n \"invalidToken\": \"Invitation link is invalid.\",\n \"missingToken\": \"Invitation link is missing or invalid.\",\n \"passwordMismatch\": \"Password and confirmation do not match.\",\n \"passwordPolicyViolation\": \"Your password does not meet policy requirements.\",\n \"rateLimited\": \"Too many attempts. Please try again later.\",\n \"unavailable\": \"Invitation acceptance is not available.\"\n },\n \"form\": {\n \"confirmLabel\": \"Confirm password\",\n \"confirmPlaceholder\": \"Confirm your password\",\n \"passwordLabel\": \"Password\",\n \"passwordPlaceholder\": \"Create a password\",\n \"submit\": \"Accept invitation\"\n },\n \"mfaSubtitle\": \"Enter the verification code to continue.\",\n \"mfaTitle\": \"Verify your identity\",\n \"status\": {\n \"success\": \"Invitation accepted.\",\n \"workingButton\": \"Working...\"\n },\n \"subtitle\": \"Create your account to join.\",\n \"title\": \"Accept invitation\"\n },\n \"emailCapture\": {\n \"continue\": \"Continue\",\n \"description\": \"Enter your work email to continue.\",\n \"emailLabel\": \"Work email\",\n \"emailPlaceholder\": \"you@company.com\",\n \"forgotPassword\": \"Forgot your password?\"\n },\n \"loginFlow\": {\n \"errors\": {\n \"accountLocked\": \"Too many attempts. Try again later.\",\n \"emailRequired\": \"Enter an email address to continue.\",\n \"invalidCredentials\": \"Email or password is incorrect.\",\n \"invalidEmail\": \"Enter a valid email address.\",\n \"passkeyUnavailable\": \"Passkeys are not available.\",\n \"rateLimited\": \"Too many attempts. Please try again later.\",\n \"tryAgain\": \"Something went wrong. Please try again.\"\n },\n \"methods\": {\n \"title\": \"Choose a sign-in method\"\n },\n \"passkey\": {\n \"description\": \"Use the passkey associated with {{email}}.\",\n \"title\": \"Use a passkey\"\n },\n \"subtitle\": {\n \"default\": \"Choose a sign-in method to continue.\",\n \"mfa\": \"Enter the verification code to continue.\"\n },\n \"title\": {\n \"default\": \"Sign in\",\n \"mfa\": \"Two-factor authentication\"\n }\n },\n \"logout\": {\n \"errors\": {\n \"default\": \"Logout failed.\"\n }\n },\n \"methodChooser\": {\n \"actions\": {\n \"back\": \"Back\"\n },\n \"locked\": \"Too many attempts. Try again later.\",\n \"lockedWithTime\": \"Too many attempts. Try again at {{time}}.\",\n \"methods\": {\n \"other\": \"{{method}}\",\n \"passkey\": \"Passkey\",\n \"password\": \"Password\"\n },\n \"prompt\": \"Choose how to sign in for <strong>{{email}}</strong>.\"\n },\n \"mfa\": {\n \"actions\": {\n \"back\": \"Back\",\n \"submit\": \"Verify\"\n },\n \"errors\": {\n \"expired\": \"Verification session expired. Please try again.\",\n \"invalidChallenge\": \"Verification session is invalid. Restart the login.\",\n \"invalidCode\": \"Invalid code. Try again.\",\n \"shortCode\": \"Enter the 6-digit code.\",\n \"tooManyAttempts\": \"Too many attempts. Try again later.\",\n \"verificationFailed\": \"Verification failed. Try again.\"\n },\n \"form\": {\n \"label\": \"Verification code\",\n \"placeholder\": \"123456\"\n },\n \"helper\": {\n \"default\": \"Enter the 6-digit code from your authenticator.\",\n \"withEmail\": \"Enter the 6-digit code sent to {{email}}.\"\n }\n },\n \"oidc\": {\n \"buttons\": {\n \"apple\": \"Continue with Apple\",\n \"generic\": \"Continue with single sign-on\",\n \"google\": \"Continue with Google\"\n }\n },\n \"passkey\": {\n \"actions\": {\n \"showMethods\": \"Use another method\",\n \"submit\": \"Continue with passkey\",\n \"submitting\": \"Waiting for passkey...\"\n },\n \"errors\": {\n \"cancelled\": \"Passkey sign-in was cancelled.\",\n \"challengeExpired\": \"Passkey request expired. Try again.\",\n \"emailRequired\": \"Enter your email to continue.\",\n \"failed\": \"Passkey sign-in failed.\",\n \"invalidAssertion\": \"Passkey response is invalid. Try again.\",\n \"invalidChallenge\": \"Passkey request is invalid. Try again.\",\n \"invalidEmail\": \"Enter a valid email address.\",\n \"locked\": \"Too many attempts. Try again later.\",\n \"lockedWithTime\": \"Too many attempts. Try again at {{time}}.\",\n \"noCredential\": \"No credential was returned by the authenticator.\",\n \"notAvailable\": \"Passkeys are not available on this device.\",\n \"notFound\": \"No passkey found for this account.\"\n },\n \"form\": {\n \"emailLabel\": \"Email\",\n \"emailPlaceholder\": \"you@company.com\"\n },\n \"helper\": \"Use a passkey instead of your password.\"\n },\n \"passwordLogin\": {\n \"forgotPassword\": \"Forgot your password?\",\n \"title\": \"Sign in\"\n },\n \"passwordResetComplete\": {\n \"errors\": {\n \"expired\": \"This reset link has expired.\",\n \"invalid\": \"Reset link is invalid or expired.\",\n \"minLength\": \"Password must be at least {{minLength}} characters.\",\n \"mismatch\": \"Passwords do not match.\",\n \"missingToken\": \"Reset link is missing or invalid.\",\n \"policyViolation\": \"Your new password does not meet policy requirements.\"\n },\n \"form\": {\n \"confirmLabel\": \"Confirm password\",\n \"confirmPlaceholder\": \"Re-enter your password\",\n \"description\": \"Enter a new password for your account.\",\n \"passwordLabel\": \"Password\",\n \"passwordPlaceholder\": \"Enter a new password\",\n \"submit\": \"Update password\",\n \"title\": \"New password\"\n },\n \"subtitle\": \"Choose a strong password to secure your account.\",\n \"success\": {\n \"action\": \"Back to login\",\n \"description\": \"Your password has been changed.\",\n \"helper\": \"You can now sign in with your new password.\",\n \"title\": \"Password updated\"\n },\n \"title\": \"Set a new password\"\n },\n \"passwordResetRequest\": {\n \"errors\": {\n \"emailRequired\": \"Enter an email address.\",\n \"invalidEmail\": \"Please enter a valid email address.\",\n \"rateLimited\": \"Too many requests. Please wait and try again.\",\n \"startFailed\": \"Unable to start password reset.\"\n },\n \"form\": {\n \"description\": \"Enter the email for your account.\",\n \"emailLabel\": \"Email\",\n \"emailPlaceholder\": \"you@company.com\",\n \"submit\": \"Send reset link\"\n },\n \"sent\": {\n \"action\": \"Send another email\",\n \"description\": \"We sent a reset link to {{email}}.\",\n \"helper\": \"If you don't see it, check spam or try again.\",\n \"title\": \"Check your email\"\n },\n \"title\": \"Reset your password\"\n },\n \"verifyEmail\": {\n \"actions\": {\n \"continue\": \"Continue\",\n \"return\": \"Back to login\"\n },\n \"errors\": {\n \"alreadyVerified\": \"This email address is already verified.\",\n \"expired\": \"This verification link has expired.\",\n \"invalid\": \"Verification link is invalid or expired.\",\n \"missingToken\": \"Verification link is missing or invalid.\"\n },\n \"status\": {\n \"success\": \"Email verified. You can continue.\",\n \"verifying\": \"Verifying...\",\n \"verifyingButton\": \"Verifying\"\n },\n \"subtitle\": \"Confirm your email address to continue.\",\n \"title\": \"Verify your email\"\n }\n },\n \"common\": {\n \"actions\": {\n \"close\": \"Close\",\n \"copied\": \"Copied\",\n \"copy\": \"Copy\",\n \"pick\": \"Pick\",\n \"retry\": \"Retry\"\n },\n \"boolean\": {\n \"no\": \"No\",\n \"yes\": \"Yes\"\n },\n \"breadcrumb\": \"Breadcrumb\",\n \"errors\": {\n \"unexpected\": \"An unexpected error occurred.\"\n },\n \"loading\": \"Loading...\",\n \"notAvailable\": \"N/A\",\n \"time\": {\n \"lastDay\": \"24 h\",\n \"lastHour\": \"1 h\",\n \"lastSevenDays\": \"7 j\",\n \"lastThirtyDays\": \"30 j\"\n }\n },\n \"dashboard\": {\n \"actions\": {\n \"openList\": \"Open list\",\n \"openTool\": \"Open tool\"\n },\n \"subtitle\": \"Overview of the Work context.\",\n \"title\": \"Dashboard\"\n },\n \"detail\": {\n \"actionResult\": {\n \"message\": \"Message\",\n \"status\": \"Status\"\n },\n \"actions\": {\n \"backToList\": \"Back to list\",\n \"viewDetails\": \"View details\"\n },\n \"columns\": {\n \"charged\": \"Charged\",\n \"events\": \"Events\",\n \"markup\": \"Markup\",\n \"name\": \"Name\",\n \"rawCost\": \"Raw cost\"\n },\n \"loadingTitle\": \"Detail\",\n \"notFound\": \"Not found\",\n \"notFoundDescription\": \"This item does not exist or is no longer available.\"\n },\n \"emptyState\": {\n \"listEmpty\": {\n \"description\": \"There are no records to display.\",\n \"title\": \"No results\"\n },\n \"listEmptyFiltered\": {\n \"actions\": {\n \"reset\": \"Reset filters\"\n },\n \"description\": \"No results match the current filters.\"\n }\n },\n \"filters\": {\n \"actions\": {\n \"applyFilter\": \"Apply {{label}} filter\",\n \"changeFilterValue\": \"Change {{label}}\",\n \"clearFilter\": \"Clear {{label}} filter\",\n \"filterBy\": \"Filter by {{label}}\",\n \"removeFilterValue\": \"Remove {{label}} value\"\n },\n \"all\": \"All {{label}}\",\n \"boolean\": {\n \"no\": \"No\",\n \"yes\": \"Yes\"\n },\n \"drawer\": {\n \"emptySearchResults\": \"No filters match this search.\"\n },\n \"placeholders\": {\n \"anyEntity\": \"All\",\n \"search\": \"Search {{label}}\",\n \"unresolved\": \"Unresolved ID\"\n },\n \"sections\": {\n \"default\": \"Filters\"\n },\n \"selectedEntities_one\": \"{{count}} selected\",\n \"selectedEntities_other\": \"{{count}} selected\",\n \"trigger\": \"Filters\",\n \"triggerWithCount_one\": \"Filters ({{count}})\",\n \"triggerWithCount_other\": \"Filters ({{count}})\"\n },\n \"flags\": {\n \"agentManaged\": {\n \"agentManaged\": \"Agent managed\",\n \"userManaged\": \"User managed\"\n },\n \"capability\": {\n \"allowed\": \"Allowed\",\n \"denied\": \"Denied\"\n },\n \"default\": {\n \"default\": \"Default\",\n \"notDefault\": \"Not default\"\n },\n \"deployedProduction\": {\n \"deployed\": \"Deployed\",\n \"notDeployed\": \"Not deployed\"\n },\n \"enabled\": {\n \"disabled\": \"Disabled\",\n \"enabled\": \"Enabled\"\n },\n \"encrypted\": {\n \"encrypted\": \"Encrypted\",\n \"notEncrypted\": \"Not encrypted\"\n },\n \"failure\": {\n \"failed\": \"Failed\",\n \"ok\": \"OK\"\n },\n \"forced\": {\n \"forced\": \"Forced\",\n \"normal\": \"Normal\"\n },\n \"locked\": {\n \"locked\": \"Locked\",\n \"unlocked\": \"Unlocked\"\n }\n },\n \"format\": {\n \"currency\": \"{{value, currency}}\",\n \"number\": \"{{value, number}}\",\n \"percent\": \"{{value, percent}}\"\n },\n \"history\": \"\",\n \"hub\": {\n \"empty\": {\n \"description\": \"No available item matches the current filters.\",\n \"title\": \"No items\"\n },\n \"itemKinds\": {\n \"entity\": \"List\",\n \"tool\": \"Tool\"\n },\n \"search\": {\n \"placeholder\": \"Search\"\n },\n \"subtitle\": \"Choose an item to continue.\"\n },\n \"list\": {\n \"actions\": {\n \"refresh\": \"Refresh\",\n \"refreshing\": \"Refreshing…\",\n \"retry\": \"Retry\"\n },\n \"errors\": {\n \"tableFailed\": \"The table failed to load.\",\n \"title\": \"Table error\"\n },\n \"loaded_one\": \"{{count, number}} item loaded\",\n \"loaded_other\": \"{{count, number}} items loaded\",\n \"loadMore\": {\n \"action\": \"Load more\",\n \"end\": \"End of results\",\n \"loading\": \"Loading more…\"\n },\n \"refreshingRows\": \"Filtering…\",\n \"showing\": \"Showing {{shown, number}} of {{total, number}}\",\n \"sort\": {\n \"label\": \"Sort order\"\n },\n \"title\": \"\"\n },\n \"overview\": \"\",\n \"picker\": {\n \"errors\": {\n \"loadFailed\": \"Failed to load.\"\n },\n \"searchRequired\": \"Enter an ID to search.\",\n \"title\": \"Select an ID\",\n \"unavailable\": \"Picker not available for {{entity}}.\"\n },\n \"relations\": {\n \"menu\": {\n \"label\": \"Relations\"\n },\n \"openFilteredList\": \"Open filtered list: {{label}}\"\n },\n \"review\": {\n \"status\": {\n \"approved\": \"Approved\",\n \"changesRequested\": \"Changes requested\",\n \"pending\": \"Pending\",\n \"unknown\": \"Unknown\"\n }\n },\n \"sidebar\": {\n \"actions\": {\n \"collapseSidebar\": \"Close\",\n \"expandSidebar\": \"Open\",\n \"pin\": \"Pin\",\n \"reorder\": \"Reorder\",\n \"unpin\": \"Unpin\"\n },\n \"items\": {\n \"dashboard\": \"Dashboard\"\n },\n \"navigationAriaLabel\": \"Backoffice navigation\",\n \"profile\": {\n \"actions\": {\n \"signOut\": \"Sign out\"\n },\n \"menuAriaLabel\": \"Open profile menu\",\n \"title\": \"Profile\",\n \"unknownUser\": \"Unknown user\"\n },\n \"search\": {\n \"placeholder\": \"Search…\"\n },\n \"sections\": {\n \"pinned\": \"Pinned\",\n \"recent\": \"Recent\"\n }\n },\n \"tools\": {\n \"errors\": {\n \"description\": \"We couldn't run this tool.\",\n \"details\": \"Error details\",\n \"label\": \"Error\",\n \"title\": \"Tool error\",\n \"unknown\": \"Unknown error\"\n },\n \"forms\": {\n \"actions\": {\n \"insertExample\": \"Insert example\",\n \"run\": \"Run\"\n },\n \"inputJsonLabel\": \"Input JSON\"\n },\n \"loading\": {\n \"description\": \"Running tool...\"\n },\n \"output\": \"Output\"\n }\n}\n"],"mappings":""}
|