UNPKG

@selfcommunity/react-ui

Version:

React UI Components to integrate a Community created with SelfCommunity Platform.

76 lines (75 loc) 5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const jsx_runtime_1 = require("react/jsx-runtime"); const react_1 = tslib_1.__importStar(require("react")); const styles_1 = require("@mui/material/styles"); const Media_1 = require("../../../constants/Media"); const AutoPlayer_1 = tslib_1.__importDefault(require("../../AutoPlayer")); const Box_1 = tslib_1.__importDefault(require("@mui/material/Box")); const classnames_1 = tslib_1.__importDefault(require("classnames")); const constants_1 = require("./constants"); const material_1 = require("@mui/material"); const filter_1 = tslib_1.__importDefault(require("./filter")); const classes = { displayRoot: `${constants_1.PREFIX}-display-root`, displayLink: `${constants_1.PREFIX}-link`, displayHtmlWrap: `${constants_1.PREFIX}-html-wrap`, displayHtml: `${constants_1.PREFIX}-html`, displayHtmlPlaceholder: `${constants_1.PREFIX}-html-placeholder`, displayHtmlLoading: `${constants_1.PREFIX}-html-loading`, displayVideo: `${constants_1.PREFIX}-video`, thumbnail: `${constants_1.PREFIX}-thumbnail`, thumbnailFullWidth: `${constants_1.PREFIX}-thumbnail`, image: `${constants_1.PREFIX}-image`, snippet: `${constants_1.PREFIX}-snippet`, snippetTitle: `${constants_1.PREFIX}-snippet-title`, snippetDescription: `${constants_1.PREFIX}-snippet-description` }; const Root = (0, styles_1.styled)(Box_1.default, { name: constants_1.PREFIX, slot: 'DisplayRoot' })(({ theme }) => ({})); exports.default = (props) => { // PROPS const { className = '', medias, fullWidth = false, onMediaClick = null } = props, rest = tslib_1.__rest(props, ["className", "medias", "fullWidth", "onMediaClick"]); // HANDLERS const handleLinkClick = (link) => { onMediaClick && onMediaClick(link); }; // MEMO const _medias = (0, react_1.useMemo)(() => medias.filter(filter_1.default), [medias]); // RENDER /** * Renders link display * @param media * @param key */ const renderPreview = (media, key) => { // if (media.embed.metadata.html) { // return renderHtml(media, key); // } const domain = new URL(media.embed.metadata.url).hostname.replace('www.', ''); return ((0, jsx_runtime_1.jsxs)(Box_1.default, Object.assign({ className: classes.displayLink }, { children: [media.embed.metadata.images && media.embed.metadata.images.length > 0 && ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: fullWidth ? ((0, jsx_runtime_1.jsx)(Box_1.default, { className: (0, classnames_1.default)(classes.thumbnailFullWidth, classes.image), style: { background: `url(${media.image})`, paddingBottom: `${100 / media.image_width / media.image_height}%` } })) : ((0, jsx_runtime_1.jsx)(Box_1.default, { className: (0, classnames_1.default)(classes.thumbnail, classes.image), style: { background: `url(${media.image})` } })) })), (0, jsx_runtime_1.jsxs)(Box_1.default, Object.assign({ className: classes.snippet }, { children: [(0, jsx_runtime_1.jsx)("b", Object.assign({ className: classes.snippetTitle }, { children: media.embed.metadata.title })), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("p", Object.assign({ className: classes.snippetDescription }, { children: media.embed.metadata.description })), (0, jsx_runtime_1.jsx)("a", Object.assign({ href: media.embed.metadata.url, target: '_blank', onClick: () => handleLinkClick(media) }, { children: domain }))] })), (0, jsx_runtime_1.jsx)("div", { style: { clear: 'both' } })] }), key)); }; /** * Render html embed * @param media * @param key */ const renderHtml = (media, key) => { return ((0, jsx_runtime_1.jsxs)(Box_1.default, Object.assign({ className: classes.displayHtmlWrap }, { children: [(0, jsx_runtime_1.jsx)("div", { dangerouslySetInnerHTML: { __html: media.embed.metadata.html }, className: classes.displayHtml }), (0, jsx_runtime_1.jsx)("div", Object.assign({ className: classes.displayHtmlPlaceholder, style: { paddingTop: `${(100 * media.embed.metadata.height) / media.embed.metadata.width}%`, maxHeight: media.embed.metadata.height } }, { children: (0, jsx_runtime_1.jsx)(material_1.CircularProgress, { size: 20, className: classes.displayHtmlLoading }) }))] }), key)); }; /** * Renders component */ if (_medias.length === 0) { return null; } return ((0, jsx_runtime_1.jsx)(Root, Object.assign({ className: (0, classnames_1.default)(className, classes.displayRoot) }, rest, { children: _medias.map((l, i) => { if (l.embed.metadata && l.embed.metadata.type === Media_1.MEDIA_TYPE_VIDEO) { return (0, jsx_runtime_1.jsx)(AutoPlayer_1.default, { url: l.url, width: '100%', height: 360, onVideoWatch: () => handleLinkClick(l) }, i); } return (0, jsx_runtime_1.jsx)(react_1.default.Fragment, { children: renderPreview(l, i) }, i); }) }))); };