'use strict'; const settings = require('../models/settings.js'); const views = require('../util/views.js'); const optimizedResize = require('../util/optimized_resize.js'); class PostContentControl { constructor(hostNode, post, viewportSizeCalculator) { this._post = post; this._viewportSizeCalculator = viewportSizeCalculator; this._hostNode = hostNode; this._template = views.getTemplate('post-content'); this._currentFitFunction = { 'fit-both': this.fitBoth, 'fit-original': this.fitOriginal, 'fit-width': this.fitWidth, 'fit-height': this.fitHeight, }[settings.get().fitMode] || this.fitBoth; this._install(); this._post.addEventListener( 'changeContent', e => this._evtPostContentChange(e)); } disableOverlay() { this._hostNode.querySelector('.post-overlay').style.display = 'none'; } fitWidth() { this._currentFitFunction = this.fitWidth; const mul = this._post.canvasHeight / this._post.canvasWidth; let width = this._viewportWidth; if (!settings.get().upscaleSmallPosts) { width = Math.min(this._post.canvasWidth, width); } this._resize(width, width * mul); } fitHeight() { this._currentFitFunction = this.fitHeight; const mul = this._post.canvasWidth / this._post.canvasHeight; let height = this._viewportHeight; if (!settings.get().upscaleSmallPosts) { height = Math.min(this._post.canvasHeight, height); } this._resize(height * mul, height); } fitBoth() { this._currentFitFunction = this.fitBoth; let mul = this._post.canvasHeight / this._post.canvasWidth; if (this._viewportWidth * mul < this._viewportHeight) { let width = this._viewportWidth; if (!settings.get().upscaleSmallPosts) { width = Math.min(this._post.canvasWidth, width); } this._resize(width, width * mul); } else { let height = this._viewportHeight; if (!settings.get().upscaleSmallPosts) { height = Math.min(this._post.canvasHeight, height); } this._resize(height / mul, height); } } fitOriginal() { this._currentFitFunction = this.fitOriginal; this._resize(this._post.canvasWidth, this._post.canvasHeight); } get _viewportWidth() { return this._viewportSizeCalculator()[0]; } get _viewportHeight() { return this._viewportSizeCalculator()[1]; } _evtPostContentChange(e) { this._post = e.detail.post; this._post.mutateContentUrl(); this._reinstall(); } _resize(width, height) { const resizeListenerNodes = [this._postContentNode].concat( ...this._postContentNode.querySelectorAll('.resize-listener')); for (let node of resizeListenerNodes) { node.style.width = width + 'px'; node.style.height = height + 'px'; } } _refreshSize() { this._currentFitFunction(); } _install() { this._reinstall(); optimizedResize.add(() => this._refreshSize()); views.monitorNodeRemoval( this._hostNode, () => { this._uninstall(); }); } _reinstall() { const newNode = this._template({ post: this._post, autoplay: settings.get().autoplayVideos, }); if (settings.get().transparencyGrid) { newNode.classList.add('transparency-grid'); } if (this._postContentNode) { this._hostNode.replaceChild(newNode, this._postContentNode); } else { this._hostNode.appendChild(newNode); } this._postContentNode = newNode; this._refreshSize(); } _uninstall() { optimizedResize.remove(() => this._refreshSize()); } } module.exports = PostContentControl;