import { useState } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { Plus, Trash2, Star, X } from 'lucide-react' import { getFirmware, createFirmware, deleteFirmware } from '../api/client' export default function FirmwareList() { const qc = useQueryClient() const [modal, setModal] = useState(null) const { data: fws = [], isLoading } = useQuery({ queryKey: ['firmware'], queryFn: () => getFirmware(), }) const saveMut = useMutation({ mutationFn: (d: any) => createFirmware(d), onSuccess: () => { qc.invalidateQueries({ queryKey: ['firmware'] }); setModal(null) }, }) const deleteMut = useMutation({ mutationFn: deleteFirmware, onSuccess: () => qc.invalidateQueries({ queryKey: ['firmware'] }), }) if (isLoading) return
로딩 중...
return (

펌웨어 관리

{['버전','테넌트','장치유형','파일명','크기','체크섬','최신','등록일','액션'].map(h => ( ))} {(fws as any[]).map((f: any) => ( ))} {(fws as any[]).length === 0 && ( )}
{h}
{f.firmwareVersion} {f.tenantCode} {f.deviceType} {f.fileName} {f.fileSize ? `${(f.fileSize / 1024).toFixed(1)}KB` : '-'} {f.checksum ? f.checksum.substring(0, 8) + '...' : '-'} {f.latest && } {f.createdAt ? new Date(f.createdAt).toLocaleDateString('ko-KR') : '-'}
펌웨어가 없습니다
{modal && (

펌웨어 등록

saveMut.mutate(d)} />
)}
) } function FirmwareForm({ onSave }: { onSave: (d: any) => void }) { const [f, setF] = useState({ tenantCode: 'EMART', firmwareVersion: '', deviceType: 'ESL_DEVICE', fileName: '', filePath: '', fileSize: '', checksum: '', description: '', latest: true, }) const set = (k: string) => (e: React.ChangeEvent) => setF(p => ({ ...p, [k]: e.target.value })) const submit = (e: React.FormEvent) => { e.preventDefault() onSave({ ...f, fileSize: f.fileSize === '' ? null : Number(f.fileSize), latest: f.latest === true || (f as any).latest === 'true', }) } return (
{[ { label: '펌웨어 버전', key: 'firmwareVersion', ph: '예: v1.2.3', required: true }, { label: '파일명', key: 'fileName', ph: 'firmware_v1.2.3.bin' }, { label: '파일 경로', key: 'filePath', ph: '/opt/esn/firmware/...' }, { label: '파일 크기(byte)', key: 'fileSize', type: 'number' }, { label: '체크섬(SHA256)', key: 'checksum' }, ].map(({ label, key, ph, type, required }) => (
))}