This commit is contained in:
@@ -0,0 +1,439 @@
|
||||
import apiClient from "./client";
|
||||
import type {
|
||||
DeliveryStatus,
|
||||
QueueInfo,
|
||||
DeliveryItem,
|
||||
DeliveryDetails,
|
||||
Alert,
|
||||
} from "./types";
|
||||
|
||||
const API = "/api/v1/livreur";
|
||||
|
||||
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",
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
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",
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
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 type StatPoint = { label: string; count: number; revenue: number };
|
||||
|
||||
export const getMyStats = async (): Promise<{
|
||||
success: boolean;
|
||||
by_day?: StatPoint[];
|
||||
by_week?: StatPoint[];
|
||||
by_month?: StatPoint[];
|
||||
today_count?: number;
|
||||
today_revenue?: number;
|
||||
error?: string;
|
||||
}> => {
|
||||
try {
|
||||
const { data } = await apiClient.get(`${API}/stats`);
|
||||
return {
|
||||
success: true,
|
||||
by_day: data.by_day || [],
|
||||
by_week: data.by_week || [],
|
||||
by_month: data.by_month || [],
|
||||
today_count: data.today_count || 0,
|
||||
today_revenue: data.today_revenue || 0,
|
||||
};
|
||||
} catch (error: any) {
|
||||
return { success: false, error: error.response?.data?.error || "Erreur réseau" };
|
||||
}
|
||||
};
|
||||
|
||||
export interface LivreurRating {
|
||||
id: number;
|
||||
order_id: number;
|
||||
livreur_username: string;
|
||||
client_username: string;
|
||||
rating: number;
|
||||
comment: string;
|
||||
created_at: string;
|
||||
}
|
||||
|
||||
export const getMyRatings = async (): Promise<{
|
||||
success: boolean;
|
||||
ratings: LivreurRating[];
|
||||
average: number;
|
||||
count: number;
|
||||
error?: string;
|
||||
}> => {
|
||||
try {
|
||||
const { data } = await apiClient.get(`${API}/ratings`);
|
||||
return { success: true, ratings: data.ratings || [], average: data.average || 0, count: data.count || 0 };
|
||||
} catch (e: any) {
|
||||
return { success: false, ratings: [], average: 0, count: 0, error: e?.response?.data?.error || "Erreur" };
|
||||
}
|
||||
};
|
||||
|
||||
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" };
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user