import DataSortModal from '@/components/data-sort-modal'; import DeleteModal from '@/components/inertia/delete-modal'; import Switch from '@/components/switch'; import Tabs from '@/components/tabs'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { router, useForm } from '@inertiajs/react'; import { ArrowUpDown, Copyright, CreditCard, Edit, Facebook, Github, Instagram, Linkedin, List, Plus, Share2, Trash2, Twitter, X, Youtube, } from 'lucide-react'; import React, { useState } from 'react'; interface FooterItemForm { type: string; slug: string; title: string; active: boolean; items: any[]; sort: number; [key: string]: any; } const FooterEditor = ({ footer }: { footer: Footer }) => { const footerItems = footer.footer_items; const [activeType, setActiveType] = useState('list'); const [editingItem, setEditingItem] = useState(null); const [isFormOpen, setIsFormOpen] = useState(false); const { data, setData, post, put, processing } = useForm({ type: 'list', slug: '', title: '', items: [], active: true, sort: 0, }); // Filter items by type const filteredItems = footerItems.filter((item) => item.type === activeType); const openCreateForm = (type: string) => { setEditingItem(null); setData({ type, slug: '', title: '', items: [], active: true, sort: Math.max(...footerItems.map((item) => item.sort), 0) + 1, }); setIsFormOpen(true); }; const openEditForm = (item: FooterItem) => { setEditingItem(item); setData({ type: item.type, slug: item.slug, title: item.title, active: item.active, items: Array.isArray(item.items) ? item.items : [], sort: item.sort, }); setIsFormOpen(true); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (editingItem) { // Update existing item put(`/dashboard/settings/footer-items/${editingItem.id}`, { onSuccess: () => { setIsFormOpen(false); router.reload({ only: ['footer'] }); }, }); } else { // Create new item post(`/dashboard/settings/footer/${footer.id}/items`, { onSuccess: () => { setIsFormOpen(false); router.reload({ only: ['footer'] }); }, }); } }; // Helper functions for different item types const addListItem = () => { setData((prev) => ({ ...prev, items: [...prev.items, { title: '', url: '' }] })); }; const updateListItem = (index: number, field: 'title' | 'url', value: string) => { const updatedItems = [...data.items]; updatedItems[index] = { ...updatedItems[index], [field]: value }; setData((prev) => ({ ...prev, items: updatedItems })); }; const removeListItem = (index: number) => { const updatedItems = data.items.filter((_: any, i: number) => i !== index); setData((prev) => ({ ...prev, items: updatedItems })); }; const addSocialMediaItem = () => { setData((prev) => ({ ...prev, items: [...prev.items, { title: '', url: '', icon: 'facebook' }] })); }; const updateSocialMediaItem = (index: number, field: 'title' | 'url' | 'icon', value: string) => { const updatedItems = [...data.items]; updatedItems[index] = { ...updatedItems[index], [field]: value }; setData((prev) => ({ ...prev, items: updatedItems })); }; const addPaymentMethodItem = () => { setData((prev) => ({ ...prev, items: [...prev.items, { image: '' }] })); }; const updatePaymentMethodItem = (index: number, value: string) => { const updatedItems = [...data.items]; updatedItems[index] = { image: value }; setData((prev) => ({ ...prev, items: updatedItems })); }; const removeDynamicItem = (index: number) => { const updatedItems = data.items.filter((_: any, i: number) => i !== index); setData((prev) => ({ ...prev, items: updatedItems })); }; const socialMediaIcons = [ { value: 'facebook', label: 'Facebook', icon: }, { value: 'twitter', label: 'Twitter', icon: }, { value: 'instagram', label: 'Instagram', icon: }, { value: 'linkedin', label: 'LinkedIn', icon: }, { value: 'github', label: 'GitHub', icon: }, { value: 'youtube', label: 'YouTube', icon: }, ]; return (
{/* Type Tabs */}
List ({footerItems.filter((item) => item.type === 'list').length}) Social ({footerItems.filter((item) => item.type === 'social_media').length}) Payment ({footerItems.filter((item) => item.type === 'payment_methods').length}) Copyright ({footerItems.filter((item) => item.type === 'copyright').length})
Reorder } onOrderChange={(newOrder, setOpen) => { router.post( route('settings.footer.items.reorder'), { sortedData: newOrder, }, { preserveScroll: true, onSuccess: () => setOpen && setOpen(false) }, ); }} renderContent={(item) => (

{item.title}

{ router.put(`/dashboard/settings/navbar-items/${item.id}`, { ...(item as any), active: checked, }); }} />
)} />
{/* List Items */} {filteredItems.length > 0 ? (
{filteredItems.map((item) => (
{item.title}
{item.items && Array.isArray(item.items) ? `${item.items.length} items` : '0 items'}
} />
{item.items && Array.isArray(item.items) && (
{(item.items as any[]).map((subItem: any, idx: number) => (
{subItem.title} {subItem.url && ({subItem.url})}
))}
)}
))}
) : (
No list items found. Click "Add List" to create one.
)}
{/* Social Media Items */} {filteredItems.length > 0 ? (
{filteredItems.map((item) => (
{item.title}
{item.items && Array.isArray(item.items) ? `${item.items.length} social links` : '0 social links'}
} />
))}
) : (
No social media sections found. Click "Add Social Media" to create one.
)}
{/* Payment Methods Items */} {filteredItems.length > 0 ? (
{filteredItems.map((item) => (
{item.title}
{item.items && Array.isArray(item.items) ? `${item.items.length} payment methods` : '0 payment methods'}
} />
))}
) : (
No payment methods found. Click "Add Payment Methods" to create one.
)}
{/* Copyright Items */} {filteredItems.length > 0 ? (
{filteredItems.map((item) => (
{item.title}
{ router.put(`/dashboard/settings/footer-items/${item.id}`, { ...(item as any), active: checked, }); }} />
))}
) : (
No copyright text found. Click "Add Copyright" to create one.
)}
{/* Create/Edit Form Dialog */} {editingItem ? 'Edit' : 'Create'} {data.type.charAt(0).toUpperCase() + data.type.slice(1).replace('_', ' ')} Item {editingItem ? 'Update the details of this footer item.' : 'Add a new footer item to your footer.'}
setData((prev) => ({ ...prev, title: e.target.value }))} placeholder="Enter title" required />
setData((prev) => ({ ...prev, slug: e.target.value }))} placeholder="Enter unique slug" required />
{/* List Items */} {data.type === 'list' && (
{data.items.map((item, index) => (
updateListItem(index, 'title', e.target.value)} placeholder="Title" className="flex-1" /> updateListItem(index, 'url', e.target.value)} placeholder="URL (optional)" className="flex-1" />
))}
)} {/* Social Media Items */} {data.type === 'social_media' && (
{data.items.map((item, index) => (
updateSocialMediaItem(index, 'title', e.target.value)} placeholder="Platform name" className="flex-1" /> updateSocialMediaItem(index, 'url', e.target.value)} placeholder="Profile URL" className="flex-1" />
))}
)} {/* Payment Method Items */} {data.type === 'payment_methods' && (
{data.items.map((item, index) => (
updatePaymentMethodItem(index, e.target.value)} placeholder="Image URL or path" className="flex-1" />
))}
)} {/* Copyright doesn't need items */}
); }; export default FooterEditor;