plane/web/components/api-token/token-list-item.tsx
2024-02-08 20:05:52 +05:30

61 lines
2.2 KiB
TypeScript

import { useState } from "react";
import { XCircle } from "lucide-react";
// components
import { DeleteApiTokenModal } from "components/api-token";
// ui
import { Tooltip } from "@plane/ui";
// helpers
import { renderFormattedDate, calculateTimeAgo } from "helpers/date-time.helper";
// types
import { IApiToken } from "@plane/types";
type Props = {
token: IApiToken;
};
export const ApiTokenListItem: React.FC<Props> = (props) => {
const { token } = props;
// states
const [deleteModalOpen, setDeleteModalOpen] = useState(false);
return (
<>
<DeleteApiTokenModal isOpen={deleteModalOpen} onClose={() => setDeleteModalOpen(false)} tokenId={token.id} />
<div className="group relative flex flex-col justify-center border-b border-neutral-border-medium px-4 py-3">
<Tooltip tooltipContent="Delete token">
<button
onClick={() => setDeleteModalOpen(true)}
className="absolute right-4 hidden place-items-center group-hover:grid"
>
<XCircle className="h-4 w-4 text-danger-text-medium" />
</button>
</Tooltip>
<div className="flex w-4/5 items-center">
<h5 className="truncate text-sm font-medium">{token.label}</h5>
<span
className={`${
token.is_active
? "bg-success-component-surface-dark text-success-text-medium"
: "bg-neutral-component-surface-dark text-neutral-text-subtle"
} ml-2 flex h-4 max-h-fit items-center rounded-sm px-2 text-xs font-medium`}
>
{token.is_active ? "Active" : "Expired"}
</span>
</div>
<div className="mt-1 flex w-full flex-col justify-center">
{token.description.trim() !== "" && (
<p className="mb-1 max-w-[70%] break-words text-sm">{token.description}</p>
)}
<p className="mb-1 text-xs leading-6 text-neutral-text-subtle">
{token.is_active
? token.expired_at
? `Expires ${renderFormattedDate(token.expired_at!)}`
: "Never expires"
: `Expired ${calculateTimeAgo(token.expired_at)}`}
</p>
</div>
</div>
</>
);
};