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}
);
}