Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"use client";

import { CopyButton } from "@/components/dashboard/copy-button";
import { CreateKeyButton } from "@/components/dashboard/create-key-button";
import { Navbar } from "@/components/navigation/navbar";
import { Badge } from "@/components/ui/badge";
import type { Api } from "@unkey/db";
import { Nodes } from "@unkey/icons";

type Key = {
id: string;
keyAuth: {
id: string;
};
};

interface NavigationProps {
api: Api;
apiKey: Key;
}

export function Navigation({ api, apiKey }: NavigationProps) {
return (
<Navbar>
<Navbar.Breadcrumbs icon={<Nodes />}>
<Navbar.Breadcrumbs.Link href="/apis">APIs</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Link href={`/apis/${api.id}`} isIdentifier>
{api.name}
</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Ellipsis />
<Navbar.Breadcrumbs.Link
href={`/apis/${api.id}/keys/${apiKey.keyAuth.id}/${apiKey.id}`}
isIdentifier
active
>
{apiKey.id}
</Navbar.Breadcrumbs.Link>
</Navbar.Breadcrumbs>
<Navbar.Actions>
<Badge
variant="secondary"
className="flex justify-between w-full gap-2 font-mono font-medium ph-no-capture"
>
{apiKey.id}
<CopyButton value={apiKey.id} />
</Badge>

<CreateKeyButton apiId={api.id} keyAuthId={apiKey.keyAuth.id} />
</Navbar.Actions>
</Navbar>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@ import { CreateNewPermission } from "@/app/(app)/authorization/permissions/creat
import type { NestedPermissions } from "@/app/(app)/authorization/roles/[roleId]/tree";
import { CreateNewRole } from "@/app/(app)/authorization/roles/create-new-role";
import { StackedColumnChart } from "@/components/dashboard/charts";
import { CopyButton } from "@/components/dashboard/copy-button";
import { CreateKeyButton } from "@/components/dashboard/create-key-button";
import { Navbar } from "@/components/navbar";
import { PageContent } from "@/components/page-content";
import { Badge } from "@/components/ui/badge";
import { Card, CardContent, CardHeader } from "@/components/ui/card";
Expand All @@ -18,12 +15,12 @@ import { getTenantId } from "@/lib/auth";
import { clickhouse } from "@/lib/clickhouse";
import { and, db, eq, isNull, schema } from "@/lib/db";
import { formatNumber } from "@/lib/fmt";
import { Nodes } from "@unkey/icons";
import { Empty } from "@unkey/ui";
import { Button } from "@unkey/ui";
import { Minus } from "lucide-react";
import ms from "ms";
import { notFound } from "next/navigation";
import { Navigation } from "./navigation";
import PermissionTree from "./permission-list";
import { VerificationTable } from "./verification-table";
export default async function APIKeyDetailPage(props: {
Expand Down Expand Up @@ -264,33 +261,7 @@ export default async function APIKeyDetailPage(props: {

return (
<div>
<Navbar>
<Navbar.Breadcrumbs icon={<Nodes />}>
<Navbar.Breadcrumbs.Link href="/apis">APIs</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Link href={`/apis/${props.params.apiId}`} isIdentifier>
{api.name}
</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Ellipsis />
<Navbar.Breadcrumbs.Link
href={`/apis/${props.params.apiId}/keys/${key.keyAuth.id}/${key.id}`}
isIdentifier
active
>
{key.id}
</Navbar.Breadcrumbs.Link>
</Navbar.Breadcrumbs>
<Navbar.Actions>
<Badge
variant="secondary"
className="flex justify-between w-full gap-2 font-mono font-medium ph-no-capture"
>
{key.id}
<CopyButton value={key.id} />
</Badge>

<CreateKeyButton apiId={api.id} keyAuthId={key.keyAuthId} />
</Navbar.Actions>
</Navbar>
<Navigation api={api} apiKey={key} />

<PageContent>
<div className="flex flex-col">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
"use client";

import { CopyButton } from "@/components/dashboard/copy-button";
import { CreateKeyButton } from "@/components/dashboard/create-key-button";
import { Navbar } from "@/components/navigation/navbar";
import { Badge } from "@/components/ui/badge";
import { Nodes } from "@unkey/icons";

type Key = {
id: string;
keyAuth: {
id: string;
api: {
id: string;
name: string;
};
};
};

interface NavigationProps {
apiId: string;
apiKey: Key;
}

export function Navigation({ apiId, apiKey }: NavigationProps) {
return (
<Navbar>
<Navbar.Breadcrumbs icon={<Nodes />}>
<Navbar.Breadcrumbs.Link href="/apis">APIs</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Link href={`/apis/${apiId}`} isIdentifier>
{apiKey.keyAuth.api.name}
</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Ellipsis />
<Navbar.Breadcrumbs.Link
href={`/apis/${apiId}/keys/${apiKey.keyAuth.id}/${apiKey.id}`}
isIdentifier
>
{apiKey.id}
</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Link
href={`/apis/${apiId}/keys/${apiKey.keyAuth.id}/${apiKey.id}/settings`}
active
>
Settings
</Navbar.Breadcrumbs.Link>
</Navbar.Breadcrumbs>
<Navbar.Actions>
<Badge
variant="secondary"
className="flex justify-between w-full gap-2 font-mono font-medium ph-no-capture"
>
{apiKey.id}
<CopyButton value={apiKey.id} />
</Badge>
<CreateKeyButton apiId={apiKey.keyAuth.api.id} keyAuthId={apiKey.keyAuth.id} />
</Navbar.Actions>
</Navbar>
);
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
import { CopyButton } from "@/components/dashboard/copy-button";
import { CreateKeyButton } from "@/components/dashboard/create-key-button";
import { Navbar } from "@/components/navbar";
import { PageContent } from "@/components/page-content";
import { Badge } from "@/components/ui/badge";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { Code } from "@/components/ui/code";
import { getTenantId } from "@/lib/auth";
import { and, db, eq, isNull, schema } from "@/lib/db";
import { Nodes } from "@unkey/icons";
import { ArrowLeft } from "lucide-react";
import Link from "next/link";
import { notFound } from "next/navigation";
import { DeleteKey } from "./delete-key";
import { Navigation } from "./navigation";
import { UpdateKeyEnabled } from "./update-key-enabled";
import { UpdateKeyExpiration } from "./update-key-expiration";
import { UpdateKeyMetadata } from "./update-key-metadata";
Expand Down Expand Up @@ -44,37 +41,7 @@ export default async function SettingsPage(props: Props) {

return (
<div>
<Navbar>
<Navbar.Breadcrumbs icon={<Nodes />}>
<Navbar.Breadcrumbs.Link href="/apis">APIs</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Link href={`/apis/${props.params.apiId}`} isIdentifier>
{key.keyAuth.api.name}
</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Ellipsis />
<Navbar.Breadcrumbs.Link
href={`/apis/${props.params.apiId}/keys/${key.keyAuth.id}/${key.id}`}
isIdentifier
>
{key.id}
</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Link
href={`/apis/${props.params.apiId}/keys/${key.keyAuth.id}/${key.id}/settings`}
active
>
Settings
</Navbar.Breadcrumbs.Link>
</Navbar.Breadcrumbs>
<Navbar.Actions>
<Badge
variant="secondary"
className="flex justify-between w-full gap-2 font-mono font-medium ph-no-capture"
>
{key.id}
<CopyButton value={key.id} />
</Badge>
<CreateKeyButton apiId={key.keyAuth.api.id} keyAuthId={key.keyAuth.id} />
</Navbar.Actions>
</Navbar>
<Navigation apiId={props.params.apiId} apiKey={key} />

<PageContent>
<div className="mb-20 flex flex-col gap-8 ">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
"use client";

import { CopyButton } from "@/components/dashboard/copy-button";
import { CreateKeyButton } from "@/components/dashboard/create-key-button";
import { Navbar } from "@/components/navigation/navbar";
import { Badge } from "@/components/ui/badge";
import { Nodes } from "@unkey/icons";

type KeyAuthProps = {
id: string;
api: {
id: string;
name: string;
keyAuthId: string | null;
};
workspace: {
tenantId: string;
};
};

interface NavigationProps {
apiId: string;
keyA: KeyAuthProps;
}

export function Navigation({ apiId, keyA }: NavigationProps) {
return (
<Navbar>
<Navbar.Breadcrumbs icon={<Nodes />}>
<Navbar.Breadcrumbs.Link href="/apis">APIs</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Link href={`/apis/${apiId}`} isIdentifier>
{keyA.api.name}
</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Link active href={`/apis/${apiId}/keys/${keyA.id}`}>
Keys
</Navbar.Breadcrumbs.Link>
</Navbar.Breadcrumbs>
<Navbar.Actions>
<Badge
key="apiId"
variant="secondary"
className="flex justify-between w-full gap-2 font-mono font-medium ph-no-capture"
>
{keyA.api.id}
<CopyButton value={keyA.api.id} />
</Badge>
<CreateKeyButton apiId={keyA.api.id} keyAuthId={keyA.api.keyAuthId!} />
</Navbar.Actions>
</Navbar>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"use client";

import { CopyButton } from "@/components/dashboard/copy-button";
import { Navbar } from "@/components/navigation/navbar";
import { Badge } from "@/components/ui/badge";
import { Nodes } from "@unkey/icons";

type KeyAuthProps = {
id: string;
api: {
id: string;
name: string;
keyAuthId: string | null;
};
workspace: {
tenantId: string;
};
};

interface NavigationProps {
apiId: string;
keyA: KeyAuthProps;
}

export function Navigation({ apiId, keyA }: NavigationProps) {
return (
<Navbar>
<Navbar.Breadcrumbs icon={<Nodes />}>
<Navbar.Breadcrumbs.Link href="/apis">APIs</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Link href={`/apis/${apiId}`} isIdentifier>
{keyA.api.name}
</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Link href={`/apis/${apiId}/keys/${keyA.id}`}>
Keys
</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Link active href={`/apis/${apiId}/keys/${keyA.id}/new`}>
Create new key
</Navbar.Breadcrumbs.Link>
</Navbar.Breadcrumbs>
<Navbar.Actions>
<Badge
key="apiId"
variant="secondary"
className="flex justify-between w-full gap-2 font-mono font-medium ph-no-capture"
>
{keyA.api.id}
<CopyButton value={keyA.api.id} />
</Badge>
</Navbar.Actions>
</Navbar>
);
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
import { CopyButton } from "@/components/dashboard/copy-button";
import { Navbar } from "@/components/navbar";
import { PageContent } from "@/components/page-content";
import { Badge } from "@/components/ui/badge";
import { getTenantId } from "@/lib/auth";
import { db } from "@/lib/db";
import { Nodes } from "@unkey/icons";
import { notFound } from "next/navigation";
import { CreateKey } from "./client";
import { Navigation } from "./navigation";

export default async function CreateKeypage(props: {
params: {
Expand All @@ -30,33 +27,7 @@ export default async function CreateKeypage(props: {

return (
<div>
<Navbar>
<Navbar.Breadcrumbs icon={<Nodes />}>
<Navbar.Breadcrumbs.Link href="/apis">APIs</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Link href={`/apis/${props.params.apiId}`} isIdentifier>
{keyAuth.api.name}
</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Link href={`/apis/${props.params.apiId}/keys/${keyAuth.id}`}>
Keys
</Navbar.Breadcrumbs.Link>
<Navbar.Breadcrumbs.Link
active
href={`/apis/${props.params.apiId}/keys/${keyAuth.id}/new`}
>
Create new key
</Navbar.Breadcrumbs.Link>
</Navbar.Breadcrumbs>
<Navbar.Actions>
<Badge
key="apiId"
variant="secondary"
className="flex justify-between w-full gap-2 font-mono font-medium ph-no-capture"
>
{keyAuth.api.id}
<CopyButton value={keyAuth.api.id} />
</Badge>
</Navbar.Actions>
</Navbar>
<Navigation apiId={props.params.apiId} keyA={keyAuth} />

<PageContent>
<CreateKey
Expand Down
Loading
Loading