Files
projet_gestion_commande/frontend-admin/src/api/api_delivery.ts
T
2026-05-09 16:38:22 +02:00

401 lines
11 KiB
TypeScript

import apiClient, { API_BASE_URL } from "./client";
import type {
DeliveryStatus,
QueueInfo,
DeliveryItem,
DeliveryDetails,
Alert,
} from "./types";
const API = `${API_BASE_URL}/api/v1/livreur`;
// ============================================
// STATUT
// ============================================
export const getMyStatus = async (): Promise<{
success: boolean;
status?: DeliveryStatus;
error?: string;
}> => {
try {
const { data } = await apiClient.get(`${API}/status`);
return { success: true, status: data.status };
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
export const updateMyStatus = async (
status: "available" | "busy" | "offline",
): Promise<{ success: boolean; message?: string; error?: string }> => {
try {
const { data } = await apiClient.post(`${API}/update/status`, {
status,
});
return { success: true, message: data.message };
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
// ============================================
// QUEUE
// ============================================
export const getMyQueue = async (): Promise<{
success: boolean;
queue_info?: QueueInfo;
error?: string;
}> => {
try {
const { data } = await apiClient.get(`${API}/queue`);
return { success: true, queue_info: data.queue_info };
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
// ============================================
// LIVRAISONS
// ============================================
export const getMyDeliveries = async (): Promise<{
success: boolean;
deliveries?: DeliveryItem[];
error?: string;
}> => {
try {
const { data } = await apiClient.get(`${API}/deliveries`);
const deliveries: DeliveryItem[] = (data.deliveries || []).map(
(d: any) => ({ ...d, items: d.items || [] }),
);
return { success: true, deliveries };
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
export const getDeliveryDetails = async (
deliveryId: number,
): Promise<{
success: boolean;
delivery?: DeliveryDetails;
error?: string;
}> => {
try {
const { data } = await apiClient.get(`${API}/deliveries/${deliveryId}`);
// Le backend retourne { delivery: { id, status, adresse, items, ... }, success: true }
// Les items sont dans data.delivery.items, pas dans data.client_info
const deliveryObj = data.delivery || {};
return {
success: true,
delivery: {
delivery: {
...deliveryObj,
items: deliveryObj.items || [],
},
client_info: deliveryObj.client_info || data.client_info || {},
},
};
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
export const startDelivery = async (
deliveryId: number,
latitude: number,
longitude: number,
): Promise<{ success: boolean; message?: string; error?: string }> => {
try {
const { data } = await apiClient.post(
`${API}/deliveries/${deliveryId}/start`,
{ latitude, longitude },
);
return { success: true, message: data.message };
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
export const updateDeliveryStatus = async (
deliveryId: number,
status: string,
latitude: number,
longitude: number,
notes?: string,
): Promise<{ success: boolean; message?: string; error?: string }> => {
try {
const { data } = await apiClient.put(
`${API}/deliveries/${deliveryId}/status`,
{ status, latitude, longitude, ...(notes ? { notes } : {}) },
);
return { success: true, message: data.message };
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
// ============================================
// GPS
// ============================================
export const updateMyLocation = async (
latitude: number,
longitude: number,
): Promise<{ success: boolean; message?: string; error?: string }> => {
try {
const { data } = await apiClient.post(`${API}/location/update`, {
latitude,
longitude,
});
return { success: true, message: data.message };
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
export const getDeliveryNavLink = async (
deliveryId: number,
): Promise<{ success: boolean; waze_app?: string; error?: string }> => {
try {
const { data } = await apiClient.get(
`${API}/deliveries/${deliveryId}/nav-link`,
);
return { success: true, waze_app: data.waze_app };
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
export const getMyLocation = async (): Promise<{
success: boolean;
latitude?: number;
longitude?: number;
error?: string;
}> => {
try {
const { data } = await apiClient.get(`${API}/location`);
return {
success: true,
latitude: data.latitude,
longitude: data.longitude,
};
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
// ============================================
// ALERTES
// ============================================
export const triggerPoliceAlert = async (
alertMessage: string,
): Promise<{
success: boolean;
alert_id?: number;
message?: string;
error?: string;
}> => {
try {
const { data } = await apiClient.post(`${API}/alert`, {
message: alertMessage,
});
return {
success: true,
alert_id: data.alert_id,
message: data.message,
};
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
export const endAlert = async (
alertId: number,
): Promise<{ success: boolean; message?: string; error?: string }> => {
try {
const { data } = await apiClient.delete(`${API}/alert/${alertId}`);
return { success: true, message: data.message };
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
export const getMyAlerts = async (): Promise<{
success: boolean;
alerts?: Alert[];
count?: number;
error?: string;
}> => {
try {
const { data } = await apiClient.get(`${API}/alerts`);
return {
success: true,
alerts: data.alerts || [],
count: data.count || 0,
};
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
// ============================================
// NOTIFICATIONS
// ============================================
export type LivreurNotification = {
command_id: number;
type: string;
message: string;
created_at: string;
read: boolean;
};
export const getLivreurNotifications = async (): Promise<{
success: boolean;
notifications?: LivreurNotification[];
unread_count?: number;
total?: number;
error?: string;
}> => {
try {
const { data } = await apiClient.get(`${API}/notifications`);
return {
success: true,
notifications: data.notifications || [],
unread_count: data.unread_count || 0,
total: data.total || 0,
};
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
export const markLivreurNotificationsRead = async (): Promise<{
success: boolean;
error?: string;
}> => {
try {
await apiClient.post(`${API}/notifications/read`);
return { success: true };
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur réseau",
};
}
};
// ============================================
// TELEGRAM — LIVREUR
// ============================================
export const getLivreurTelegramStatus = async (): Promise<{
linked: boolean;
enabled: boolean;
}> => {
try {
const { data } = await apiClient.get(`${API}/telegram/status`);
return data;
} catch {
return { linked: false, enabled: false };
}
};
export const generateLivreurLinkToken = async (): Promise<{
link_url?: string;
expires_in?: number;
error?: string;
}> => {
try {
const { data } = await apiClient.post(`${API}/telegram/link-token`);
return data;
} catch (e: any) {
return { error: e?.response?.data?.error || "Erreur" };
}
};
export const unlinkLivreurTelegram = async (): Promise<void> => {
try {
await apiClient.delete(`${API}/telegram/unlink`);
} catch {
/* ignore */
}
};
export type IssueType =
| "client_absent"
| "wrong_address"
| "refused_delivery"
| "no_access"
| "other";
export const ISSUE_LABELS: Record<IssueType, string> = {
client_absent: "Client absent",
wrong_address: "Adresse incorrecte",
refused_delivery: "Livraison refusée",
no_access: "Accès impossible",
other: "Autre",
};
export const reportDeliveryIssue = async (
deliveryId: number,
issueType: IssueType,
description: string,
): Promise<{ success: boolean; error?: string }> => {
try {
await apiClient.post(`${API}/deliveries/${deliveryId}/issue`, {
issue_type: issueType,
description,
});
return { success: true };
} catch (e: any) {
return { success: false, error: e?.response?.data?.error || "Erreur" };
}
};