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, getSnippetEditUrl } from '../../../utils/snippets/snippets' import { Button } from '../../common/Button' import { SnippetPreviewModal } from '../../common/snippets/SnippetPreviewModal' import { ConfirmDeleteDialog, useDeleteSnippet } from '../../common/snippets/ConfirmDeleteDialog' import type { ReactNode } from 'react' import type { Snippet } from '../../../types/Snippet' interface RowActionsProps { snippet: Snippet } const PreviewButton: React.FC = ({ snippet }) => { const [isPreviewOpen, setIsPreviewOpen] = useState(false) return ( <> {isPreviewOpen && } ) } 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) return ( ) } const DeleteActionLink: React.FC = ({ snippet }) => { const { refreshSnippetsList } = useSnippetsList() const { requestDelete, deleteDialogProps } = useDeleteSnippet({ snippet, onSuccess: refreshSnippetsList }) return ( <> ) } const ActionLinks: React.FC = ({ snippet }) => { const api = useSnippetsAPI() const { refreshSnippetsList } = useSnippetsList() const previewButton = !snippet.trashed ? : null const editLink = !snippet.trashed ? {snippet.locked ? __('View', 'code-snippets') : __('Edit', 'code-snippets')} : null const cloneButton = !snippet.trashed ? api.create(cloneSnippetObject(snippet)).then(refreshSnippetsList)} /> : null const exportButton = !snippet.trashed ? api.export(snippet) .then(response => downloadSnippetExportFile(response, snippet))} /> : null const restoreButton = snippet.trashed ? api.restore(snippet).then(refreshSnippetsList)} /> : null const deleteButton = !snippet.locked || snippet.trashed ? : null return ( <> {[previewButton, editLink, cloneButton, restoreButton, exportButton, deleteButton] .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 null } return (
) }