You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.1 KiB
78 lines
2.1 KiB
import React, { useRef } from 'react';
|
|
import { motion } from 'framer-motion';
|
|
import { format, addDays } from 'date-fns';
|
|
import DraggableEvent from './DraggableEvent';
|
|
import { Event } from '../types';
|
|
|
|
interface DayColumnProps {
|
|
date: Date;
|
|
events: Event[];
|
|
isMobile: boolean;
|
|
index: number;
|
|
onEventClick: (eventData: { event: Event; date: string }) => void;
|
|
onDragStart: () => void;
|
|
onDragEnd: () => void;
|
|
handleEventMove: (eventId: string, newDate: Date) => void;
|
|
onDayChange: (dir: 'left' | 'right') => void;
|
|
isClient: boolean;
|
|
}
|
|
|
|
const DayColumn: React.FC<DayColumnProps> = ({
|
|
date,
|
|
events,
|
|
isMobile,
|
|
index,
|
|
onEventClick,
|
|
onDragStart,
|
|
onDragEnd,
|
|
handleEventMove,
|
|
onDayChange,
|
|
isClient
|
|
}) => {
|
|
const columnRef = useRef<HTMLDivElement>(null);
|
|
|
|
const sortedEvents = [...events].sort((a, b) => {
|
|
const timeA = new Date(a.time).getTime();
|
|
const timeB = new Date(b.time).getTime();
|
|
return timeA - timeB;
|
|
});
|
|
|
|
const handleMove = (dir: 'up' | 'down') => {
|
|
// ... existing code ...
|
|
};
|
|
|
|
return (
|
|
<motion.div
|
|
ref={columnRef}
|
|
className={`flex-1 ${isMobile ? 'min-w-[calc(100vw-32px)]' : ''} bg-gray-50 rounded-lg p-2 relative shadow-md z-10`}
|
|
data-day={index}
|
|
>
|
|
<div className="font-bold mb-2 text-purple-600 text-sm font-sans">
|
|
{format(date, 'EEE, MMM d')}
|
|
</div>
|
|
|
|
<div className="relative z-10">
|
|
{sortedEvents
|
|
.filter(event => event && event.id)
|
|
.map((event, index) => (
|
|
<DraggableEvent
|
|
key={event.id}
|
|
event={event}
|
|
date={format(date, 'yyyy-MM-dd')}
|
|
onEventClick={(eventData) => onEventClick({ event: eventData.event, date: eventData.date })}
|
|
onDragStart={() => onDragStart()}
|
|
onDragEnd={() => onDragEnd()}
|
|
onDayChange={(dir) => {
|
|
onDayChange(dir);
|
|
const newDate = addDays(date, dir === 'left' ? -1 : 1);
|
|
handleEventMove(event.id, newDate);
|
|
}}
|
|
isClient={isClient}
|
|
/>
|
|
))}
|
|
</div>
|
|
</motion.div>
|
|
);
|
|
};
|
|
|
|
export default DayColumn;
|