import classnames from 'classnames' import { humanTimeDiff } from '@wordpress/date' import { RawHTML } from '@wordpress/element' import { __, sprintf } from '@wordpress/i18n' import React, { useState } from 'react' import { ConfirmDeleteDialog, useDeleteSnippet } from '../../common/snippets/ConfirmDeleteDialog' import { useSnippetsAPI } from '../../../hooks/useSnippetsAPI' import { useSnippetsList } from '../../../hooks/useSnippetsList' import { handleUnknownError } from '../../../utils/errors' import { downloadSnippetExportFile } from '../../../utils/files' import { canModifySnippet, cloneSnippetObject, getSnippetDisplayName, getSnippetEditUrl, getSnippetType, isNetworkOnlySnippet, isSnippetActive } from '../../../utils/snippets/snippets' import { Button } from '../../common/Button' import { KebabMenu, KebabMenuDivider, KebabMenuItem, KebabMenuRow } from '../../common/KebabMenu' import { SnippetCard } from '../../common/snippets/SnippetCard' import { SnippetPreviewModal } from '../../common/snippets/SnippetPreviewModal' import { SnippetPriorityInput } from '../../common/snippets/SnippetPriorityInput' import { useFilteredSnippets } from './WithFilteredSnippetsContext' import { ActivateColumn, SnippetExtraIcons, SnippetName, TagsColumn, TypeColumn } from './TableColumns' import type { Snippet } from '../../../types/Snippet' interface SnippetCardActionsProps { snippet: Snippet } const CardPreviewButton: React.FC = ({ snippet }) => { const [isPreviewOpen, setIsPreviewOpen] = useState(false) return ( <> {isPreviewOpen && } ) } const CloneExportMenuItems: React.FC = ({ snippet }) => { const api = useSnippetsAPI() const { refreshSnippetsList } = useSnippetsList() return ( <> { api.create(cloneSnippetObject(snippet)) .then(refreshSnippetsList) .catch(handleUnknownError) }} > {__('Clone', 'code-snippets')} { api.export(snippet) .then(response => downloadSnippetExportFile(response, snippet)) .catch(handleUnknownError) }} > {__('Export', 'code-snippets')} ) } interface RestoreDeleteMenuItemsProps extends SnippetCardActionsProps { requestDelete: VoidFunction } const RestoreDeleteMenuItems: React.FC = ({ snippet, requestDelete }) => { const api = useSnippetsAPI() const { refreshSnippetsList } = useSnippetsList() return ( <> {snippet.trashed ? { api.restore(snippet) .then(refreshSnippetsList) .catch(handleUnknownError) }} > {__('Restore', 'code-snippets')} : null} {snippet.trashed ? __('Delete Permanently', 'code-snippets') : __('Trash', 'code-snippets')} ) } const CardActionsMenu: React.FC = ({ snippet }) => { const { refreshSnippetsList } = useSnippetsList() const canModify = canModifySnippet(snippet) const { requestDelete, deleteDialogProps } = useDeleteSnippet({ snippet, onSuccess: refreshSnippetsList, onError: handleUnknownError }) return ( <> {canModify && !snippet.trashed ? : null} {canModify && (snippet.trashed || !snippet.locked) && ( void requestDelete()} />)} ) } const CardFooterActions: React.FC = ({ snippet }) => <> {isNetworkOnlySnippet(snippet) ? snippet.active ? {__('Network Active', 'code-snippets')} : {__('Network Only', 'code-snippets')} : null} {!snippet.trashed ? : null} {!snippet.trashed && canModifySnippet(snippet) ? {snippet.locked ? __('View', 'code-snippets') : __('Edit', 'code-snippets')} : null} const CardModifiedDate: React.FC = ({ snippet }) => snippet.modified ? : null export interface ManageSnippetCardProps { snippet: Snippet isSelected: boolean onSelectedChange: (isSelected: boolean) => void } export const ManageSnippetCard: React.FC = ({ snippet, isSelected, onSelectedChange }) => { const { activeByCondition } = useFilteredSnippets() return ( } >

{(0 < snippet.tags.length || !!snippet.modified) && (
{0 < snippet.tags.length && ( {__('Tags:', 'code-snippets')} )}
)} {snippet.desc && (
{snippet.desc}
)}
) }