import React, { useState, useEffect, useMemo } from 'react'; import { ItineraryTimeline } from './ItineraryTimeline.js'; import { ExpenseManager } from './ExpenseManager.js'; import { useTourStore } from './useTourStore.js'; import { AddLocationModal } from './AddLocationModal.js'; import { Map as MapIcon, Wallet, Image as ImageIcon, Calendar, Users, ChevronLeft, Settings, Quote, Plus } from 'lucide-react'; export const TourDetailPage = ({ onBack }: { onBack: () => void }) => { const [activeTab, setActiveTab] = useState<'plan' | 'expense' | 'photo' | 'settings'>('plan'); const [isAddLocationOpen, setIsAddLocationOpen] = useState(false); const { currentTour, fetchTour, fetchPublicTours, publicTours, userRole } = useTourStore(); useEffect(() => { const loadData = async () => { // Nếu chưa có tour nào trong store, thử tải danh sách public trước if (publicTours.length === 0) { await fetchPublicTours(); } }; loadData(); }, []); useEffect(() => { // Lấy tour đầu tiên từ danh sách khám phá để hiển thị demo if (publicTours.length > 0 && !currentTour) { fetchTour(publicTours[0].id); } }, [publicTours, currentTour, fetchTour]); // Định nghĩa các tab dựa trên quyền hạn (RBAC) từ store const tabs = [ { id: 'plan', label: 'Lộ trình', icon: MapIcon, visible: true }, { id: 'expense', label: 'Chi phí', icon: Wallet, visible: ['OWNER', 'MANAGER', 'MEMBER'].includes(userRole || '') }, { id: 'photo', label: 'Ảnh', icon: ImageIcon, visible: true }, { id: 'settings', label: 'Cài đặt', icon: Settings, visible: ['OWNER', 'MANAGER'].includes(userRole || '') }, ].filter(t => t.visible); const hasFinanceAccess = ['OWNER', 'MANAGER', 'MEMBER'].includes(userRole || ''); const travelQuotes = [ "Đừng nghe họ nói, hãy tự mình đi xem.", "Thế giới là một cuốn sách, và ai không đi du lịch thì chỉ mới đọc được một trang.", "Hành trình ngàn dặm bắt đầu từ một bước chân.", "Đi là để trở về, nhưng với một tâm hồn mới." ]; const randomQuote = useMemo(() => travelQuotes[Math.floor(Math.random() * travelQuotes.length)], []); const tourInfo = { title: currentTour?.title || "Hành trình khám phá TP.HCM", date: currentTour?.startDate ? `${new Date(currentTour.startDate).toLocaleDateString('vi-VN')} - ${new Date(currentTour.endDate).toLocaleDateString('vi-VN')}` : "Chưa xác định ngày", membersCount: currentTour?.participants?.length || 0, budget: currentTour?.totalCost ? `${Number(currentTour.totalCost).toLocaleString()} VND` : "0 VND", coverImage: currentTour?.photos?.[0]?.imageUrl || "https://images.unsplash.com/photo-1476514525535-07fb3b4ae5f1?q=80&w=2070&auto=format&fit=crop" }; return (
Tổng chi tiêu hiện tại
"{randomQuote}"
Tính năng quản lý thành viên đang được cập nhật...