diff --git a/frontend-admin/src/api/api_delivery.ts b/frontend-admin/src/api/api_delivery.ts index dcea78a7..009f08dc 100644 --- a/frontend-admin/src/api/api_delivery.ts +++ b/frontend-admin/src/api/api_delivery.ts @@ -205,14 +205,14 @@ export const getMyLocation = async (): Promise<{ // ALERTES // ============================================ -export const triggerPoliceAlert = async (): Promise<{ +export const triggerPoliceAlert = async (alertMessage: string): Promise<{ success: boolean; alert_id?: number; message?: string; error?: string; }> => { try { - const { data } = await apiClient.post(`${API}/alert`); + const { data } = await apiClient.post(`${API}/alert`, { message: alertMessage }); return { success: true, alert_id: data.alert_id, diff --git a/frontend-admin/src/api/types.ts b/frontend-admin/src/api/types.ts index eae55d34..9e96dee1 100644 --- a/frontend-admin/src/api/types.ts +++ b/frontend-admin/src/api/types.ts @@ -60,6 +60,7 @@ export interface Alert { id: number; username: string; status: string; + message: string; created_at: string; updated_at: string; } diff --git a/frontend-admin/src/screens/admin/AlertsScreen.tsx b/frontend-admin/src/screens/admin/AlertsScreen.tsx index 82225149..275586ec 100644 --- a/frontend-admin/src/screens/admin/AlertsScreen.tsx +++ b/frontend-admin/src/screens/admin/AlertsScreen.tsx @@ -44,6 +44,12 @@ export default function AlertsScreen() { fontSize: fontSize.md, fontWeight: "600", }, + alertMessage: { + color: colors.danger, + fontSize: fontSize.sm, + fontWeight: "600", + marginTop: 2, + }, date: { color: colors.textMuted, fontSize: fontSize.xs, @@ -75,6 +81,9 @@ export default function AlertsScreen() { Livreur: {item.username} + {item.message ? ( + {item.message} + ) : null} {new Date(item.created_at).toLocaleString("fr-FR")} diff --git a/frontend-admin/src/screens/cabine/AlertsScreen.tsx b/frontend-admin/src/screens/cabine/AlertsScreen.tsx index 7e4658fc..3bf0e177 100644 --- a/frontend-admin/src/screens/cabine/AlertsScreen.tsx +++ b/frontend-admin/src/screens/cabine/AlertsScreen.tsx @@ -56,6 +56,12 @@ export default function AlertsScreen() { fontSize: fontSize.md, fontWeight: "600", }, + alertMessage: { + color: colors.danger, + fontSize: fontSize.sm, + fontWeight: "600", + marginTop: 2, + }, date: { color: colors.textMuted, fontSize: fontSize.xs, @@ -108,6 +114,9 @@ export default function AlertsScreen() { Livreur: {item.username} + {item.message ? ( + {item.message} + ) : null} {new Date(item.created_at).toLocaleString("fr-FR")} diff --git a/frontend-admin/src/screens/delivery/AlertsScreen.tsx b/frontend-admin/src/screens/delivery/AlertsScreen.tsx index 4145a0fe..1834bf06 100644 --- a/frontend-admin/src/screens/delivery/AlertsScreen.tsx +++ b/frontend-admin/src/screens/delivery/AlertsScreen.tsx @@ -25,14 +25,21 @@ import Button from "../../components/ui/Button"; import AlertModal from "../../components/ui/AlertModal"; import { useAlert } from "../../hooks/useAlert"; +const ALERT_PHRASES = [ + { label: "Contrôle de police", icon: "shield-outline" as const }, + { label: "Guet-apens", icon: "warning-outline" as const }, +]; + export default function AlertsScreen() { const { colors } = useTheme(); const [alerts, setAlerts] = useState([]); const [loading, setLoading] = useState(true); const [refreshing, setRefreshing] = useState(false); const [triggering, setTriggering] = useState(false); + const [showPhraseModal, setShowPhraseModal] = useState(false); const [showConfirmModal, setShowConfirmModal] = useState(false); const [showSuccessModal, setShowSuccessModal] = useState(false); + const [selectedPhrase, setSelectedPhrase] = useState(""); const [successMessage, setSuccessMessage] = useState(""); const [pulseAnim] = useState(() => new Animated.Value(1)); const { alert: alertModal, showError, hideAlert } = useAlert(); @@ -77,10 +84,16 @@ export default function AlertsScreen() { setRefreshing(false); }; + const handleSelectPhrase = (phrase: string) => { + setSelectedPhrase(phrase); + setShowPhraseModal(false); + setShowConfirmModal(true); + }; + const handleConfirmTrigger = async () => { setShowConfirmModal(false); setTriggering(true); - const res = await triggerPoliceAlert(); + const res = await triggerPoliceAlert(selectedPhrase); setTriggering(false); if (res.success) { setSuccessMessage(res.message || "Alerte déclenchée avec succès"); @@ -113,6 +126,9 @@ export default function AlertsScreen() { } /> + {item.message ? ( + {item.message} + ) : null} {new Date(item.created_at).toLocaleString("fr-FR")} @@ -142,6 +158,7 @@ export default function AlertsScreen() { StyleSheet.create({ container: { flex: 1, backgroundColor: colors.bgPrimary }, row: { flexDirection: "row", alignItems: "center" }, + alertMessage: { color: colors.textPrimary, fontSize: fontSize.md, fontWeight: "600", marginBottom: 2 }, date: { color: colors.textMuted, fontSize: fontSize.sm }, empty: { color: colors.textMuted, @@ -303,6 +320,21 @@ export default function AlertsScreen() { fontSize: fontSize.md, fontWeight: "700", }, + phraseBtn: { + flexDirection: "row", + alignItems: "center", + gap: spacing.m, + paddingVertical: 14, + paddingHorizontal: spacing.l, + borderRadius: borderRadius.sm, + borderWidth: 1, + backgroundColor: colors.bgInput, + }, + phraseBtnText: { + fontSize: fontSize.md, + fontWeight: "600", + flex: 1, + }, }), [colors], ); @@ -311,6 +343,50 @@ export default function AlertsScreen() { return ( + {/* Phrase selection Modal */} + setShowPhraseModal(false)} + > + + + + + + + + Type d'alerte + + Sélectionnez la raison de l'alerte. + + + {ALERT_PHRASES.map((p) => ( + handleSelectPhrase(p.label)} + activeOpacity={0.7} + > + + + {p.label} + + + ))} + + setShowPhraseModal(false)} + activeOpacity={0.7} + > + Annuler + + + + + {/* Confirmation Modal */} + {selectedPhrase ? ( + + {selectedPhrase} + + ) : null} Confirmez-vous le déclenchement ? @@ -417,7 +498,7 @@ export default function AlertsScreen() {