import React, { useEffect, useState } from 'react';
import { useAvailability } from '../hooks/useAvailability';
import { useVehicles } from '../hooks/useVehicles';
import ExcelTable from '../components/ExcelTable';
import { Plus, Search, Calendar as CalendarIcon } from 'lucide-react';
import {
Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogDescription
} from "@/components/ui/dialog";
import { toast } from 'sonner';
// Reusing styled components locally
const DarkInput = ({ label, ...props }) => (
{label && }
);
const DarkSelect = ({ label, options, value, onChange }) => (
{label && }
);
const DarkButton = ({ children, variant = 'primary', className = '', ...props }) => {
const baseClass = "px-4 py-2 rounded-lg font-bold text-sm transition-all shadow-lg active:scale-95 flex items-center justify-center gap-2";
const variants = {
primary: "bg-orange-600 hover:bg-orange-500 text-white shadow-orange-500/10",
secondary: "bg-slate-100 dark:bg-[#2a2a2a] hover:bg-slate-200 dark:hover:bg-[#333] text-slate-700 dark:text-slate-200 border border-slate-200 dark:border-[#333]",
ghost: "bg-transparent hover:bg-slate-100 dark:hover:bg-[#2a2a2a] text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-white"
};
return (
);
};
export default function AvailabilityView() {
const { availabilities, fetchAvailabilities, createAvailability, updateAvailability, deleteAvailability } = useAvailability();
const { vehicles, fetchVehicles } = useVehicles();
const [searchTerm, setSearchTerm] = useState('');
const [isModalOpen, setIsModalOpen] = useState(false);
const [editingItem, setEditingItem] = useState(null);
const initialFormState = {
iddisponibilidade_frota: '', idveiculo_frota: '', placa: '', disponibilidade: '', status_disponibilidade: 'Disponível'
};
const [formData, setFormData] = useState(initialFormState);
useEffect(() => {
fetchAvailabilities();
fetchVehicles();
}, []);
const handleOpenModal = (item = null) => {
if (item) {
setEditingItem(item);
setFormData({ ...initialFormState, ...item });
} else {
setEditingItem(null);
setFormData(initialFormState);
}
setIsModalOpen(true);
};
const handlePlateChange = (e) => {
const val = e.target.value;
const foundVehicle = vehicles.find(v => v.placa === val);
setFormData({
...formData,
placa: val,
idveiculo_frota: foundVehicle ? foundVehicle.idveiculo_frota : ''
});
};
const handleSubmit = async (e) => {
e.preventDefault();
const payload = {
...formData,
iddisponibilidade_frota: formData.iddisponibilidade_frota ? Number(formData.iddisponibilidade_frota) : undefined,
idveiculo_frota: formData.idveiculo_frota ? Number(formData.idveiculo_frota) : null
};
let success;
if (editingItem) {
success = await updateAvailability(Number(editingItem.iddisponibilidade_frota || editingItem.id), payload);
} else {
success = await createAvailability(payload);
}
if (success) setIsModalOpen(false);
};
const filteredData = availabilities.filter(item =>
item.placa?.toLowerCase().includes(searchTerm.toLowerCase())
);
return (
Disponibilidade e Agenda
Visualização de disponibilidade da frota.
row.disponibilidade?.split('T')[0] },
{ header: 'STATUS', field: 'status_disponibilidade', width: '150px', render: (row) => (
{row.status_disponibilidade}
)}
]}
filterDefs={[
{ field: 'placa', label: 'Placa', type: 'text', placeholder: 'Buscar placa...' },
{ field: 'status_disponibilidade', label: 'Status', type: 'select' },
]}
onEdit={handleOpenModal}
onDelete={(item) => deleteAvailability(item.iddisponibilidade_frota)}
/>
);
}