diff --git a/src/pages/AdminSettings.tsx b/src/pages/AdminSettings.tsx index 9e34da89..e2a10893 100644 --- a/src/pages/AdminSettings.tsx +++ b/src/pages/AdminSettings.tsx @@ -1,82 +1,29 @@ -import { useState, useEffect } from 'react'; -import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; +import { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Switch } from '@/components/ui/switch'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; -import { Textarea } from '@/components/ui/textarea'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; -import { Separator } from '@/components/ui/separator'; import { Badge } from '@/components/ui/badge'; import { AdminHeader } from '@/components/layout/AdminHeader'; import { useAuth } from '@/hooks/useAuth'; import { useUserRole } from '@/hooks/useUserRole'; -import { supabase } from '@/integrations/supabase/client'; -import { useToast } from '@/hooks/use-toast'; -import { Loader2, Save, Clock, Users, Bell, Shield, Settings, Trash2, Plus, X } from 'lucide-react'; - -interface AdminSetting { - id: string; - setting_key: string; - setting_value: any; - category: string; - description: string; -} +import { useAdminSettings } from '@/hooks/useAdminSettings'; +import { Loader2, Save, Clock, Users, Bell, Shield, Settings, Trash2 } from 'lucide-react'; export default function AdminSettings() { const { user } = useAuth(); - const { permissions, loading: roleLoading } = useUserRole(); - const { toast } = useToast(); - const queryClient = useQueryClient(); - const [hasChanges, setHasChanges] = useState(false); - - // Fetch admin settings - const { data: settings, isLoading } = useQuery({ - queryKey: ['admin-settings'], - queryFn: async () => { - const { data, error } = await supabase - .from('admin_settings') - .select('*') - .order('category', { ascending: true }); - - if (error) throw error; - return data as AdminSetting[]; - }, - enabled: !!user && permissions?.role_level !== 'user' - }); - - // Update settings mutation - const updateSettingMutation = useMutation({ - mutationFn: async ({ key, value }: { key: string; value: any }) => { - const { error } = await supabase - .from('admin_settings') - .update({ - setting_value: value, - updated_by: user?.id, - updated_at: new Date().toISOString() - }) - .eq('setting_key', key); - - if (error) throw error; - }, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['admin-settings'] }); - setHasChanges(false); - toast({ - title: "Settings Updated", - description: "Admin settings have been saved successfully.", - }); - }, - onError: (error: any) => { - toast({ - title: "Error", - description: error.message || "Failed to update settings", - variant: "destructive", - }); - } - }); + const { isAdmin, isModerator, loading: roleLoading } = useUserRole(); + const { + settings, + isLoading, + error, + updateSetting, + isUpdating, + getSettingsByCategory + } = useAdminSettings(); if (roleLoading || isLoading) { return ( @@ -89,38 +36,51 @@ export default function AdminSettings() { ); } - if (!user || permissions?.role_level === 'user') { + if (!user || (!isAdmin() && !isModerator())) { return ( <>
-
+

Access Denied

You don't have permission to access admin settings.

+ {error && ( +
+ Error details: {error.message} +
+ )}
); } - const getSettingsByCategory = (category: string) => { - return settings?.filter(s => s.category === category) || []; - }; + if (!settings || settings.length === 0) { + return ( + <> + +
+
+

No Settings Found

+

+ No admin settings have been configured yet. Please contact your system administrator. +

+ {error && ( +
+ Error details: {error.message} +
+ )} +
+
+ + ); + } - const handleSettingChange = (key: string, value: any) => { - setHasChanges(true); - // You could implement local state management here for real-time updates - }; - - const handleSave = async (key: string, value: any) => { - await updateSettingMutation.mutateAsync({ key, value }); - }; - - const SettingInput = ({ setting }: { setting: AdminSetting }) => { + const SettingInput = ({ setting }: { setting: any }) => { const [localValue, setLocalValue] = useState(setting.setting_value); const handleSubmit = async () => { - await handleSave(setting.setting_key, localValue); + await updateSetting(setting.setting_key, localValue); }; // Auto-flagging threshold settings @@ -139,7 +99,7 @@ export default function AdminSettings() { { const numValue = parseInt(value); setLocalValue(numValue); - handleSave(setting.setting_key, numValue); + updateSetting(setting.setting_key, numValue); }}> @@ -209,7 +169,7 @@ export default function AdminSettings() { }; const saveBanDurations = () => { - handleSave(setting.setting_key, banDurations); + updateSetting(setting.setting_key, banDurations); }; return ( @@ -281,7 +241,7 @@ export default function AdminSettings() {
- @@ -327,7 +287,7 @@ export default function AdminSettings() { checked={localValue === true || localValue === 'true'} onCheckedChange={(checked) => { setLocalValue(checked); - handleSave(setting.setting_key, checked); + updateSetting(setting.setting_key, checked); }} /> @@ -360,7 +320,7 @@ export default function AdminSettings() { className="w-24" min="0" /> - @@ -387,7 +347,7 @@ export default function AdminSettings() { }} className="flex-1" /> -