From 1de2f7274dabc91272326edea508ba7a9a03c618 Mon Sep 17 00:00:00 2001 From: CCS Admin Date: Thu, 26 Feb 2026 18:23:46 +0000 Subject: [PATCH] refactor: migrate DisclosuresPage to TanStack Query Co-Authored-By: Claude Opus 4.6 --- frontend/src/hooks/useDisclosures.ts | 21 +++++++++++++++++ frontend/src/pages/DisclosuresPage.tsx | 32 +++++++------------------- 2 files changed, 29 insertions(+), 24 deletions(-) create mode 100644 frontend/src/hooks/useDisclosures.ts diff --git a/frontend/src/hooks/useDisclosures.ts b/frontend/src/hooks/useDisclosures.ts new file mode 100644 index 0000000..3b4032b --- /dev/null +++ b/frontend/src/hooks/useDisclosures.ts @@ -0,0 +1,21 @@ +import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' +import { getDisclosureRequests, reviewDisclosure } from '@/services/disclosureService' + +export function useDisclosures(status: string = 'pending') { + return useQuery({ + queryKey: ['disclosures', status], + queryFn: () => getDisclosureRequests(status), + }) +} + +export function useReviewDisclosure() { + const queryClient = useQueryClient() + return useMutation({ + mutationFn: ({ id, status }: { id: number; status: 'approved' | 'rejected' }) => + reviewDisclosure(id, status), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['disclosures'] }) + queryClient.invalidateQueries({ queryKey: ['notifications'] }) + }, + }) +} diff --git a/frontend/src/pages/DisclosuresPage.tsx b/frontend/src/pages/DisclosuresPage.tsx index 6bddc45..967ae37 100644 --- a/frontend/src/pages/DisclosuresPage.tsx +++ b/frontend/src/pages/DisclosuresPage.tsx @@ -1,41 +1,23 @@ -import { useState, useEffect } from 'react' import { Check, X } from 'lucide-react' import { Button } from '@/components/ui/button' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Skeleton } from '@/components/ui/skeleton' -import type { DisclosureRequest } from '@/types' -import { getDisclosureRequests, reviewDisclosure } from '@/services/disclosureService' +import { useDisclosures, useReviewDisclosure } from '@/hooks/useDisclosures' export function DisclosuresPage() { - const [requests, setRequests] = useState([]) - const [loading, setLoading] = useState(true) + const { data: requests = [], isLoading } = useDisclosures('pending') + const reviewMutation = useReviewDisclosure() - const load = () => { - setLoading(true) - getDisclosureRequests('pending') - .then(setRequests) - .catch(() => setRequests([])) - .finally(() => setLoading(false)) - } - - useEffect(() => { load() }, []) - - const handleReview = async (id: number, status: 'approved' | 'rejected') => { - try { - await reviewDisclosure(id, status) - load() - } catch { - // Silently reload on error - load() - } + const handleReview = (id: number, status: 'approved' | 'rejected') => { + reviewMutation.mutate({ id, status }) } return (

Freigabe-Anfragen

- {loading ? ( + {isLoading ? (
{[1, 2, 3].map((i) => ( @@ -70,6 +52,7 @@ export function DisclosuresPage() {