diff --git a/src/components/layout/AdminHeader.tsx b/src/components/layout/AdminHeader.tsx index 02ec6125..637b731a 100644 --- a/src/components/layout/AdminHeader.tsx +++ b/src/components/layout/AdminHeader.tsx @@ -1,5 +1,6 @@ -import { Shield, ArrowLeft, Settings, RefreshCw, Menu } from 'lucide-react'; +import { Shield, ArrowLeft, Settings, Menu } from 'lucide-react'; import { Button } from '@/components/ui/button'; +import { RefreshButton } from '@/components/ui/refresh-button'; import { Link, useLocation } from 'react-router-dom'; import { ThemeToggle } from '@/components/theme/ThemeToggle'; import { AuthButtons } from '@/components/auth/AuthButtons'; @@ -15,7 +16,7 @@ import { SheetTrigger, } from '@/components/ui/sheet'; -export function AdminHeader({ onRefresh }: { onRefresh?: () => void }) { +export function AdminHeader({ onRefresh, isRefreshing }: { onRefresh?: () => void; isRefreshing?: boolean }) { const { permissions } = useUserRole(); const { user } = useAuth(); const location = useLocation(); @@ -68,14 +69,12 @@ export function AdminHeader({ onRefresh }: { onRefresh?: () => void }) { Theme - + {permissions?.role_level === 'superuser' && !isSettingsPage && ( + {onRefresh && ( + + )} {permissions?.role_level === 'superuser' && !isSettingsPage && ( + /> )} {user && } diff --git a/src/pages/AdminSettings.tsx b/src/pages/AdminSettings.tsx index 33e37896..fb46af70 100644 --- a/src/pages/AdminSettings.tsx +++ b/src/pages/AdminSettings.tsx @@ -166,8 +166,15 @@ export default function AdminSettings() { setLocalValue(updated); }; - const saveBanDurations = () => { - updateSetting(setting.setting_key, banDurations); + const [savingBanDurations, setSavingBanDurations] = useState(false); + + const saveBanDurations = async () => { + setSavingBanDurations(true); + try { + await updateSetting(setting.setting_key, banDurations); + } finally { + setSavingBanDurations(false); + } }; return ( @@ -239,7 +246,13 @@ export default function AdminSettings() { - @@ -431,7 +444,13 @@ export default function AdminSettings() { className="w-24" min="0" /> - @@ -458,7 +477,13 @@ export default function AdminSettings() { }} className="flex-1" /> - diff --git a/src/pages/AuthCallback.tsx b/src/pages/AuthCallback.tsx index 412e9412..de2ead86 100644 --- a/src/pages/AuthCallback.tsx +++ b/src/pages/AuthCallback.tsx @@ -275,15 +275,14 @@ export default function AuthCallback() { required /> - diff --git a/src/pages/Profile.tsx b/src/pages/Profile.tsx index c7bab1b3..005e3bb2 100644 --- a/src/pages/Profile.tsx +++ b/src/pages/Profile.tsx @@ -525,6 +525,8 @@ export default function Profile() { setFormErrors({}); return true; }; + const [isSaving, setIsSaving] = useState(false); + const handleSaveProfile = async () => { if (!profile || !currentUser) return; if (!validateForm()) return; @@ -533,6 +535,8 @@ export default function Profile() { setShowUsernameDialog(true); return; } + + setIsSaving(true); try { const updateData: any = { display_name: editForm.display_name, @@ -572,6 +576,8 @@ export default function Profile() { title: "Error updating profile", description: getErrorMessage(error) }); + } finally { + setIsSaving(false); } }; const confirmUsernameChange = () => { @@ -730,7 +736,14 @@ export default function Profile() {
- diff --git a/src/pages/admin/ErrorLookup.tsx b/src/pages/admin/ErrorLookup.tsx index e47a8d50..1a55cc38 100644 --- a/src/pages/admin/ErrorLookup.tsx +++ b/src/pages/admin/ErrorLookup.tsx @@ -83,7 +83,12 @@ export default function ErrorLookup() { onKeyDown={(e) => e.key === 'Enter' && handleSearch()} className="font-mono" /> - diff --git a/src/pages/admin/ErrorMonitoring.tsx b/src/pages/admin/ErrorMonitoring.tsx index a65a75c5..0361af74 100644 --- a/src/pages/admin/ErrorMonitoring.tsx +++ b/src/pages/admin/ErrorMonitoring.tsx @@ -5,9 +5,9 @@ import { AdminLayout } from '@/components/layout/AdminLayout'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; -import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; -import { AlertCircle, RefreshCw } from 'lucide-react'; +import { AlertCircle } from 'lucide-react'; +import { RefreshButton } from '@/components/ui/refresh-button'; import { ErrorDetailsModal } from '@/components/admin/ErrorDetailsModal'; import { ErrorAnalytics } from '@/components/admin/ErrorAnalytics'; import { format } from 'date-fns'; @@ -33,7 +33,7 @@ export default function ErrorMonitoring() { const [dateRange, setDateRange] = useState<'1h' | '24h' | '7d' | '30d'>('24h'); // Fetch recent errors - const { data: errors, isLoading, refetch } = useQuery({ + const { data: errors, isLoading, refetch, isFetching } = useQuery({ queryKey: ['admin-errors', dateRange, errorTypeFilter, searchTerm], queryFn: async () => { let query = supabase @@ -88,10 +88,12 @@ export default function ErrorMonitoring() {

Error Monitoring

Track and analyze application errors

- + { await refetch(); }} + isLoading={isFetching} + variant="outline" + size="sm" + /> {/* Analytics Section */}