piano/js/app.js

96 lines
2.3 KiB
JavaScript

/*jshint es5: true */
/*globals MIDI, React, App, $ */
/**
* app.js
*
* Bootstrap app:
* - connect to MIDI device;
* - config vendors;
* - instantiate main component;
* - integrate with shell.
*/
(function () {
'use strict';
var remote, ipc, shell;
// shell integration
if (window.atom) {
remote = window.atom.require('remote');
shell = window.atom.require('shell');
ipc = window.atom.require('ipc');
}
// configs
window.vex.defaultOptions.className = 'dialog-theme';
window.vex.dialog.buttons.YES.text = 'OK';
window.vex.dialog.buttons.NO.text = 'Annuler';
// bootstrap
function bootstrap() {
var main = React.renderComponent(
App.components.Main(),
$('#content')[0]
);
// we're ready to receive shell options
// and to show the window
if (ipc) {
ipc.send('ready');
ipc.on('options', function (options) {
main.setProps({
url: options.file
});
});
ipc.on('visible', function (state) {
if (state) {
main.resume();
} else {
main.halt();
}
});
window.onkeydown = function (e) {
if (e.keyCode === 123 && remote) {
remote.getCurrentWindow().toggleDevTools();
}
};
}
// handle links in default navigator, not in app
if (shell) {
$(document).on('click', 'a', function (e) {
shell.openExternal($(this).attr('href'));
e.preventDefault();
});
}
}
// on error, offer choice to retry or ignore
function error(err) {
var modal = App.components.Error({
title: "Erreur d'initialisation",
error: err,
canRetry: true,
onRetry: function () {
window.location.reload();
},
onClose: function () {
bootstrap();
}
});
ipc.send('ready');
modal.open();
}
// establish connection to MIDI device
App.MIDI.connect()
.then(bootstrap)
.catch(error);
}());