Add calendar cleanup button to admin consulting page
Adds a manual button for admins to trigger Google Calendar event cleanup for cancelled consulting sessions. This works around Docker networking limitations. Features: - Button to trigger cleanup - Confirmation dialog - Loading state - Success/error toast notifications 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -77,6 +77,7 @@ export default function AdminConsulting() {
|
|||||||
const [editTotalDuration, setEditTotalDuration] = useState(0);
|
const [editTotalDuration, setEditTotalDuration] = useState(0);
|
||||||
const [isRescheduling, setIsRescheduling] = useState(false);
|
const [isRescheduling, setIsRescheduling] = useState(false);
|
||||||
const [notifyMember, setNotifyMember] = useState(true);
|
const [notifyMember, setNotifyMember] = useState(true);
|
||||||
|
const [cleaningCalendar, setCleaningCalendar] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (user && isAdmin) {
|
if (user && isAdmin) {
|
||||||
@@ -115,6 +116,36 @@ export default function AdminConsulting() {
|
|||||||
if (data) setSettings(data);
|
if (data) setSettings(data);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleCalendarCleanup = async () => {
|
||||||
|
if (!confirm('Bersihkan Google Calendar events untuk semua sesi yang sudah dibatalkan?')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setCleaningCalendar(true);
|
||||||
|
try {
|
||||||
|
const { data, error } = await supabase.functions.invoke('trigger-calendar-cleanup');
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = data as { processed?: number; message?: string };
|
||||||
|
toast({
|
||||||
|
title: 'Berhasil',
|
||||||
|
description: result.message || `Calendar events dibersihkan untuk ${result.processed || 0} sesi`,
|
||||||
|
});
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error('Calendar cleanup error:', error);
|
||||||
|
toast({
|
||||||
|
title: 'Gagal',
|
||||||
|
description: error.message || 'Gagal membersihkan calendar events',
|
||||||
|
variant: 'destructive',
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
setCleaningCalendar(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const openMeetDialog = (session: ConsultingSession, rescheduleMode: boolean = false) => {
|
const openMeetDialog = (session: ConsultingSession, rescheduleMode: boolean = false) => {
|
||||||
setSelectedSession(session);
|
setSelectedSession(session);
|
||||||
setMeetLink(session.meet_link || '');
|
setMeetLink(session.meet_link || '');
|
||||||
@@ -421,10 +452,36 @@ export default function AdminConsulting() {
|
|||||||
<Video className="w-10 h-10" />
|
<Video className="w-10 h-10" />
|
||||||
Manajemen Konsultasi
|
Manajemen Konsultasi
|
||||||
</h1>
|
</h1>
|
||||||
<p className="text-muted-foreground mb-8">
|
<p className="text-muted-foreground mb-4">
|
||||||
Kelola jadwal dan link Google Meet untuk sesi konsultasi
|
Kelola jadwal dan link Google Meet untuk sesi konsultasi
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
{/* Calendar Cleanup Button */}
|
||||||
|
<div className="mb-6">
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
size="sm"
|
||||||
|
onClick={handleCalendarCleanup}
|
||||||
|
disabled={cleaningCalendar}
|
||||||
|
className="border-orange-600 text-orange-600 hover:bg-orange-50"
|
||||||
|
>
|
||||||
|
{cleaningCalendar ? (
|
||||||
|
<>
|
||||||
|
<Loader2 className="w-4 h-4 mr-2 animate-spin" />
|
||||||
|
Membersihkan Calendar Events...
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<AlertCircle className="w-4 h-4 mr-2" />
|
||||||
|
Cleanup Calendar Events (Cancelled Sessions)
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</Button>
|
||||||
|
<p className="text-xs text-muted-foreground mt-2">
|
||||||
|
Membersihkan Google Calendar events untuk sesi yang sudah dibatalkan
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Passed Confirmed Sessions Alert */}
|
{/* Passed Confirmed Sessions Alert */}
|
||||||
{passedConfirmedSessions.length > 0 && (
|
{passedConfirmedSessions.length > 0 && (
|
||||||
<Card className="border-2 border-orange-500 bg-orange-50 dark:bg-orange-950 mb-6">
|
<Card className="border-2 border-orange-500 bg-orange-50 dark:bg-orange-950 mb-6">
|
||||||
|
|||||||
Reference in New Issue
Block a user