blob: aee00312fdb1e34bd9dc209d7539e1124c2f58c6 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
var debug = require('debug')('reader:device');
var event = require('synthetic-dom-events');
var extend = require('xtend');
var hg = require('mercury');
var raf = require('raf');
var uuid = require('uuid').v4;
var window = require('global/window');
module.exports = {
state: state
};
function state(options, key) {
options = extend({
id: key || uuid(),
linked: true,
screen: {},
index: 0
}, options);
debug('init: %o', options);
var atom = hg.state({
id: hg.value(options.id),
linked: hg.value(options.linked),
index: hg.value(options.index),
current: hg.value(options.current || false),
type: hg.value(options.type),
alias: hg.value(options.alias),
arch: hg.value(options.arch),
screen: hg.struct({
width: hg.value(options.screen.width),
height: hg.value(options.screen.height)
})
});
if (atom.current()) {
// Fire the resize event just in case the size has changed since a previous
// value was stashed.
window.addEventListener('resize', resize(atom));
window.dispatchEvent(event('resize'));
}
return atom;
}
// HACK(jasoncampbell): I couldn't get this event plumbed into to
// state.channels.resize handler. This is a quick way to get an
// optimized resize listener around window resize events.
// SEE: https://developer.mozilla.org/en-US/docs/Web/Events/resize
//
// TODO(jasoncampbell): Make it so only the last resize event trigers the state
// update.
function resize(state) {
var running = false;
return function listener(event) {
if (! running) {
running = true;
raf(update);
}
};
function update() {
var width = window.innerWidth;
var height = window.innerHeight;
if (state.screen.width() !== width) {
state.screen.width.set(width);
}
if (state.screen.height() !== height) {
state.screen.height.set(height);
}
running = false;
}
}