// src/app/reservation/page.tsx import { getRoomReservations, Reservation } from "@/lib/reservation"; import { RoomInfo } from "@/lib/roominfo"; const ROOMS = Object.keys(RoomInfo); // ["ENJI","PINK","MINT"] const startHour = 7; // 開店時間 const endHour = 22; // 閉店時間 const TIMES = Array.from({ length: endHour - startHour }, (_, i) => `${startHour + i}:00`); // 7:00〜21:00 function getNextWeekDates(): Date[] { const today = new Date(); const dates: Date[] = []; const dayOfWeek = today.getDay(); const daysUntilNextSaturday = 6 - dayOfWeek + 7; // 翌週土曜まで for (let i = 0; i <= daysUntilNextSaturday; i++) { const d = new Date(today); d.setDate(today.getDate() + i); dates.push(d); } return dates; } function formatDate(date: Date) { const y = date.getFullYear(); const m = (date.getMonth() + 1).toString().padStart(2, "0"); const d = date.getDate().toString().padStart(2, "0"); return `${y}-${m}-${d}`; } function buildReservationMap(reservations: Reservation[], dates: Date[]) { const map: Record> = {}; TIMES.forEach((time) => { map[time] = {}; dates.forEach((date) => { map[time][formatDate(date)] = "◯"; }); }); reservations.forEach((r) => { const dateStr = formatDate(new Date(r.sdate)); if (!map[TIMES[0]][dateStr]) return; if (r.type === "oneday") { TIMES.forEach((time) => (map[time][dateStr] = "✗")); } else if (r.type === "range") { const [startH, startM] = r.start.split(":").map(Number); const startMinutes = startH * 60 + startM; const [endH, endM] = r.end.split(":").map(Number); const endMinutes = endH * 60 + endM; TIMES.forEach((time) => { const [hour, minute] = time.split(":").map(Number); const timeMinutes = hour * 60 + minute; if (timeMinutes >= startMinutes && timeMinutes < endMinutes) { map[time][dateStr] = "✗"; } }); } }); return map; } export default async function ReservationPage() { const dates = getNextWeekDates(); const dateLabels = dates.map( (d) => `${d.getMonth() + 1}/${d.getDate()} (${ ["日", "月", "火", "水", "木", "金", "土"][d.getDay()] })` ); // 3部屋の予約データ取得 const roomData: Record>> = {}; for (const room of ROOMS) { const reservations = await getRoomReservations(room); roomData[room] = buildReservationMap(reservations, dates); } return (
{ROOMS.map((room) => (

{room} 予約表

外部予約サービス:{" "} こちら

{/* 固定列(時間) */}
{TIMES.map((time) => ( ))}
時間
{time}
{/* 横スクロール可能列 */}
{dateLabels.map((label) => ( ))} {TIMES.map((time) => ( {dates.map((date) => { const dateStr = formatDate(date); const val = roomData[room][time][dateStr]; return ( ); })} ))}
{label}
{val}
))}
); }