import { Spinner } from '@wordpress/components' import { __ } from '@wordpress/i18n' import classnames from 'classnames' import React, { useState } from 'react' import { useSnippetsAPI } from '../../../hooks/useSnippetsAPI' import { useSnippetsList } from '../../../hooks/useSnippetsList' import { downloadSnippetExportFile } from '../../../utils/files' import { isNetworkAdmin } from '../../../utils/screen' import { cloneSnippetObject, getSnippetDisplayName, getSnippetEditUrl, getSnippetType } from '../../../utils/snippets/snippets' import { Button } from '../../common/Button' import { DeleteButton } from '../../common/DeleteButton' import { SnippetPreviewModal } from '../../common/SnippetPreviewModal' import type { ReactNode } from 'react' import type { Snippet } from '../../../types/Snippet' interface RowActionsProps { snippet: Snippet } const PreviewLink: React.FC = ({ snippet }) => { const [isPreviewOpen, setIsPreviewOpen] = useState(false) return ( <> ) } interface SnippetActionButtonProps { action: () => Promise label: ReactNode workingLabel?: string failedLabel?: string className?: string } enum SnippetActionStatus { Ready, Working, Errored } const SnippetActionButton: React.FC = ({ action, label, workingLabel, failedLabel, className }) => { const [status, setStatus] = useState(SnippetActionStatus.Ready) const ButtonContent = () => { switch (status) { case SnippetActionStatus.Working: return ( {workingLabel ?? __('Loading…', 'code-snippets')} ) case SnippetActionStatus.Errored: return ( {failedLabel ?? __('Failed', 'code-snippets')} ) default: return label } } return ( ) } const DeleteActionLink: React.FC<{ snippet: Snippet; onSuccess: () => Promise }> = ({ snippet, onSuccess }) => { const [isDeleting, setIsDeleting] = useState(false) return ( <> {isDeleting ? {__('Deleting…', 'code-snippets')} : null} ) } const ActionLinks = ({ snippet }: { snippet: Snippet }) => { const api = useSnippetsAPI() const { refreshSnippetsList } = useSnippetsList() const Preview = !snippet.trashed ? : null const Edit = !snippet.trashed ? {snippet.locked ? __('View', 'code-snippets') : __('Edit', 'code-snippets')} : null const Clone = !snippet.trashed ? api.create(cloneSnippetObject(snippet)).then(refreshSnippetsList)} /> : null const Export = !snippet.trashed ? api.export(snippet) .then(response => downloadSnippetExportFile(response, snippet))} /> : null const Restore = snippet.trashed ? api.restore(snippet).then(refreshSnippetsList)} /> : null const Delete = !snippet.locked || snippet.trashed ? : null return ( <> {[Preview, Edit, Clone, Restore, Export, Delete] .filter(Action => Action) .reduce( (Actions, Action) => null === Actions ? <>{Action} : <>{Actions} | {Action}, null)} ) } export const RowActions: React.FC = ({ snippet }) => { if (!isNetworkAdmin() && snippet.network && !snippet.shared_network) { return (
{snippet.active ? {__('Network Active', 'code-snippets')} : {__('Network Only', 'code-snippets')}}
) } if (snippet.shared_network && !window.CODE_SNIPPETS_MANAGE?.hasNetworkCap) { return undefined } return (
) }