import { AlarmData } from "@/app/(tabs)"; import { ThemedText } from "@/components/themed-text"; import { useAppTheme } from "@/hooks/use-app-theme"; import { formatTimestamp } from "@/services/time_service"; import { Ionicons } from "@expo/vector-icons"; import { useCallback } from "react"; import { FlatList, TouchableOpacity, View } from "react-native"; // ============ Types ============ type AlarmType = "approaching" | "entered" | "fishing"; interface AlarmCardProps { alarm: AlarmData; onPress?: () => void; } // ============ Config ============ const getAlarmConfig = (isDark: boolean) => ({ entered: { icon: "warning" as keyof typeof Ionicons.glyphMap, label: "Xâm nhập", bgColor: isDark ? "rgba(220, 38, 38, 0.15)" : "#FEF2F2", borderColor: isDark ? "rgba(220, 38, 38, 0.3)" : "#FECACA", iconBgColor: isDark ? "rgba(220, 38, 38, 0.25)" : "#FEE2E2", iconColor: isDark ? "#F87171" : "#DC2626", labelColor: isDark ? "#F87171" : "#DC2626", }, approaching: { icon: "alert-circle" as keyof typeof Ionicons.glyphMap, label: "Tiếp cận", bgColor: isDark ? "rgba(217, 119, 6, 0.15)" : "#FFFBEB", borderColor: isDark ? "rgba(217, 119, 6, 0.3)" : "#FDE68A", iconBgColor: isDark ? "rgba(217, 119, 6, 0.25)" : "#FEF3C7", iconColor: isDark ? "#FBBF24" : "#D97706", labelColor: isDark ? "#FBBF24" : "#D97706", }, fishing: { icon: "fish" as keyof typeof Ionicons.glyphMap, label: "Đánh bắt", bgColor: isDark ? "rgba(234, 88, 12, 0.15)" : "#FFF7ED", borderColor: isDark ? "rgba(234, 88, 12, 0.3)" : "#FED7AA", iconBgColor: isDark ? "rgba(234, 88, 12, 0.25)" : "#FFEDD5", iconColor: isDark ? "#FB923C" : "#EA580C", labelColor: isDark ? "#FB923C" : "#EA580C", }, }); // ============ AlarmCard Component ============ const AlarmCard = ({ alarm, onPress }: AlarmCardProps) => { const { colors, utils } = useAppTheme(); const isDark = utils.isDark; const alarmConfig = getAlarmConfig(isDark); const config = alarmConfig[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)} ); }; // ============ Main Component ============ interface AlarmListProps { data: AlarmData[]; onPress?: (alarm: AlarmData) => void; } export default function AlarmList({ data, onPress }: AlarmListProps) { const renderItem = useCallback( ({ item }: { item: AlarmData }) => ( onPress?.(item)} /> ), [onPress] ); const keyExtractor = useCallback( (item: AlarmData, index: number) => `${item.thing_id}-${index}`, [] ); const ItemSeparator = useCallback(() => , []); return ( ); }