import React, {useMemo, useState} from 'react';
import {Search, Truck, Plane, Inbox} from 'lucide-react';
const labels = {
RECEIVING:'接收正常',GOOD:'正常',CONNECTED:'服务连接正常',STALE:'数据已过期',
NOT_RECEIVED:'未接收',MISSING:'未采到',ERROR:'数据异常',WAITING:'等待数据同步',
INVALID_TIME:'时间异常',INVALID_VALUE:'数值异常',AMBIGUOUS:'来源不明确',
online:'在线',offline:'离线',UNKNOWN:'未接入',
};
export function Status({state='UNKNOWN', label}) {
const tone = ['RECEIVING','GOOD','CONNECTED','online'].includes(state) ? 'good' : ['STALE','INVALID_TIME','AMBIGUOUS'].includes(state) ? 'warn' : ['ERROR','INVALID_VALUE'].includes(state) ? 'bad' : 'muted';
return {label || labels[state] || labels.UNKNOWN};
}
export function Panel({title,children,extra,className=''}) {
return {(title||extra)&&}{children};
}
export function Empty({title='暂无数据',description,icon:Icon=Inbox}) {
return
{title}{description&&{description}
} ;
}
export function EquipmentIcon({equipment,size=25}) {
const air=/无人机|航空|飞行|UAV/i.test(`${equipment?.name||''} ${equipment?.code||''} ${equipment?.type||''}`);
const Icon=air?Plane:Truck;
return ;
}
export function EquipmentList({equipments=[],selectedId,onSelect,title='实装列表',emptyText='暂无已绑定装备'}) {
const [search,setSearch]=useState('');
const filtered=useMemo(()=>equipments.filter(item=>`${item.name||''} ${item.code||''}`.toLowerCase().includes(search.trim().toLowerCase())),[equipments,search]);
return {filtered.map(item=>)}
{!filtered.length&&};
}
export function EquipmentHeader({equipment,statusLabel}) {
if(!equipment)return null;
return {equipment.name||equipment.code||'未命名装备'}
{equipment.code||'—'}·{equipment.type||'实装装备'}
最近接收
;
}
export function formatTime(value) {
if(value===null||value===undefined||value==='')return '—';
const date=new Date(value);
if(Number.isNaN(date.getTime()))return '—';
return new Intl.DateTimeFormat('zh-CN',{timeZone:'Asia/Shanghai',hour:'2-digit',minute:'2-digit',second:'2-digit',hour12:false}).format(date);
}