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 (
);
}