diff --git a/src/components/admin/settings/BrandingTab.tsx b/src/components/admin/settings/BrandingTab.tsx
index e118c61..57f71f1 100644
--- a/src/components/admin/settings/BrandingTab.tsx
+++ b/src/components/admin/settings/BrandingTab.tsx
@@ -4,8 +4,15 @@ import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/com
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
+import { Textarea } from '@/components/ui/textarea';
import { toast } from '@/hooks/use-toast';
-import { Palette, Image, Mail } from 'lucide-react';
+import { Palette, Image, Mail, Home, Plus, Trash2 } from 'lucide-react';
+
+interface HomepageFeature {
+ icon: string;
+ title: string;
+ description: string;
+}
interface PlatformSettings {
id?: string;
@@ -16,8 +23,17 @@ interface PlatformSettings {
brand_primary_color: string;
brand_accent_color: string;
brand_email_from_name: string;
+ homepage_headline: string;
+ homepage_description: string;
+ homepage_features: HomepageFeature[];
}
+const defaultFeatures: HomepageFeature[] = [
+ { icon: 'Users', title: 'Consulting', description: 'One-on-one sessions with industry experts to solve your specific challenges.' },
+ { icon: 'Video', title: 'Webinars', description: 'Live and recorded sessions covering the latest trends and techniques.' },
+ { icon: 'BookOpen', title: 'Bootcamps', description: 'Intensive programs to master new skills in weeks, not months.' },
+];
+
const emptySettings: PlatformSettings = {
brand_name: '',
brand_tagline: '',
@@ -26,8 +42,13 @@ const emptySettings: PlatformSettings = {
brand_primary_color: '#111827',
brand_accent_color: '#0F766E',
brand_email_from_name: '',
+ homepage_headline: 'Learn. Grow. Succeed.',
+ homepage_description: 'Access premium consulting, live webinars, and intensive bootcamps to accelerate your career.',
+ homepage_features: defaultFeatures,
};
+const iconOptions = ['Users', 'Video', 'BookOpen', 'Star', 'Award', 'Target', 'Zap', 'Heart', 'Shield', 'Rocket'];
+
export function BrandingTab() {
const [settings, setSettings] = useState
(emptySettings);
const [loading, setLoading] = useState(true);
@@ -44,6 +65,17 @@ export function BrandingTab() {
.single();
if (data) {
+ let features = defaultFeatures;
+ if (data.homepage_features) {
+ try {
+ features = typeof data.homepage_features === 'string'
+ ? JSON.parse(data.homepage_features)
+ : data.homepage_features;
+ } catch (e) {
+ console.error('Error parsing features:', e);
+ }
+ }
+
setSettings({
id: data.id,
brand_name: data.brand_name || '',
@@ -53,6 +85,9 @@ export function BrandingTab() {
brand_primary_color: data.brand_primary_color || '#111827',
brand_accent_color: data.brand_accent_color || '#0F766E',
brand_email_from_name: data.brand_email_from_name || '',
+ homepage_headline: data.homepage_headline || emptySettings.homepage_headline,
+ homepage_description: data.homepage_description || emptySettings.homepage_description,
+ homepage_features: features,
});
}
setLoading(false);
@@ -60,8 +95,18 @@ export function BrandingTab() {
const saveSettings = async () => {
setSaving(true);
- const payload = { ...settings };
- delete payload.id;
+ const payload = {
+ brand_name: settings.brand_name,
+ brand_tagline: settings.brand_tagline,
+ brand_logo_url: settings.brand_logo_url,
+ brand_favicon_url: settings.brand_favicon_url,
+ brand_primary_color: settings.brand_primary_color,
+ brand_accent_color: settings.brand_accent_color,
+ brand_email_from_name: settings.brand_email_from_name,
+ homepage_headline: settings.homepage_headline,
+ homepage_description: settings.homepage_description,
+ homepage_features: settings.homepage_features,
+ };
if (settings.id) {
const { error } = await supabase
@@ -87,10 +132,33 @@ export function BrandingTab() {
setSaving(false);
};
+ const updateFeature = (index: number, field: keyof HomepageFeature, value: string) => {
+ const newFeatures = [...settings.homepage_features];
+ newFeatures[index] = { ...newFeatures[index], [field]: value };
+ setSettings({ ...settings, homepage_features: newFeatures });
+ };
+
+ const addFeature = () => {
+ if (settings.homepage_features.length >= 6) {
+ toast({ title: 'Maksimum', description: 'Maksimum 6 fitur', variant: 'destructive' });
+ return;
+ }
+ setSettings({
+ ...settings,
+ homepage_features: [...settings.homepage_features, { icon: 'Star', title: '', description: '' }],
+ });
+ };
+
+ const removeFeature = (index: number) => {
+ const newFeatures = settings.homepage_features.filter((_, i) => i !== index);
+ setSettings({ ...settings, homepage_features: newFeatures });
+ };
+
if (loading) return ;
return (
+ {/* Brand Identity */}
@@ -228,12 +296,119 @@ export function BrandingTab() {
Digunakan jika SMTP from_name kosong
-
-
+
+ {/* Homepage Settings */}
+
+
+
+
+ Konten Homepage
+
+
+ Konfigurasi teks dan fitur yang ditampilkan di halaman utama
+
+
+
+
+
+ setSettings({ ...settings, homepage_headline: e.target.value })}
+ placeholder="Learn. Grow. Succeed."
+ className="border-2"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+ {settings.homepage_features.map((feature, index) => (
+
+
+ Fitur {index + 1}
+ {settings.homepage_features.length > 1 && (
+
+ )}
+
+
+
+
+
+
+
+
+
+
+ updateFeature(index, 'title', e.target.value)}
+ placeholder="Consulting"
+ className="border-2"
+ />
+
+
+
+
+
+
+
+ ))}
+
+
+
+
+
);
}
diff --git a/src/hooks/useBranding.tsx b/src/hooks/useBranding.tsx
new file mode 100644
index 0000000..aac9c07
--- /dev/null
+++ b/src/hooks/useBranding.tsx
@@ -0,0 +1,104 @@
+import { createContext, useContext, useEffect, useState, ReactNode } from 'react';
+import { supabase } from '@/integrations/supabase/client';
+
+interface HomepageFeature {
+ icon: string;
+ title: string;
+ description: string;
+}
+
+interface BrandingSettings {
+ brand_name: string;
+ brand_tagline: string;
+ brand_logo_url: string;
+ brand_favicon_url: string;
+ brand_primary_color: string;
+ brand_accent_color: string;
+ brand_email_from_name: string;
+ homepage_headline: string;
+ homepage_description: string;
+ homepage_features: HomepageFeature[];
+}
+
+const defaultBranding: BrandingSettings = {
+ brand_name: 'LearnHub',
+ brand_tagline: 'Belajar bareng, dari praktisi.',
+ brand_logo_url: '',
+ brand_favicon_url: '',
+ brand_primary_color: '#111827',
+ brand_accent_color: '#0F766E',
+ brand_email_from_name: '',
+ homepage_headline: 'Learn. Grow. Succeed.',
+ homepage_description: 'Access premium consulting, live webinars, and intensive bootcamps to accelerate your career.',
+ homepage_features: [
+ { icon: 'Users', title: 'Consulting', description: 'One-on-one sessions with industry experts to solve your specific challenges.' },
+ { icon: 'Video', title: 'Webinars', description: 'Live and recorded sessions covering the latest trends and techniques.' },
+ { icon: 'BookOpen', title: 'Bootcamps', description: 'Intensive programs to master new skills in weeks, not months.' },
+ ],
+};
+
+const BrandingContext = createContext