UNPKG

@amaui/ui-react

Version:
671 lines (670 loc) 41.7 kB
"use strict"; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const jsx_runtime_1 = require("react/jsx-runtime"); const react_1 = __importDefault(require("react")); const utils_1 = require("@amaui/utils"); const style_react_1 = require("@amaui/style-react"); const date_1 = require("@amaui/date"); const IconMaterialPlayArrowW100_1 = __importDefault(require("@amaui/icons-material-rounded-react/IconMaterialPlayArrowW100")); const IconMaterialPauseW100_1 = __importDefault(require("@amaui/icons-material-rounded-react/IconMaterialPauseW100")); const IconMaterialForwardMediaW100_1 = __importDefault(require("@amaui/icons-material-rounded-react/IconMaterialForwardMediaW100")); const IconMaterialVolumeDownAltW100_1 = __importDefault(require("@amaui/icons-material-rounded-react/IconMaterialVolumeDownAltW100")); const IconMaterialVolumeOffW100_1 = __importDefault(require("@amaui/icons-material-rounded-react/IconMaterialVolumeOffW100")); const IconMaterialFullscreenW100_1 = __importDefault(require("@amaui/icons-material-rounded-react/IconMaterialFullscreenW100")); const IconMaterialFullscreenExitW100_1 = __importDefault(require("@amaui/icons-material-rounded-react/IconMaterialFullscreenExitW100")); const IconMaterialSettingsW100_1 = __importDefault(require("@amaui/icons-material-rounded-react/IconMaterialSettingsW100")); const IconMaterialTuneW100_1 = __importDefault(require("@amaui/icons-material-rounded-react/IconMaterialTuneW100")); const IconMaterialSlowMotionVideoW100_1 = __importDefault(require("@amaui/icons-material-rounded-react/IconMaterialSlowMotionVideoW100")); const IconMaterialPictureInPictureAltW100_1 = __importDefault(require("@amaui/icons-material-rounded-react/IconMaterialPictureInPictureAltW100")); const IconMaterialArrowBackIosW100_1 = __importDefault(require("@amaui/icons-material-rounded-react/IconMaterialArrowBackIosW100")); const Line_1 = __importDefault(require("../Line")); const Surface_1 = __importDefault(require("../Surface")); const Slider_1 = __importDefault(require("../Slider")); const IconButton_1 = __importDefault(require("../IconButton")); const Expand_1 = __importDefault(require("../Expand")); const Type_1 = __importDefault(require("../Type")); const Menu_1 = __importDefault(require("../Menu")); const ListItem_1 = __importDefault(require("../ListItem")); const utils_2 = require("../utils"); const useStyle = (0, style_react_1.style)(theme => ({ root: { position: 'relative' }, wrapper: { position: 'relative', borderRadius: 'inherit' }, wrapperFullScreen: { height: '100vh', width: '100vw' }, video: { background: 'black', flex: '1 1 auto', borderRadius: 'inherit', cursor: 'pointer', userSelect: 'none' }, size_small: { borderRadius: theme.methods.shape.radius.value(0.5, 'px') }, size_regular: { borderRadius: theme.methods.shape.radius.value(1.5, 'px') }, size_large: { borderRadius: theme.methods.shape.radius.value(2, 'px') }, fullScreen: { borderRadius: '0px' }, controls: { position: 'absolute', bottom: '0px', left: '0px', width: '100%', borderRadius: 'inherit', transition: theme.methods.transitions.make('opacity'), '&.amaui-Surface-root': { background: 'linear-gradient(0deg, rgb(0, 0, 0, 0.24), transparent)' } }, controlsHiddden: { opacity: 0, pointerEvents: 'none' }, controlsFullScreen: {}, controls_size_small: { padding: `${theme.methods.space.value(0.75, 'px')} ${theme.methods.space.value(1, 'px')} ${theme.methods.space.value(0.5, 'px')}` }, controls_size_regular: { padding: `${theme.methods.space.value(1.5, 'px')} ${theme.methods.space.value(1.5, 'px')} ${theme.methods.space.value(1, 'px')}` }, controls_size_large: { padding: `${theme.methods.space.value(2.25, 'px')} ${theme.methods.space.value(2, 'px')} ${theme.methods.space.value(1.5, 'px')}` }, wrapperTimeline: { padding: `0 ${theme.methods.space.value(1.5, 'px')}` }, timeline: { '&.amaui-Slider-root': { height: '20px !important', width: '100% !important', margin: 'unset !important', maxWidth: 'unset !important' } }, volume: { flex: '1 1 auto', '&.amaui-Slider-root': { height: '24px !important', width: '100vw !important', maxWidth: '54px !important', margin: 'unset !important', borderRadius: '0px', '& .amaui-Slider-rail': { borderRadius: '0px' }, '& .amaui-Slider-track': { borderRadius: '0px' } } }, volumeExpand: { display: 'flex', alignItems: 'center', height: '100%' }, time: { cursor: 'default', userSelect: 'none' }, menuSettings: { maxHeight: 194, overflowY: 'auto' }, endControls: { position: 'relative' }, placeholder: {}, bottomControls: { scrollbarWidth: 'none', overflow: 'auto hidden', '& > *': { flex: '0 0 auto' }, '&::-webkit-scrollbar': { display: 'none' } }, menuSettingsFullScreen: { '&.amaui-Modal-root': { position: 'fixed !important', transform: 'none !important', left: 'unset !important', right: '12px !important', bottom: '47.8906px !important' } } }), { name: 'amaui-VideoPlayer' }); const VideoPlayer = react_1.default.forwardRef((props_, ref) => { var _a, _b, _c; const theme = (0, style_react_1.useAmauiTheme)(); const props = react_1.default.useMemo(() => { var _a, _b, _c, _d, _e, _f, _g, _h; return (Object.assign(Object.assign(Object.assign({}, (_d = (_c = (_b = (_a = theme === null || theme === void 0 ? void 0 : theme.ui) === null || _a === void 0 ? void 0 : _a.elements) === null || _b === void 0 ? void 0 : _b.all) === null || _c === void 0 ? void 0 : _c.props) === null || _d === void 0 ? void 0 : _d.default), (_h = (_g = (_f = (_e = theme === null || theme === void 0 ? void 0 : theme.ui) === null || _e === void 0 ? void 0 : _e.elements) === null || _f === void 0 ? void 0 : _f.amauiVideoPlayer) === null || _g === void 0 ? void 0 : _g.props) === null || _h === void 0 ? void 0 : _h.default), props_)); }, [props_]); const Line = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Line) || Line_1.default; }, [theme]); const Surface = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Surface) || Surface_1.default; }, [theme]); const Slider = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Slider) || Slider_1.default; }, [theme]); const IconButton = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.IconButton) || IconButton_1.default; }, [theme]); const Expand = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Expand) || Expand_1.default; }, [theme]); const Type = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Type) || Type_1.default; }, [theme]); const Menu = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Menu) || Menu_1.default; }, [theme]); const ListItem = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.ListItem) || ListItem_1.default; }, [theme]); const { name, src, meta, versions, thumbnails, mime, duration: duration_, tonal = true, color, size = 'regular', start, end, startControls, endControls, startButtons, endButtons, startButtonsEnd, endButtonsEnd, forward, backward, settings = true, quality: quality_ = true, playbackSpeed: playbackSpeed_ = true, pictureInPicture: pictureInPicture_ = true, fullScreen: fullScreen_ = true, startMediaSessionOnPlay, disabled, IconPlay = IconMaterialPlayArrowW100_1.default, IconPause = IconMaterialPauseW100_1.default, IconForward = IconMaterialForwardMediaW100_1.default, IconBackward = IconMaterialForwardMediaW100_1.default, IconVolume = IconMaterialVolumeDownAltW100_1.default, IconVolumeMuted = IconMaterialVolumeOffW100_1.default, IconBack = IconMaterialArrowBackIosW100_1.default, IconSettings = IconMaterialSettingsW100_1.default, IconQuality = IconMaterialTuneW100_1.default, IconPlaybackSpeed = IconMaterialSlowMotionVideoW100_1.default, IconPictureInPicture = IconMaterialPictureInPictureAltW100_1.default, IconFullScreen = IconMaterialFullscreenW100_1.default, IconFullScreenExit = IconMaterialFullscreenExitW100_1.default, PlayButtonProps, ForwardButtonProps, BackwardButtonProps, VolumeButtonProps, IconButtonProps, TypeProps, TimelineProps, VolumeProps, SliderProps, SettingsButtonProps, SettingsMenuProps, QualityButtonProps, PictureInPictureButtonProps, FullScreenButtonProps, className, Component } = props, other = __rest(props, ["name", "src", "meta", "versions", "thumbnails", "mime", "duration", "tonal", "color", "size", "start", "end", "startControls", "endControls", "startButtons", "endButtons", "startButtonsEnd", "endButtonsEnd", "forward", "backward", "settings", "quality", "playbackSpeed", "pictureInPicture", "fullScreen", "startMediaSessionOnPlay", "disabled", "IconPlay", "IconPause", "IconForward", "IconBackward", "IconVolume", "IconVolumeMuted", "IconBack", "IconSettings", "IconQuality", "IconPlaybackSpeed", "IconPictureInPicture", "IconFullScreen", "IconFullScreenExit", "PlayButtonProps", "ForwardButtonProps", "BackwardButtonProps", "VolumeButtonProps", "IconButtonProps", "TypeProps", "TimelineProps", "VolumeProps", "SliderProps", "SettingsButtonProps", "SettingsMenuProps", "QualityButtonProps", "PictureInPictureButtonProps", "FullScreenButtonProps", "className", "Component"]); const { classes } = useStyle(); const [loaded, setLoaded] = react_1.default.useState(false); const [duration, setDuration] = react_1.default.useState((0, utils_1.is)('number', meta === null || meta === void 0 ? void 0 : meta.duration) ? meta.duration : undefined); const [time, setTime] = react_1.default.useState(0); const [play, setPlay] = react_1.default.useState(false); const [muted, setMuted] = react_1.default.useState(false); const [volume, setVolume] = react_1.default.useState(1); const [volumeVisible, setVolumeVisible] = react_1.default.useState(false); const [updating, setUpdating] = react_1.default.useState(false); const [mouseMoved, setMouseMoved] = react_1.default.useState(); const [quality, setQuality] = react_1.default.useState(); const [posterShow, setPosterShow] = react_1.default.useState(true); const [pictureInPicture, setPictureInPicture] = react_1.default.useState(false); const [fullScreen, setFullScreen] = react_1.default.useState(false); const [playbackSpeed, setPlaybackSpeed] = react_1.default.useState(1); const [openMenu, setOpenMenu] = react_1.default.useState(); const refs = { root: react_1.default.useRef(undefined), video: react_1.default.useRef(), controls: react_1.default.useRef(undefined), duration: react_1.default.useRef(undefined), time: react_1.default.useRef(undefined), play: react_1.default.useRef(undefined), updating: react_1.default.useRef(undefined), onPlay: react_1.default.useRef(undefined), onPause: react_1.default.useRef(undefined), onTimeChange: react_1.default.useRef(undefined), onBackward: react_1.default.useRef(undefined), onForward: react_1.default.useRef(undefined), onStop: react_1.default.useRef(undefined), startMediaSession: react_1.default.useRef(undefined), updateMediaSession: react_1.default.useRef(undefined), startMediaSessionOnPlay: react_1.default.useRef(undefined), fullScreen: react_1.default.useRef(fullScreen), mouseMoved: react_1.default.useRef(mouseMoved), timeoutMouseMoved: react_1.default.useRef(undefined) }; refs.duration.current = duration; refs.time.current = time; refs.play.current = play; refs.updating.current = updating; refs.startMediaSessionOnPlay.current = startMediaSessionOnPlay; refs.fullScreen.current = fullScreen; refs.mouseMoved.current = mouseMoved; const allowedPictureInPicture = () => { var _a; if ((0, utils_1.isEnvironment)('browser')) { const rootDocument = (((_a = refs.root.current) === null || _a === void 0 ? void 0 : _a.ownerDocument) || window.document); return rootDocument.pictureInPictureEnabled; } }; const startMediaSession = react_1.default.useCallback(() => { if ('mediaSession' in navigator) { window.navigator.mediaSession.metadata = new MediaMetadata({ title: name }); const methods = [ { name: 'play', method: refs.onPlay.current }, { name: 'pause', method: refs.onPause.current }, { name: 'previoustrack', method: () => { } }, { name: 'nexttrack', method: () => { } }, { name: 'seekbackward', method: refs.onBackward.current }, { name: 'seekforward', method: refs.onForward.current }, { name: 'seekto', method: (details) => refs.onTimeChange.current(details.seekTime) }, { name: 'stop', method: refs.onStop.current } ]; for (const method of methods) { try { window.navigator.mediaSession.setActionHandler(method.name, method.method); } catch (error) { console.log(`MediaSession action ${method.name}, is not supported`); } } } }, [name]); const updateMediaSession = react_1.default.useCallback(() => { if ('mediaSession' in navigator) { window.navigator.mediaSession.setPositionState({ duration: refs.duration.current, playbackRate: 1, position: (0, utils_1.clamp)(refs.time.current, 0, refs.duration.current) }); } }, [name]); refs.startMediaSession.current = startMediaSession; refs.updateMediaSession.current = updateMediaSession; const durationTime = duration_ || (meta === null || meta === void 0 ? void 0 : meta.duration); const onVolumeChange = react_1.default.useCallback((value) => { setVolume(value); refs.video.current.volume = value; }, []); const onTimeChange = react_1.default.useCallback((value) => { setTime(value); refs.video.current.currentTime = value; // update MediaSession refs.updateMediaSession.current(); }, []); const onPlaybackSpeed = react_1.default.useCallback((value_) => { const value = (0, utils_1.clamp)(value_, 0, 2); setPlaybackSpeed(value); setOpenMenu(null); refs.video.current.playbackRate = value; }, []); const onForward = react_1.default.useCallback((details) => { const part = refs.duration.current * 0.1; const toMove = (0, utils_1.clamp)((details === null || details === void 0 ? void 0 : details.seekOffset) || part, 1, refs.duration.current); const value = (0, utils_1.clamp)(refs.time.current + toMove, 0, refs.duration.current); refs.onTimeChange.current(value); }, []); const onBackward = react_1.default.useCallback((details) => { const part = refs.duration.current * 0.1; const toMove = (0, utils_1.clamp)((details === null || details === void 0 ? void 0 : details.seekOffset) || part, 1, refs.duration.current); const value = (0, utils_1.clamp)(refs.time.current - toMove, 0, refs.duration.current); refs.onTimeChange.current(value); }, []); const onPlay = react_1.default.useCallback(() => { try { setPlay(true); refs.video.current.play(); // start MediaSession if (refs.startMediaSessionOnPlay.current) refs.startMediaSession.current(); // update MediaSession refs.updateMediaSession.current(); } catch (error) { console.error(`videoPlayer`, error); } }, []); const onPause = react_1.default.useCallback(() => { setPlay(false); refs.video.current.pause(); }, []); const onStop = react_1.default.useCallback(() => { setPlay(false); refs.video.current.pause(); refs.video.current.currentTime = 0; }, []); const onMute = react_1.default.useCallback(() => { setMuted(true); refs.video.current.muted = true; }, []); const onUnmute = react_1.default.useCallback(() => { setMuted(false); refs.video.current.muted = false; }, []); refs.onPlay.current = onPlay; refs.onPause.current = onPause; refs.onTimeChange.current = onTimeChange; refs.onForward.current = onForward; refs.onBackward.current = onBackward; refs.onStop.current = onStop; const init = react_1.default.useCallback(() => { var _a, _b, _c, _d; setLoaded(false); const video = refs.video.current; video.addEventListener('loadedmetadata', () => { const value = video.duration; if (!(0, utils_1.is)('number', durationTime) && (0, utils_1.is)('number', value)) { if (refs.duration.current === undefined) setDuration(value); setLoaded(true); } }); video.addEventListener('ended', () => { refs.onStop.current(); }); video.addEventListener('timeupdate', () => { const value = video.currentTime; if (!refs.updating.current && refs.time.current !== value) { setTime(value); // update MediaSession refs.updateMediaSession.current(); } }); video.addEventListener('ratechange', () => { const value = video.playbackRate; setPlaybackSpeed(value); }); // start MediaSession startMediaSession(); if ((0, utils_1.is)('number', durationTime)) { if (refs.duration.current === undefined) setDuration(durationTime); setLoaded(true); } const rootDocument = (0, utils_1.isEnvironment)('browser') ? (((_a = refs.root.current) === null || _a === void 0 ? void 0 : _a.ownerDocument) || window.document) : undefined; const methodPictureInPicture = () => { if (rootDocument.pictureInPictureElement) { setPictureInPicture(true); } else { setPictureInPicture(false); } }; const methodFullScreen = () => { if (rootDocument.fullscreenElement) { setFullScreen(true); } else { setFullScreen(false); } }; const methodMouseMove = () => { if (refs.play.current) { clearTimeout(refs.timeoutMouseMoved.current); setMouseMoved({ moved: true, unix: date_1.AmauiDate.unix }); refs.timeoutMouseMoved.current = setTimeout(() => { setMouseMoved({ moved: false, unix: date_1.AmauiDate.unix }); }, 4000); } }; (_b = refs.root.current) === null || _b === void 0 ? void 0 : _b.addEventListener('mousemove', methodMouseMove); (_c = refs.root.current) === null || _c === void 0 ? void 0 : _c.addEventListener('touchstart', methodMouseMove); (_d = refs.root.current) === null || _d === void 0 ? void 0 : _d.addEventListener('touchmove', methodMouseMove); rootDocument.addEventListener('enterpictureinpicture', methodPictureInPicture); rootDocument.addEventListener('leavepictureinpicture', methodPictureInPicture); rootDocument.addEventListener('fullscreenchange', methodFullScreen); video.src = src; return () => { var _a, _b, _c; (_a = refs.root.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('mousemove', methodMouseMove); (_b = refs.root.current) === null || _b === void 0 ? void 0 : _b.removeEventListener('touchstart', methodMouseMove); (_c = refs.root.current) === null || _c === void 0 ? void 0 : _c.removeEventListener('touchmove', methodMouseMove); rootDocument.removeEventListener('enterpictureinpicture', methodPictureInPicture); rootDocument.removeEventListener('leavepictureinpicture', methodPictureInPicture); rootDocument.removeEventListener('fullscreenchange', methodFullScreen); }; }, [src, durationTime, startMediaSession]); react_1.default.useEffect(() => { var _a, _b; if (loaded) { let urlNew = src; if (quality) { if ((_a = quality === null || quality === void 0 ? void 0 : quality.meta) === null || _a === void 0 ? void 0 : _a.resolution) urlNew += `?version=${(_b = quality === null || quality === void 0 ? void 0 : quality.meta) === null || _b === void 0 ? void 0 : _b.resolution}`; } const currentTime = refs.video.current.currentTime; const playbackRate = refs.video.current.playbackRate; const playing = refs.play.current; // pause if (playing) refs.onPause.current(); // poster remove setPosterShow(false); refs.video.current.poster = ''; refs.video.current.src = urlNew; refs.video.current.load(); refs.video.current.currentTime = currentTime; refs.video.current.playbackRate = playbackRate; // play if (playing) refs.onPlay.current(); } }, [quality]); const onMouseEnter = react_1.default.useCallback(() => { setVolumeVisible(true); }, []); const onMouseLeave = react_1.default.useCallback(() => { setVolumeVisible(false); }, []); const onUpdating = react_1.default.useCallback(() => { setUpdating(refs.play.current ? 'play' : true); if (refs.play.current) onPause(); }, [onPause]); const onUpdatingDone = react_1.default.useCallback(() => { const updatingPrevious = refs.updating.current; setUpdating(false); if (updatingPrevious === 'play') onPlay(); }, [onPlay]); const onFullScreen = react_1.default.useCallback(async () => { const root = refs.root.current; try { if (root.requestFullscreen) await root.requestFullscreen(); else if (root.webkitRequestFullscreen) await root.webkitRequestFullscreen(); else if (root.msRequestFullscreen) await root.msRequestFullscreen(); } catch (error) { } }, []); const onFullScreenExit = react_1.default.useCallback(async () => { var _a; const rootDocument = (0, utils_1.isEnvironment)('browser') ? (((_a = refs.root.current) === null || _a === void 0 ? void 0 : _a.ownerDocument) || window.document) : undefined; try { if (rootDocument.exitFullscreen) await rootDocument.exitFullscreen(); else if (rootDocument.webkitExitFullscreen) await rootDocument.webkitExitFullscreen(); else if (rootDocument.msExitFullscreen) await rootDocument.msExitFullscreen(); } catch (error) { } }, []); const onPictureInPicture = react_1.default.useCallback(async () => { const video = refs.video.current; try { if (video.requestPictureInPicture) await video.requestPictureInPicture(); else if (video.webkitRequestPictureInPicture) await video.webkitRequestPictureInPicture(); else if (video.msRequestPictureInPicture) await video.msRequestPictureInPicture(); } catch (error) { } }, []); const onPictureInPictureExit = react_1.default.useCallback(async () => { var _a; const rootDocument = (0, utils_1.isEnvironment)('browser') ? (((_a = refs.root.current) === null || _a === void 0 ? void 0 : _a.ownerDocument) || window.document) : undefined; try { if (rootDocument.exitPictureInPicture) await rootDocument.exitPictureInPicture(); else if (rootDocument.webkitExitPictureInPicture) await rootDocument.webkitExitPictureInPicture(); else if (rootDocument.msExitPictureInPicture) await rootDocument.msExitPictureInPicture(); } catch (error) { } }, []); const onVideoClick = react_1.default.useCallback((event) => { if (event.detail === 1) { !play ? onPlay() : onPause(); } if (event.detail === 2) { !fullScreen ? onFullScreen() : onFullScreenExit(); } }, [play, fullScreen, onPlay, onPause, onFullScreen, onFullScreenExit]); react_1.default.useEffect(() => { var _a; const rootDocument = (0, utils_1.isEnvironment)('browser') ? (((_a = refs.root.current) === null || _a === void 0 ? void 0 : _a.ownerDocument) || window.document) : undefined; rootDocument.addEventListener('mouseup', onUpdatingDone); rootDocument.addEventListener('touchend', onUpdatingDone); return () => { rootDocument.removeEventListener('mouseup', onUpdatingDone); rootDocument.removeEventListener('touchend', onUpdatingDone); }; }, []); react_1.default.useEffect(() => { // init init(); }, [src]); const durationToValue = (item) => { let value = ''; const separator = ':'; if (item.hour) value += `${(0, utils_1.getLeadingZerosNumber)(item.hour, { leadingZeros: 0 })}`; if (item.minute) { if (value) value += separator; value += `${(0, utils_1.getLeadingZerosNumber)(item.minute, { leadingZeros: 0 })}`; } else { if (value) value += separator; value += '0'; } if (item.second) { if (value) value += separator; value += `${(0, utils_1.getLeadingZerosNumber)(item.second, { leadingZeros: 1 })}`; } else { if (value) value += separator; value += '00'; } return value; }; const onQuality = react_1.default.useCallback((version) => { setQuality(version); setOpenMenu(null); }, []); const onSettingsMenuClose = react_1.default.useCallback(() => { setOpenMenu(null); }, []); const getSettingsMenuItems = () => { var _a; const itemProps = { button: true, startAlign: 'center', endAlign: 'center', size: 'small', className: 'amaui-videoPlayer-option' }; const items = []; if (openMenu) { items.push((0, jsx_runtime_1.jsx)(ListItem, Object.assign({ start: ((0, jsx_runtime_1.jsx)(IconBack, { size: 'very small' })), primary: ((0, jsx_runtime_1.jsx)(Type, Object.assign({ version: 'b3' }, { children: "Back" }))), onClick: () => setOpenMenu(null) }, itemProps), 'back')); } if (!openMenu) { if (playbackSpeed_) items.push((0, jsx_runtime_1.jsx)(ListItem, Object.assign({ start: ((0, jsx_runtime_1.jsx)(IconPlaybackSpeed, { size: 'small' })), primary: ((0, jsx_runtime_1.jsx)(Type, Object.assign({ version: 'b3' }, { children: "Playback speed" }))), end: ((0, jsx_runtime_1.jsx)(Type, Object.assign({ version: 'b3', priority: 'secondary' }, { children: playbackSpeed === 1 ? 'Normal' : playbackSpeed }))), onClick: () => setOpenMenu('playbackSpeed') }, itemProps), 'playbackSpeed')); if (quality_) items.push((0, jsx_runtime_1.jsx)(ListItem, Object.assign({ start: ((0, jsx_runtime_1.jsx)(IconQuality, { size: 'small' })), primary: ((0, jsx_runtime_1.jsx)(Type, Object.assign({ version: 'b3' }, { children: "Quality" }))), end: ((0, jsx_runtime_1.jsx)(Type, Object.assign({ version: 'b3', priority: 'secondary' }, { children: !quality ? 'Original' : `${(_a = quality === null || quality === void 0 ? void 0 : quality.meta) === null || _a === void 0 ? void 0 : _a.resolution}p` }))), onClick: () => setOpenMenu('quality') }, itemProps), 'quality')); } else if (openMenu === 'quality') { items.push((0, jsx_runtime_1.jsx)(ListItem, Object.assign({ primary: ((0, jsx_runtime_1.jsx)(Type, Object.assign({ version: 'b3' }, { children: `${meta === null || meta === void 0 ? void 0 : meta.resolution}p (original)` }))), onClick: () => quality ? onQuality(null) : undefined, selected: !quality }, itemProps), 'original')); versions === null || versions === void 0 ? void 0 : versions.forEach((version, index) => { var _a; const isSelected = (quality === null || quality === void 0 ? void 0 : quality.id) === (version === null || version === void 0 ? void 0 : version.id); items.push((0, jsx_runtime_1.jsx)(ListItem, Object.assign({ primary: ((0, jsx_runtime_1.jsxs)(Type, Object.assign({ version: 'b3' }, { children: [(_a = version === null || version === void 0 ? void 0 : version.meta) === null || _a === void 0 ? void 0 : _a.resolution, "p"] }))), onClick: () => !isSelected ? onQuality(version) : undefined, selected: isSelected }, itemProps), index)); }); } else if (openMenu === 'playbackSpeed') { const options = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]; options.forEach(option => { items.push((0, jsx_runtime_1.jsx)(ListItem, Object.assign({ primary: ((0, jsx_runtime_1.jsx)(Type, Object.assign({ version: 'b3' }, { children: option === 1 ? 'Normal' : option }))), onClick: () => onPlaybackSpeed(option), selected: playbackSpeed === option }, itemProps), option)); }); } return items; }; const thumbnailsToUse = thumbnails || (quality === null || quality === void 0 ? void 0 : quality.thumbnails); const thumbnail = thumbnailsToUse ? 1 : undefined; const typeProps = Object.assign({ version: size === 'large' ? 'b1' : size === 'regular' ? 'b2' : 'b3' }, TypeProps); const iconButtonProps = Object.assign({ version: 'text', size, disabled }, IconButtonProps); const sliderProps = Object.assign({ color, size, disabled }, SliderProps); let url = src; let poster; if (quality) { if ((_a = quality === null || quality === void 0 ? void 0 : quality.meta) === null || _a === void 0 ? void 0 : _a.resolution) url += `?version=${(_b = quality === null || quality === void 0 ? void 0 : quality.meta) === null || _b === void 0 ? void 0 : _b.resolution}`; } if ((0, utils_1.is)('number', thumbnail)) { poster = `${url}${(url === null || url === void 0 ? void 0 : url.includes('?')) ? '&' : '?'}thumbnail=${thumbnail}`; } return ((0, jsx_runtime_1.jsx)(Line, Object.assign({ ref: item => { if (ref) { if ((0, utils_1.is)('function', ref)) ref(item); else ref.current = item; } refs.root.current = item; }, gap: 1, direction: 'column', align: 'unset', justify: 'unset', fullWidth: true, Component: Component, className: (0, style_react_1.classNames)([ (0, utils_2.staticClassName)('VideoPlayer', theme) && [ `amaui-VideoPlayer-root`, `amaui-VideoPlayer-size-${size}`, fullScreen && `amaui-VideoPlayer-full-screen` ], className, classes.root, classes[`size_${size}`], fullScreen && classes.fullScreen ]) }, other, { children: (0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 0, direction: 'column', align: 'unset', justify: 'unset', fullWidth: true, className: (0, style_react_1.classNames)([ classes.wrapper, fullScreen && classes.wrapperFullScreen ]) }, { children: [start, (0, jsx_runtime_1.jsx)("video", Object.assign({ ref: refs.video, onClick: onVideoClick, poster: posterShow ? poster : undefined, controls: false, className: (0, style_react_1.classNames)([ classes.video, fullScreen && classes.videoFullScreen ]) }, { children: (0, jsx_runtime_1.jsx)("source", { src: url, type: mime }) })), (0, jsx_runtime_1.jsxs)(Surface, Object.assign({ ref: refs.controls, gap: 0, fullWidth: true, tonal: tonal, color: color !== undefined ? color : theme.palette.light ? 'inverted' : 'default', Component: Line, className: (0, style_react_1.classNames)([ classes.controls, classes[`controls_size_${size}`], fullScreen && classes.controlsFullScreen, !(mouseMoved === null || mouseMoved === void 0 ? void 0 : mouseMoved.moved) && play && classes.controlsHiddden ]) }, { children: [startControls, (0, jsx_runtime_1.jsx)(Line, Object.assign({ fullWidth: true, className: classes.wrapperTimeline }, { children: (0, jsx_runtime_1.jsx)(Slider, Object.assign({ value: time, onChange: onTimeChange, min: 0, max: duration, onMouseDown: onUpdating, onTouchStart: onUpdating, onMouseUp: onUpdatingDone, onToucheEnd: onUpdatingDone }, sliderProps, TimelineProps, { className: (0, style_react_1.classNames)([ sliderProps === null || sliderProps === void 0 ? void 0 : sliderProps.className, TimelineProps === null || TimelineProps === void 0 ? void 0 : TimelineProps.className, classes.timeline ]) })) })), (0, jsx_runtime_1.jsxs)(Line, Object.assign({ direction: 'row', align: 'center', fullWidth: true, onMouseLeave: onMouseLeave, className: classes.bottomControls, style: { color: theme.palette.color[color] ? theme.palette.color[color][90] : theme.palette.color.neutral[90] } }, { children: [startButtons, (0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 1, direction: 'row', align: 'center', justify: 'space-between', flexNo: true, fullWidth: true }, { children: [(0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 1.5, direction: 'row', align: 'center', flexNo: true }, { children: [(0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 0, direction: 'row', align: 'center' }, { children: [(0, jsx_runtime_1.jsx)(IconButton, Object.assign({ onClick: play ? onPause : onPlay }, iconButtonProps, PlayButtonProps, { children: play ? (0, jsx_runtime_1.jsx)(IconPause, {}) : (0, jsx_runtime_1.jsx)(IconPlay, {}) })), backward && ((0, jsx_runtime_1.jsx)(IconButton, Object.assign({ onClick: onBackward }, iconButtonProps, BackwardButtonProps, { children: (0, jsx_runtime_1.jsx)(IconBackward, { style: { transform: 'rotateY(180deg)' } }) }))), forward && ((0, jsx_runtime_1.jsx)(IconButton, Object.assign({ onClick: onForward }, iconButtonProps, ForwardButtonProps, { children: (0, jsx_runtime_1.jsx)(IconForward, {}) }))), (0, jsx_runtime_1.jsx)(IconButton, Object.assign({ onClick: muted ? onUnmute : onMute, onMouseEnter: onMouseEnter }, iconButtonProps, VolumeButtonProps, { children: !muted ? (0, jsx_runtime_1.jsx)(IconVolume, {}) : (0, jsx_runtime_1.jsx)(IconVolumeMuted, {}) })), (0, jsx_runtime_1.jsx)(Expand, Object.assign({ in: volumeVisible, parent: refs.controls.current, orientation: 'horizontal', className: classes.volumeExpand }, { children: (0, jsx_runtime_1.jsx)(Slider, Object.assign({ value: volume, onChange: onVolumeChange, min: 0, max: 1, orientation: 'horizontal' }, sliderProps, { size: ['small', 'regular'].includes(size) ? 'small' : 'regular' }, VolumeProps, { className: (0, style_react_1.classNames)([ sliderProps === null || sliderProps === void 0 ? void 0 : sliderProps.className, VolumeProps === null || VolumeProps === void 0 ? void 0 : VolumeProps.className, classes.volume ]) })) }))] })), (0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 0.5, direction: 'row', align: 'center', flexNo: true, className: (0, style_react_1.classNames)([ 'amaui-Audio-time', classes.time ]) }, { children: [(0, jsx_runtime_1.jsx)(Type, Object.assign({}, typeProps, { children: durationToValue((0, date_1.duration)(time * 1000, false, true)) })), (0, jsx_runtime_1.jsx)(Type, Object.assign({}, typeProps, { children: "/" })), (0, jsx_runtime_1.jsx)(Type, Object.assign({}, typeProps, { children: durationToValue((0, date_1.duration)(duration * 1000, false, true)) }))] }))] })), (0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 0.5, direction: 'row', align: 'center', className: classes.endControls }, { children: [startButtonsEnd, settings && ((0, jsx_runtime_1.jsx)(Menu, Object.assign({ menuItems: getSettingsMenuItems(), position: 'top', switch: false, portal: !fullScreen, onClose: onSettingsMenuClose, includeParentQueries: ['.amaui-videoPlayer'] }, SettingsMenuProps, { ListProps: { className: (0, style_react_1.classNames)([ (_c = SettingsMenuProps === null || SettingsMenuProps === void 0 ? void 0 : SettingsMenuProps.ListProps) === null || _c === void 0 ? void 0 : _c.className, classes.menuSettings, ]), size: 'small' }, className: (0, style_react_1.classNames)([ 'amaui-videoPlayer', SettingsMenuProps === null || SettingsMenuProps === void 0 ? void 0 : SettingsMenuProps.className, fullScreen && classes.menuSettingsFullScreen ]) }, { children: (0, jsx_runtime_1.jsx)(IconButton, Object.assign({}, iconButtonProps, SettingsButtonProps, { children: (0, jsx_runtime_1.jsx)(IconSettings, {}) })) }))), pictureInPicture_ && allowedPictureInPicture() && ((0, jsx_runtime_1.jsx)(IconButton, Object.assign({ onClick: !pictureInPicture ? onPictureInPicture : onPictureInPictureExit }, iconButtonProps, PictureInPictureButtonProps, { children: (0, jsx_runtime_1.jsx)(IconPictureInPicture, {}) }))), fullScreen_ && ((0, jsx_runtime_1.jsx)(IconButton, Object.assign({ onClick: !fullScreen ? onFullScreen : onFullScreenExit }, iconButtonProps, FullScreenButtonProps, { children: fullScreen ? (0, jsx_runtime_1.jsx)(IconFullScreenExit, {}) : (0, jsx_runtime_1.jsx)(IconFullScreen, {}) }))), endButtonsEnd] }))] })), endButtons] })), endControls] })), end] })) }))); }); VideoPlayer.displayName = 'amaui-VideoPlayer'; exports.default = VideoPlayer;