- "content": "/**\n * Internal SSO provider table service hook.\n * Handles data fetching and CRUD operations for SSO providers.\n * @module use-sso-provider-table-service\n * @internal\n */\n\nimport {\n BusinessError,\n OrganizationDetailsMappers,\n SsoProviderMappers,\n ssoProviderQueryKeys,\n type UpdateIdentityProviderRequestContent,\n type ComponentAction,\n type IdpKnownResponse,\n type OrganizationPrivate,\n} from '@auth0/universal-components-core';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useCallback } from 'react';\n\nimport { useCoreClient } from '@/hooks/shared/use-core-client';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport type { UseSsoProviderTableServiceReturn } from '@/types/my-organization/idp-management/sso-provider/sso-provider-table-types';\n\nexport { ssoProviderQueryKeys };\n\n/**\n * Internal service hook for SSO provider table data and CRUD operations.\n * @param deleteAction - Delete action handler.\n * @param removeFromOrg - Remove from org handler.\n * @param enableAction - Enable/disable handler.\n * @param customMessages - Custom translation messages.\n * @returns Provider data, mutations, and actions.\n * @internal\n */\nexport function useSsoProviderTableService(\n deleteAction?: ComponentAction<IdpKnownResponse, void>,\n removeFromOrg?: ComponentAction<IdpKnownResponse, void>,\n enableAction?: ComponentAction<IdpKnownResponse>,\n customMessages: Record<string, unknown> = {},\n): UseSsoProviderTableServiceReturn {\n const { coreClient } = useCoreClient();\n const queryClient = useQueryClient();\n const { t } = useTranslator('idp_management.notifications', customMessages);\n\n const providersQuery = useQuery({\n queryKey: ssoProviderQueryKeys.list(),\n queryFn: async () => {\n const response = await coreClient!\n .getMyOrganizationApiClient()\n .organization.identityProviders.list();\n return (response?.identity_providers ?? []) as IdpKnownResponse[];\n },\n enabled: !!coreClient,\n });\n\n const organizationQuery = useQuery({\n queryKey: ssoProviderQueryKeys.organization,\n queryFn: async () => {\n const response = await coreClient!.getMyOrganizationApiClient().organizationDetails.get();\n return OrganizationDetailsMappers.fromAPI(response);\n },\n enabled: !!coreClient,\n });\n\n const enableProviderMutation = useMutation({\n mutationFn: async ({\n selectedIdp,\n enabled,\n }: {\n selectedIdp: IdpKnownResponse;\n enabled: boolean;\n }): Promise<IdpKnownResponse> => {\n if (!selectedIdp?.id) {\n throw new Error('Invalid provider');\n }\n\n if (enableAction?.onBefore) {\n const shouldProceed = enableAction.onBefore(selectedIdp);\n if (!shouldProceed) {\n throw new BusinessError({ message: t('enable_on_before') });\n }\n }\n\n const apiRequestData: UpdateIdentityProviderRequestContent = SsoProviderMappers.updateToAPI({\n strategy: selectedIdp.strategy,\n is_enabled: enabled,\n });\n\n const updatedProvider = await coreClient!\n .getMyOrganizationApiClient()\n .organization.identityProviders.update(selectedIdp.id, apiRequestData);\n\n return updatedProvider as IdpKnownResponse;\n },\n onSuccess: async (updatedProvider, { selectedIdp }) => {\n if (enableAction?.onAfter) {\n await enableAction.onAfter(selectedIdp);\n }\n\n queryClient.setQueryData<IdpKnownResponse[]>(ssoProviderQueryKeys.list(), (old) => {\n if (!old) return old;\n return old.map((provider) =>\n provider.id === selectedIdp.id ? { ...provider, ...updatedProvider } : provider,\n );\n });\n },\n });\n\n const deleteProviderMutation = useMutation({\n mutationFn: async (selectedIdp: IdpKnownResponse): Promise<void> => {\n if (!selectedIdp?.id) {\n throw new Error('Invalid provider');\n }\n\n await coreClient!\n .getMyOrganizationApiClient()\n .organization.identityProviders.delete(selectedIdp.id);\n },\n onSuccess: async (_, selectedIdp) => {\n if (deleteAction?.onAfter) {\n await deleteAction.onAfter(selectedIdp);\n }\n\n queryClient.invalidateQueries({ queryKey: ssoProviderQueryKeys.list() });\n },\n });\n\n const removeProviderMutation = useMutation({\n mutationFn: async (selectedIdp: IdpKnownResponse): Promise<void> => {\n if (!selectedIdp?.id) {\n throw new Error('Invalid provider');\n }\n\n await coreClient!\n .getMyOrganizationApiClient()\n .organization.identityProviders.detach(selectedIdp.id);\n },\n onSuccess: async (_, selectedIdp) => {\n if (removeFromOrg?.onAfter) {\n await removeFromOrg.onAfter(selectedIdp);\n }\n\n queryClient.invalidateQueries({ queryKey: ssoProviderQueryKeys.list() });\n },\n });\n\n const onEnableProvider = useCallback(\n async (selectedIdp: IdpKnownResponse, enabled: boolean): Promise<void> => {\n if (!selectedIdp || !coreClient || !selectedIdp.id) {\n throw new Error('Invalid provider');\n }\n\n await enableProviderMutation.mutateAsync({ selectedIdp, enabled });\n },\n [coreClient, enableProviderMutation],\n );\n\n const onDeleteConfirm = useCallback(\n async (selectedIdp: IdpKnownResponse): Promise<void> => {\n if (!selectedIdp || !coreClient || !selectedIdp.id) {\n throw new Error('Invalid provider');\n }\n\n await deleteProviderMutation.mutateAsync(selectedIdp);\n },\n [coreClient, deleteProviderMutation],\n );\n\n const onRemoveConfirm = useCallback(\n async (selectedIdp: IdpKnownResponse): Promise<void> => {\n if (!selectedIdp || !coreClient || !selectedIdp.id) {\n throw new Error('Invalid provider');\n }\n\n await removeProviderMutation.mutateAsync(selectedIdp);\n },\n [coreClient, removeProviderMutation],\n );\n\n const fetchProviders = useCallback(async (): Promise<void> => {\n await queryClient.getQueryData(ssoProviderQueryKeys.list());\n }, [queryClient]);\n\n const fetchOrganizationDetails = useCallback(async (): Promise<OrganizationPrivate | null> => {\n if (!coreClient) {\n return null;\n }\n\n const data = await queryClient.ensureQueryData({\n queryKey: ssoProviderQueryKeys.organization,\n queryFn: async () => {\n const response = await coreClient.getMyOrganizationApiClient().organizationDetails.get();\n return OrganizationDetailsMappers.fromAPI(response);\n },\n });\n return data;\n }, [coreClient, queryClient]);\n\n return {\n providers: providersQuery.data ?? [],\n organization: organizationQuery.data ?? null,\n isLoading: providersQuery.isLoading || organizationQuery.isLoading,\n providersError: providersQuery.error,\n organizationError: organizationQuery.error,\n isDeleting: deleteProviderMutation.isPending,\n isRemoving: removeProviderMutation.isPending,\n isUpdating: enableProviderMutation.isPending,\n isUpdatingId: enableProviderMutation.isPending\n ? (enableProviderMutation.variables?.selectedIdp?.id ?? null)\n : null,\n\n fetchProviders,\n fetchOrganizationDetails,\n onDeleteConfirm,\n onRemoveConfirm,\n onEnableProvider,\n };\n}\n",
0 commit comments