'use client';
import {
CalendarBody,
CalendarDate,
CalendarDatePagination,
CalendarDatePicker,
CalendarHeader,
CalendarMonthPicker,
CalendarProvider,
CalendarYearPicker,
type Feature,
} from '@/components/kibo-ui/calendar';
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
} from '@/components/ui/alert-dialog';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { useMemo, useState } from 'react';
import { toast } from 'sonner';
import {
changeBaldinhoDaysSale,
changeBaldinhoDeliverySize,
changeNoDelivery,
} from '../action/update-baldinho';
import { type GetBladinhoResponse } from '../data-access/calendario/get-bladinho';
interface PaginaProps {
bladinhoData: GetBladinhoResponse[];
}
// Componente customizado para exibir informações em múltiplas linhas
const CustomCalendarItem = ({ feature }: { feature: Feature }) => {
const lines = feature.name.split('\n');
return (
{lines.map((line, index) => (
{line}
))}
);
};
const Pagina = ({ bladinhoData }: PaginaProps) => {
// Estado para controlar a abertura do AlertDialog
const [isDialogOpen, setIsDialogOpen] = useState(false);
// Estado para armazenar a data e o novo valor de delivery quando o usuário clicar
const [pendingUpdate, setPendingUpdate] = useState<{
date: Date;
delivery: boolean;
} | null>(null);
// Transforma os dados do bladinho em features do calendário
const [valorBaldinho, setValorBaldinho] = useState(
bladinhoData[0].deliverySize ?? 0
);
const [diasBaldinho, setDiasBaldinho] = useState(
bladinhoData[0].daysSale ?? 0
);
const [isLoadingDaysSale, setIsLoadingDaysSale] = useState(false);
const [isLoadingDeliverySize, setIsLoadingDeliverySize] = useState(false);
const features = useMemo(() => {
return bladinhoData.map((item) => {
const dateDelivery = new Date(item.dateDelivery);
const additionalInfo = [
`Capacidade: ${item.deliverySize}`,
`Peso Venda: ${item.saleWeight}`,
`Disponível: ${item.avaliableDelivery}`,
].join('\n');
return {
id: item.id.toString(),
name: additionalInfo,
startAt: dateDelivery,
endAt: dateDelivery,
status: {
id: item.id.toString(),
name: item.delivery ? 'Delivery' : 'No Delivery',
color: item.delivery ? '#6B7280' : '#EF4444',
},
isSelected: !item.delivery,
delivery: item.delivery,
} as Feature & { delivery: boolean };
});
}, [bladinhoData]);
const selectedFeatures = useMemo(() => features, [features]);
const earliestYear = useMemo(
() =>
selectedFeatures
.map((feature) => feature.startAt.getFullYear())
.sort()
.at(0) ?? new Date().getFullYear(),
[selectedFeatures]
);
const latestYear = useMemo(
() =>
selectedFeatures
.map((feature) => feature.endAt.getFullYear())
.sort()
.at(-1) ?? new Date().getFullYear(),
[selectedFeatures]
);
const handleDateClick = (date: Date, dayFeatures?: Feature[]) => {
// Encontra o feature correspondente à data clicada
const featureForDate = dayFeatures?.find((feature) => {
const featureDate = new Date(feature.startAt);
return (
featureDate.getDate() === date.getDate() &&
featureDate.getMonth() === date.getMonth() &&
featureDate.getFullYear() === date.getFullYear()
);
});
let newDelivery: boolean;
if (featureForDate) {
// Extrai o isSelected atual do feature
const currentIsSelected = featureForDate.isSelected ?? false;
// Inverte o valor para obter o novo delivery (!isSelected)
newDelivery = !currentIsSelected;
} else {
// Se não há feature para esta data, cria um novo com delivery = true
newDelivery = true;
}
// Armazena os dados e abre o dialog
setPendingUpdate({ date, delivery: newDelivery });
setIsDialogOpen(true);
};
const handleConfirmUpdate = async () => {
if (pendingUpdate) {
// Executa o update apenas quando o usuário confirmar
await changeNoDelivery(pendingUpdate.date, pendingUpdate.delivery);
// Fecha o dialog e limpa o estado
setIsDialogOpen(false);
setPendingUpdate(null);
}
};
const handleCancelUpdate = () => {
// Apenas fecha o dialog e limpa o estado, sem fazer update
setIsDialogOpen(false);
setPendingUpdate(null);
};
const handleBaldinhoDaysSaleChange = async (daysSale: number) => {
if ((daysSale ?? 0) <= 0) {
toast.error('O valor deve ser maior que zero');
return;
}
setDiasBaldinho(daysSale);
setIsLoadingDaysSale(true);
const toastId = toast.loading('Atualizando dias baldinho...');
try {
await changeBaldinhoDaysSale(daysSale);
toast.success(`Dias baldinho atualizado para ${daysSale}`, {
id: toastId,
});
} catch (error) {
toast.error('Erro ao atualizar dias baldinho', { id: toastId });
} finally {
setIsLoadingDaysSale(false);
}
};
const handleBaldinhoDeliverySizeChange = async (deliverySize: number) => {
if ((deliverySize ?? 0) <= 0) {
toast.error('O valor deve ser maior que zero');
return;
}
setValorBaldinho(deliverySize);
setIsLoadingDeliverySize(true);
const toastId = toast.loading('Atualizando capacidade baldinho...');
try {
await changeBaldinhoDeliverySize(deliverySize);
toast.success(`Capacidade baldinho atualizada para ${deliverySize}`, {
id: toastId,
});
} catch (error) {
toast.error('Erro ao atualizar capacidade baldinho', { id: toastId });
} finally {
setIsLoadingDeliverySize(false);
}
};
return (
{({ feature }) => (
)}
Confirmar alteração
Tem certeza que deseja alterar o status de entrega para esta data?
Esta ação não pode ser desfeita.
Cancelar
Confirmar
);
};
export default Pagina;