142 lines
4.7 KiB
TypeScript
142 lines
4.7 KiB
TypeScript
import { STATUS_DANGEROUS, STATUS_NORMAL, STATUS_WARNING } from "@/constants";
|
|
import { useAppTheme } from "@/hooks/use-app-theme";
|
|
import { useI18n } from "@/hooks/use-i18n";
|
|
import { formatRelativeTime } from "@/services/time_service";
|
|
import { convertToDMS, kmhToKnot } from "@/utils/geom";
|
|
import { Ionicons } from "@expo/vector-icons";
|
|
import { ScrollView, Text, View } from "react-native";
|
|
import { ThemedText } from "../themed-text";
|
|
|
|
interface ShipInfoProps {
|
|
thingMetadata?: Model.ThingMetadata;
|
|
}
|
|
|
|
const ShipInfo = ({ thingMetadata }: ShipInfoProps) => {
|
|
const { t } = useI18n();
|
|
const { colors } = useAppTheme();
|
|
// Định nghĩa màu sắc theo trạng thái
|
|
const statusConfig = {
|
|
normal: {
|
|
dotColor: "bg-green-500",
|
|
badgeColor: "bg-green-100",
|
|
badgeTextColor: "text-green-700",
|
|
badgeText: "Bình thường",
|
|
},
|
|
warning: {
|
|
dotColor: "bg-yellow-500",
|
|
badgeColor: "bg-yellow-100",
|
|
badgeTextColor: "text-yellow-700",
|
|
badgeText: "Cảnh báo",
|
|
},
|
|
danger: {
|
|
dotColor: "bg-red-500",
|
|
badgeColor: "bg-red-100",
|
|
badgeTextColor: "text-red-700",
|
|
badgeText: "Nguy hiểm",
|
|
},
|
|
};
|
|
const getThingStatus = () => {
|
|
switch (thingMetadata?.state_level) {
|
|
case STATUS_NORMAL:
|
|
return "normal";
|
|
case STATUS_WARNING:
|
|
return "warning";
|
|
case STATUS_DANGEROUS:
|
|
return "danger";
|
|
default:
|
|
return "normal";
|
|
}
|
|
};
|
|
|
|
const gpsData: Model.GPSResponse = JSON.parse(thingMetadata?.gps || "{}");
|
|
|
|
const currentStatus = statusConfig[getThingStatus()];
|
|
|
|
// Format tọa độ
|
|
const formatCoordinate = (lat: number, lon: number) => {
|
|
const latDir = lat >= 0 ? "N" : "S";
|
|
const lonDir = lon >= 0 ? "E" : "W";
|
|
return `${Math.abs(lat).toFixed(4)}°${latDir}, ${Math.abs(lon).toFixed(
|
|
4
|
|
)}°${lonDir}`;
|
|
};
|
|
|
|
return (
|
|
<View className="px-4 py-3">
|
|
{/* Header: Tên tàu và trạng thái */}
|
|
<View className="flex-row items-center justify-between mb-3">
|
|
<View className="flex-row items-center gap-2">
|
|
{/* Status dot */}
|
|
<View className={`h-3 w-3 rounded-full ${currentStatus.dotColor}`} />
|
|
|
|
{/* Tên tàu */}
|
|
<Text className="text-lg font-semibold text-gray-900">
|
|
{thingMetadata?.ship_name}
|
|
</Text>
|
|
</View>
|
|
|
|
{/* Badge trạng thái */}
|
|
<View className={`px-3 py-1 rounded-full ${currentStatus.badgeColor}`}>
|
|
<Text
|
|
className={`text-md font-medium ${currentStatus.badgeTextColor}`}
|
|
>
|
|
{currentStatus.badgeText}
|
|
</Text>
|
|
</View>
|
|
</View>
|
|
|
|
{/* Mã tàu */}
|
|
{/* <Text className="text-base text-gray-600 mb-2">{shipCode}</Text> */}
|
|
<View className="flex-row items-center justify-between gap-2 mb-3">
|
|
<View className="flex-row items-center gap-2 w-2/3">
|
|
<Ionicons name="speedometer-outline" size={16} color="#6B7280" />
|
|
<Text className="text-md text-gray-600">
|
|
{kmhToKnot(gpsData.s || 0)} {t("home.speed_units")}
|
|
</Text>
|
|
</View>
|
|
<View className="flex-row items-start gap-2 w-1/3 ">
|
|
<Ionicons name="compass-outline" size={16} color="#6B7280" />
|
|
<Text className="text-md text-gray-600">{gpsData.h}°</Text>
|
|
</View>
|
|
</View>
|
|
{/* Tọa độ */}
|
|
<View className="flex-row items-center justify-between gap-2 mb-2">
|
|
<View className="flex-row items-center gap-2 w-2/3">
|
|
<Ionicons name="location-outline" size={16} color="#6B7280" />
|
|
<Text className="text-md text-gray-600">
|
|
{convertToDMS(gpsData.lat || 0, true)},
|
|
{convertToDMS(gpsData.lon || 0, false)}
|
|
</Text>
|
|
</View>
|
|
<View className=" flex-row items-start gap-2 w-1/3 ">
|
|
<Ionicons name="time-outline" size={16} color="#6B7280" />
|
|
<Text className="text-md text-gray-600">
|
|
{formatRelativeTime(gpsData.t)}
|
|
</Text>
|
|
</View>
|
|
</View>
|
|
{/* <View className="flex">
|
|
<Description title="Trạng thái" description={thingMetadata?.state} />
|
|
</View> */}
|
|
{thingMetadata?.state !== "" && (
|
|
<View className="flex-row items-center gap-2">
|
|
<ThemedText style={{ color: colors.textSecondary, fontSize: 15 }}>
|
|
Trạng thái:
|
|
</ThemedText>
|
|
<ScrollView
|
|
horizontal
|
|
showsHorizontalScrollIndicator={false}
|
|
style={{ flex: 1 }}
|
|
>
|
|
<ThemedText style={{ color: colors.text, fontSize: 15 }}>
|
|
{thingMetadata?.state || "-"}
|
|
</ThemedText>
|
|
</ScrollView>
|
|
</View>
|
|
)}
|
|
</View>
|
|
);
|
|
};
|
|
|
|
export default ShipInfo;
|