import { create } from 'zustand'; export const useTourStore = create((set, get) => ({ currentTour: null, legs: [], publicTours: [], userRole: null, activeLegId: null, mapCenter: [10.7769, 106.7009], setTour: (tour) => set({ currentTour: tour }), updateLegs: (legs) => set({ legs }), setActiveLegId: (id) => set({ activeLegId: id }), setMapCenter: (pos) => set({ mapCenter: pos }), fetchTour: async (id) => { const API_BASE = `http://${window.location.hostname}:3001`; const token = localStorage.getItem('token'); try { const response = await fetch(`${API_BASE}/api/v1/tours/${id}`, { headers: { 'Authorization': `Bearer ${token}` } }); if (!response.ok) throw new Error(`HTTP ${response.status}`); const data = await response.json(); let role = 'VIEWER_ONLY'; if (token) { try { const payload = JSON.parse(atob(token.split('.')[1])); const currentUserId = payload.sub; const participant = data.participants?.find((p) => p.userId === currentUserId); if (participant) role = participant.role; } catch (e) { console.error("Lỗi khi xác định vai trò người dùng:", e); } } const legs = data.legs || []; set({ currentTour: data, legs, userRole: role, activeLegId: legs.length > 0 ? legs[0].id : null }); } catch (err) { console.error('Không thể tải tour:', err); } }, fetchPublicTours: async () => { const API_BASE = `http://${window.location.hostname}:3001`; const token = localStorage.getItem('token'); if (!token) return; const response = await fetch(`${API_BASE}/api/v1/tours/explore`, { headers: { 'Authorization': `Bearer ${token}` } }); if (!response.ok) return; const data = await response.json(); set({ publicTours: data }); }, createTour: async (tourData) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/tours`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('token')}` }, body: JSON.stringify(tourData), }); return await response.json(); }, updateTour: async (id, data) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/tours/${id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('token')}` }, body: JSON.stringify(data), }); if (!response.ok) throw new Error('Lỗi khi cập nhật Tour'); get().fetchPublicTours(); }, deleteTour: async (id) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/tours/${id}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` }, }); if (!response.ok) { const data = await response.json(); throw new Error(data.message || 'Lỗi khi xóa Tour'); } if (get().currentTour?.id === id) set({ currentTour: null }); get().fetchPublicTours(); }, addLeg: async (tourId, data) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/tours/${tourId}/legs`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('token')}` }, body: JSON.stringify(data), }); if (!response.ok) throw new Error('Lỗi khi thêm chặng'); get().fetchTour(tourId); }, initializeLegs: async (tourId, count) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/tours/${tourId}/legs/batch`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('token')}` }, body: JSON.stringify({ count }), }); if (!response.ok) throw new Error('Lỗi khi khởi tạo chặng'); await get().fetchTour(tourId); }, updateLeg: async (legId, data) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/legs/${legId}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('token')}` }, body: JSON.stringify(data), }); if (!response.ok) throw new Error('Lỗi khi cập nhật chặng'); const { currentTour } = get(); if (currentTour) get().fetchTour(currentTour.id); }, deleteLeg: async (legId) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/legs/${legId}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` }, }); const result = await response.json(); if (!response.ok) { throw new Error(result.message || 'Lỗi khi xóa chặng'); } const { currentTour } = get(); if (currentTour) get().fetchTour(currentTour.id); }, addLocation: async (tourId, locationData) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/tours/${tourId}/locations`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('token')}` }, body: JSON.stringify(locationData), }); if (!response.ok) throw new Error('Lỗi khi thêm địa điểm'); get().fetchTour(tourId); }, updateLocation: async (locationId, data) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/locations/${locationId}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('token')}` }, body: JSON.stringify(data), }); if (!response.ok) throw new Error('Lỗi khi cập nhật địa điểm'); const { currentTour } = get(); if (currentTour) get().fetchTour(currentTour.id); }, deleteLocation: async (locationId) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/locations/${locationId}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` }, }); if (!response.ok) throw new Error('Lỗi khi xóa địa điểm'); const { currentTour } = get(); if (currentTour) get().fetchTour(currentTour.id); }, updateTourStartPoint: async (tourId, data) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/tours/${tourId}/start-point`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('token')}` }, body: JSON.stringify(data), }); console.log(`[STORE] updateTourStartPoint API Status: ${response.status}`); if (!response.ok) throw new Error('Lỗi khi thiết lập điểm bắt đầu'); await get().fetchTour(tourId); }, updateTourEndPoint: async (tourId, data) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/tours/${tourId}/end-point`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('token')}` }, body: JSON.stringify(data), }); if (!response.ok) throw new Error('Lỗi khi thiết lập điểm kết thúc'); await get().fetchTour(tourId); }, optimizeRouting: async (legId) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/routing/optimize/${legId}`, { method: 'POST' }); const { locations, totalDistance } = await response.json(); const { currentTour } = get(); if (currentTour) { const updatedLegs = currentTour.legs.map((l) => l.id === legId ? { ...l, locations: locations, totalDistance: totalDistance } : l); set({ currentTour: { ...currentTour, legs: updatedLegs }, legs: updatedLegs }); } }, removeMember: async (tourId, userId) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/tours/${tourId}/members/${userId}`, { method: 'DELETE', headers: { Authorization: `Bearer ${localStorage.getItem('token')}`, }, }); if (!response.ok) throw new Error('Lỗi khi xóa thành viên'); const { currentTour } = get(); if (currentTour) get().fetchTour(currentTour.id); }, addMember: async (tourId, member) => { const API_BASE = `http://${window.location.hostname}:3001`; const response = await fetch(`${API_BASE}/api/v1/tours/${tourId}/members`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${localStorage.getItem('token')}` }, body: JSON.stringify(member), }); if (!response.ok) throw new Error('Lỗi khi thêm thành viên'); const { currentTour } = get(); if (currentTour) get().fetchTour(currentTour.id); }, })); //# sourceMappingURL=useTourStore.js.map