import React, { useEffect, RefObject } from "react"; import { parseISO, format, differenceInMinutes, differenceInDays, parse, } from "date-fns"; import { zhTW } from "date-fns/locale"; import { typeColors, eventColors, EventCode, TypeCode, } from "../../Const/colors"; import Dot from "../../Component/Units/Dot"; import Event from "../../Component/Units/Event"; import style from "./style.module.scss"; export interface DateItem { id: string; date: string; type: TypeCode | null; event: EventCode | null; name: string; start: string; end: string; } interface DateInfoProps { dateInfo: DateItem[]; clickDate?: Date; onClick?: (date: DateItem) => void; } const DateInfoComponent: React.FC = ({ dateInfo, clickDate, onClick, }) => { const refs: Record> = dateInfo.reduce< Record> >((acc, value) => { acc[value.date] = React.createRef(); return acc; }, {}); useEffect(() => { if (clickDate && dateInfo.length !== 0) { const targetDateStr = format(clickDate, "yyyy-MM-dd"); // 如果點擊的日期存在於列表中 if (refs[targetDateStr]?.current) { refs[targetDateStr]?.current?.scrollIntoView({ block: "start", }); } else { // 如果不存在,則尋找最接近的日期 const targetDate = parseISO(targetDateStr); const closestDate = dateInfo.reduce((prev, curr) => { const prevDate = parseISO(prev.date); const currDate = parseISO(curr.date); const prevDiff = Math.abs(differenceInDays(prevDate, targetDate)); const currDiff = Math.abs(differenceInDays(currDate, targetDate)); return prevDiff < currDiff ? prev : curr; }); refs[closestDate.date]?.current?.scrollIntoView({ block: "start", }); } } }, [clickDate]); const dayFormat = (inputDate: string) => { const date = parseISO(inputDate); const formattedDate = format(date, "M/d EEEE", { locale: zhTW }); return formattedDate; }; const timeFormat = (start: string, end: string) => { const startTime = parse(start, "yyyy-MM-dd HH:mm:ss", new Date()); const endTime = parse(end, "yyyy-MM-dd HH:mm:ss", new Date()); const formattedStart = format(startTime, "HH:mm:ss").split(":"); const formattedEnd = format(endTime, "HH:mm:ss").split(":"); const diff = differenceInMinutes(endTime, startTime); const hours = Math.floor(diff / 60); const minutes = diff % 60; const formattedDiff = ( <> {String(hours).padStart(2, "0")}{String(minutes).padStart(2, "0")}分 ); return ( <> {formattedStart[0]}:{formattedStart[1]}: {formattedStart[2]}-{formattedEnd[0]}: {formattedEnd[1]}:{formattedEnd[2]}( {formattedDiff}) ); }; return (
{dateInfo.map((item, index) => (

{index === 0 || item.date !== dateInfo[index - 1].date ? ( <> {dayFormat(item.date)}

) : null}

onClick && onClick(item)} >
{item.type && } {item.event && }

{item.name}

{timeFormat(item.start, item.end)}

))}
); }; export default DateInfoComponent;