import { useSubmit, useSearchParams, useNavigation, useParams } from "react-router"; import { useState } from "react"; import { FilterablePropertyDto } from "~/application/dtos/data/FilterablePropertyDto"; import { PaginationDto } from "~/application/dtos/data/PaginationDto"; import SimpleBadge from "~/components/ui/badges/SimpleBadge"; import ButtonSecondary from "~/components/ui/buttons/ButtonSecondary"; import RefreshIcon from "~/components/ui/icons/RefreshIcon"; import InputFilters from "~/components/ui/input/InputFilters"; import InputSearchWithURL from "~/components/ui/input/InputSearchWithURL"; import ShowPayloadModalButton from "~/components/ui/json/ShowPayloadModalButton"; import { FilterableValueLink } from "~/components/ui/links/FilterableValueLink"; import TableSimple from "~/components/ui/tables/TableSimple"; import ApiUtils from "~/utils/app/ApiUtils"; import { useAppOrAdminData } from "~/utils/data/useAppOrAdminData"; import { getUserHasPermission } from "~/utils/helpers/PermissionsHelper"; import { useLocaleFormatters } from "~/locale/format"; import { ApiKeyLogDto } from "../dtos/ApiKeyLogDto"; import ApiCallSpeedBadge from "./ApiCallSpeedBadge"; import { useTranslation } from "react-i18next"; import ApiCallStatusBadge from "./ApiCallStatusBadge"; import { Button } from "~/components/ui/button"; interface Props { data: { items: ApiKeyLogDto[]; filterableProperties: FilterablePropertyDto[]; pagination: PaginationDto; }; } export default function ApiKeyLogsDetails({ data }: Props) { const { t } = useTranslation(); const formatters = useLocaleFormatters(); const appOrAdminData = useAppOrAdminData(); const submit = useSubmit(); const navigation = useNavigation(); const params = useParams(); const canDelete = !params.tenant; const [searchParams, setSearchParams] = useSearchParams(); const [selectedRows, setSelectedRows] = useState([]); function onDelete(ids: string[]) { if (!canDelete) { return; } const form = new FormData(); form.set("action", "delete"); form.set("ids", ids.join(",")); submit(form, { method: "post", }); } return (
{canDelete && selectedRows.length > 0 && ( )} {/* */}
onDelete([item.id]), hidden: () => !canDelete, disabled: () => !canDelete, destructive: true, }, ]} headers={[ { name: "createdAt", title: t("shared.createdAt"), value: (item) => formatters.dateTime(item.createdAt), formattedValue: (item) => (
{item.createdAt && {formatters.dateTime(item.createdAt)}}
), }, { name: "tenant", title: t("models.tenant.object"), value: (item) => { const tenantName = item.apiKey?.tenant?.name ?? item.tenant?.name; const tenantId = item.apiKey?.tenant?.id ?? item.tenant?.id; return ; }, hidden: !!params.tenant, }, { name: "apiKeyId", title: t("models.apiKey.alias"), value: (item) => , }, { name: "ip", title: t("models.apiKeyLog.ip"), value: (item) => item.ip, formattedValue: (item) => (
{item.ip.length > 0 ? : {t("shared.notSet")}}
), }, { name: "endpoint", title: t("models.apiKeyLog.endpoint"), value: (item) => , }, { name: "method", title: t("models.apiKeyLog.method"), value: (item) => item.method, formattedValue: (item) => (
), }, { name: "status", title: t("models.apiKeyLog.status"), value: (item) => item.status, formattedValue: (item) => (
{item.status ? ( ) : ( {t("shared.notSet")} )}
), }, { name: "duration", title: t("models.apiKeyLog.duration"), value: (item) => item.duration === null ? ( {t("shared.notSet")} ) : (
{formatters.number(Number(item.duration), { style: "unit", unit: "millisecond", unitDisplay: "short", maximumFractionDigits: 3 })}
), }, { name: "speed", title: t("models.apiKeyLog.speed"), value: (item) => item.duration === null ? {t("shared.notSet")} : , }, { name: "params", title: t("models.apiKeyLog.params"), value: (item) => item.params === "{}" ? ( {t("shared.notSet")} ) : ( ), }, { name: "error", title: t("models.apiKeyLog.error"), value: (item) =>
{item.error}
, }, ]} />
); }