import React, { useState, useEffect } from 'react';
import { Head, router } from '@inertiajs/react';
import AdminLayout from '@/Layouts/AdminLayout';
import {
Plus,
Edit2,
Trash2,
Check,
X,
Info,
MoreVertical,
DollarSign,
Clock,
Zap,
Shield,
Trophy,
Search
} from 'lucide-react';
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from '@/components/ui/table';
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog";
export default function SubscriptionsIndex({ plans: initialPlans, errors = {} }) {
const mapIncomingPlans = (rawPlans) => {
if (!rawPlans) return [];
return rawPlans.map(p => ({
...p,
price: Number(p.price),
maxContactPeople: p.max_contact_people !== undefined ? p.max_contact_people : p.maxContactPeople,
unlimitedContacts: p.unlimited_contacts !== undefined ? !!p.unlimited_contacts : !!p.unlimitedContacts,
enableJobApply: p.enable_job_apply !== undefined ? !!p.enable_job_apply : !!p.enableJobApply,
usageCount: p.usage_count !== undefined ? Number(p.usage_count) : 0
}));
};
const [plans, setPlans] = useState(() => mapIncomingPlans(initialPlans || []));
useEffect(() => {
if (initialPlans) {
setPlans(mapIncomingPlans(initialPlans));
}
}, [initialPlans]);
const [isDialogOpen, setIsDialogOpen] = useState(false);
const [editingPlan, setEditingPlan] = useState(null);
const [searchQuery, setSearchQuery] = useState('');
// Form states
const [name, setName] = useState('');
const [price, setPrice] = useState('');
const [duration, setDuration] = useState('Monthly');
const [features, setFeatures] = useState('');
const [maxContactPeople, setMaxContactPeople] = useState('');
const [unlimitedContacts, setUnlimitedContacts] = useState(false);
const [enableJobApply, setEnableJobApply] = useState(false);
const [status, setStatus] = useState('Active');
const handleCreateClick = () => {
setEditingPlan(null);
setName('');
setPrice('');
setDuration('Monthly');
setFeatures('');
setMaxContactPeople('');
setUnlimitedContacts(false);
setEnableJobApply(false);
setStatus('Active');
setIsDialogOpen(true);
};
const handleEdit = (plan) => {
setEditingPlan(plan);
setName(plan.name);
setPrice(plan.price);
setDuration(plan.duration);
setFeatures(plan.features.join('\n'));
setMaxContactPeople(plan.maxContactPeople !== null && plan.maxContactPeople !== undefined ? plan.maxContactPeople : '');
setUnlimitedContacts(!!plan.unlimitedContacts);
setEnableJobApply(!!plan.enableJobApply);
setStatus(plan.status || 'Active');
setIsDialogOpen(true);
};
const handleDelete = (id) => {
if (confirm('Are you sure you want to delete this plan?')) {
router.delete(`/admin/subscriptions/${id}`, {
onSuccess: () => {
// Props are re-loaded automatically by Inertia, updating state via useEffect
}
});
}
};
const handleSave = (e) => {
e.preventDefault();
if (!name.trim() || !price) {
alert('Please fill out Name and Price.');
return;
}
const featuresArray = features
.split('\n')
.map(f => f.trim())
.filter(Boolean);
const payload = {
name,
price: Number(price),
duration,
features: featuresArray,
max_contact_people: unlimitedContacts ? null : (maxContactPeople !== '' ? Number(maxContactPeople) : null),
unlimited_contacts: !!unlimitedContacts,
enable_job_apply: !!enableJobApply,
status
};
if (editingPlan) {
router.post(`/admin/subscriptions/${editingPlan.id}/update`, payload, {
onSuccess: () => {
setIsDialogOpen(false);
}
});
} else {
const newId = name.toLowerCase().replace(/\s+/g, '-');
router.post('/admin/subscriptions', {
id: newId || `plan-${Date.now()}`,
...payload
}, {
onSuccess: () => {
setIsDialogOpen(false);
}
});
}
};
const filteredPlans = plans.filter(plan =>
plan.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
plan.duration.toLowerCase().includes(searchQuery.toLowerCase()) ||
plan.features.some(f => f.toLowerCase().includes(searchQuery.toLowerCase()))
);
return (