UNPKG

@nutui/nutui-react

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

255 lines (254 loc) 10.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Audio", { enumerable: true, get: function() { return Audio; } }); var _interop_require_default = require("@swc/helpers/_/_interop_require_default"); var _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard"); var _object_spread = require("@swc/helpers/_/_object_spread"); var _object_spread_props = require("@swc/helpers/_/_object_spread_props"); var _object_without_properties = require("@swc/helpers/_/_object_without_properties"); var _sliced_to_array = require("@swc/helpers/_/_sliced_to_array"); var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react")); var _iconsreact = require("@nutui/icons-react"); var _classnames = /*#__PURE__*/ _interop_require_default._(require("classnames")); var _range = /*#__PURE__*/ _interop_require_default._(require("../range")); var _button = /*#__PURE__*/ _interop_require_default._(require("../button")); var _configprovider = require("../configprovider"); var _typings = require("../../utils/typings"); var defaultProps = (0, _object_spread_props._)((0, _object_spread._)({}, _typings.ComponentDefaults), { src: '', muted: false, autoPlay: false, loop: false, preload: 'auto', type: 'progress', onBack: function onBack(e) {}, onForward: function onForward(e) {}, onPause: function onPause(e) {}, onEnd: function onEnd(e) {}, onMute: function onMute(e) {}, onCanPlay: function onCanPlay(e) {} }); var Audio = function Audio(props) { var watch = function watch() { if (AudioRef && AudioRef.current) { var current = AudioRef.current; current.addEventListener('play', function() { setPlaying(true); }); } }; var locale = (0, _configprovider.useConfig)().locale; var _ref = (0, _object_spread._)({}, defaultProps, props), className = _ref.className, src = _ref.src, style = _ref.style, muted = _ref.muted, autoPlay = _ref.autoPlay, loop = _ref.loop, preload = _ref.preload, type = _ref.type, onBack = _ref.onBack, onForward = _ref.onForward, onPause = _ref.onPause, onEnd = _ref.onEnd, onMute = _ref.onMute, onCanPlay = _ref.onCanPlay, children = _ref.children, rest = (0, _object_without_properties._)(_ref, [ "className", "src", "style", "muted", "autoPlay", "loop", "preload", "type", "onBack", "onForward", "onPause", "onEnd", "onMute", "onCanPlay", "children" ]); var _useState = (0, _sliced_to_array._)((0, _react.useState)(false), 2), playing = _useState[0], setPlaying = _useState[1]; var _useState1 = (0, _sliced_to_array._)((0, _react.useState)(0), 2), percent = _useState1[0], setPercent = _useState1[1]; var _useState2 = (0, _sliced_to_array._)((0, _react.useState)(false), 2), isCanPlay = _useState2[0], setIsCanPlay = _useState2[1]; var _useState3 = (0, _sliced_to_array._)((0, _react.useState)('00:00:00'), 2), currentDuration = _useState3[0], setCurrentDuration = _useState3[1]; var AudioRef = (0, _react.useRef)(null); var statusRef = (0, _react.useRef)({ currentTime: 0, currentDuration: '00:00:00', percent: 0, duration: '00:00:00', second: 0, hanMuted: muted, playing: autoPlay, handPlaying: false }); var classPrefix = 'nut-audio'; var handleEnded = function handleEnded(e) { if (loop) { console.warn(locale.audio.tips || 'onPlayEnd事件在loop=false时才会触发'); } else { onEnd === null || onEnd === void 0 ? void 0 : onEnd(e); } }; (0, _react.useEffect)(function() { watch(); }, []); (0, _react.useEffect)(function() {}, [ currentDuration ]); var handleStatusChange = function handleStatusChange() { setPlaying(!playing); if (playing) { AudioRef && AudioRef.current && AudioRef.current.pause(); } else { AudioRef && AudioRef.current && AudioRef.current.play(); } }; var renderIcon = function renderIcon() { return /*#__PURE__*/ _react.default.createElement("div", { className: "".concat(classPrefix, "-icon") }, /*#__PURE__*/ _react.default.createElement("div", { className: (0, _classnames.default)("".concat(classPrefix, "-icon-box"), playing ? "".concat(classPrefix, "-icon-play") : "".concat(classPrefix, "-icon-stop")), onClick: handleStatusChange }, /*#__PURE__*/ _react.default.createElement(_iconsreact.Service, { className: playing ? 'nut-icon-loading' : '' }))); }; var handleBack = function handleBack() { if (statusRef.current.currentTime > 0 && AudioRef.current) { statusRef.current.currentTime--; AudioRef.current.currentTime = statusRef.current.currentTime; onBack === null || onBack === void 0 ? void 0 : onBack(AudioRef.current); } }; var handleForward = function handleForward() { if (AudioRef.current) { statusRef.current.currentTime++; AudioRef.current.currentTime = statusRef.current.currentTime; onForward === null || onForward === void 0 ? void 0 : onForward(AudioRef.current); } }; var handleMute = function handleMute() { if (AudioRef.current) { AudioRef.current.muted = !AudioRef.current.muted; onMute === null || onMute === void 0 ? void 0 : onMute(AudioRef.current); } }; var handlePause = function handlePause(e) { setPlaying(false); onPause === null || onPause === void 0 ? void 0 : onPause(e); }; var formatSeconds = function formatSeconds(value) { if (!value) { return '00:00:00'; } var time = parseInt(value); var hours = Math.floor(time / 3600); var minutes = Math.floor((time - hours * 3600) / 60); var seconds = time - hours * 3600 - minutes * 60; var result = ''; result += "".concat("0".concat(hours.toString()).slice(-2), ":"); result += "".concat("0".concat(minutes.toString()).slice(-2), ":"); result += "0".concat(seconds.toString()).slice(-2); return result; }; var renderProgerss = function renderProgerss() { return /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/ _react.default.createElement("div", { className: "".concat(classPrefix, "-progress") }, /*#__PURE__*/ _react.default.createElement("div", { className: "time" }, currentDuration), /*#__PURE__*/ _react.default.createElement("div", { className: "".concat(classPrefix, "-progress-bar-wrapper") }, /*#__PURE__*/ _react.default.createElement(_range.default, { value: percent, onChange: function onChange(val) { return setPercent(val); }, currentDescription: null, maxDescription: null, minDescription: null, "inactive-color": "#cccccc", "active-color": "#FF0F23" })), /*#__PURE__*/ _react.default.createElement("div", { className: "time" }, AudioRef.current ? formatSeconds("".concat(statusRef.current.second)) : '00:00:00')), /*#__PURE__*/ _react.default.createElement("div", { className: isCanPlay ? 'custom-button-group' : 'custom-button-group-disable' }, /*#__PURE__*/ _react.default.createElement(_button.default, { type: "primary", size: "small", className: "back", onClick: handleBack }, locale.audio.back || '快退'), /*#__PURE__*/ _react.default.createElement(_button.default, { type: "primary", size: "small", className: "start", onClick: handleStatusChange }, playing ? "".concat(locale.audio.pause || '暂停') : "".concat(locale.audio.start || '开始')), /*#__PURE__*/ _react.default.createElement(_button.default, { type: "primary", size: "small", onClick: handleForward }, locale.audio.forward || '快进'), /*#__PURE__*/ _react.default.createElement(_button.default, { type: AudioRef.current && AudioRef.current.muted ? 'default' : 'primary', size: "small", onClick: handleMute }, locale.audio.mute || '静音'))); }; var renderNone = function renderNone() { return /*#__PURE__*/ _react.default.createElement("div", { className: "".concat(classPrefix, "-none-container"), onClick: handleStatusChange }, children); }; var renderAudio = function renderAudio() { switch(type){ case 'icon': return renderIcon(); case 'progress': return renderProgerss(); case 'none': return renderNone(); default: return null; } }; var handleCanplay = function handleCanplay(e) { setIsCanPlay(true); if (autoPlay && !playing) { AudioRef && AudioRef.current && AudioRef.current.play(); } if (AudioRef.current) { statusRef.current.second = AudioRef.current.duration || 0; onCanPlay === null || onCanPlay === void 0 ? void 0 : onCanPlay(e); } }; var onTimeupdate = function onTimeupdate(e) { var time = parseInt(String(e.target.currentTime)); var formated = formatSeconds("".concat(time)); statusRef.current.currentDuration = formated; setPercent(time / statusRef.current.second * 100); setCurrentDuration(formated); statusRef.current.currentTime = time; }; return /*#__PURE__*/ _react.default.createElement("div", (0, _object_spread._)({ className: (0, _classnames.default)(classPrefix, className), style: style }, rest), renderAudio(), /*#__PURE__*/ _react.default.createElement("audio", { className: "audioMain", controls: type === 'controls', ref: AudioRef, src: src, muted: muted, preload: preload, loop: loop, onPause: function onPause(e) { return handlePause(e); }, onEnded: function onEnded(e) { return handleEnded(e); }, onCanPlay: function onCanPlay(e) { return handleCanplay(e); }, onTimeUpdate: function onTimeUpdate(e) { return onTimeupdate(e); } }, /*#__PURE__*/ _react.default.createElement("track", { kind: "captions" }))); }; Audio.displayName = 'NutAudio';