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 (
-
-
{setting.description}
-
+
+
+
+
+ Auto-Flag Content Threshold
+
+
+ Content will be automatically flagged for review after receiving this many reports
+
+
+ {
+ const numValue = parseInt(value);
+ setLocalValue(numValue);
+ handleSave(setting.setting_key, numValue);
+ }}>
+
+
+
+
+ 1 report
+ 2 reports
+ 3 reports
+ 5 reports
+ 10 reports
+
+
+ Current: {localValue} reports
+
+
+
+ );
+ }
+
+ // Review retention settings
+ if (setting.setting_key === 'moderation.review_retention_days') {
+ return (
+
+
+
+
+ Review Data Retention
+
+
+ How long to keep moderated content data before automatic cleanup
+
+
+ {
+ const numValue = parseInt(value);
+ setLocalValue(numValue);
+ handleSave(setting.setting_key, numValue);
+ }}>
+
+
+
+
+ 30 days
+ 60 days
+ 90 days
+ 6 months
+ 1 year
+ 2 years
+
+
+ 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 (
+
+
+
+
+ User Ban Duration Options
+
+
+ Configure the available ban duration options for moderators
+
+
+
+
+
+
Temporary Ban
+
Short-term restriction for minor violations
+
+
+ updateBanDuration('temporary', parseInt(value))}
+ >
+
+
+
+
+ 1 day
+ 3 days
+ 7 days
+ 14 days
+
+
+
+
+
+
+
+
Extended Ban
+
Longer restriction for serious violations
+
+
+ updateBanDuration('extended', parseInt(value))}
+ >
+
+
+
+
+ 30 days
+ 60 days
+ 90 days
+ 6 months
+
+
+
+
+
+
+
+
Permanent Ban
+
Indefinite restriction for severe violations
+
+
+ Permanent
+
+
+
+
+
+
+ Save Ban Duration Settings
+
+
+
+ );
+ }
+
+ // 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.description}
+
+
+ {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 (
+
+
+
+
+ {setting.description}
+
+
+ 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 (
+
+
+
+
+ {setting.description}
+
+
{
- 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 (
-
-
- {setting.description}
-
-
{
- setLocalValue(checked);
- handleSave(setting.setting_key, checked);
- }}
- />
-
- );
- }
-
- if (setting.setting_key === 'moderation.ban_durations') {
- return (
-
-
{setting.description}
-
-
-
- );
- }
-
- return (
-
-
{setting.description}
-
- {
- setLocalValue(e.target.value);
- handleSettingChange(setting.setting_key, e.target.value);
- }}
- />
-
-
-
-
-
+
);
};
return (
<>
-
+
Admin Settings
- Configure system-wide settings and preferences
+ Configure system-wide settings and preferences with easy-to-use controls
-
+
- Moderation
- User Management
- Notifications
- System
+
+
+ Moderation
+
+
+
+ Users
+
+
+
+ Notifications
+
+
+
+ System
+
- Moderation Settings
+
+
+ Moderation Settings
+
- Configure content moderation rules and thresholds
+ Configure content moderation rules, thresholds, and automated actions
-
- {getSettingsByCategory('moderation').map((setting) => (
-
- ))}
+
+ {getSettingsByCategory('moderation').length > 0 ? (
+ getSettingsByCategory('moderation').map((setting) => (
+
+ ))
+ ) : (
+
+
+
No moderation settings configured yet.
+
+ )}
@@ -245,15 +456,25 @@ export default function AdminSettings() {
- User Management
+
+
+ User Management
+
- Configure user management policies and options
+ Configure user registration, profile settings, and account policies
-
- {getSettingsByCategory('user_management').map((setting) => (
-
- ))}
+
+ {getSettingsByCategory('user_management').length > 0 ? (
+ getSettingsByCategory('user_management').map((setting) => (
+
+ ))
+ ) : (
+
+
+
No user management settings configured yet.
+
+ )}
@@ -261,15 +482,25 @@ export default function AdminSettings() {
- Notifications
+
+
+ Notification Settings
+
- Configure notification preferences and alert thresholds
+ Configure email alerts, push notifications, and communication preferences
-
- {getSettingsByCategory('notifications').map((setting) => (
-
- ))}
+
+ {getSettingsByCategory('notifications').length > 0 ? (
+ getSettingsByCategory('notifications').map((setting) => (
+
+ ))
+ ) : (
+
+
+
No notification settings configured yet.
+
+ )}
@@ -277,15 +508,25 @@ export default function AdminSettings() {
- System Configuration
+
+
+ System Configuration
+
- Configure system-wide settings and maintenance options
+ Configure system-wide settings, maintenance options, and technical parameters
-
- {getSettingsByCategory('system').map((setting) => (
-
- ))}
+
+ {getSettingsByCategory('system').length > 0 ? (
+ getSettingsByCategory('system').map((setting) => (
+
+ ))
+ ) : (
+
+
+
No system settings configured yet.
+
+ )}