diff --git a/src/pages/AdminSettings.tsx b/src/pages/AdminSettings.tsx index 240f7b30..9e34da89 100644 --- a/src/pages/AdminSettings.tsx +++ b/src/pages/AdminSettings.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useState, useEffect } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; @@ -8,12 +8,14 @@ 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 } from 'lucide-react'; +import { Loader2, Save, Clock, Users, Bell, Shield, Settings, Trash2, Plus, X } from 'lucide-react'; interface AdminSetting { id: string; @@ -121,123 +123,332 @@ export default function AdminSettings() { await handleSave(setting.setting_key, localValue); }; - if (setting.setting_key.includes('threshold') || setting.setting_key.includes('retention_days')) { + // Auto-flagging threshold settings + if (setting.setting_key === 'moderation.auto_flag_threshold') { return ( -
- -
+ +
+
+ + +
+

+ Content will be automatically flagged for review after receiving this many reports +

+
+ + Current: {localValue} reports +
+
+
+ ); + } + + // Review retention settings + if (setting.setting_key === 'moderation.review_retention_days') { + return ( + +
+
+ + +
+

+ How long to keep moderated content data before automatic cleanup +

+
+ + Current: {localValue} days +
+
+
+ ); + } + + // Ban duration settings + if (setting.setting_key === 'moderation.ban_durations') { + const [banDurations, setBanDurations] = useState<{[key: string]: number}>( + typeof localValue === 'object' ? localValue : { temporary: 7, extended: 30, permanent: 0 } + ); + + const updateBanDuration = (type: string, days: number) => { + const updated = { ...banDurations, [type]: days }; + setBanDurations(updated); + setLocalValue(updated); + }; + + const saveBanDurations = () => { + handleSave(setting.setting_key, banDurations); + }; + + return ( + +
+
+ + +
+

+ Configure the available ban duration options for moderators +

+ +
+
+
+ +

Short-term restriction for minor violations

+
+
+ +
+
+ +
+
+ +

Longer restriction for serious violations

+
+
+ +
+
+ +
+
+ +

Indefinite restriction for severe violations

+
+
+ Permanent +
+
+
+ + +
+
+ ); + } + + // Boolean/switch settings + if (setting.setting_key.includes('email_alerts') || + setting.setting_key.includes('require_approval') || + setting.setting_key.includes('auto_cleanup') || + setting.setting_key.includes('enable_') || + setting.setting_key.includes('allow_')) { + + const getSettingIcon = () => { + if (setting.setting_key.includes('email_alerts')) return ; + if (setting.setting_key.includes('require_approval')) return ; + if (setting.setting_key.includes('auto_cleanup')) return ; + return ; + }; + + return ( + +
+
+
+ {getSettingIcon()} + +
+

+ {setting.setting_key.includes('email_alerts') && "Receive email notifications for this event"} + {setting.setting_key.includes('require_approval') && "Items must be manually approved before being published"} + {setting.setting_key.includes('auto_cleanup') && "Automatically remove old or rejected content"} + {(!setting.setting_key.includes('email_alerts') && !setting.setting_key.includes('require_approval') && !setting.setting_key.includes('auto_cleanup')) && "Toggle this feature on or off"} +

+
+
+ + {localValue ? "Enabled" : "Disabled"} + + { + setLocalValue(checked); + handleSave(setting.setting_key, checked); + }} + /> +
+
+
+ ); + } + + // Numeric threshold settings + if (setting.setting_key.includes('threshold') || setting.setting_key.includes('limit') || setting.setting_key.includes('max_')) { + return ( + +
+
+ + +
+

+ Set the numeric limit for this system parameter +

+
+
+ { + const value = parseInt(e.target.value) || 0; + setLocalValue(value); + }} + className="w-24" + min="0" + /> + +
+ Current: {localValue} +
+
+
+ ); + } + + // Default string input + return ( + +
+
+ + +
+
{ - setLocalValue(parseInt(e.target.value)); - handleSettingChange(setting.setting_key, parseInt(e.target.value)); + setLocalValue(e.target.value); }} + className="flex-1" /> -
- ); - } - - if (setting.setting_key.includes('email_alerts') || setting.setting_key.includes('require_approval') || setting.setting_key.includes('auto_cleanup')) { - return ( -
-
- -
- { - setLocalValue(checked); - handleSave(setting.setting_key, checked); - }} - /> -
- ); - } - - if (setting.setting_key === 'moderation.ban_durations') { - return ( -
- -
-