import { Link, useParams, useSearchParams } from "react-router"; import { useEffect, useState } from "react"; import ApiKeyLogUtils from "../utils/ApiKeyLogUtils"; import { RowHeaderDisplayDto } from "~/application/dtos/data/RowHeaderDisplayDto"; import { ApiCallSummaryDto } from "../dtos/ApiCallSummaryDto"; import ApiKeyLogsConstants from "../utils/ApiKeyLogsConstants"; import { FilterablePropertyDto } from "~/application/dtos/data/FilterablePropertyDto"; import { FilterableValueLink } from "~/components/ui/links/FilterableValueLink"; import WarningBanner from "~/components/ui/banners/WarningBanner"; import InputCombobox from "~/components/ui/input/InputCombobox"; import InputFilters from "~/components/ui/input/InputFilters"; import TableSimple from "~/components/ui/tables/TableSimple"; import { useLocaleFormatters } from "~/locale/format"; import UrlUtils from "~/utils/app/UrlUtils"; import ApiUtils from "~/utils/app/ApiUtils"; import SimpleBadge from "~/components/ui/badges/SimpleBadge"; import { Colors } from "~/application/enums/shared/Colors"; import ApiCallSpeedBadge from "./ApiCallSpeedBadge"; import { useTranslation } from "react-i18next"; interface Props { data: { items: ApiCallSummaryDto[]; allTenants: { id: string; name: string }[]; filterableProperties: FilterablePropertyDto[]; }; } export default function ApiKeyLogsSummary({ data }: Props) { const { t } = useTranslation(); const formatters = useLocaleFormatters(); const params = useParams(); const [searchParams, setSearchParams] = useSearchParams(); const [groupBy, setGroupBy] = useState(ApiKeyLogUtils.getGroupByValues(searchParams)); const [headers, setHeaders] = useState[]>([]); useEffect(() => { if (ApiKeyLogUtils.getGroupByValues(searchParams).sort().join(",") !== groupBy.sort().join(",")) { searchParams.delete("groupBy"); groupBy.forEach((by) => { searchParams.append("groupBy", by); }); setSearchParams(searchParams); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [groupBy]); useEffect(() => { const headers: RowHeaderDisplayDto[] = []; let currentGroupBy = groupBy; if (currentGroupBy.length === 0) { currentGroupBy = ApiKeyLogsConstants.DEFAULT_GROUP_BY; } const getTenant = (item: ApiCallSummaryDto) => { return data.allTenants.find((x) => x.id === item.tenantId); }; const getCountLink = (item: ApiCallSummaryDto) => { const searchParams = new URLSearchParams(); // searchParams.set("pageSize", "100"); currentGroupBy.forEach((groupBy) => { if (groupBy === "method") { searchParams.append("method", item.method); } else if (groupBy === "endpoint") { searchParams.append("endpoint", item.endpoint); } else if (groupBy === "params") { searchParams.append("params", item.params); } else if (groupBy === "status") { searchParams.append("status", item.status?.toString() ?? "{null}"); } }); return UrlUtils.getModulePath(params, `api/logs?${searchParams.toString()}`); }; if (groupBy.includes("method")) { headers.push({ name: "method", title: t("models.apiKeyLog.method"), value: (item) => ( ), }); } if (groupBy.includes("endpoint")) { headers.push({ name: "endpoint", title: t("models.apiKeyLog.endpoint"), value: (item) => , }); } if (groupBy.includes("params")) { headers.push({ name: "params", title: t("models.apiKeyLog.params"), value: (item) => , }); } if (groupBy.includes("status")) { headers.push({ name: "status", title: t("models.apiKeyLog.status"), value: (item) => ( ), }); } if (groupBy.includes("tenantId")) { headers.push({ name: "tenantId", title: t("models.apiKeyLog.tenant"), value: (item) => , }); } headers.push({ name: "apiCalls", title: t("models.apiKeyLog.apiCalls"), align: "right", value: (item) => (
{t("models.apiKeyLog.calls", { count: Number(item._count._all), formattedCount: formatters.number(Number(item._count._all)) })}
), }); headers.push({ name: "duration", title: t("models.apiKeyLog.avgDuration"), value: (item) => item._avg.duration === null ? ( {t("shared.notAvailable")} ) : (
{formatters.number(Number(item._avg.duration), { style: "unit", unit: "millisecond", unitDisplay: "short", maximumFractionDigits: 3 })}
), }); headers.push({ name: "speed", title: t("models.apiKeyLog.speed"), value: (item) => item._avg.duration === null ? ( {t("shared.notAvailable")} ) : ( ), }); headers.push({ name: "actions", title: "", value: (item) => ( {t("shared.details")} → ), }); setHeaders(headers); }, [data, groupBy, params, t]); return (
{ setGroupBy(value as string[]); }} />
{/* */}
{groupBy.length === 0 ? ( ) : ( )}
); }