vkashti / app / admin / reservations / ReservationsKanban.tsx
ReservationsKanban.tsx
Raw
import React, { useState } from 'react';
import { useReservations } from './ReservationsProvider';
import { Reservation } from '@/types/types';
import ReservationDialog from './ReservationDialog';
import { DragProvider } from './DragContext';
import DayColumn from './DayColumn';
import { DropdownProvider } from './ReservationCard';

export default function ReservationsKanban() {
  const [isDialogOpen, setIsDialogOpen] = useState(false);
  const [selectedReservation, setSelectedReservation] = useState<
    Reservation | undefined
  >();
  const {
    reservations,
    updateReservation,
    deleteReservation,
    startDate,
    interval
  } = useReservations();
  const today = new Date(startDate);
  today.setHours(0, 0, 0, 0);

  const columns = Array.from({ length: interval }, (_, i) => {
    const date = new Date(today.getTime() + i * 24 * 60 * 60 * 1000);
    return {
      date,
      reservations: reservations
        .filter((r) => {
          const rDate = new Date(r.from_date);
          return (
            rDate.getDate() === date.getDate() &&
            rDate.getMonth() === date.getMonth() &&
            rDate.getFullYear() === date.getFullYear()
          );
        })
        .sort(
          (a, b) =>
            new Date(a.from_date).getTime() - new Date(b.from_date).getTime()
        )
    };
  });

  const handleReservationClick = (reservation: Reservation) => {
    setSelectedReservation(reservation);
    setIsDialogOpen(true);
  };

  return (
    <DragProvider>
      <DropdownProvider>
        <div className="w-full h-full overflow-x-auto">
          <div
            className={`grid gap-4 pl-1 pr-1 relative`}
            style={{
              gridTemplateColumns: `repeat(${interval}, minmax(0, 1fr))`
            }}
          >
            {columns.map(({ date, reservations }, index) => (
              <DayColumn
                key={date.toISOString()}
                date={date}
                reservations={reservations}
                showHours={
                  index === 0
                    ? 'left'
                    : index === columns.length - 1
                      ? 'right'
                      : undefined
                }
                onReservationClick={handleReservationClick}
              />
            ))}
          </div>
          <ReservationDialog
            isOpen={isDialogOpen}
            onClose={() => {
              setIsDialogOpen(false);
              setSelectedReservation(undefined);
            }}
            onSave={(updatedReservation) => {
              if (selectedReservation?.id) {
                updateReservation(selectedReservation.id, updatedReservation);
                setIsDialogOpen(false);
                setSelectedReservation(undefined);
              }
            }}
            onDelete={(id) => {
              deleteReservation(id);
              setIsDialogOpen(false);
              setSelectedReservation(undefined);
            }}
            reservation={selectedReservation}
          />
        </div>
      </DropdownProvider>
    </DragProvider>
  );
}