UNPKG

@azesmway/react-native-rutube

Version:
163 lines (140 loc) 5.25 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _reactNative = require("react-native"); var _reactNativeWebview = require("react-native-webview"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } const RutubeView = _ref => { let { source, width, height, webViewStyle, webViewProps } = _ref; const webViewRef = (0, _react.useRef)(null); const [playUrl, setPlayUrl] = (0, _react.useState)(''); const fetchVideoData = async url => { let videoId = ''; if (url.indexOf('pl_video=') > -1) { videoId = url.substring(url.indexOf('pl_video=') + 9, url.length); } else if (url.indexOf('private/') > -1) { videoId = 'private'; setPlayUrl(url); } else if (url.indexOf('video/') > -1) { videoId = url.substring(url.indexOf('video/') + 6, url.length).replace('/', ''); } else if (url.indexOf('embed/') > -1) { videoId = url.substring(url.indexOf('embed/') + 6, url.length).replace('/', ''); } if (videoId === '') { console.error('Video id not recognized: ', videoId); return; } try { if (videoId === 'private') { return; } const metaUrl = `https://rutube.ru/pangolin/api/web/video/${videoId}/?pageType=video&client=wdp`; const videoJson = await fetch(metaUrl, { method: 'GET', headers: { Accept: 'application/json' } }); if (!videoJson.ok) { console.error('The request resulted in an error: ', url, videoJson); return; } const videoData = await videoJson.json(); if (videoData && videoData.result) { if (videoData.result.video && videoData.result.video.embed_url) { setPlayUrl(videoData.result.video.embed_url); } } } catch (error) { // @ts-ignore console.error('Error parse json', error.message); } }; (0, _react.useEffect)(() => { fetchVideoData(source); }, [source]); const renderLoading = () => { return /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: { height, width, alignItems: 'center', justifyContent: 'center', backgroundColor: 'transparent' } }, /*#__PURE__*/_react.default.createElement(_reactNative.ActivityIndicator, { animating: true, size: "large", color: '#ccc' })); }; const getHtmlCode = () => { const html = `<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0" > </head> <body> <iframe width="${width}" height="${height}" src="${playUrl}" frameborder="0" allowfullscreen allow="encrypted-media"> </iframe> </body> </html>`; return { html }; }; if (playUrl === '') { return renderLoading(); } return /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: { width, height } }, /*#__PURE__*/_react.default.createElement(_reactNativeWebview.WebView, _extends({ useWebKit: true, source: getHtmlCode(), ref: webViewRef, bounces: false, originWhitelist: ['*'], scalesPageToFit: true, scrollEnabled: true, javaScriptEnabled: true, domStorageEnabled: true, allowsInlineMediaPlayback: true, style: [styles.webView, webViewStyle], allowsFullscreenVideo: true, startInLoadingState: true, renderLoading: renderLoading, automaticallyAdjustContentInsets: false }, webViewProps))); }; const styles = _reactNative.StyleSheet.create({ webView: { backgroundColor: 'transparent', flex: 1 } }); var _default = RutubeView; exports.default = _default; //# sourceMappingURL=index.js.map