import { useCallback } from "react"; import { faCheck, faCopy, faEllipsisV } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { format } from "date-fns"; import { twMerge } from "tailwind-merge"; import { createNotification } from "@app/components/notifications"; import { ProjectPermissionCan } from "@app/components/permissions"; import { Badge, Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, GenericFieldLabel, IconButton, Td, Tooltip, Tr } from "@app/components/v2"; import { ProjectPermissionSecretScanningFindingActions, ProjectPermissionSub } from "@app/context/ProjectPermissionContext/types"; import { SECRET_SCANNING_DATA_SOURCE_MAP, SECRET_SCANNING_FINDING_STATUS_ICON_MAP } from "@app/helpers/secretScanningV2"; import { useToggle } from "@app/hooks"; import { SecretScanningFindingStatus, TSecretScanningFinding } from "@app/hooks/api/secretScanningV2"; type Props = { finding: TSecretScanningFinding; onUpdate: (finding: TSecretScanningFinding) => void; }; export const SecretScanningFindingRow = ({ finding, onUpdate }: Props) => { const { resourceName, id, dataSourceType, createdAt, dataSourceName, rule, status, details, remarks } = finding; const [isIdCopied, setIsIdCopied] = useToggle(false); const handleCopyId = useCallback( (idToCopy: string) => { setIsIdCopied.on(); navigator.clipboard.writeText(idToCopy); createNotification({ text: "Resource ID copied to clipboard", type: "info" }); const timer = setTimeout(() => setIsIdCopied.off(), 2000); // eslint-disable-next-line consistent-return return () => clearTimeout(timer); }, [isIdCopied] ); const sourceDetails = SECRET_SCANNING_DATA_SOURCE_MAP[dataSourceType]; const [isExpanded, setIsExpanded] = useToggle(false); return ( <>
{sourceDetails.name}
{format(createdAt, "MMM dd yyyy")}
{format(createdAt, "h:mm aa")}
{resourceName}
{dataSourceName}