2026-06-22 19:03:37 +02:00

86 lines
2.5 KiB
TypeScript

import { useMutation, useQuery, useQueryClient, type QueryClient } from '@tanstack/react-query';
import {
createManagedContentCatalog,
deleteManagedContentCatalog,
getContentCatalog,
getManagedContentCatalog,
updateManagedContentCatalog,
} from '@/shared/api/contentCatalog';
import { CONTENT_CATALOG_QUERY_KEYS } from '@/shared/constants/contentCatalog';
export function useContentCatalogPayload<TPayload>(
contentType: string,
emptyPayload: TPayload,
options?: { readonly enabled?: boolean },
) {
const query = useQuery({
queryKey: [...CONTENT_CATALOG_QUERY_KEYS.content, contentType],
queryFn: async () => {
const response = await getContentCatalog<TPayload>(contentType);
return response.payload;
},
enabled: options?.enabled ?? true,
});
return {
payload: query.data ?? emptyPayload,
isLoading: query.isLoading,
error: query.error,
refresh: query.refetch,
};
}
export function useManagedContentCatalog<TPayload>(
contentType: string,
options?: { readonly enabled?: boolean },
) {
return useQuery({
queryKey: [...CONTENT_CATALOG_QUERY_KEYS.content, 'managed', contentType],
queryFn: () => getManagedContentCatalog<TPayload>(contentType),
enabled: options?.enabled ?? true,
});
}
export function useSaveManagedContentCatalog<TPayload>(
contentType: string,
hasExistingContent: boolean,
getPayload: () => TPayload,
) {
const queryClient = useQueryClient();
return useMutation({
mutationFn: () => (
hasExistingContent
? updateManagedContentCatalog<TPayload>(contentType, { payload: getPayload() })
: createManagedContentCatalog<TPayload>({
content_type: contentType,
payload: getPayload(),
})
),
onSuccess: async () => {
await invalidateContentCatalogQueries(queryClient, contentType);
},
});
}
export function useDeleteManagedContentCatalog(contentType: string) {
const queryClient = useQueryClient();
return useMutation({
mutationFn: () => deleteManagedContentCatalog(contentType),
onSuccess: async () => {
await invalidateContentCatalogQueries(queryClient, contentType);
},
});
}
async function invalidateContentCatalogQueries(
queryClient: QueryClient,
contentType: string,
): Promise<void> {
await Promise.all([
queryClient.invalidateQueries({ queryKey: [...CONTENT_CATALOG_QUERY_KEYS.content, contentType] }),
queryClient.invalidateQueries({ queryKey: [...CONTENT_CATALOG_QUERY_KEYS.content, 'managed', contentType] }),
]);
}