intercept errors during fetching

merge-requests/3361/merge^2
Siddharth Singh 2025-04-12 05:04:56 +05:30
rodzic 9e492caa9f
commit 772fa930d2
Nie znaleziono w bazie danych klucza dla tego podpisu
1 zmienionych plików z 27 dodań i 16 usunięć

Wyświetl plik

@ -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<PolicyItem[]>;
return await handleResponse(
await api.get('/api/v1/admin/ditto/policies'),
'Error fetching policy list',
) as Promise<PolicyItem[]>;
},
});
@ -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<PolicyResponse>;
return await handleResponse(
await api.get('/api/v1/admin/ditto/policies/current'),
'Error fetching current policy',
) as Promise<PolicyResponse>;
},
});
// 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<PolicyResponse>;
},
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,
};
};