UNPKG

@wordpress/block-editor

Version:
200 lines (193 loc) 8.15 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _reactNative = require("react-native"); var _i18n = require("@wordpress/i18n"); var _compose = require("@wordpress/compose"); var _element = require("@wordpress/element"); var _icons = require("@wordpress/icons"); var _styles = _interopRequireDefault(require("./styles.scss")); var _context = require("../block-edit/context"); var _mediaUpload = _interopRequireDefault(require("../media-upload")); var _constants = require("../media-upload/constants"); var _jsxRuntime = require("react/jsx-runtime"); /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const isMediaEqual = (media1, media2) => media1.id === media2.id || media1.url === media2.url; // Remove duplicates after gallery append. const dedupMedia = media => media.reduce((dedupedMedia, mediaItem) => dedupedMedia.some(item => isMediaEqual(item, mediaItem)) ? dedupedMedia : [...dedupedMedia, mediaItem], []); const hitSlop = { top: 22, bottom: 22, left: 22, right: 22 }; function MediaPlaceholder(props) { const { addToGallery, allowedTypes = [], className = '', labels = {}, icon, onSelect, onFocus, __experimentalOnlyMediaLibrary, isAppender, disableMediaButtons, multiple, value = [], children, height, backgroundColor, hideContent, autoOpenMediaUpload, onSelectURL } = props; // Use ref to keep media array current for callbacks during rerenders. const mediaRef = (0, _element.useRef)(value); mediaRef.current = value; const blockEditContext = (0, _context.useBlockEditContext)(); const onButtonPress = (0, _element.useCallback)(open => event => { onFocus?.(event); open(); }, [onFocus]); // Append and deduplicate media array for gallery use case. const setMedia = multiple && addToGallery ? selected => onSelect(dedupMedia([...mediaRef.current, ...selected])) : onSelect; const isOneType = allowedTypes.length === 1; const isImage = isOneType && allowedTypes.includes(_constants.MEDIA_TYPE_IMAGE); const isVideo = isOneType && allowedTypes.includes(_constants.MEDIA_TYPE_VIDEO); const isAudio = isOneType && allowedTypes.includes(_constants.MEDIA_TYPE_AUDIO); let placeholderTitle = labels.title; if (placeholderTitle === undefined) { placeholderTitle = (0, _i18n.__)('Media'); if (isImage) { placeholderTitle = (0, _i18n.__)('Image'); } else if (isVideo) { placeholderTitle = (0, _i18n.__)('Video'); } else if (isAudio) { placeholderTitle = (0, _i18n.__)('Audio'); } } let instructions = labels.instructions; if (instructions === undefined) { if (isImage) { instructions = (0, _i18n.__)('Add image'); } else if (isVideo) { instructions = (0, _i18n.__)('Add video'); } else if (isAudio) { instructions = (0, _i18n.__)('Add audio'); } else { instructions = (0, _i18n.__)('Add image or video'); } } let accessibilityHint = (0, _i18n.__)('Double tap to select'); if (isImage) { accessibilityHint = (0, _i18n.__)('Double tap to select an image'); } else if (isVideo) { accessibilityHint = (0, _i18n.__)('Double tap to select a video'); } else if (isAudio) { accessibilityHint = (0, _i18n.__)('Double tap to select an audio file'); } const titleStyles = (0, _compose.usePreferredColorSchemeStyle)(_styles.default['media-placeholder__header-title'], _styles.default['media-placeholder__header-title--dark']); const addMediaButtonStyle = (0, _compose.usePreferredColorSchemeStyle)(_styles.default.addMediaButton, _styles.default.addMediaButtonDark); const buttonStyles = (0, _compose.usePreferredColorSchemeStyle)(_styles.default['media-placeholder__button'], _styles.default['media-placeholder__button--dark']); const emptyStateDescriptionStyles = (0, _compose.usePreferredColorSchemeStyle)(_styles.default.emptyStateDescription, _styles.default.emptyStateDescriptionDark); const iconStyles = (0, _compose.usePreferredColorSchemeStyle)(_styles.default['media-placeholder__header-icon'], _styles.default['media-placeholder__header-icon--dark']); const placeholderIcon = (0, _element.cloneElement)(icon, { fill: iconStyles.fill }); const accessibilityLabel = (0, _i18n.sprintf)(/* translators: accessibility text for the media block empty state. %s: media type */ (0, _i18n.__)('%s block. Empty'), placeholderTitle); const renderContent = open => { if (isAppender === undefined || !isAppender) { return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, { children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, { style: _styles.default['media-placeholder__header'], children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, { style: iconStyles, children: placeholderIcon }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, { style: titleStyles, children: placeholderTitle })] }), children, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, { activeOpacity: 0.5, accessibilityLabel: accessibilityLabel, style: buttonStyles, accessibilityRole: "button", accessibilityHint: accessibilityHint, hitSlop: hitSlop, onPress: onButtonPress(open), children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, { style: emptyStateDescriptionStyles, children: instructions }) })] }); } else if (isAppender && !disableMediaButtons) { return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, { activeOpacity: 0.5, accessibilityLabel: accessibilityLabel, style: _styles.default['media-placeholder__appender'], accessibilityRole: "button", accessibilityHint: accessibilityHint, hitSlop: hitSlop, onPress: onButtonPress(open), children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, { testID: "media-placeholder-appender-icon", children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.Icon, { icon: _icons.plusCircleFilled, style: addMediaButtonStyle, color: addMediaButtonStyle.color, size: addMediaButtonStyle.size }) }) }); } }; const appenderStyle = (0, _compose.usePreferredColorSchemeStyle)(_styles.default.appender, _styles.default.appenderDark); const containerSelectedStyle = (0, _compose.usePreferredColorSchemeStyle)(_styles.default['media-placeholder__container-selected'], _styles.default['media-placeholder__container-selected--dark']); const containerStyle = [(0, _compose.usePreferredColorSchemeStyle)(_styles.default['media-placeholder__container'], _styles.default['media-placeholder__container--dark']), blockEditContext?.isSelected && !className.includes('no-block-outline') && containerSelectedStyle]; if (isAppender && disableMediaButtons) { return null; } return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, { style: { flex: 1 }, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_mediaUpload.default, { allowedTypes: allowedTypes, onSelect: setMedia, onSelectURL: onSelectURL, __experimentalOnlyMediaLibrary: __experimentalOnlyMediaLibrary, multiple: multiple, isReplacingMedia: false, autoOpen: autoOpenMediaUpload, render: ({ open, getMediaOptions }) => { return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, { style: [[containerStyle, height && { height }, backgroundColor && { backgroundColor }], isAppender && appenderStyle], children: [getMediaOptions(), !hideContent && renderContent(open)] }); } }) }); } var _default = exports.default = MediaPlaceholder; //# sourceMappingURL=index.native.js.map