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 => { 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 = { 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" }; } };