// @flow import { FLOATING_PLAYER_CLASS } from './view'; export function getRootEl() { return document && document.documentElement; } export function getScreenWidth() { const rootEl = getRootEl(); return rootEl ? rootEl.clientWidth : window.innerWidth; } export function getScreenHeight() { const rootEl = getRootEl(); return rootEl ? rootEl.clientHeight : window.innerHeight; } export function getFloatingPlayerRect() { const elem = document.querySelector(`.${FLOATING_PLAYER_CLASS}`); return elem ? elem.getBoundingClientRect() : null; } export function clampFloatingPlayerToScreen(x: number, y: number) { const playerRect = getFloatingPlayerRect(); let newX = x; let newY = y; if (playerRect) { const screenW = getScreenWidth(); const screenH = getScreenHeight(); if (x + playerRect.width > screenW) { newX = screenW - playerRect.width; } else if (x < 0) { newX = 0; } if (y + playerRect.height > screenH) { newY = screenH - playerRect.height; } else if (y < 0) { newY = 0; } } return { x: newX, y: newY }; } export function calculateRelativePos(x: number, y: number) { return { x: x / getScreenWidth(), y: y / getScreenHeight(), }; } // Max landscape height = calculates the maximum size the player would be at // if it was at landscape aspect ratio export function getMaxLandscapeHeight(width?: number) { const windowWidth = width || getScreenWidth(); const maxLandscapeHeight = (windowWidth * 9) / 16; return maxLandscapeHeight; } // If a video is higher than landscape, this calculates how much is needed in order // for the video to be centered in a container at the landscape height export function getAmountNeededToCenterVideo(height: number, fromValue: number) { const minVideoHeight = getMaxLandscapeHeight(); const timesHigherThanLandscape = height / minVideoHeight; const amountNeededToCenter = (height - fromValue) / timesHigherThanLandscape; return amountNeededToCenter * -1; } export function getPossiblePlayerHeight(height: number, isMobile: boolean) { // min player height = landscape size based on screen width (only for mobile, since // comment expansion will default to landscape view height) const minHeight = getMaxLandscapeHeight(); const maxPercentOfScreen = isMobile ? 70 : 80; // max player height const maxHeight = (getScreenHeight() * maxPercentOfScreen) / 100; const forceMaxHeight = height < maxHeight ? height : maxHeight; const forceMinHeight = isMobile && height < minHeight ? minHeight : forceMaxHeight; return forceMinHeight; } export function getWindowAngle(cb?: () => void) { // iOS if (typeof window.orientation === 'number') { return window.orientation; } // Android if (screen && screen.orientation && screen.orientation.angle) { return window.orientation; } if (cb) cb(); return 0; } export function isWindowLandscapeForAngle(angle: number) { return angle === 90 || angle === 270 || angle === -90; }