import React from 'react'; import PropTypes from 'prop-types'; import { PageStore, MediaPageStore } from '../../utils/stores/'; import { formatInnerLink, formatViewsNumber } from '../../utils/helpers/'; import { MemberContext, PlaylistsContext, SiteContext } from '../../utils/contexts/'; import { MediaLikeIcon, MediaDislikeIcon, OtherMediaDownloadLink, VideoMediaDownloadLink, MediaSaveButton, MediaShareButton, MediaMoreOptionsIcon } from '../media-actions/'; function Tooltip(el) { const parent = document.body; const tooltipElem = document.createElement('span'); tooltipElem.innerText = el.getAttribute('data-tooltip'); tooltipElem.setAttribute('class', 'tooltip'); el.removeAttribute('data-tooltip'); function onMouseenter() { const targetClientRect = el.getBoundingClientRect(); parent.appendChild(tooltipElem); tooltipElem.style.top = targetClientRect.top - (0 + tooltipElem.offsetHeight) + 'px'; tooltipElem.style.left = targetClientRect.left + 'px'; document.addEventListener('scroll', onScroll); } function onMouseleave() { parent.removeChild(tooltipElem); tooltipElem.style.top = ''; tooltipElem.style.left = ''; document.removeEventListener('scroll', onScroll); } function onScroll() { const targetClientRect = el.getBoundingClientRect(); tooltipElem.style.top = targetClientRect.top - (0 + tooltipElem.offsetHeight) + 'px'; tooltipElem.style.left = targetClientRect.left + 'px'; } el.addEventListener('mouseenter', onMouseenter); el.addEventListener('mouseleave', onMouseleave); } export default class ViewerInfoTitleBanner extends React.PureComponent { constructor(props) { super(props); this.state = { likedMedia: MediaPageStore.get('user-liked-media'), dislikedMedia: MediaPageStore.get('user-disliked-media'), }; this.downloadLink = 'video' !== MediaPageStore.get('media-type') ? formatInnerLink(MediaPageStore.get('media-original-url'), SiteContext._currentValue.url) : null; // Extract actual filename from URL for non-video downloads const originalUrl = MediaPageStore.get('media-original-url'); this.downloadFilename = originalUrl ? originalUrl.substring(originalUrl.lastIndexOf('/') + 1) : this.props.title; this.updateStateValues = this.updateStateValues.bind(this); } componentDidMount() { MediaPageStore.on('liked_media', this.updateStateValues); MediaPageStore.on('unliked_media', this.updateStateValues); MediaPageStore.on('disliked_media', this.updateStateValues); MediaPageStore.on('undisliked_media', this.updateStateValues); const tooltips = document.querySelectorAll('[data-tooltip]'); if (tooltips.length) { tooltips.forEach((tooltipElem) => Tooltip(tooltipElem)); } } updateStateValues() { this.setState({ likedMedia: MediaPageStore.get('user-liked-media'), dislikedMedia: MediaPageStore.get('user-disliked-media'), }); } mediaCategories(overTitle) { if (void 0 === this.props.categories || null === this.props.categories || !this.props.categories.length) { return null; } let i = 0; let cats = []; while (i < this.props.categories.length) { cats.push( {this.props.categories[i].title} ); i += 1; } return