Sửa lỗi frontend không load dược danh sách thêm thành viên

This commit is contained in:
2026-06-15 18:27:54 +07:00
parent 34e2af8825
commit 71f4aa9ecd
5 changed files with 16 additions and 22 deletions
+4 -4
View File
@@ -765,7 +765,7 @@ __decorate([
__metadata("design:returntype", Promise)
], LocationController.prototype, "deleteLocation", null);
LocationController = __decorate([
(0, common_1.Controller)('v1/locations'),
(0, common_1.Controller)('locations'),
(0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard),
__metadata("design:paramtypes", [prisma_service_1.PrismaService])
], LocationController);
@@ -810,7 +810,7 @@ __decorate([
__metadata("design:returntype", Promise)
], LegController.prototype, "deleteLeg", null);
LegController = __decorate([
(0, common_1.Controller)('v1/legs'),
(0, common_1.Controller)('legs'),
(0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard),
__metadata("design:paramtypes", [prisma_service_1.PrismaService])
], LegController);
@@ -912,7 +912,7 @@ __decorate([
__metadata("design:returntype", Promise)
], RoutingController.prototype, "optimize", null);
RoutingController = __decorate([
(0, common_1.Controller)('v1/routing'),
(0, common_1.Controller)('routing'),
__metadata("design:paramtypes", [prisma_service_1.PrismaService])
], RoutingController);
let UserController = class UserController {
@@ -1001,7 +1001,7 @@ __decorate([
__metadata("design:returntype", Promise)
], UserController.prototype, "toggleBlock", null);
UserController = __decorate([
(0, common_1.Controller)('v1/users'),
(0, common_1.Controller)('users'),
__metadata("design:paramtypes", [prisma_service_1.PrismaService])
], UserController);
let AppModule = class AppModule {
+1 -1
View File
File diff suppressed because one or more lines are too long
+4 -4
View File
@@ -587,7 +587,7 @@ class TourController {
}
}
@Controller('v1/locations')
@Controller('locations')
@UseGuards(JwtAuthGuard)
class LocationController {
constructor(private prisma: PrismaService) {}
@@ -644,7 +644,7 @@ class LocationController {
}
}
@Controller('v1/legs')
@Controller('legs')
@UseGuards(JwtAuthGuard)
class LegController {
constructor(private prisma: PrismaService) {}
@@ -688,7 +688,7 @@ function calculateDistance(lat1: number, lon1: number, lat2: number, lon2: numbe
return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km
}
@Controller('v1/routing')
@Controller('routing')
class RoutingController {
constructor(private prisma: PrismaService) {}
@@ -801,7 +801,7 @@ class RoutingController {
}
}
@Controller('v1/users')
@Controller('users')
class UserController {
constructor(private prisma: PrismaService) {}
+4 -7
View File
@@ -35,8 +35,7 @@ export const AddMemberModal: React.FC<AddMemberModalProps> = ({ isOpen, onClose,
setLoading(true);
setFetchError('');
try {
const API_BASE = `http://${window.location.hostname}:3001`;
const res = await fetch(`${API_BASE}/api/v1/users?q=${encodeURIComponent(query)}`, {
const res = await fetch(`/api/v1/users?q=${encodeURIComponent(query)}`, {
headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` }
});
if (!res.ok) throw new Error('Không thể tải danh sách người dùng');
@@ -86,10 +85,9 @@ export const AddMemberModal: React.FC<AddMemberModalProps> = ({ isOpen, onClose,
if (!onMemberAdded) return;
setActionLoading(reqId);
try {
const API_BASE = `http://${window.location.hostname}:3001`;
const endpoint = action === 'accept'
? `${API_BASE}/api/v1/tours/${tourId}/join-requests/${reqId}/accept`
: `${API_BASE}/api/v1/tours/${tourId}/join-requests/${reqId}/reject`;
? `/api/v1/tours/${tourId}/join-requests/${reqId}/accept`
: `/api/v1/tours/${tourId}/join-requests/${reqId}/reject`;
const res = await fetch(endpoint, {
method: 'POST',
headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` },
@@ -111,12 +109,11 @@ export const AddMemberModal: React.FC<AddMemberModalProps> = ({ isOpen, onClose,
setSubmitting(true);
setSubmitError('');
try {
const API_BASE = `http://${window.location.hostname}:3001`;
const endpoint = canCreateDirectly ? `/api/v1/tours/${tourId}/members` : `/api/v1/tours/${tourId}/join-requests`;
const body = canCreateDirectly
? { userId: selectedUser, role }
: { userId: selectedUser };
const res = await fetch(`${API_BASE}${endpoint}`, {
const res = await fetch(`${endpoint}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
@@ -14,8 +14,7 @@ export const UserManagementModal: React.FC<UserManagementModalProps> = ({ isOpen
const fetchUsers = async () => {
setLoading(true);
try {
const API_BASE = `http://${window.location.hostname}:3001`;
const response = await fetch(`${API_BASE}/api/v1/users`, {
const response = await fetch(`/api/v1/users`, {
headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` }
});
if (!response.ok) throw new Error('Không thể tải danh sách người dùng');
@@ -34,8 +33,7 @@ export const UserManagementModal: React.FC<UserManagementModalProps> = ({ isOpen
const handleToggleBlock = async (id: string) => {
try {
const API_BASE = `http://${window.location.hostname}:3001`;
await fetch(`${API_BASE}/api/v1/users/block/${id}`, {
await fetch(`/api/v1/users/block/${id}`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` }
});
@@ -48,8 +46,7 @@ export const UserManagementModal: React.FC<UserManagementModalProps> = ({ isOpen
const handleDelete = async (id: string) => {
if (!confirm('Bạn có chắc chắn muốn xóa người dùng này?')) return;
try {
const API_BASE = `http://${window.location.hostname}:3001`;
const res = await fetch(`${API_BASE}/api/v1/users/${id}`, {
const res = await fetch(`/api/v1/users/${id}`, {
method: 'DELETE',
headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` }
});