/**
* Copyright (c) Nicolas Gallagher.
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
*/
import { canUseDOM } from 'fbjs/lib/ExecutionEnvironment';
import debounce from 'debounce';
import invariant from 'fbjs/lib/invariant';
const win = canUseDOM
? window
: {
devicePixelRatio: undefined,
innerHeight: undefined,
innerWidth: undefined,
screen: {
height: undefined,
width: undefined
}
};
const dimensions = {};
const listeners = {};
export default class Dimensions {
static get(dimension: string): Object {
invariant(dimensions[dimension], `No dimension set for key ${dimension}`);
return dimensions[dimension];
}
static set(initialDimensions: ?{ [key: string]: any }): void {
if (initialDimensions) {
if (canUseDOM) {
invariant(false, 'Dimensions cannot be set in the browser');
} else {
dimensions.screen = initialDimensions.screen;
dimensions.window = initialDimensions.window;
}
}
}
static _update() {
dimensions.window = {
fontScale: 1,
height: win.innerHeight,
scale: win.devicePixelRatio || 1,
width: win.innerWidth
};
dimensions.screen = {
fontScale: 1,
height: win.screen.height,
scale: win.devicePixelRatio || 1,
width: win.screen.width
};
if (Array.isArray(listeners['change'])) {
listeners['change'].forEach(handler => handler(dimensions));
}
}
static addEventListener(type: string, handler: Function): void {
listeners[type] = listeners[type] || [];
listeners[type].push(handler);
}
static removeEventListener(type: string, handler: Function): void {
if (Array.isArray(listeners[type])) {
listeners[type] = listeners[type].filter(_handler => _handler !== handler);
}
}
}
Dimensions._update();
if (canUseDOM) {
window.addEventListener('resize', debounce(Dimensions._update, 16), false);
}