parent
99a2893d51
commit
726d1f9ac3
File diff suppressed because one or more lines are too long
@ -0,0 +1,74 @@ |
|||||||
|
'use client'; |
||||||
|
|
||||||
|
import Guard from '@/components/guard'; |
||||||
|
import { Button } from '@/components/ui/button'; |
||||||
|
import { |
||||||
|
Table, |
||||||
|
TableBody, |
||||||
|
TableCell, |
||||||
|
TableHead, |
||||||
|
TableHeader, |
||||||
|
TableRow, |
||||||
|
} from '@/components/ui/table'; |
||||||
|
import { useSensorData } from '@/hooks/useSensorData'; |
||||||
|
import { useRouter, useSearchParams } from 'next/navigation'; |
||||||
|
|
||||||
|
export default function InnerSensorDataPage() { |
||||||
|
const searchParams = useSearchParams(); |
||||||
|
const rawSensorId = searchParams.get('sensorId'); |
||||||
|
const router = useRouter(); |
||||||
|
|
||||||
|
const sensorId = (() => { |
||||||
|
if (!rawSensorId) return 0; |
||||||
|
const n = Number(rawSensorId); |
||||||
|
return Number.isNaN(n) || !Number.isFinite(n) || !Number.isInteger(n) || n <= 0 ? 0 : n; |
||||||
|
})(); |
||||||
|
const { data, isLoading, isError, refetch } = useSensorData(sensorId); |
||||||
|
|
||||||
|
return ( |
||||||
|
<Guard> |
||||||
|
<div className="mb-4 flex items-center justify-between"> |
||||||
|
<div className="flex items-center gap-2"> |
||||||
|
<Button variant="ghost" onClick={() => router.back()}> |
||||||
|
〈 |
||||||
|
</Button> |
||||||
|
<h1 className="text-xl font-semibold">센서{sensorId} 데이터</h1> |
||||||
|
</div> |
||||||
|
<Button onClick={() => refetch()}>새로고침</Button> |
||||||
|
</div> |
||||||
|
|
||||||
|
{isLoading && <p className="text-gray-500">불러오는 중...</p>} |
||||||
|
{isError && <p className="text-red-600">불러오지 못했습니다.</p>} |
||||||
|
{!isLoading && !isError && ( |
||||||
|
<div className="overflow-x-auto rounded border"> |
||||||
|
<Table> |
||||||
|
<TableHeader> |
||||||
|
<TableRow> |
||||||
|
<TableHead className="px-4 py-2 text-center">ID</TableHead> |
||||||
|
<TableHead className="px-4 py-2 text-center">값</TableHead> |
||||||
|
<TableHead className="px-4 py-2 text-center">시간</TableHead> |
||||||
|
</TableRow> |
||||||
|
</TableHeader> |
||||||
|
<TableBody> |
||||||
|
{data && data.length > 0 ? ( |
||||||
|
data.map((s) => ( |
||||||
|
<TableRow key={s.id}> |
||||||
|
<TableCell className="px-4 py-2 text-center">{s.id}</TableCell> |
||||||
|
<TableCell className="px-4 py-2 text-center">{s.value}</TableCell> |
||||||
|
<TableCell className="px-4 py-2 text-center">{s.recordedAt ?? '-'}</TableCell> |
||||||
|
</TableRow> |
||||||
|
)) |
||||||
|
) : ( |
||||||
|
<TableRow> |
||||||
|
<TableCell colSpan={4} className="px-4 py-6 text-center text-gray-500"> |
||||||
|
데이터가 없습니다. |
||||||
|
</TableCell> |
||||||
|
</TableRow> |
||||||
|
)} |
||||||
|
</TableBody> |
||||||
|
</Table> |
||||||
|
</div> |
||||||
|
)} |
||||||
|
</Guard> |
||||||
|
); |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
import { Suspense } from 'react'; |
||||||
|
import InnerSensorDataPage from './innerPage'; |
||||||
|
|
||||||
|
export default function SensorDataPage() { |
||||||
|
return ( |
||||||
|
<Suspense |
||||||
|
fallback={<div className="mb-4 flex items-center justify-between">불러오는 중...</div>} |
||||||
|
> |
||||||
|
<InnerSensorDataPage /> |
||||||
|
</Suspense> |
||||||
|
); |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
import { Suspense } from 'react'; |
||||||
|
import InnerGroupSensorsPage from './innerPage'; |
||||||
|
|
||||||
|
export default function GroupSensorsPage() { |
||||||
|
return ( |
||||||
|
<Suspense |
||||||
|
fallback={<div className="mb-4 flex items-center justify-between">불러오는 중...</div>} |
||||||
|
> |
||||||
|
<InnerGroupSensorsPage /> |
||||||
|
</Suspense> |
||||||
|
); |
||||||
|
} |
@ -1,21 +0,0 @@ |
|||||||
'use client'; |
|
||||||
|
|
||||||
import Guard from '@/components/guard'; |
|
||||||
import { useParams, useRouter, useSearchParams } from 'next/navigation'; |
|
||||||
|
|
||||||
export default function SensorDetailPage() { |
|
||||||
const params = useParams(); |
|
||||||
const router = useRouter(); |
|
||||||
const search = useSearchParams(); |
|
||||||
const sensorId = Number(params?.sensorId); |
|
||||||
|
|
||||||
const limit = search.get('limit') ? Number(search.get('limit')) : undefined; |
|
||||||
|
|
||||||
return ( |
|
||||||
<Guard> |
|
||||||
<main> |
|
||||||
<div></div> |
|
||||||
</main> |
|
||||||
</Guard> |
|
||||||
); |
|
||||||
} |
|
Loading…
Reference in new issue