@plumile/backoffice-react 0.1.201 → 0.1.205

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.
Files changed (167) hide show
  1. package/README.md +4 -4
  2. package/lib/esm/auth/login/LoginFlow.js.map +1 -1
  3. package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
  4. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
  5. package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
  6. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +28 -28
  7. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js.map +1 -1
  8. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +183 -183
  9. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  10. package/lib/esm/hooks/useAuth.js +56 -56
  11. package/lib/esm/hooks/useAuth.js.map +1 -1
  12. package/lib/esm/hooks/useConditionalSubscription.js +18 -18
  13. package/lib/esm/hooks/useConditionalSubscription.js.map +1 -1
  14. package/lib/esm/index.js +49 -57
  15. package/lib/esm/pages/BackofficeEntityDetailPage.js +97 -97
  16. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  17. package/lib/esm/pages/BackofficeLayoutPage.js +19 -19
  18. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  19. package/lib/esm/provider/BackofficeProvider.js +33 -33
  20. package/lib/esm/router/createBackofficeRoutes.js +26 -28
  21. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  22. package/lib/esm/storybook/relay/RelayStory.js +32 -32
  23. package/lib/esm/storybook/relay/RelayStory.js.map +1 -1
  24. package/lib/esm/storybook/relay/mockResolvers.js.map +1 -1
  25. package/lib/esm/style.css +1 -1
  26. package/lib/types/components/backoffice/detail/BackofficeEntitySummaryHeader.d.ts +1 -1
  27. package/lib/types/components/backoffice/detail/BackofficeEntitySummaryHeader.d.ts.map +1 -1
  28. package/lib/types/hooks/useAuth.d.ts.map +1 -1
  29. package/lib/types/hooks/useConditionalSubscription.d.ts.map +1 -1
  30. package/lib/types/i18n/locales/en/backofficeReact.d.ts +5 -0
  31. package/lib/types/i18n/locales/fr/backofficeReact.d.ts +5 -0
  32. package/lib/types/index.d.ts +1 -9
  33. package/lib/types/index.d.ts.map +1 -1
  34. package/lib/types/pages/BackofficeLayoutPage.d.ts.map +1 -1
  35. package/lib/types/router/createBackofficeRoutes.d.ts +3 -3
  36. package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
  37. package/lib/types/storybook/relay/RelayStory.d.ts +1 -1
  38. package/lib/types/storybook/relay/RelayStory.d.ts.map +1 -1
  39. package/lib/types/storybook/relay/mockResolvers.d.ts +9 -1
  40. package/lib/types/storybook/relay/mockResolvers.d.ts.map +1 -1
  41. package/package.json +12 -15
  42. package/lib/esm/_virtual/_rolldown/runtime.js +0 -7
  43. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js +0 -13
  44. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js.map +0 -1
  45. package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js +0 -12
  46. package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js.map +0 -1
  47. package/lib/esm/components/backoffice/detail/BackofficeEnumLabel.js +0 -16
  48. package/lib/esm/components/backoffice/detail/BackofficeEnumLabel.js.map +0 -1
  49. package/lib/esm/components/backoffice/detail/BackofficeReferenceValue.js +0 -17
  50. package/lib/esm/components/backoffice/detail/BackofficeReferenceValue.js.map +0 -1
  51. package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js +0 -8
  52. package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js.map +0 -1
  53. package/lib/esm/components/backoffice/detail/BackofficeStatusMetaBadge.js +0 -16
  54. package/lib/esm/components/backoffice/detail/BackofficeStatusMetaBadge.js.map +0 -1
  55. package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js +0 -6
  56. package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js.map +0 -1
  57. package/lib/esm/components/backoffice/refs/backofficeEntityIdRef.css.js +0 -6
  58. package/lib/esm/components/backoffice/refs/backofficeEntityIdRef.css.js.map +0 -1
  59. package/lib/esm/components/backoffice/routing/BackofficeRoutePendingBar.js +0 -12
  60. package/lib/esm/components/backoffice/routing/BackofficeRoutePendingBar.js.map +0 -1
  61. package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js +0 -7
  62. package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js.map +0 -1
  63. package/lib/esm/modules/base64.js +0 -21
  64. package/lib/esm/modules/base64.js.map +0 -1
  65. package/lib/esm/node_modules/@babel/runtime/helpers/arrayLikeToArray.js +0 -15
  66. package/lib/esm/node_modules/@babel/runtime/helpers/arrayLikeToArray.js.map +0 -1
  67. package/lib/esm/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js +0 -15
  68. package/lib/esm/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js.map +0 -1
  69. package/lib/esm/node_modules/@babel/runtime/helpers/defineProperty.js +0 -20
  70. package/lib/esm/node_modules/@babel/runtime/helpers/defineProperty.js.map +0 -1
  71. package/lib/esm/node_modules/@babel/runtime/helpers/interopRequireDefault.js +0 -13
  72. package/lib/esm/node_modules/@babel/runtime/helpers/interopRequireDefault.js.map +0 -1
  73. package/lib/esm/node_modules/@babel/runtime/helpers/iterableToArray.js +0 -13
  74. package/lib/esm/node_modules/@babel/runtime/helpers/iterableToArray.js.map +0 -1
  75. package/lib/esm/node_modules/@babel/runtime/helpers/nonIterableSpread.js +0 -13
  76. package/lib/esm/node_modules/@babel/runtime/helpers/nonIterableSpread.js.map +0 -1
  77. package/lib/esm/node_modules/@babel/runtime/helpers/objectSpread2.js +0 -33
  78. package/lib/esm/node_modules/@babel/runtime/helpers/objectSpread2.js.map +0 -1
  79. package/lib/esm/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js +0 -19
  80. package/lib/esm/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js.map +0 -1
  81. package/lib/esm/node_modules/@babel/runtime/helpers/toConsumableArray.js +0 -18
  82. package/lib/esm/node_modules/@babel/runtime/helpers/toConsumableArray.js.map +0 -1
  83. package/lib/esm/node_modules/@babel/runtime/helpers/toPrimitive.js +0 -22
  84. package/lib/esm/node_modules/@babel/runtime/helpers/toPrimitive.js.map +0 -1
  85. package/lib/esm/node_modules/@babel/runtime/helpers/toPropertyKey.js +0 -17
  86. package/lib/esm/node_modules/@babel/runtime/helpers/toPropertyKey.js.map +0 -1
  87. package/lib/esm/node_modules/@babel/runtime/helpers/typeof.js +0 -18
  88. package/lib/esm/node_modules/@babel/runtime/helpers/typeof.js.map +0 -1
  89. package/lib/esm/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js +0 -19
  90. package/lib/esm/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js.map +0 -1
  91. package/lib/esm/node_modules/fbjs/lib/areEqual.js +0 -42
  92. package/lib/esm/node_modules/fbjs/lib/areEqual.js.map +0 -1
  93. package/lib/esm/node_modules/invariant/browser.js +0 -30
  94. package/lib/esm/node_modules/invariant/browser.js.map +0 -1
  95. package/lib/esm/node_modules/relay-test-utils/index.js +0 -11
  96. package/lib/esm/node_modules/relay-test-utils/index.js.map +0 -1
  97. package/lib/esm/node_modules/relay-test-utils/lib/RelayMockPayloadGenerator.js +0 -288
  98. package/lib/esm/node_modules/relay-test-utils/lib/RelayMockPayloadGenerator.js.map +0 -1
  99. package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js +0 -183
  100. package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js.map +0 -1
  101. package/lib/esm/node_modules/relay-test-utils/lib/RelayResolverTestUtils.js +0 -19
  102. package/lib/esm/node_modules/relay-test-utils/lib/RelayResolverTestUtils.js.map +0 -1
  103. package/lib/esm/node_modules/relay-test-utils/lib/index.js +0 -21
  104. package/lib/esm/node_modules/relay-test-utils/lib/index.js.map +0 -1
  105. package/lib/esm/node_modules/relay-test-utils/lib/unwrapContainer.js +0 -16
  106. package/lib/esm/node_modules/relay-test-utils/lib/unwrapContainer.js.map +0 -1
  107. package/lib/esm/relay/RelayProvider.js +0 -2
  108. package/lib/esm/relay/envHelpers.js +0 -63
  109. package/lib/esm/relay/envHelpers.js.map +0 -1
  110. package/lib/esm/relay/environment.js +0 -2
  111. package/lib/esm/relay/shortAccessTokenEnvironment.js +0 -2
  112. package/lib/esm/relay/useRelayOperationActivity.js +0 -2
  113. package/lib/esm/storybook/relay/relay-test-utils.d.js +0 -0
  114. package/lib/types/auth/AuthFlows.stories.d.ts +0 -19
  115. package/lib/types/auth/AuthFlows.stories.d.ts.map +0 -1
  116. package/lib/types/components/backoffice/billing/BackofficeBillingUsageChart.stories.d.ts +0 -41
  117. package/lib/types/components/backoffice/billing/BackofficeBillingUsageChart.stories.d.ts.map +0 -1
  118. package/lib/types/components/backoffice/detail/BackofficeDetailFlagTag.d.ts +0 -11
  119. package/lib/types/components/backoffice/detail/BackofficeDetailFlagTag.d.ts.map +0 -1
  120. package/lib/types/components/backoffice/detail/BackofficeDetailPrimitives.stories.d.ts +0 -17
  121. package/lib/types/components/backoffice/detail/BackofficeDetailPrimitives.stories.d.ts.map +0 -1
  122. package/lib/types/components/backoffice/detail/BackofficeDetailTaggedValue.d.ts +0 -13
  123. package/lib/types/components/backoffice/detail/BackofficeDetailTaggedValue.d.ts.map +0 -1
  124. package/lib/types/components/backoffice/detail/BackofficeEnumLabel.d.ts +0 -9
  125. package/lib/types/components/backoffice/detail/BackofficeEnumLabel.d.ts.map +0 -1
  126. package/lib/types/components/backoffice/detail/BackofficeReferenceValue.d.ts +0 -10
  127. package/lib/types/components/backoffice/detail/BackofficeReferenceValue.d.ts.map +0 -1
  128. package/lib/types/components/backoffice/detail/BackofficeStatusGroup.d.ts +0 -8
  129. package/lib/types/components/backoffice/detail/BackofficeStatusGroup.d.ts.map +0 -1
  130. package/lib/types/components/backoffice/detail/BackofficeStatusMetaBadge.d.ts +0 -11
  131. package/lib/types/components/backoffice/detail/BackofficeStatusMetaBadge.d.ts.map +0 -1
  132. package/lib/types/components/backoffice/detail/backofficeDetailRelationLink.css.d.ts +0 -6
  133. package/lib/types/components/backoffice/detail/backofficeDetailRelationLink.css.d.ts.map +0 -1
  134. package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.stories.d.ts +0 -12
  135. package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.stories.d.ts.map +0 -1
  136. package/lib/types/components/backoffice/filters/EntityIdFilterField.stories.d.ts +0 -12
  137. package/lib/types/components/backoffice/filters/EntityIdFilterField.stories.d.ts.map +0 -1
  138. package/lib/types/components/backoffice/hub/BackofficeHubTemplate.stories.d.ts +0 -49
  139. package/lib/types/components/backoffice/hub/BackofficeHubTemplate.stories.d.ts.map +0 -1
  140. package/lib/types/components/backoffice/overview/BackofficeOverviewLayout.stories.d.ts +0 -11
  141. package/lib/types/components/backoffice/overview/BackofficeOverviewLayout.stories.d.ts.map +0 -1
  142. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.stories.d.ts +0 -12
  143. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.stories.d.ts.map +0 -1
  144. package/lib/types/components/backoffice/refs/backofficeEntityIdRef.css.d.ts +0 -2
  145. package/lib/types/components/backoffice/refs/backofficeEntityIdRef.css.d.ts.map +0 -1
  146. package/lib/types/components/backoffice/routing/BackofficeRoutePendingBar.d.ts +0 -4
  147. package/lib/types/components/backoffice/routing/BackofficeRoutePendingBar.d.ts.map +0 -1
  148. package/lib/types/components/backoffice/routing/backofficeRoutePendingBar.css.d.ts +0 -3
  149. package/lib/types/components/backoffice/routing/backofficeRoutePendingBar.css.d.ts.map +0 -1
  150. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.stories.d.ts +0 -11
  151. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.stories.d.ts.map +0 -1
  152. package/lib/types/components/backoffice/tools/BackofficeTools.stories.d.ts +0 -17
  153. package/lib/types/components/backoffice/tools/BackofficeTools.stories.d.ts.map +0 -1
  154. package/lib/types/modules/base64.d.ts +0 -3
  155. package/lib/types/modules/base64.d.ts.map +0 -1
  156. package/lib/types/pages/BackofficeDashboardPage.stories.d.ts +0 -9
  157. package/lib/types/pages/BackofficeDashboardPage.stories.d.ts.map +0 -1
  158. package/lib/types/relay/RelayProvider.d.ts +0 -2
  159. package/lib/types/relay/RelayProvider.d.ts.map +0 -1
  160. package/lib/types/relay/envHelpers.d.ts +0 -25
  161. package/lib/types/relay/envHelpers.d.ts.map +0 -1
  162. package/lib/types/relay/environment.d.ts +0 -2
  163. package/lib/types/relay/environment.d.ts.map +0 -1
  164. package/lib/types/relay/shortAccessTokenEnvironment.d.ts +0 -5
  165. package/lib/types/relay/shortAccessTokenEnvironment.d.ts.map +0 -1
  166. package/lib/types/relay/useRelayOperationActivity.d.ts +0 -2
  167. 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 { getRelayTransportSnapshot as e, subscribeRelayTransport as t } from "../relay/environment.js";
2
- import { useCallback as n, useEffect as r, useMemo as i, useRef as a, useState as o, useSyncExternalStore as s } from "react";
3
- import * as c from "react-relay";
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(c, "default") ?? c;
7
+ return Reflect.get(o, "default") ?? o;
8
8
  }
9
9
  var d = u();
10
- function f(c, u) {
11
- let f = d.useRelayEnvironment(), [p, m] = o(null), [h, g] = o(!1), [_, v] = o(!1), y = s(t, () => e().generation, () => e().generation), { enabled: b = !0, deps: x = l, getVariables: S } = u, C = n(() => {
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 ? c.variables : S();
13
+ return S == null ? o.variables : S();
14
14
  } catch {
15
15
  return null;
16
16
  }
17
- }, [c.variables, S]), w = i(() => C(), [C]), T = i(() => {
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 = a(null);
25
- return r(() => {
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: c.subscription,
28
+ subscription: o.subscription,
29
29
  variables: t,
30
- cacheConfig: c.cacheConfig,
31
- configs: c.configs,
30
+ cacheConfig: o.cacheConfig,
31
+ configs: o.configs,
32
32
  onCompleted: () => {
33
- v(!0), g(!1), c.onCompleted?.();
33
+ v(!0), g(!1), o.onCompleted?.();
34
34
  },
35
35
  onError: (e) => {
36
- m(e), g(!1), c.onError?.(e);
36
+ m(e), g(!1), o.onError?.(e);
37
37
  },
38
- onNext: c.onNext,
39
- updater: c.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
- c,
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';\n\nimport {\n getRelayTransportSnapshot,\n subscribeRelayTransport,\n} from '../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":";;;;AA8BA,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
+ {"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"}
package/lib/esm/index.js CHANGED
@@ -19,60 +19,52 @@ import { useBackofficeLink as S } from "./components/backoffice/links/useBackoff
19
19
  import { BackofficeInlineLink as C } from "./components/backoffice/links/BackofficeInlineLink.js";
20
20
  import { buildDataTableColumns as w } from "./components/backoffice/columns/buildDataTableColumns.js";
21
21
  import { BackofficeDetailBadgeRow as T } from "./components/backoffice/detail/BackofficeDetailBadgeRow.js";
22
- import { BackofficeStatusMetaBadge as E } from "./components/backoffice/detail/BackofficeStatusMetaBadge.js";
23
- import { BackofficeEntitySummaryHeader as D } from "./components/backoffice/detail/BackofficeEntitySummaryHeader.js";
24
- import { BackofficeEnumLabel as O } from "./components/backoffice/detail/BackofficeEnumLabel.js";
25
- import { BackofficeLifecycleTimelineSection as k } from "./components/backoffice/detail/BackofficeLifecycleTimelineSection.js";
26
- import { BackofficeReferenceValue as A } from "./components/backoffice/detail/BackofficeReferenceValue.js";
27
- import { BackofficeRelationsSummaryGrid as j } from "./components/backoffice/detail/BackofficeRelationsSummaryGrid.js";
28
- import { BackofficeStatusGroup as M } from "./components/backoffice/detail/BackofficeStatusGroup.js";
29
- import { BackofficeTokenUsageBreakdown as N } from "./components/backoffice/detail/BackofficeTokenUsageBreakdown.js";
30
- import { BackofficeUsageCostBreakdown as P } from "./components/backoffice/detail/BackofficeUsageCostBreakdown.js";
31
- import { createBackofficeEntityLinkProps as F } from "./components/backoffice/detail/createBackofficeEntityLinkProps.js";
32
- import { formatListAsMarkdown as I } from "./components/backoffice/detail/detailPayloadUtils.js";
33
- import { BackofficeFilterAction as L } from "./components/backoffice/filters/BackofficeFilterAction.js";
34
- import { EntityFilterValue as R, EntityFilterValueText as z } from "./components/backoffice/filters/EntityFilterValue.js";
35
- import { BackofficeHubTemplate as B } from "./components/backoffice/hub/BackofficeHubTemplate.js";
36
- import { BackofficeLink as V } from "./components/backoffice/links/BackofficeLink.js";
37
- import { BackofficeLinkLabel as H } from "./components/backoffice/links/BackofficeLinkLabel.js";
38
- import { BackofficeRightPageLayout as U } from "./components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js";
39
- import { BackofficeOverviewLayout as W } from "./components/backoffice/overview/BackofficeOverviewLayout.js";
40
- import { BackofficeFilterableCell as G } from "./components/backoffice/shared/BackofficeFilterableCell.js";
41
- import { BackofficeEntityLink as K } from "./components/backoffice/refs/BackofficeEntityLink.js";
42
- import { BackofficeLazyEntityCount as q } from "./components/backoffice/refs/BackofficeLazyEntityCount.js";
43
- import { BackofficeRelatedCountLink as J } from "./components/backoffice/refs/BackofficeRelatedCountLink.js";
44
- import { BackofficeTabbedDetailShell as Y } from "./components/backoffice/scaffolds/BackofficeTabbedDetailShell.js";
45
- import { BackofficeFormattedCurrency as X } from "./components/backoffice/shared/BackofficeFormattedCurrency.js";
46
- import { BackofficeFormattedNumber as Z } from "./components/backoffice/shared/BackofficeFormattedNumber.js";
47
- import { BackofficeInlineFilterRow as Q } from "./components/backoffice/shared/BackofficeInlineFilterRow.js";
48
- import { BackofficeToolsDocPanel as $ } from "./components/backoffice/tools/BackofficeToolsDocPanel.js";
49
- import { BackofficeToolsErrorFallback as ee } from "./components/backoffice/tools/BackofficeToolsErrorFallback.js";
50
- import { BackofficeToolsJsonForm as te } from "./components/backoffice/tools/BackofficeToolsJsonForm.js";
51
- import { BackofficeToolsQueryBoundary as ne } from "./components/backoffice/tools/BackofficeToolsQueryBoundary.js";
52
- import { parseToolJson as re } from "./components/backoffice/tools/parseToolJson.js";
53
- import { configureRelayEnvironment as ie, getEnvironment as ae, getNetwork as oe, getRelayOperationActivitySnapshot as se, getRelayTransportSnapshot as ce, reconnectRelayWebSocket as le, refreshRelayWebSocketAuthentication as ue, resetRelayStore as de, subscribeRelayOperationActivity as fe, subscribeRelayTransport as pe } from "./relay/environment.js";
54
- import { base64UrlToBuffer as me, bufferToBase64Url as he, mapWebAuthnRegistrationError as ge, parseSignCount as _e } from "./modules/webauthn.js";
55
- import { createUseAuth as ve } from "./hooks/useAuth.js";
56
- import { useBackofficeListUrlState as ye } from "./hooks/useBackofficeListUrlState.js";
57
- import { useConditionalSubscription as be } from "./hooks/useConditionalSubscription.js";
58
- import xe from "./hooks/useCopyToClipboard.js";
59
- import Se from "./hooks/useInfiniteConnection.js";
60
- import { useRefetchNeededReload as Ce } from "./hooks/useRefetchNeededReload.js";
61
- import { createI18nInstance as we } from "./i18n/createI18nInstance.js";
62
- import { backofficeReactI18nResources as Te, withBackofficeReactI18nResources as Ee } from "./i18n/resources.js";
63
- import { useReviewStatusLabel as De } from "./i18n/useReviewStatusLabel.js";
64
- import { BackofficeProvider as Oe } from "./provider/BackofficeProvider.js";
65
- import { createBackofficeLazyValue as ke } from "./provider/lazyValue.js";
66
- import { decodeBase64ToUtf8 as Ae, encodeUtf8ToBase64 as je } from "./modules/base64.js";
67
- import { formatFileSize as Me } from "./modules/formatFileSize.js";
68
- import { uploadFilesSequentially as Ne } from "./modules/uploads.js";
69
- import { resolveVisibleDetailPages as Pe } from "./pages/detail/pageResolution.js";
70
- import { createInlineDataReader as Fe } from "./relay/createInlineReader.js";
71
- import { appendNodeToConnections as Ie } from "./relay/connectionUtils.js";
72
- import { RelayProvider as Le } from "./relay/RelayProvider.js";
73
- import { useRelayOperationActivity as Re } from "./relay/useRelayOperationActivity.js";
74
- import { configureBackofficeShortAccessTokenRelayEnvironment as ze, configureShortAccessTokenRelayEnvironment as Be } from "./relay/shortAccessTokenEnvironment.js";
75
- import { useMutationAction as Ve } from "./relay/useMutationAction.js";
76
- import { identityView as He } from "./relay/identityView.js";
77
- import { useCursorResumableSubscription as Ue } from "./subscriptions/useCursorResumableSubscription.js";
78
- export { s as AcceptInvitationScreen, e as AuthRefreshNotice, y as BackofficeBillingUsageChart, T as BackofficeDetailBadgeRow, K as BackofficeEntityLink, D as BackofficeEntitySummaryHeader, O as BackofficeEnumLabel, _ as BackofficeErrorBoundary, L as BackofficeFilterAction, G as BackofficeFilterableCell, X as BackofficeFormattedCurrency, Z as BackofficeFormattedNumber, B as BackofficeHubTemplate, Q as BackofficeInlineFilterRow, C as BackofficeInlineLink, q as BackofficeLazyEntityCount, k as BackofficeLifecycleTimelineSection, V as BackofficeLink, H as BackofficeLinkLabel, W as BackofficeOverviewLayout, Oe as BackofficeProvider, A as BackofficeReferenceValue, J as BackofficeRelatedCountLink, j as BackofficeRelationGrid, j as BackofficeRelationsSummaryGrid, U as BackofficeRightPageLayout, M as BackofficeStatusGroup, E as BackofficeStatusMetaBadge, Y as BackofficeTabbedDetailShell, N as BackofficeTokenUsageBreakdown, $ as BackofficeToolsDocPanel, ee as BackofficeToolsErrorFallback, te as BackofficeToolsJsonForm, ne as BackofficeToolsQueryBoundary, P as BackofficeUsageCostBreakdown, R as EntityFilterValue, z as EntityFilterValueText, g as EntityIdFilterField, v as EntityIdPickerDialog, a as LoginFlow, c as PasswordResetCompleteScreen, l as PasswordResetRequestScreen, Le as RelayProvider, n as TotpQrCode, u as VerifyEmailScreen, Ie as appendNodeToConnections, Te as backofficeReactI18nResources, me as base64UrlToBuffer, he as bufferToBase64Url, w as buildDataTableColumns, r as buildTotpOtpAuthUri, ze as configureBackofficeShortAccessTokenRelayEnvironment, ie as configureRelayEnvironment, Be as configureShortAccessTokenRelayEnvironment, i as createBackofficeAuthHeaders, F as createBackofficeEntityLinkProps, ke as createBackofficeLazyValue, we as createI18nInstance, Fe as createInlineDataReader, ve as createUseAuth, Ae as decodeBase64ToUtf8, je as encodeUtf8ToBase64, Me as formatFileSize, I as formatListAsMarkdown, ae as getEnvironment, oe as getNetwork, se as getRelayOperationActivitySnapshot, ce as getRelayTransportSnapshot, He as identityView, ge as mapWebAuthnRegistrationError, _e as parseSignCount, re as parseToolJson, le as reconnectRelayWebSocket, ue as refreshRelayWebSocketAuthentication, d as requireField, f as requireLinkedRecordId, de as resetRelayStore, p as resolveAgentStartOutcome, x as resolveBackofficeLink, b as resolveBackofficeTargetIcon, m as resolveMutationOutcome, Pe as resolveVisibleDetailPages, fe as subscribeRelayOperationActivity, pe as subscribeRelayTransport, o as synchronizeAuthStatusQuery, Ne as uploadFilesSequentially, t as useAuthRefreshStateSnapshot, h as useBackofficeConfig, S as useBackofficeLink, ye as useBackofficeListUrlState, be as useConditionalSubscription, xe as useCopyToClipboard, Ue as useCursorResumableSubscription, Se as useInfiniteConnection, Ve as useMutationAction, Ce as useRefetchNeededReload, Re as useRelayOperationActivity, De as useReviewStatusLabel, Ee as withBackofficeReactI18nResources };
22
+ import { BackofficeEntitySummaryHeader as E } from "./components/backoffice/detail/BackofficeEntitySummaryHeader.js";
23
+ import { BackofficeLifecycleTimelineSection as D } from "./components/backoffice/detail/BackofficeLifecycleTimelineSection.js";
24
+ import { BackofficeRelationsSummaryGrid as O } from "./components/backoffice/detail/BackofficeRelationsSummaryGrid.js";
25
+ import { BackofficeTokenUsageBreakdown as k } from "./components/backoffice/detail/BackofficeTokenUsageBreakdown.js";
26
+ import { BackofficeUsageCostBreakdown as A } from "./components/backoffice/detail/BackofficeUsageCostBreakdown.js";
27
+ import { createBackofficeEntityLinkProps as j } from "./components/backoffice/detail/createBackofficeEntityLinkProps.js";
28
+ import { formatListAsMarkdown as M } from "./components/backoffice/detail/detailPayloadUtils.js";
29
+ import { BackofficeFilterAction as N } from "./components/backoffice/filters/BackofficeFilterAction.js";
30
+ import { EntityFilterValue as P, EntityFilterValueText as F } from "./components/backoffice/filters/EntityFilterValue.js";
31
+ import { BackofficeHubTemplate as I } from "./components/backoffice/hub/BackofficeHubTemplate.js";
32
+ import { BackofficeLink as L } from "./components/backoffice/links/BackofficeLink.js";
33
+ import { BackofficeLinkLabel as R } from "./components/backoffice/links/BackofficeLinkLabel.js";
34
+ import { BackofficeRightPageLayout as z } from "./components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js";
35
+ import { BackofficeOverviewLayout as B } from "./components/backoffice/overview/BackofficeOverviewLayout.js";
36
+ import { BackofficeFilterableCell as V } from "./components/backoffice/shared/BackofficeFilterableCell.js";
37
+ import { BackofficeEntityLink as ee } from "./components/backoffice/refs/BackofficeEntityLink.js";
38
+ import { BackofficeLazyEntityCount as H } from "./components/backoffice/refs/BackofficeLazyEntityCount.js";
39
+ import { BackofficeRelatedCountLink as U } from "./components/backoffice/refs/BackofficeRelatedCountLink.js";
40
+ import { BackofficeTabbedDetailShell as W } from "./components/backoffice/scaffolds/BackofficeTabbedDetailShell.js";
41
+ import { BackofficeFormattedCurrency as G } from "./components/backoffice/shared/BackofficeFormattedCurrency.js";
42
+ import { BackofficeFormattedNumber as K } from "./components/backoffice/shared/BackofficeFormattedNumber.js";
43
+ import { BackofficeInlineFilterRow as q } from "./components/backoffice/shared/BackofficeInlineFilterRow.js";
44
+ import { BackofficeToolsDocPanel as J } from "./components/backoffice/tools/BackofficeToolsDocPanel.js";
45
+ import { BackofficeToolsErrorFallback as Y } from "./components/backoffice/tools/BackofficeToolsErrorFallback.js";
46
+ import { BackofficeToolsJsonForm as X } from "./components/backoffice/tools/BackofficeToolsJsonForm.js";
47
+ import { BackofficeToolsQueryBoundary as Z } from "./components/backoffice/tools/BackofficeToolsQueryBoundary.js";
48
+ import { parseToolJson as Q } from "./components/backoffice/tools/parseToolJson.js";
49
+ import { base64UrlToBuffer as $, bufferToBase64Url as te, mapWebAuthnRegistrationError as ne, parseSignCount as re } from "./modules/webauthn.js";
50
+ import { createUseAuth as ie } from "./hooks/useAuth.js";
51
+ import { useBackofficeListUrlState as ae } from "./hooks/useBackofficeListUrlState.js";
52
+ import { useConditionalSubscription as oe } from "./hooks/useConditionalSubscription.js";
53
+ import se from "./hooks/useCopyToClipboard.js";
54
+ import ce from "./hooks/useInfiniteConnection.js";
55
+ import { useRefetchNeededReload as le } from "./hooks/useRefetchNeededReload.js";
56
+ import { createI18nInstance as ue } from "./i18n/createI18nInstance.js";
57
+ import { backofficeReactI18nResources as de, withBackofficeReactI18nResources as fe } from "./i18n/resources.js";
58
+ import { useReviewStatusLabel as pe } from "./i18n/useReviewStatusLabel.js";
59
+ import { BackofficeProvider as me } from "./provider/BackofficeProvider.js";
60
+ import { createBackofficeLazyValue as he } from "./provider/lazyValue.js";
61
+ import { formatFileSize as ge } from "./modules/formatFileSize.js";
62
+ import { uploadFilesSequentially as _e } from "./modules/uploads.js";
63
+ import { resolveVisibleDetailPages as ve } from "./pages/detail/pageResolution.js";
64
+ import { createInlineDataReader as ye } from "./relay/createInlineReader.js";
65
+ import { appendNodeToConnections as be } from "./relay/connectionUtils.js";
66
+ import { useMutationAction as xe } from "./relay/useMutationAction.js";
67
+ import { identityView as Se } from "./relay/identityView.js";
68
+ import { useCursorResumableSubscription as Ce } from "./subscriptions/useCursorResumableSubscription.js";
69
+ import { decodeBase64ToUtf8 as we, encodeUtf8ToBase64 as Te } from "@plumile/backoffice-core/base64.js";
70
+ export { s as AcceptInvitationScreen, e as AuthRefreshNotice, y as BackofficeBillingUsageChart, T as BackofficeDetailBadgeRow, ee as BackofficeEntityLink, E as BackofficeEntitySummaryHeader, _ as BackofficeErrorBoundary, N as BackofficeFilterAction, V as BackofficeFilterableCell, G as BackofficeFormattedCurrency, K as BackofficeFormattedNumber, I as BackofficeHubTemplate, q as BackofficeInlineFilterRow, C as BackofficeInlineLink, H as BackofficeLazyEntityCount, D as BackofficeLifecycleTimelineSection, L as BackofficeLink, R as BackofficeLinkLabel, B as BackofficeOverviewLayout, me as BackofficeProvider, U as BackofficeRelatedCountLink, O as BackofficeRelationGrid, O as BackofficeRelationsSummaryGrid, z as BackofficeRightPageLayout, W as BackofficeTabbedDetailShell, k as BackofficeTokenUsageBreakdown, J as BackofficeToolsDocPanel, Y as BackofficeToolsErrorFallback, X as BackofficeToolsJsonForm, Z as BackofficeToolsQueryBoundary, A as BackofficeUsageCostBreakdown, P as EntityFilterValue, F as EntityFilterValueText, g as EntityIdFilterField, v as EntityIdPickerDialog, a as LoginFlow, c as PasswordResetCompleteScreen, l as PasswordResetRequestScreen, n as TotpQrCode, u as VerifyEmailScreen, be as appendNodeToConnections, de as backofficeReactI18nResources, $ as base64UrlToBuffer, te as bufferToBase64Url, w as buildDataTableColumns, r as buildTotpOtpAuthUri, i as createBackofficeAuthHeaders, j as createBackofficeEntityLinkProps, he as createBackofficeLazyValue, ue as createI18nInstance, ye as createInlineDataReader, ie as createUseAuth, we as decodeBase64ToUtf8, Te as encodeUtf8ToBase64, ge as formatFileSize, M as formatListAsMarkdown, Se as identityView, ne as mapWebAuthnRegistrationError, re as parseSignCount, Q as parseToolJson, d as requireField, f as requireLinkedRecordId, p as resolveAgentStartOutcome, x as resolveBackofficeLink, b as resolveBackofficeTargetIcon, m as resolveMutationOutcome, ve as resolveVisibleDetailPages, o as synchronizeAuthStatusQuery, _e as uploadFilesSequentially, t as useAuthRefreshStateSnapshot, h as useBackofficeConfig, S as useBackofficeLink, ae as useBackofficeListUrlState, oe as useConditionalSubscription, se as useCopyToClipboard, Ce as useCursorResumableSubscription, ce as useInfiniteConnection, xe as useMutationAction, le as useRefetchNeededReload, pe as useReviewStatusLabel, fe as withBackofficeReactI18nResources };