import { Ionicons } from "@expo/vector-icons"; import dayjs from "dayjs"; import { FlatList, Text, TouchableOpacity, View } from "react-native"; export type AlarmStatus = "confirmed" | "pending"; export interface AlarmListItem { id: string; code: string; title: string; station: string; timestamp: number; level: 1 | 2 | 3; // 1: warning (yellow), 2: caution (orange/yellow), 3: danger (red) status: AlarmStatus; } type AlarmProp = { alarmsData: AlarmListItem[]; onPress?: (alarm: AlarmListItem) => void; }; const AlarmList = ({ alarmsData, onPress }: AlarmProp) => { return ( } renderItem={({ item }) => ( onPress?.(item)} /> )} keyExtractor={(item) => item.id} showsVerticalScrollIndicator={false} /> ); }; type AlarmCardProps = { alarm: AlarmListItem; onPress?: () => void; }; const AlarmCard = ({ alarm, onPress }: AlarmCardProps) => { const { bgColor, borderColor, iconColor, iconBgColor } = getColorsByLevel( alarm.level ); const statusConfig = getStatusConfig(alarm.status); return ( {/* Left content */} {/* Icon */} {/* Info */} {/* Code */} {alarm.code} {/* Title */} {alarm.title} {/* Station and Time */} Trạm {alarm.station} Thời gian {formatTimestamp(alarm.timestamp)} {/* Status Badge */} {/* {statusConfig.label} */} {/* Checkmark for confirmed */} {/* {alarm.status === "confirmed" && ( )} */} ); }; const getColorsByLevel = (level: number) => { switch (level) { case 3: // Danger - Red return { bgColor: "bg-red-50", borderColor: "border-red-200", iconColor: "#DC2626", iconBgColor: "bg-red-100", }; case 2: // Caution - Yellow/Orange return { bgColor: "bg-yellow-50", borderColor: "border-yellow-200", iconColor: "#CA8A04", iconBgColor: "bg-yellow-100", }; case 1: // Info - Green default: return { bgColor: "bg-green-50", borderColor: "border-green-200", iconColor: "#16A34A", iconBgColor: "bg-green-100", }; } }; const getIconByLevel = (level: number): keyof typeof Ionicons.glyphMap => { switch (level) { case 3: return "warning"; case 2: return "alert-circle"; case 1: default: return "checkmark-circle"; } }; const getCodeTextColor = (level: number) => { switch (level) { case 3: return "text-red-600"; case 2: return "text-yellow-600"; case 1: default: return "text-green-600"; } }; const getStatusConfig = (status: AlarmStatus) => { switch (status) { case "confirmed": return { label: "Đã xác nhận", bgColor: "bg-green-100", textColor: "text-green-700", }; case "pending": default: return { label: "Chờ xác nhận", bgColor: "bg-yellow-100", textColor: "text-yellow-700", }; } }; const formatTimestamp = (timestamp: number) => { return dayjs.unix(timestamp).format("YYYY-MM-DD HH:mm"); }; export default AlarmList;