import useSWR, { mutate } from 'swr' import { apiClient } from '@/lib/api' import { FormData, PrivacyPolicy } from '@/types/privacy-policy' const POLICIES_KEY = '/api/privacy-policies' export function usePrivacyPolicies() { const ADMIN_POLICIES_KEY = '/api/privacy-policies?admin=true' const { data, error, isLoading } = useSWR( ADMIN_POLICIES_KEY, () => apiClient.getAllPolicies(true), { refreshInterval: 5000, // Refresh every 5 seconds revalidateOnFocus: true, revalidateOnReconnect: true, } ) return { policies: data || [], isLoading, error, mutate: () => mutate(ADMIN_POLICIES_KEY), } } /** * Öffentliche Erklärungen. `initial` sind die serverseitig gerenderten Daten: * Damit steht die Liste schon im ausgelieferten HTML und wird anschließend im * Hintergrund aktualisiert. */ export function usePublicPrivacyPolicies(initial?: PrivacyPolicy[]) { const { data, error, isLoading } = useSWR( POLICIES_KEY, () => apiClient.getAllPolicies(), { fallbackData: initial, refreshInterval: 10000, // Refresh every 10 seconds for public view revalidateOnFocus: true, revalidateOnReconnect: true, } ) const publicPolicies = data?.filter(policy => policy.isPublic) || [] return { policies: publicPolicies, // Liegen Startdaten vom Server vor, gibt es nichts zu laden. SWR meldet // den ersten Hintergrund-Abgleich sonst als Ladezustand und die fertige // Liste würde durch Platzhalter ersetzt. isLoading: isLoading && !initial, error, mutate: () => mutate(POLICIES_KEY), } } export async function createPolicy(data: FormData) { try { const newPolicy = await apiClient.createPolicy(data) // Trigger revalidation of both admin and public policies lists mutate('/api/privacy-policies?admin=true') mutate(POLICIES_KEY) return newPolicy } catch (error) { throw error } } export async function updatePolicy(id: number, data: FormData) { try { const updatedPolicy = await apiClient.updatePolicy(id, data) // Trigger revalidation of both admin and public policies lists mutate('/api/privacy-policies?admin=true') mutate(POLICIES_KEY) return updatedPolicy } catch (error) { throw error } } export async function deletePolicy(id: number) { try { const result = await apiClient.deletePolicy(id) // Trigger revalidation of both admin and public policies lists mutate('/api/privacy-policies?admin=true') mutate(POLICIES_KEY) return result } catch (error) { throw error } }