import { useState, useEffect } from '@wordpress/element'; import { MediaUpload } from '@wordpress/media-utils'; import {MediaUploadCheck} from '@wordpress/block-editor'; import { Button } from '@wordpress/components'; import apiFetch from '@wordpress/api-fetch'; const SUBTYPE_MAP = { image: 'image', video: 'video', document: 'application', all: '' }; const Thumbnail = ({ id, onRemove }) => { const [media, setMedia] = useState(null); useEffect(() => { let cancelled = false; if (!id) return; apiFetch({ path: `/wp/v2/media/${id}` }) .then((data) => !cancelled && setMedia(data)) .catch(() => {}); return () => { cancelled = true; }; }, [id]); const thumb = media?.media_details?.sizes?.thumbnail?.source_url || media?.source_url; const isImage = media?.media_type === 'image'; return (
{isImage && thumb ? ( {media?.alt_text ) : (
{media?.title?.rendered || `#${id}`}
)}
); }; const UploadField = ({ field, value, onChange }) => { const multiple = field.multiple || field.type === 'gallery'; const ids = multiple ? (Array.isArray(value) ? value : []) : value; const allowedTypes = SUBTYPE_MAP[field.subtype] ? [SUBTYPE_MAP[field.subtype]] : ''; const onSelect = (media) => onChange(multiple ? media.map((m) => m.id) : media.id); const onRemove = (id) => { onChange(multiple ? ids.filter((existing) => existing !== id) : 0); }; return (

{field.label}

{multiple ? ids.map((id) => ) : !!ids && }
( )} />
); }; export default UploadField;