diff --git a/src/pages/admin/AdminConsulting.tsx b/src/pages/admin/AdminConsulting.tsx index 25999e6..caad202 100644 --- a/src/pages/admin/AdminConsulting.tsx +++ b/src/pages/admin/AdminConsulting.tsx @@ -77,6 +77,7 @@ export default function AdminConsulting() { const [editTotalDuration, setEditTotalDuration] = useState(0); const [isRescheduling, setIsRescheduling] = useState(false); const [notifyMember, setNotifyMember] = useState(true); + const [cleaningCalendar, setCleaningCalendar] = useState(false); useEffect(() => { if (user && isAdmin) { @@ -111,10 +112,40 @@ export default function AdminConsulting() { .from('platform_settings') .select('integration_n8n_base_url, integration_google_calendar_id') .single(); - + 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) => { setSelectedSession(session); setMeetLink(session.meet_link || ''); @@ -421,10 +452,36 @@ export default function AdminConsulting() {