import { __, sprintf } from '@wordpress/i18n' import React, { useState } from 'react' import { getSnippetType } from '../../../utils/snippets/snippets' import { stripTags, truncateChars } from '../../../utils/text' import { Badge } from '../../common/Badge' import { Button } from '../../common/Button' import { CloudSnippetDownloadButton } from '../../common/cloud/CloudSnippetDownloadButton' import { CloudSnippetPreviewModal } from '../../common/cloud/CloudSnippetPreviewModal' import { CloudStatusBadge } from '../../common/cloud/CloudStatusBadge' import { useCloudSearch } from './WithCloudSearchContext' import type { CloudSnippetSchema } from '../../../types/schema/CloudSnippetSchema' import type { Dispatch, SetStateAction } from 'react' type CloudSnippetId = CloudSnippetSchema['id'] type SetSelected = Dispatch>> const updateSelection = (setSelected: SetSelected, ids: CloudSnippetId[], isSelected: boolean) => { setSelected(previous => { const updated = new Set(previous) ids.forEach(id => isSelected ? updated.add(id) : updated.delete(id)) return updated }) } interface CloudSnippetRowProps { snippet: CloudSnippetSchema selected: Set setSelected: SetSelected } interface CloudSnippetActionsProps extends Pick { isPreviewOpen: boolean setIsPreviewOpen: (isOpen: boolean) => void } const CloudSnippetActions: React.FC = ({ snippet, isPreviewOpen, setIsPreviewOpen }) => { const { doSearch } = useCloudSearch() return ( <>
) } const CloudSnippetRow: React.FC = ({ snippet, selected, setSelected }) => { const [isPreviewOpen, setIsPreviewOpen] = useState(false) return ( updateSelection(setSelected, [snippet.id], event.target.checked)} />
{truncateChars(stripTags(snippet.description))}
) } export interface CloudSnippetsTableProps { snippets: CloudSnippetSchema[] selected: Set setSelected: SetSelected } /** * Table view for lists of cloud snippets (community search results and * bundle contents), mirroring the card actions. Descriptions are clamped * so all rows stay the same height. */ export const CloudSnippetsTable: React.FC = ({ snippets, selected, setSelected }) => {snippets.map(snippet => )}
selected.has(snippet.id))} aria-label={__('Select all snippets', 'code-snippets')} onChange={event => updateSelection(setSelected, snippets.map(snippet => snippet.id), event.target.checked)} /> {__('Name', 'code-snippets')} {__('Type', 'code-snippets')} {__('Status', 'code-snippets')} {__('Description', 'code-snippets')} {__('Actions', 'code-snippets')}