Cho phép xóa tour và xóa chặng trong Tour Dashboard

This commit is contained in:
2026-06-13 21:48:53 +07:00
parent 578b03d808
commit 5e3f10631f
18 changed files with 580 additions and 42 deletions
+38 -2
View File
@@ -3,7 +3,7 @@ import { MapContainer, TileLayer, Marker, Popup, useMap } from 'react-leaflet';
import L from 'leaflet';
import 'leaflet/dist/leaflet.css';
import { useTourStore } from './useTourStore.js';
import { X, Navigation, Image as ImageIcon, LogOut, Settings } from 'lucide-react';
import { X, Navigation, Image as ImageIcon, LogOut, Settings, Edit2, Trash2 } from 'lucide-react';
import { UserManagementModal } from './UserManagementModal.js';
import { CreateTourModal } from './CreateTourModal.js';
@@ -26,7 +26,7 @@ function RecenterMap({ position }: { position: [number, number] }) {
}
export const ExploreMap = ({ onBack, onLogout, user, onViewTour }: { onBack: () => void, onLogout?: () => void, user?: any, onViewTour: (id: string) => void }) => {
const { publicTours, fetchPublicTours, fetchTour } = useTourStore();
const { publicTours, fetchPublicTours, fetchTour, updateTour, deleteTour } = useTourStore();
const [userPos, setUserPos] = useState<[number, number]>([10.7769, 106.7009]); // Mặc định TP.HCM
const [isAdminModalOpen, setIsAdminModalOpen] = useState(false);
const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);
@@ -39,6 +39,27 @@ export const ExploreMap = ({ onBack, onLogout, user, onViewTour }: { onBack: ()
);
}, []);
const handleEditTour = async (tour: any) => {
const newTitle = window.prompt("Nhập tên mới cho Tour:", tour.title);
if (newTitle && newTitle !== tour.title) {
try {
await updateTour(tour.id, { title: newTitle });
} catch (err: any) {
alert(err.message);
}
}
};
const handleDeleteTour = async (id: string) => {
if (window.confirm("Bạn có chắc chắn muốn xóa Tour này và toàn bộ dữ liệu liên quan?")) {
try {
await deleteTour(id);
} catch (err: any) {
alert(err.message);
}
}
};
return (
<div className="h-screen w-full relative">
{/* Nút quay lại */}
@@ -133,6 +154,21 @@ export const ExploreMap = ({ onBack, onLogout, user, onViewTour }: { onBack: ()
className="text-xs font-bold text-blue-600 flex items-center gap-1">
Xem chi tiết hình nh <ImageIcon className="w-3 h-3" />
</button>
{user && (
<div className="flex gap-2 mt-3 pt-3 border-t border-gray-100">
<button
onClick={() => handleEditTour(tour)}
className="flex-1 flex items-center justify-center gap-1 py-1.5 bg-blue-50 text-blue-600 rounded-lg text-[10px] font-bold hover:bg-blue-100 transition-colors">
<Edit2 className="w-3 h-3" /> Sửa
</button>
<button
onClick={() => handleDeleteTour(tour.id)}
className="flex-1 flex items-center justify-center gap-1 py-1.5 bg-red-50 text-red-600 rounded-lg text-[10px] font-bold hover:bg-red-100 transition-colors">
<Trash2 className="w-3 h-3" /> Xóa
</button>
</div>
)}
</div>
</Popup>
</Marker>