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() {