import React, { useState } from 'react'; import { Calendar, MapPin, Users, Info, CheckCircle, Copy, Plane, Coffee, Hotel, Phone, Mail, FileText, Upload, Heart, UserPlus, Shield, AlertCircle, ChevronRight, Printer } from 'lucide-react'; const XiangqingOfficialForm = () => { const [activeTab, setActiveTab] = useState('itinerary'); // 'itinerary' or 'form' const [formData, setFormData] = useState({ // 基本資料 chineseName: '', englishName: '', gender: 'M', birthDate: '', lineId: '', phone: '', email: '', // 護照 passportNumber: '', passportExpiry: '', hasPassportUpload: false, // 模擬上傳狀態 // 需求 roomType: 'twin', roommateName: '', // 指定同房 dietary: 'none', dietaryNote: '', // 安全 emergencyContact: '', emergencyPhone: '', emergencyRelation: '', healthIssues: '', agreeTerms: false }); const [showModal, setShowModal] = useState(false); const [submittedData, setSubmittedData] = useState(''); // 翔慶旅行社官方資訊 (Updated from oeoeo.com.tw) const agencyInfo = { fullName: "翔慶旅行社股份有限公司", shortName: "翔慶旅行社", license: "交觀甲字第7022號", qualityAssurance: "品保北1661", phone: "(02)2397-1277", phone2: "(02)6605-8155", fax: "(02)2393-3699", address: "10058台北市中正區新生南路一段6號10樓之2", email: "service@oeoeo.com.tw", representative: "古明正" }; const tripDetails = { title: "宮城偶來(含鳴子溫泉步道)+磐梯朝日國家公園 6日", subTitle: "翔慶旅行社|客製化團體旅遊專家", date: "2025年4月下旬 (暫定 4/18~4/25)", airline: "長榮航空 (BR) 或 星宇航空 (JX)", highlights: [ "鳴子溫泉路線:峽谷地形、稜線展望、絕美新綠", "奧松島路線:海岸、港灣、田園漁村風光", "五色沼自然探勝路:夢幻翡翠色湖水", "仙台市區購物與牛舌美食" ], pricing: [ { range: "15-20 人", price: "NT$ 73,800" }, { range: "21-25 人", price: "NT$ 69,800" }, { range: "26-30 人", price: "NT$ 67,800" } ], supplements: { singleRoom: "NT$ 15,000", childNoBed: "扣 NT$ 4,000", tips: "NT$ 300 / 人 / 天" } }; const itinerary = [ { day: 1, title: "台北 / 仙台 - 市區散策", desc: "抵達仙台後,若時間許可前往榴岡公園賞晚櫻或仙台城跡。", stay: "仙台國際飯店 或同級", meals: "早:溫暖的家 / 午:機上 / 晚:燒肉吃到飽" }, { day: 2, title: "鳴子溫泉 → 宮城偶來", desc: "重點步道!峽谷地形與山村景色,4月下旬新綠非常美。距離約10km。", stay: "鳴子溫泉", meals: "早:飯店 / 午:¥3000 / 晚:飯店會席料理" }, { day: 3, title: "奧松島路線 → 瑞巖寺", desc: "海岸線經典路線,適合健行後的輕鬆步道。距離約9km。", stay: "松島 或 鹽竈", meals: "早:飯店 / 午:¥3000 / 晚:飯店會席料理" }, { day: 4, title: "五色沼 → 裏磐梯溫泉", desc: "五色沼自然探勝路,湖水呈現強烈青藍/翡翠色。距離約4km。", stay: "裏磐梯", meals: "早:飯店 / 午:¥3000 / 晚:飯店會席料理" }, { day: 5, title: "中瀬沼展望 → 仙台購物", desc: "眺望磐梯山與湖群。下午返回仙台市區自由購物。", stay: "仙台國際飯店 或同級", meals: "早:飯店 / 午:東北風味餐 / 晚:自理 (發代金¥2000)" }, { day: 6, title: "仙台 / 台北", desc: "免稅店與一番町商店街最後採買,搭機返台。", stay: "溫暖的家", meals: "早:飯店 / 午:自理 / 晚:機上" } ]; const handleInputChange = (e) => { const { name, value, type, checked } = e.target; setFormData(prev => ({ ...prev, [name]: type === 'checkbox' ? checked : value })); }; const handleFileUpload = () => { setFormData(prev => ({ ...prev, hasPassportUpload: true })); alert("已模擬圖片上傳成功!"); }; const isPassportValid = () => { if (!formData.passportExpiry) return true; const expiry = new Date(formData.passportExpiry); const today = new Date(); const sixMonthsLater = new Date(today.setMonth(today.getMonth() + 6)); return expiry > sixMonthsLater; }; const handleSubmit = (e) => { e.preventDefault(); if (!formData.agreeTerms) { alert("請勾選同意報名條款"); return; } const summary = ` 【${agencyInfo.shortName} 報名表】 行程:${tripDetails.title} -------------------------------- [基本資料] 中文姓名: ${formData.chineseName} 英文姓名: ${formData.englishName} 性別: ${formData.gender === 'M' ? '男' : '女'} 生日: ${formData.birthDate} Line ID: ${formData.lineId} 電話: ${formData.phone} Email: ${formData.email} [證件] 護照號碼: ${formData.passportNumber} 護照效期: ${formData.passportExpiry} ${!isPassportValid() ? '(注意:效期不足6個月)' : ''} *護照照片: ${formData.hasPassportUpload ? '已附檔' : '未上傳'} [需求] 房型: ${formData.roomType === 'single' ? '單人房 (補差價)' : formData.roomType === 'triple' ? '三人房' : '雙人房'} 同房親友: ${formData.roommateName || '無'} 飲食: ${formData.dietary} ${formData.dietaryNote ? `(${formData.dietaryNote})` : ''} [安全資訊] 緊急聯絡人: ${formData.emergencyContact} (${formData.emergencyRelation}) 緊急聯絡電話: ${formData.emergencyPhone} 健康狀況: ${formData.healthIssues || '良好'} -------------------------------- `.trim(); setSubmittedData(summary); setShowModal(true); }; const copyToClipboard = () => { const textArea = document.createElement("textarea"); textArea.value = submittedData; document.body.appendChild(textArea); textArea.select(); try { document.execCommand('copy'); alert(`資料已複製!請傳送給${agencyInfo.shortName}業務專員。`); } catch (err) { console.error('Unable to copy', err); } document.body.removeChild(textArea); }; const handlePrint = () => { window.print(); }; return (
費用備註:
{day.desc}
請複製下方內容,透過 Line 或 Email 傳送給您的業務窗口。