import { useCallback } from "react"; import { faBan, faCheck, faCopy, faEdit, faEllipsisV, faExpand, faInfoCircle, faPlugCircleXmark, faSearch, faToggleOff, faToggleOn, faTrash, faWarning } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useNavigate } from "@tanstack/react-router"; import { formatDistance } from "date-fns"; import { twMerge } from "tailwind-merge"; import { createNotification } from "@app/components/notifications"; import { ProjectPermissionCan } from "@app/components/permissions"; import { SecretScanningScanStatusBadge } from "@app/components/secret-scanning"; import { Badge, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, IconButton, Td, Tooltip, Tr } from "@app/components/v2"; import { ROUTE_PATHS } from "@app/const/routes"; import { ProjectPermissionSub } from "@app/context"; import { ProjectPermissionSecretScanningDataSourceActions } from "@app/context/ProjectPermissionContext/types"; import { RESOURCE_DESCRIPTION_HELPER, SECRET_SCANNING_DATA_SOURCE_MAP } from "@app/helpers/secretScanningV2"; import { useToggle } from "@app/hooks"; import { SecretScanningFindingStatus, SecretScanningScanStatus, TSecretScanningDataSourceWithDetails } from "@app/hooks/api/secretScanningV2"; type Props = { dataSource: TSecretScanningDataSourceWithDetails; onDelete: (dataSource: TSecretScanningDataSourceWithDetails) => void; onTriggerScan: (dataSource: TSecretScanningDataSourceWithDetails) => void; onToggleEnableAutoScan: (dataSource: TSecretScanningDataSourceWithDetails) => void; onEdit: (dataSource: TSecretScanningDataSourceWithDetails) => void; }; export const SecretScanningDataSourceRow = ({ dataSource, onDelete, onEdit, onTriggerScan, onToggleEnableAutoScan }: Props) => { const navigate = useNavigate(); const { id, name, description, isAutoScanEnabled, projectId, type, unresolvedFindings, lastScannedAt, lastScanStatus, lastScanStatusMessage, isDisconnected } = dataSource; const sourceDetails = SECRET_SCANNING_DATA_SOURCE_MAP[type]; const [isIdCopied, setIsIdCopied] = useToggle(false); const handleCopyId = useCallback(() => { setIsIdCopied.on(); navigator.clipboard.writeText(id); createNotification({ text: "Data Source ID copied to clipboard", type: "info" }); const timer = setTimeout(() => setIsIdCopied.off(), 2000); // eslint-disable-next-line consistent-return return () => clearTimeout(timer); }, [isIdCopied]); const autoScanDescription = RESOURCE_DESCRIPTION_HELPER[type]; return (
{sourceDetails.name}
{name}
{description && (