@wordpress/block-library
Version:
Block library for the WordPress editor.
290 lines (274 loc) • 8.18 kB
JavaScript
import { createElement, Fragment } from "@wordpress/element";
/**
* WordPress dependencies
*/
import { __, sprintf } from '@wordpress/i18n';
import { NavigableMenu, MenuItem, FormFileUpload, MenuGroup, ToolbarButton, Dropdown, SVG, Rect, Path, Button, TextControl, SelectControl } from '@wordpress/components';
import { MediaUpload, MediaUploadCheck, store as blockEditorStore } from '@wordpress/block-editor';
import { upload, media } from '@wordpress/icons';
import { useSelect } from '@wordpress/data';
import { useState } from '@wordpress/element';
import { getFilename } from '@wordpress/url';
const ALLOWED_TYPES = ['text/vtt'];
const DEFAULT_KIND = 'subtitles';
const KIND_OPTIONS = [{
label: __('Subtitles'),
value: 'subtitles'
}, {
label: __('Captions'),
value: 'captions'
}, {
label: __('Descriptions'),
value: 'descriptions'
}, {
label: __('Chapters'),
value: 'chapters'
}, {
label: __('Metadata'),
value: 'metadata'
}];
const captionIcon = createElement(SVG, {
width: "18",
height: "14",
viewBox: "0 0 18 14",
role: "img",
fill: "none"
}, createElement(Rect, {
x: "0.75",
y: "0.75",
width: "16.5",
height: "12.5",
rx: "1.25",
stroke: "black",
strokeWidth: "1.5",
fill: "none"
}), createElement(Path, {
d: "M3 7H15",
stroke: "black",
strokeWidth: "1.5"
}), createElement(Path, {
d: "M3 10L15 10",
stroke: "black",
strokeWidth: "1.5"
}));
function TrackList(_ref) {
let {
tracks,
onEditPress
} = _ref;
let content;
if (tracks.length === 0) {
content = createElement("p", {
className: "block-library-video-tracks-editor__tracks-informative-message"
}, __('Tracks can be subtitles, captions, chapters, or descriptions. They help make your content more accessible to a wider range of users.'));
} else {
content = tracks.map((track, index) => {
return createElement("div", {
key: index,
className: "block-library-video-tracks-editor__track-list-track"
}, createElement("span", null, track.label, " "), createElement(Button, {
variant: "tertiary",
onClick: () => onEditPress(index),
"aria-label": sprintf(
/* translators: %s: Label of the video text track e.g: "French subtitles" */
__('Edit %s'), track.label)
}, __('Edit')));
});
}
return createElement(MenuGroup, {
label: __('Text tracks'),
className: "block-library-video-tracks-editor__track-list"
}, content);
}
function SingleTrackEditor(_ref2) {
let {
track,
onChange,
onClose,
onRemove
} = _ref2;
const {
src = '',
label = '',
srcLang = '',
kind = DEFAULT_KIND
} = track;
const fileName = src.startsWith('blob:') ? '' : getFilename(src) || '';
return createElement(NavigableMenu, null, createElement("div", {
className: "block-library-video-tracks-editor__single-track-editor"
}, createElement("span", {
className: "block-library-video-tracks-editor__single-track-editor-edit-track-label"
}, __('Edit track')), createElement("span", null, __('File'), ": ", createElement("b", null, fileName)), createElement("div", {
className: "block-library-video-tracks-editor__single-track-editor-label-language"
}, createElement(TextControl
/* eslint-disable jsx-a11y/no-autofocus */
, {
autoFocus: true
/* eslint-enable jsx-a11y/no-autofocus */
,
onChange: newLabel => onChange({ ...track,
label: newLabel
}),
label: __('Label'),
value: label,
help: __('Title of track')
}), createElement(TextControl, {
onChange: newSrcLang => onChange({ ...track,
srcLang: newSrcLang
}),
label: __('Source language'),
value: srcLang,
help: __('Language tag (en, fr, etc.)')
})), createElement(SelectControl, {
className: "block-library-video-tracks-editor__single-track-editor-kind-select",
options: KIND_OPTIONS,
value: kind,
label: __('Kind'),
onChange: newKind => {
onChange({ ...track,
kind: newKind
});
}
}), createElement("div", {
className: "block-library-video-tracks-editor__single-track-editor-buttons-container"
}, createElement(Button, {
variant: "secondary",
onClick: () => {
const changes = {};
let hasChanges = false;
if (label === '') {
changes.label = __('English');
hasChanges = true;
}
if (srcLang === '') {
changes.srcLang = 'en';
hasChanges = true;
}
if (track.kind === undefined) {
changes.kind = DEFAULT_KIND;
hasChanges = true;
}
if (hasChanges) {
onChange({ ...track,
...changes
});
}
onClose();
}
}, __('Close')), createElement(Button, {
isDestructive: true,
variant: "link",
onClick: onRemove
}, __('Remove track')))));
}
export default function TracksEditor(_ref3) {
let {
tracks = [],
onChange
} = _ref3;
const mediaUpload = useSelect(select => {
return select(blockEditorStore).getSettings().mediaUpload;
}, []);
const [trackBeingEdited, setTrackBeingEdited] = useState(null);
if (!mediaUpload) {
return null;
}
return createElement(Dropdown, {
contentClassName: "block-library-video-tracks-editor",
renderToggle: _ref4 => {
let {
isOpen,
onToggle
} = _ref4;
return createElement(ToolbarButton, {
label: __('Text tracks'),
showTooltip: true,
"aria-expanded": isOpen,
"aria-haspopup": "true",
onClick: onToggle,
icon: captionIcon
});
},
renderContent: () => {
if (trackBeingEdited !== null) {
return createElement(SingleTrackEditor, {
track: tracks[trackBeingEdited],
onChange: newTrack => {
const newTracks = [...tracks];
newTracks[trackBeingEdited] = newTrack;
onChange(newTracks);
},
onClose: () => setTrackBeingEdited(null),
onRemove: () => {
onChange(tracks.filter((_track, index) => index !== trackBeingEdited));
setTrackBeingEdited(null);
}
});
}
return createElement(Fragment, null, createElement(NavigableMenu, null, createElement(TrackList, {
tracks: tracks,
onEditPress: setTrackBeingEdited
}), createElement(MenuGroup, {
className: "block-library-video-tracks-editor__add-tracks-container",
label: __('Add tracks')
}, createElement(MediaUpload, {
onSelect: _ref5 => {
let {
url
} = _ref5;
const trackIndex = tracks.length;
onChange([...tracks, {
src: url
}]);
setTrackBeingEdited(trackIndex);
},
allowedTypes: ALLOWED_TYPES,
render: _ref6 => {
let {
open
} = _ref6;
return createElement(MenuItem, {
icon: media,
onClick: open
}, __('Open Media Library'));
}
}), createElement(MediaUploadCheck, null, createElement(FormFileUpload, {
onChange: event => {
const files = event.target.files;
const trackIndex = tracks.length;
mediaUpload({
allowedTypes: ALLOWED_TYPES,
filesList: files,
onFileChange: _ref7 => {
let [{
url
}] = _ref7;
const newTracks = [...tracks];
if (!newTracks[trackIndex]) {
newTracks[trackIndex] = {};
}
newTracks[trackIndex] = { ...tracks[trackIndex],
src: url
};
onChange(newTracks);
setTrackBeingEdited(trackIndex);
}
});
},
accept: ".vtt,text/vtt",
render: _ref8 => {
let {
openFileDialog
} = _ref8;
return createElement(MenuItem, {
icon: upload,
onClick: () => {
openFileDialog();
}
}, __('Upload'));
}
})))));
}
});
}
//# sourceMappingURL=tracks-editor.js.map