Files
pp-tcms/frontend/src/app/[locale]/health/HealthPage.tsx
2025-11-09 11:16:59 +09:00

87 lines
2.5 KiB
TypeScript

'use client';
import { useState, useEffect } from 'react';
import { Table, TableBody, TableRow, TableHeader, TableCell, Chip, TableColumn } from '@heroui/react';
import { LocaleCodeType } from '@/types/locale';
import { HealthMessages } from '@/types/health';
import Config from '@/config/config';
import { logError } from '@/utils/errorHandler';
const apiServer = Config.apiServer;
type Props = {
messages: HealthMessages;
locale: LocaleCodeType;
};
async function fetchHealth() {
const url = `${apiServer}/health`;
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error: unknown) {
logError('Error fetching health data:', error);
}
}
export default function HealthPage({ messages, locale }: Props) {
const [isFetching, setIsFetching] = useState<boolean>(true);
const [status, setStatus] = useState<string>('loading...');
const apiOrigin = Config.apiServer;
useEffect(() => {
async function fetchDataEffect() {
try {
setIsFetching(true);
const data = await fetchHealth();
setStatus(data.status);
setIsFetching(false);
} catch (error: unknown) {
logError('Error in effect:', error);
}
}
fetchDataEffect();
}, [locale]);
return (
<>
<div className="container mx-auto max-w-3xl pt-16 px-6 flex-grow">
<div className="w-full p-3 flex items-center justify-between">
<h3 className="font-bold">{messages.health_check}</h3>
</div>
<Table hideHeader aria-label="API server status">
<TableHeader>
<TableColumn>dummy</TableColumn>
<TableColumn>dummy</TableColumn>
</TableHeader>
<TableBody>
<TableRow key="1">
<TableCell>{messages.unittcms_version}</TableCell>
<TableCell>1.0.0-beta.23</TableCell>
</TableRow>
<TableRow key="2">
<TableCell>{messages.api_server}</TableCell>
<TableCell>{apiOrigin}</TableCell>
</TableRow>
<TableRow key="3">
<TableCell>{messages.status}</TableCell>
<TableCell>
{isFetching ? (
<Chip>Loading...</Chip>
) : (
<Chip color={status === 'ok' ? 'success' : 'danger'}>{status}</Chip>
)}
</TableCell>
</TableRow>
</TableBody>
</Table>
</div>
</>
);
}