import { ThemedText } from "@/components/themed-text"; import { ThemedView } from "@/components/themed-view"; import { Ionicons } from "@expo/vector-icons"; import dayjs from "dayjs"; import React, { useCallback, useMemo } from "react"; import { FlatList, StyleSheet, TouchableOpacity, View } from "react-native"; import { SafeAreaView } from "react-native-safe-area-context"; import { AlarmData } from "."; // ============ Types ============ type AlarmType = "approaching" | "entered" | "fishing"; interface AlarmCardProps { alarm: AlarmData; onPress?: () => void; } // ============ Config ============ const ALARM_CONFIG: Record< AlarmType, { icon: keyof typeof Ionicons.glyphMap; label: string; bgColor: string; borderColor: string; iconBgColor: string; iconColor: string; labelColor: string; } > = { entered: { icon: "warning", label: "Xâm nhập", bgColor: "bg-red-50", borderColor: "border-red-200", iconBgColor: "bg-red-100", iconColor: "#DC2626", labelColor: "text-red-600", }, approaching: { icon: "alert-circle", label: "Tiếp cận", bgColor: "bg-amber-50", borderColor: "border-amber-200", iconBgColor: "bg-amber-100", iconColor: "#D97706", labelColor: "text-amber-600", }, fishing: { icon: "fish", label: "Đánh bắt", bgColor: "bg-orange-50", borderColor: "border-orange-200", iconBgColor: "bg-orange-100", iconColor: "#EA580C", labelColor: "text-orange-600", }, }; // ============ Helper Functions ============ const formatTimestamp = (timestamp?: number): string => { if (!timestamp) return "N/A"; return dayjs.unix(timestamp).format("DD/MM/YYYY HH:mm:ss"); }; // ============ AlarmCard Component ============ const AlarmCard = React.memo(({ alarm, onPress }: AlarmCardProps) => { const config = ALARM_CONFIG[alarm.type]; return ( {/* Icon Container */} {/* Content */} {/* Header: Ship name + Badge */} {alarm.ship_name || alarm.thing_id} {config.label} {/* Zone Info */} {alarm.zone.message || alarm.zone.zone_name} {/* Footer: Zone ID + Time */} {formatTimestamp(alarm.zone.gps_time)} ); }); AlarmCard.displayName = "AlarmCard"; // ============ Main Component ============ interface WarningScreenProps { alarms?: AlarmData[]; } export default function WarningScreen({ alarms = [] }: WarningScreenProps) { // Mock data for demo - replace with actual props const sampleAlarms: AlarmData[] = useMemo( () => [ { thing_id: "SHIP-001", ship_name: "Ocean Star", type: "entered", zone: { zone_type: 1, zone_name: "Khu vực cấm A1", zone_id: "A1", message: "Tàu đã đi vào vùng cấm A1", alarm_type: 1, lat: 10.12345, lon: 106.12345, s: 12, h: 180, fishing: false, gps_time: 1733389200, }, }, { thing_id: "SHIP-002", ship_name: "Blue Whale", type: "approaching", zone: { zone_type: 2, zone_name: "Vùng cảnh báo B3", zone_id: "B3", message: "Tàu đang tiếp cận khu vực cấm B3", alarm_type: 2, lat: 9.87654, lon: 105.87654, gps_time: 1733389260, }, }, { thing_id: "SHIP-003", ship_name: "Sea Dragon", type: "fishing", zone: { zone_type: 3, zone_name: "Vùng cấm đánh bắt C2", zone_id: "C2", message: "Phát hiện hành vi đánh bắt trong vùng cấm C2", alarm_type: 3, lat: 11.11223, lon: 107.44556, fishing: true, gps_time: 1733389320, }, }, { thing_id: "SHIP-004", ship_name: "Red Coral", type: "entered", zone: { zone_type: 1, zone_name: "Khu vực A2", zone_id: "A2", message: "Tàu đã đi sâu vào khu vực A2", alarm_type: 1, gps_time: 1733389380, }, }, { thing_id: "SHIP-005", ship_name: "Silver Wind", type: "approaching", zone: { zone_type: 2, zone_name: "Vùng B1", zone_id: "B1", message: "Tàu đang tiến gần vào vùng B1", alarm_type: 2, gps_time: 1733389440, }, }, ], [] ); const displayAlarms = alarms.length > 0 ? alarms : sampleAlarms; const handleAlarmPress = useCallback((alarm: AlarmData) => { console.log("Alarm pressed:", alarm); // TODO: Navigate to alarm detail or show modal }, []); const renderAlarmCard = useCallback( ({ item }: { item: AlarmData }) => ( handleAlarmPress(item)} /> ), [handleAlarmPress] ); const keyExtractor = useCallback( (item: AlarmData, index: number) => `${item.thing_id}-${index}`, [] ); const ItemSeparator = useCallback(() => , []); // Count alarms by type const alarmCounts = useMemo(() => { return displayAlarms.reduce((acc, alarm) => { acc[alarm.type] = (acc[alarm.type] || 0) + 1; return acc; }, {} as Record); }, [displayAlarms]); return ( {/* Header */} Cảnh báo {displayAlarms.length} {/* Stats Bar */} {(["entered", "approaching", "fishing"] as AlarmType[]).map( (type) => { const config = ALARM_CONFIG[type]; const count = alarmCounts[type] || 0; return ( {count} ); } )} {/* Alarm List */} ); } const styles = StyleSheet.create({ container: { flex: 1, }, content: { flex: 1, }, header: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", paddingHorizontal: 16, paddingVertical: 16, }, titleText: { fontSize: 26, fontWeight: "700", }, listContent: { paddingHorizontal: 16, paddingBottom: 20, }, });