import React, { useState, useEffect } from ‘react’;

const LiveReservationSystem = () => {
// 状態管理のためのステート
const [reservations, setReservations] = useState([]);
const [formData, setFormData] = useState({
name: ”,
email: ”,
phone: ”,
eventDate: ”,
eventTime: ‘開場 18:00 / 開演 19:00’,
numberOfPeople: 1,
});
const [showConfirmation, setShowConfirmation] = useState(false);
const [currentReservation, setCurrentReservation] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const [events, setEvents] = useState([
{ date: ‘2025-03-20’, title: ‘ジャズナイト’ },
{ date: ‘2025-03-22’, title: ‘アコースティックセッション’ },
{ date: ‘2025-03-27’, title: ‘ロックバンドライブ’ },
{ date: ‘2025-04-03’, title: ‘フォークミュージックナイト’ },
{ date: ‘2025-04-10’, title: ‘ブルースジャムセッション’ }
]);
const [selectedEvent, setSelectedEvent] = useState(null);

// 予約一覧の取得(デモ用)
useEffect(() => {
const dummyReservations = [
{
_id: ‘1’,
name: ‘山田太郎’,
email: ‘yamada@example.com’,
phone: ‘090-1234-5678’,
eventDate: ‘2025-03-20’,
eventTime: ‘開場 18:00 / 開演 19:00’,
numberOfPeople: 2,
reservationNumber: ‘MR0001’,
reservationDate: ‘2025-03-15T10:30:00’,
status: ‘confirmed’
},
{
_id: ‘2’,
name: ‘佐藤花子’,
email: ‘sato@example.com’,
phone: ‘090-8765-4321’,
eventDate: ‘2025-03-20’,
eventTime: ‘開場 18:00 / 開演 19:00’,
numberOfPeople: 3,
reservationNumber: ‘MR0002’,
reservationDate: ‘2025-03-15T11:45:00’,
status: ‘confirmed’
}
];

setReservations(dummyReservations);
}, []);

// フォーム入力の処理
const handleInputChange = (e) => {
const { name, value } = e.target;
setFormData({
…formData,
[name]: value
});

// イベント日付が変更された場合、対応するイベントを選択
if (name === ‘eventDate’) {
const event = events.find(e => e.date === value);
setSelectedEvent(event || null);
}
};

// 予約の送信
const handleSubmit = async (e) => {
e.preventDefault();
setLoading(true);
setError(null);

try {
// 実際の環境では下記のようなAPIリクエストを行います
// const response = await fetch(‘/api/reservations’, {
// method: ‘POST’,
// headers: {
// ‘Content-Type’: ‘application/json’,
// },
// body: JSON.stringify(formData),
// });
// const result = await response.json();

// APIリクエストをシミュレーション
await new Promise(resolve => setTimeout(resolve, 1000)); // 1秒待機してAPIレスポンスをシミュレーション

// 新しい整理番号を生成(実際の環境ではサーバー側で生成)
const nextNumber = reservations.length + 1;
const reservationNumber = `MR${String(nextNumber).padStart(4, ‘0’)}`;

// 新しい予約オブジェクトを作成
const newReservation = {
_id: String(Date.now()),
…formData,
reservationNumber,
reservationDate: new Date().toISOString(),
status: ‘confirmed’
};

// 成功レスポンスをシミュレーション
const simulatedResponse = {
success: true,
data: newReservation,
emailSent: true,
adminNotificationSent: true
};

if (simulatedResponse.success) {
// 予約が成功した場合
setCurrentReservation(simulatedResponse.data);

// 予約リストを更新
setReservations([…reservations, simulatedResponse.data]);

// フォームをリセット
setFormData({
name: ”,
email: ”,
phone: ”,
eventDate: ”,
eventTime: ‘開場 18:00 / 開演 19:00’,
numberOfPeople: 1,
});

// 予約確認画面を表示
setShowConfirmation(true);

// メール送信のシミュレーションログ
console.log(`メール送信シミュレーション:
宛先: ${formData.email}
件名: [Mosrite Cafe] ライブ予約確認 #${reservationNumber}
本文: ライブ予約の確認メール

CC: info@mosritecafe.com
`);
} else {
// エラーメッセージを設定
setError(simulatedResponse.message || ‘予約の作成に失敗しました。’);
}
} catch (err) {
console.error(‘予約送信エラー:’, err);
setError(‘予約の送信中にエラーが発生しました。後でもう一度お試しください。’);
} finally {
setLoading(false);
}
};

// 新しい予約フォームに戻る
const handleBackToForm = () => {
setShowConfirmation(false);
setSelectedEvent(null);
};

// 日本語の曜日を取得
const getJapaneseDayOfWeek = (dateString) => {
const days = [‘日’, ‘月’, ‘火’, ‘水’, ‘木’, ‘金’, ‘土’];
const date = new Date(dateString);
return days[date.getDay()];
};

// 日付を日本語表示形式に変換
const formatJapaneseDate = (dateString) => {
const date = new Date(dateString);
const year = date.getFullYear();
const month = date.getMonth() + 1;
const day = date.getDate();
const dayOfWeek = getJapaneseDayOfWeek(dateString);

return `${year}年${month}月${day}日(${dayOfWeek})`;
};

return (

Mosrite Cafe ライブ予約システム

{!showConfirmation ? (

以下のフォームからライブの予約ができます。予約受付後、確認メールが自動送信されます。

{/* イベント一覧 */}

開催予定ライブ

{events.map((event, index) => (

{
setFormData({
…formData,
eventDate: event.date
});
setSelectedEvent(event);
}}
>

{event.title}
{formatJapaneseDate(event.date)}

))}

{selectedEvent && (

選択中のイベント:

{selectedEvent.title}

{formatJapaneseDate(selectedEvent.date)}

)}



※確認メールをお送りします





{error && (

{error}

)}


{!formData.eventDate && (※日付を選択してください)}

※ ご予約後、確認メールが自動送信されます。

※ 予約は先着順です。整理番号が早い方から優先的にご案内します。

※ キャンセルされる場合は、お電話にてご連絡ください。

) : (

予約が完了しました!

確認メールをお送りしました。

予約内容

整理番号: {currentReservation.reservationNumber}

お名前:{currentReservation.name}

メールアドレス:{currentReservation.email}

電話番号:{currentReservation.phone}

人数:{currentReservation.numberOfPeople}名

イベント:{formatJapaneseDate(currentReservation.eventDate)}
{events.find(e => e.date === currentReservation.eventDate)?.title &&
` – ${events.find(e => e.date === currentReservation.eventDate).title}`
}

時間:{currentReservation.eventTime}

予約日時:{new Date(currentReservation.reservationDate).toLocaleString(‘ja-JP’)}

ご注意

  • 当日は整理番号をご提示ください
  • 整理番号順にご案内いたします
  • キャンセルの場合は早めにご連絡ください

確認メールを {currentReservation.email} に送信しました。
メールが届かない場合は、迷惑メールフォルダをご確認いただくか、お電話でお問い合わせください。

)}

{/* 予約状況(管理者向け)- 実際の環境では条件付きで表示 */}
{!showConfirmation && reservations.length > 0 && (

予約状況(管理者用)

{reservations.map((res, index) => ())}

整理番号 氏名 イベント日 人数 状態
{res.reservationNumber} {res.name} {formatJapaneseDate(res.eventDate)} {res.numberOfPeople}名 {res.status === ‘confirmed’ ? ‘予約済’ :
res.status === ‘cancelled’ ? ‘キャンセル’ :
res.status === ‘attended’ ? ‘来場済’ : ‘不明’}

)}

);
};

export default LiveReservationSystem;

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です