From 7f1622613c112666185cee1572360324ff4ca5c4 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 13:07:23 +0000 Subject: [PATCH] Changes --- .../admin/settings/KonsultasiTab.tsx | 170 +++++++ .../admin/settings/NotifikasiTab.tsx | 384 ++++++++++++++++ .../admin/settings/WorkhoursTab.tsx | 166 +++++++ src/pages/ConsultingBooking.tsx | 424 ++++++++++++++++++ src/pages/admin/AdminConsulting.tsx | 302 +++++++++++++ src/pages/admin/AdminSettings.tsx | 210 +++------ 6 files changed, 1500 insertions(+), 156 deletions(-) create mode 100644 src/components/admin/settings/KonsultasiTab.tsx create mode 100644 src/components/admin/settings/NotifikasiTab.tsx create mode 100644 src/components/admin/settings/WorkhoursTab.tsx create mode 100644 src/pages/ConsultingBooking.tsx create mode 100644 src/pages/admin/AdminConsulting.tsx diff --git a/src/components/admin/settings/KonsultasiTab.tsx b/src/components/admin/settings/KonsultasiTab.tsx new file mode 100644 index 0000000..b06ae16 --- /dev/null +++ b/src/components/admin/settings/KonsultasiTab.tsx @@ -0,0 +1,170 @@ +import { useEffect, useState } from 'react'; +import { supabase } from '@/integrations/supabase/client'; +import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Switch } from '@/components/ui/switch'; +import { Textarea } from '@/components/ui/textarea'; +import { toast } from '@/hooks/use-toast'; +import { Video, Calendar, Clock } from 'lucide-react'; +import { formatIDR } from '@/lib/format'; + +interface ConsultingSettings { + id?: string; + is_consulting_enabled: boolean; + consulting_block_price: number; + consulting_block_duration_minutes: number; + consulting_categories: string; +} + +const emptySettings: ConsultingSettings = { + is_consulting_enabled: false, + consulting_block_price: 250000, + consulting_block_duration_minutes: 30, + consulting_categories: 'Teknis, Strategi Bisnis, Karier, Review Produk', +}; + +export function KonsultasiTab() { + const [settings, setSettings] = useState(emptySettings); + const [loading, setLoading] = useState(true); + const [saving, setSaving] = useState(false); + + useEffect(() => { + fetchSettings(); + }, []); + + const fetchSettings = async () => { + const { data, error } = await supabase.from('consulting_settings').select('*').single(); + if (data) setSettings(data); + setLoading(false); + }; + + const saveSettings = async () => { + setSaving(true); + const payload = { ...settings }; + delete payload.id; + + if (settings.id) { + const { error } = await supabase.from('consulting_settings').update(payload).eq('id', settings.id); + if (error) toast({ title: 'Error', description: error.message, variant: 'destructive' }); + else toast({ title: 'Berhasil', description: 'Pengaturan konsultasi disimpan' }); + } else { + const { data, error } = await supabase.from('consulting_settings').insert(payload).select().single(); + if (error) toast({ title: 'Error', description: error.message, variant: 'destructive' }); + else { setSettings(data); toast({ title: 'Berhasil', description: 'Pengaturan konsultasi disimpan' }); } + } + setSaving(false); + }; + + const categories = settings.consulting_categories.split(',').map(c => c.trim()).filter(Boolean); + + if (loading) return
; + + return ( +
+ + + + + + Konfigurasi layanan konsultasi 1-on-1 + + + +
+
+

Aktifkan Layanan Konsultasi

+

+ Tampilkan konsultasi di halaman produk dan dashboard member +

+
+ setSettings({ ...settings, is_consulting_enabled: checked })} + /> +
+ +
+
+ + setSettings({ ...settings, consulting_block_price: parseInt(e.target.value) || 0 })} + className="border-2" + /> +

+ Harga saat ini: {formatIDR(settings.consulting_block_price)} +

+
+ +
+ + setSettings({ ...settings, consulting_block_duration_minutes: Math.max(15, parseInt(e.target.value) || 30) })} + className="border-2" + /> +

+ Minimum 15 menit, kelipatan 15 disarankan +

+
+
+ +
+ +