diff --git a/src/api/hooks/admin/useModerationPolicies.ts b/src/api/hooks/admin/useModerationPolicies.ts index aba552757..608cd42f0 100644 --- a/src/api/hooks/admin/useModerationPolicies.ts +++ b/src/api/hooks/admin/useModerationPolicies.ts @@ -1,5 +1,6 @@ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; +import { MastodonResponse } from 'soapbox/api/MastodonResponse.ts'; import { useApi } from 'soapbox/hooks/useApi.ts'; import { PolicyItem, PolicyResponse, PolicySpec } from 'soapbox/utils/policies.ts'; @@ -7,11 +8,23 @@ const useModerationPolicies = () => { const api = useApi(); const queryClient = useQueryClient(); + const handleResponse = async (response: MastodonResponse, message: string) => { + const details = await response.error() + .then(v => v?.error || 'Unknown error'); + if (!response.ok) throw new Error(`${message}: ${details}`); + const data = await response.json(); + // Check if the response contains an error + if (data && 'error' in data) throw new Error(data.error); + return data; + }; + const allPoliciesQuery = useQuery({ queryKey: ['admin', 'moderation_policies'], queryFn: async () => { - const response = await api.get('/api/v1/admin/ditto/policies'); - return response.json() as Promise; + return await handleResponse( + await api.get('/api/v1/admin/ditto/policies'), + 'Error fetching policy list', + ) as Promise; }, }); @@ -19,26 +32,20 @@ const useModerationPolicies = () => { const currentPolicyQuery = useQuery({ queryKey: ['admin', 'current_moderation_policy'], queryFn: async () => { - const response = await api.get('/api/v1/admin/ditto/policies/current'); - return response.json() as Promise; + return await handleResponse( + await api.get('/api/v1/admin/ditto/policies/current'), + 'Error fetching current policy', + ) as Promise; }, }); // Update current policy const updatePolicyMutation = useMutation({ mutationFn: async (spec: PolicySpec) => { - const response = await api.put('/api/v1/admin/ditto/policies/current', spec); - - // Parse the JSON response - const data = await response.json(); - - // Check if the response contains an error - if (data && 'error' in data) { - // Throw the error to be caught by the caller - throw new Error(data.error); - } - - return data; + return await handleResponse( + await api.put('/api/v1/admin/ditto/policies/current', spec), + 'Error updating policy', + ) as Promise; }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin', 'current_moderation_policy'] }); // Refetch after update @@ -52,6 +59,10 @@ const useModerationPolicies = () => { isFetched: currentPolicyQuery.isFetched, updatePolicy: updatePolicyMutation.mutate, isUpdating: updatePolicyMutation.isPending, + allPoliciesError: allPoliciesQuery.error, + storedPoliciesError: currentPolicyQuery.error, + allPoliciesIsError: allPoliciesQuery.isError, + storedPoliciesIsError: currentPolicyQuery.isError, }; };