'use client' import { useState, useRef, useEffect, useCallback } from 'react' import { Button } from '@/components/ui/button' import { Loader2, Check, Lock } from 'lucide-react' import { useToast } from '@/components/ui/use-toast' import { useCanWrite } from '@/lib/hooks/use-can-write' type SaveResult = | Record | { updates: Record; onSuccess?: (data: Record) => void } interface SettingsFormWrapperProps { children: React.ReactNode onSave?: (formData: FormData) => SaveResult className?: string } export function SettingsFormWrapper({ children, onSave, className }: SettingsFormWrapperProps) { const { toast } = useToast() const { canWrite } = useCanWrite() const [isSaving, setIsSaving] = useState(false) const [saved, setSaved] = useState(false) const timerRef = useRef>(undefined) useEffect(() => { return () => { if (timerRef.current) clearTimeout(timerRef.current) } }, []) const handleSubmit = useCallback(async (e: React.FormEvent) => { e.preventDefault() if (!onSave) return const formData = new FormData(e.currentTarget) const saveResult = onSave(formData) // Support both plain object and { updates, onSuccess } return types const isStructured = saveResult && 'updates' in saveResult && typeof saveResult.updates === 'object' const updates = isStructured ? saveResult.updates : saveResult const onSuccess = isStructured ? (saveResult as { onSuccess?: (data: Record) => void }).onSuccess : undefined if (!updates || Object.keys(updates).length === 0) return setIsSaving(true) setSaved(false) try { const response = await fetch('/api/settings', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(updates), }) const result = await response.json() if (!response.ok) { throw new Error(result.error || 'Kunde inte spara inställningar') } onSuccess?.(result.data ?? updates) setSaved(true) timerRef.current = setTimeout(() => setSaved(false), 2000) } catch (error) { toast({ title: 'Kunde inte spara', description: error instanceof Error ? error.message : 'Försök igen.', variant: 'destructive', }) } setIsSaving(false) }, [onSave, toast]) return (
{children}
{saved && ( Sparat )}
) }