Cập nhật tab Nhật ký ( CRUD chuyến đi, CRUD thuyền viên trong chuyến đi )
This commit is contained in:
@@ -1,10 +1,14 @@
|
||||
import { api } from "@/config";
|
||||
import { API_CREW, API_GET_PHOTO } from "@/constants";
|
||||
import { API_CREW, API_GET_PHOTO, API_SEARCH_CREW } from "@/constants";
|
||||
|
||||
export async function newCrew(body: Model.NewCrewAPIRequest) {
|
||||
return api.post(API_CREW, body);
|
||||
}
|
||||
|
||||
export async function searchCrew(personal_id: string) {
|
||||
return api.get<Model.TripCrewPerson>(`${API_SEARCH_CREW}/${personal_id}`);
|
||||
}
|
||||
|
||||
export async function updateCrewInfo(
|
||||
personalId: string,
|
||||
body: Model.UpdateCrewAPIRequest
|
||||
@@ -17,3 +21,60 @@ export async function queryCrewImage(personal_id: string) {
|
||||
responseType: "arraybuffer",
|
||||
});
|
||||
}
|
||||
|
||||
// Upload ảnh thuyền viên
|
||||
// Hỗ trợ các định dạng: HEIC, jpg, jpeg, png
|
||||
export async function uploadCrewImage(personalId: string, imageUri: string) {
|
||||
// Lấy tên file và extension từ URI
|
||||
const uriParts = imageUri.split("/");
|
||||
const fileName = uriParts[uriParts.length - 1];
|
||||
|
||||
// Xác định MIME type dựa trên extension
|
||||
const extension = fileName.split(".").pop()?.toLowerCase() || "jpg";
|
||||
let mimeType = "image/jpeg";
|
||||
|
||||
switch (extension) {
|
||||
case "heic":
|
||||
mimeType = "image/heic";
|
||||
break;
|
||||
case "heif":
|
||||
mimeType = "image/heif";
|
||||
break;
|
||||
case "png":
|
||||
mimeType = "image/png";
|
||||
break;
|
||||
case "gif":
|
||||
mimeType = "image/gif";
|
||||
break;
|
||||
case "webp":
|
||||
mimeType = "image/webp";
|
||||
break;
|
||||
case "jpg":
|
||||
case "jpeg":
|
||||
default:
|
||||
mimeType = "image/jpeg";
|
||||
break;
|
||||
}
|
||||
|
||||
// Tạo FormData để upload
|
||||
const formData = new FormData();
|
||||
formData.append("file", {
|
||||
uri: imageUri,
|
||||
name: fileName,
|
||||
type: mimeType,
|
||||
} as any);
|
||||
|
||||
// Debug logs
|
||||
console.log("📤 Upload params:");
|
||||
console.log(" - URI:", imageUri);
|
||||
console.log(" - fileName:", fileName);
|
||||
console.log(" - mimeType:", mimeType);
|
||||
console.log(" - endpoint:", `${API_GET_PHOTO}/people/${personalId}/main`);
|
||||
|
||||
// Phải set Content-Type header cho React Native
|
||||
return api.post(`${API_GET_PHOTO}/people/${personalId}/main`, formData, {
|
||||
headers: {
|
||||
"Content-Type": "multipart/form-data",
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
@@ -19,10 +19,8 @@ export async function queryShipGroups() {
|
||||
return await api.get<Model.ShipGroup[]>(API_GET_SHIP_GROUPS);
|
||||
}
|
||||
|
||||
export async function queryAllShips(params: Model.SearchThingBody) {
|
||||
return await api.get<Model.ShipResponse>(API_GET_ALL_SHIP, {
|
||||
params: params,
|
||||
});
|
||||
export async function queryAllShips() {
|
||||
return await api.get<Model.ShipResponse>(API_GET_ALL_SHIP);
|
||||
}
|
||||
|
||||
export async function queryShipsImage(ship_id: string) {
|
||||
|
||||
@@ -9,12 +9,19 @@ import {
|
||||
API_POST_TRIP,
|
||||
API_PUT_TRIP,
|
||||
API_TRIP_CREW,
|
||||
API_GET_TRIP_BY_ID,
|
||||
API_TRIP_APPROVE_REQUEST,
|
||||
API_TRIP_CANCEL_REQUEST,
|
||||
} from "@/constants";
|
||||
|
||||
export async function queryTrip() {
|
||||
return api.get<Model.Trip>(API_GET_TRIP);
|
||||
}
|
||||
|
||||
export async function queryTripById(tripId: string) {
|
||||
return api.get<Model.Trip>(`${API_GET_TRIP_BY_ID}/${tripId}`);
|
||||
}
|
||||
|
||||
export async function queryLastTrip(thingId: string) {
|
||||
return api.get<Model.Trip>(`${API_GET_LAST_TRIP}/${thingId}`);
|
||||
}
|
||||
@@ -42,3 +49,11 @@ export async function createTrip(thingId: string, body: Model.TripAPIBody) {
|
||||
export async function updateTrip(tripId: string, body: Model.TripAPIBody) {
|
||||
return api.put<Model.Trip>(`${API_PUT_TRIP}/${tripId}`, body);
|
||||
}
|
||||
|
||||
export async function tripApproveRequest(tripId: string) {
|
||||
return api.put<Model.Trip>(`${API_TRIP_APPROVE_REQUEST}/${tripId}`);
|
||||
}
|
||||
|
||||
export async function tripCancelRequest(tripId: string) {
|
||||
return api.put<Model.Trip>(`${API_TRIP_CANCEL_REQUEST}/${tripId}`);
|
||||
}
|
||||
|
||||
@@ -7,11 +7,9 @@ import {
|
||||
} from "@/constants";
|
||||
|
||||
export async function queryTripCrew(tripId: string) {
|
||||
return api.get<Model.TripCrews[]>(`${API_GET_TRIP_CREW}/${tripId}`);
|
||||
}
|
||||
|
||||
export async function searchCrew(personal_id: string) {
|
||||
return api.get<Model.TripCrewPerson>(`${API_SEARCH_CREW}/${personal_id}`);
|
||||
return api.get<{ trip_crews: Model.TripCrews[] }>(
|
||||
`${API_GET_TRIP_CREW}/${tripId}`
|
||||
);
|
||||
}
|
||||
|
||||
export async function newTripCrew(body: Model.NewTripCrewAPIRequest) {
|
||||
|
||||
2
controller/typings.d.ts
vendored
2
controller/typings.d.ts
vendored
@@ -234,7 +234,6 @@ declare namespace Model {
|
||||
|
||||
// API body interface for creating a new trip
|
||||
interface TripAPIBody {
|
||||
thing_id?: string;
|
||||
name: string;
|
||||
departure_time: string; // ISO string
|
||||
departure_port_id: number;
|
||||
@@ -372,6 +371,7 @@ declare namespace Model {
|
||||
dir?: "asc" | "desc";
|
||||
name?: string;
|
||||
level?: number;
|
||||
thing_id?: string;
|
||||
confirmed?: boolean;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user