58 lines
1.9 KiB
TypeScript
58 lines
1.9 KiB
TypeScript
import { LoaderFunctionArgs, useLoaderData } from "react-router";
|
|
import { Outlet } from "react-router";
|
|
import { useTranslation } from "react-i18next";
|
|
import ApiKeysTable from "~/components/core/apiKeys/ApiKeysTable";
|
|
import EditPageLayout from "~/components/ui/layouts/EditPageLayout";
|
|
import { useAdminData } from "~/utils/data/useAdminData";
|
|
import { RedactedApiKeyWithDetails, getAllApiKeys } from "~/utils/db/apiKeys.db.server";
|
|
import { verifyUserHasPermission } from "~/utils/helpers/.server/PermissionsService";
|
|
import { getUserHasPermission } from "~/utils/helpers/PermissionsHelper";
|
|
import { adminPath } from "~/utils/app/CanonicalUrlUtils";
|
|
|
|
type LoaderData = {
|
|
apiKeys: RedactedApiKeyWithDetails[];
|
|
};
|
|
export const loader = async ({ request }: LoaderFunctionArgs) => {
|
|
await verifyUserHasPermission(request, "admin.apiKeys.view");
|
|
const apiKeys = await getAllApiKeys();
|
|
const data: LoaderData = {
|
|
apiKeys,
|
|
};
|
|
return data;
|
|
};
|
|
|
|
export default function AdminApiKeysRoute() {
|
|
const { t } = useTranslation();
|
|
const data = useLoaderData<LoaderData>();
|
|
const adminData = useAdminData();
|
|
return (
|
|
<>
|
|
<EditPageLayout
|
|
title={t("models.apiKey.plural")}
|
|
tabs={[
|
|
{
|
|
name: t("shared.overview"),
|
|
routePath: adminPath("api", { mode: "host-aware" }),
|
|
},
|
|
{
|
|
name: t("models.apiCall.plural"),
|
|
routePath: adminPath("api/logs", { mode: "host-aware" }),
|
|
},
|
|
{
|
|
name: t("models.apiKey.plural"),
|
|
routePath: adminPath("api/keys", { mode: "host-aware" }),
|
|
},
|
|
]}
|
|
>
|
|
<ApiKeysTable
|
|
canCreate={getUserHasPermission(adminData, "admin.apiKeys.create")}
|
|
entities={adminData.entities}
|
|
items={data.apiKeys}
|
|
withTenant={true}
|
|
/>
|
|
<Outlet />
|
|
</EditPageLayout>
|
|
</>
|
|
);
|
|
}
|