import Alert from "@mui/material/Alert"; import Box from "@mui/material/Box"; import Button from "@mui/material/Button"; import Card from "@mui/material/Card"; import CardContent from "@mui/material/CardContent"; import Chip from "@mui/material/Chip"; import Skeleton from "@mui/material/Skeleton"; import Stack from "@mui/material/Stack"; import Table from "@mui/material/Table"; import TableBody from "@mui/material/TableBody"; import TableCell from "@mui/material/TableCell"; import TableContainer from "@mui/material/TableContainer"; import TableHead from "@mui/material/TableHead"; import TableRow from "@mui/material/TableRow"; import Typography from "@mui/material/Typography"; import useMediaQuery from "@mui/material/useMediaQuery"; import { useTheme } from "@mui/material/styles"; import { useExternalI18n } from "../i18n/ExternalI18nProvider.jsx"; import { translateExternalError } from "../i18n/errors.js"; export function ExternalPage({ actions, children, title }) { return ( {title} {actions ? {actions} : null} {children} ); } export function ExternalPageState({ error, loading, onRetry }) { const { t } = useExternalI18n(); if (loading) { return ( ); } if (error) { return ( {translateExternalError(error, t, "errors.loadFailed")} ); } return null; } export function ResponsiveDataList({ columns, emptyText, items, rowKey }) { const theme = useTheme(); const mobile = useMediaQuery(theme.breakpoints.down("sm")); const { t } = useExternalI18n(); if (!items.length) { return {emptyText || t("common.noData")}; } if (mobile) { return ( {items.map((item, index) => ( {columns.map((column) => ( {column.label} {column.render(item)} ))} ))} ); } return ( {columns.map((column) => {column.label})} {items.map((item, index) => ( {columns.map((column) => {column.render(item)})} ))}
); } export function StatusChip({ status }) { const { t } = useExternalI18n(); const normalized = String(status || "-").toLowerCase(); const enabled = ["active", "enabled", "running", "normal", "unbanned"].includes(normalized); const dangerous = ["banned", "disabled", "failed", "blocked"].includes(normalized); const statusKey = `status.${normalized}`; const translated = t(statusKey); return ; } export function PagePagination({ page, pageSize, total, onChange }) { const { t } = useExternalI18n(); const totalPages = Math.max(1, Math.ceil(total / pageSize)); return ( {t("pagination.total", { count: total })} {page} / {totalPages} ); }