diff --git a/web/.eslintrc.js b/web/.eslintrc.js index 0191731..1ffe66a 100644 --- a/web/.eslintrc.js +++ b/web/.eslintrc.js @@ -13,5 +13,5 @@ module.exports = { globals: { chrome: false, introJs: false - }, + } }; diff --git a/web/app/pods/components/lights-tab/component.js b/web/app/pods/components/lights-tab/component.js index c88ca4c..8906aa4 100644 --- a/web/app/pods/components/lights-tab/component.js +++ b/web/app/pods/components/lights-tab/component.js @@ -15,21 +15,21 @@ export default Component.extend({ // COLOR LOOP related stuff colorLoopOn: false, - lightsOnTxt: computed('lightsOn', function () { + lightsOnTxt: computed('lightsOn', function() { return this.get('lightsOn') ? 'On' : 'Off'; }), - colorloopOnTxt: computed('colorLoopOn', function () { + colorloopOnTxt: computed('colorLoopOn', function() { return this.get('colorLoopOn') ? 'On' : 'Off'; }), // determines the average brightness of the hue system for the brightness slider - lightsBrightness: computed('lightsData', 'activeLights.[]', function () { + lightsBrightness: computed('lightsData', 'activeLights.[]', function() { let lightsData = this.get('lightsData'), activeLights = this.get('activeLights'), lightsBrightness = 0; - activeLights.forEach(function (light) { + activeLights.forEach(function(light) { lightsBrightness += lightsData[light].state.bri; }); @@ -38,22 +38,22 @@ export default Component.extend({ brightnessControlDisabled: computed.not('lightsOn'), - onColorLoopOnChange: observer('colorLoopOn', function () { + onColorLoopOnChange: observer('colorLoopOn', function() { let lightsData = this.get('lightsData'), activeLights = this.get('activeLights'), colorLoopsOn = this.get('colorLoopOn'), effect = colorLoopsOn ? 'colorloop' : 'none'; - let colorLoopsOnSystem = activeLights.some(function (light) { + let colorLoopsOnSystem = activeLights.some(function(light) { return lightsData[light].state.effect === 'colorloop'; }); // if the internal lights state is different than the one from lightsData (user manually toggled the switch), send the request to change the bulbs state if (colorLoopsOn !== colorLoopsOnSystem) { - activeLights.forEach((light) => { + activeLights.forEach(light => { if (this.get('lightsData')[light].state.effect !== effect) { $.ajax(this.get('apiURL') + '/lights/' + light + '/state', { - data: JSON.stringify({ 'effect': effect }), + data: JSON.stringify({ effect: effect }), contentType: 'application/json', type: 'PUT' }); @@ -62,15 +62,15 @@ export default Component.extend({ } }), - rgbPreview: observer('rgb', function () { + rgbPreview: observer('rgb', function() { let rgb = this.get('rgb'), xy = rgbToCie(rgb[0], rgb[1], rgb[2]); this.set('colorLoopOn', false); - this.get('activeLights').forEach((light) => { + this.get('activeLights').forEach(light => { $.ajax(this.get('apiURL') + '/lights/' + light + '/state', { - data: JSON.stringify({ "xy": xy }), + data: JSON.stringify({ xy: xy }), contentType: 'application/json', type: 'PUT' }); @@ -80,59 +80,61 @@ export default Component.extend({ $('.color').css('background', 'rgb(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ')'); }), - onActiveLightsChange: on('init', observer('activeLights.[]', function () { + onActiveLightsChange: observer('activeLights.[]', function() { let lightsData = this.get('lightsData'), - xy = null, - setRGB = true; + activeLights = this.get('activeLights'), + xy = null; if (!isEmpty(lightsData)) { - this.get('activeLights').forEach((i) => { + activeLights.forEach(i => { let light = lightsData[i]; if (light && light.state && light.state.xy) { - if (xy !== null && xy[0] !== light.state.xy[0] && xy[1] !== light.state.xy[1]) { - setRGB = false; + if (xy === null) { + xy = [0, 0]; } - - xy = light.state.xy; + xy[0] += light.state.xy[0]; + xy[1] += light.state.xy[1]; } }); - if (setRGB && xy) { - let rgb = cieToRgb(xy[0], xy[1]); + if (xy) { + let rgb = cieToRgb(xy[0] / activeLights.length, xy[1] / activeLights.length); $('.color').css('background', 'rgb(' + Math.abs(rgb[0]) + ',' + Math.abs(rgb[1]) + ',' + Math.abs(rgb[2]) + ')'); - } else { - $('.color').css('background', 'rgb(' + 255 + ',' + 255 + ',' + 255 + ')'); } } - })), + }), // determines whether the lights are on/off for the lights switch - lightsOnChange: on('init', observer('lightsData.@each.state.on', 'activeLights.[]', function () { - if (!this.get('strobeOn')) { - let lightsData = this.get('lightsData'), lightsOn = this.get('activeLights').some(function (light) { - return lightsData[light].state.on === true; - }); + lightsOnChange: on( + 'init', + observer('lightsData.@each.state.on', 'activeLights.[]', function() { + if (!this.get('strobeOn')) { + let lightsData = this.get('lightsData'), + lightsOn = this.get('activeLights').some(function(light) { + return lightsData[light].state.on === true; + }); - this.set('lightsOn', lightsOn); - } - })), + this.set('lightsOn', lightsOn); + } + }) + ), - onLightsOnChange: observer('lightsOn', function () { + onLightsOnChange: observer('lightsOn', function() { let lightsData = this.get('lightsData'), activeLights = this.get('activeLights'), lightsOn = this.get('lightsOn'); - let lightsOnSystem = activeLights.some(function (light) { + let lightsOnSystem = activeLights.some(function(light) { return lightsData[light].state.on === true; }); // if the internal lights state is different than the one from lightsData (user manually toggled the switch), send the request to change the bulbs state if (lightsOn !== lightsOnSystem) { - activeLights.forEach((light) => { + activeLights.forEach(light => { $.ajax(this.get('apiURL') + '/lights/' + light + '/state', { - data: JSON.stringify({ "on": lightsOn }), + data: JSON.stringify({ on: lightsOn }), contentType: 'application/json', type: 'PUT' }); @@ -146,7 +148,7 @@ export default Component.extend({ lightsBrightness = this.get('lightsBrightness'), activeLights = this.get('activeLights'); - activeLights.forEach(function (light) { + activeLights.forEach(function(light) { lightsBrightnessSystem += lightsData[light].state.bri; }); @@ -154,9 +156,9 @@ export default Component.extend({ // if the internal lights state is different than the one from lightsData (user manually toggled the switch), send the request to change the bulbs state if (lightsBrightness !== lightsBrightnessSystem) { - activeLights.forEach((light) => { + activeLights.forEach(light => { $.ajax(this.get('apiURL') + '/lights/' + light + '/state', { - data: JSON.stringify({ "bri": lightsBrightness }), + data: JSON.stringify({ bri: lightsBrightness }), contentType: 'application/json', type: 'PUT' }); @@ -164,19 +166,20 @@ export default Component.extend({ } }, - onBrightnessChanged: observer('lightsBrightness', function () { + onBrightnessChanged: observer('lightsBrightness', function() { let activeLights = this.get('activeLights').length; - throttle(this, this.changeLightsBrightness, activeLights * 69); + throttle(this, this.changeLightsBrightness, activeLights * 69, false); }), // sync the current light settings to the newly added light - onaActiveLightsChange: observer('syncLight', function () { + onaActiveLightsChange: observer('syncLight', function() { let options = { - on: this.get('lightsOn'), - bri: this.get('lightsBrightness'), - effect: this.get('colorLoopOn') ? 'colorloop' : 'none' - }, rgb = this.get('rgb'), + on: this.get('lightsOn'), + bri: this.get('lightsBrightness'), + effect: this.get('colorLoopOn') ? 'colorloop' : 'none' + }, + rgb = this.get('rgb'), syncLight = this.get('syncLight'); if (rgb[0] !== 255 && rgb[1] !== 255 && rgb[2] !== 255) { @@ -192,6 +195,10 @@ export default Component.extend({ }); }), + didInsertElement() { + this.onActiveLightsChange(); + }, + // **************** STROBE LIGHT START **************** strobeOn: false, @@ -199,7 +206,7 @@ export default Component.extend({ preStrobeOnLightsDataCache: null, nextLightIdx: 0, - onStrobeOnChange: observer('strobeOn', function () { + onStrobeOnChange: observer('strobeOn', function() { let lightsData = this.get('lightsData'), strobeOn = this.get('strobeOn'); @@ -222,17 +229,19 @@ export default Component.extend({ } this.set('strobeOnInervalHandle', setInterval(this.strobeStep.bind(this), 500)); - } else { // revert the light system to pre-strobe - let preStrobeOnLightsDataCache = this.get('preStrobeOnLightsDataCache'), updateLight = (lightIndex) => { - $.ajax(this.get('apiURL') + '/lights/' + lightIndex + '/state', { - data: JSON.stringify({ - on: preStrobeOnLightsDataCache[lightIndex].state.on, - sat: preStrobeOnLightsDataCache[lightIndex].state.sat - }), - contentType: 'application/json', - type: 'PUT' - }); - }; + } else { + // revert the light system to pre-strobe + let preStrobeOnLightsDataCache = this.get('preStrobeOnLightsDataCache'), + updateLight = lightIndex => { + $.ajax(this.get('apiURL') + '/lights/' + lightIndex + '/state', { + data: JSON.stringify({ + on: preStrobeOnLightsDataCache[lightIndex].state.on, + sat: preStrobeOnLightsDataCache[lightIndex].state.sat + }), + contentType: 'application/json', + type: 'PUT' + }); + }; for (let key in lightsData) { if (lightsData.hasOwnProperty(key)) { @@ -263,7 +272,7 @@ export default Component.extend({ type: 'PUT' }); $.ajax(this.get('apiURL') + '/lights/' + nextStrobeLight + '/state', { - data: JSON.stringify({ 'on': false, 'transitiontime': 0 }), + data: JSON.stringify({ on: false, transitiontime: 0 }), contentType: 'application/json', type: 'PUT' }); @@ -271,11 +280,11 @@ export default Component.extend({ this.set('nextLightIdx', ++nextLightIdx); }, - strobeOnTxt: computed('strobeOn', function () { + strobeOnTxt: computed('strobeOn', function() { return this.get('strobeOn') ? 'On' : 'Off'; }), - dimmerOnClass: computed('dimmerOn', function () { + dimmerOnClass: computed('dimmerOn', function() { return this.get('dimmerOn') ? 'dimmerOn' : null; }), @@ -285,9 +294,11 @@ export default Component.extend({ }, randomizeHues() { - $('.dice').velocity({ scale: 1.10 }, 100).velocity({ scale: 1 }, 100); + $('.dice') + .velocity({ scale: 1.1 }, 100) + .velocity({ scale: 1 }, 100); - this.get('activeLights').forEach((light) => { + this.get('activeLights').forEach(light => { let options = { hue: Math.floor(Math.random() * 65535) }; if (this.get('lightsData')[light].state.on === false) { @@ -300,6 +311,10 @@ export default Component.extend({ type: 'PUT' }); }); + + later(() => { + this.onActiveLightsChange(); + }, 1000); } } }); diff --git a/web/app/pods/components/music-tab/mixins/helpers.js b/web/app/pods/components/music-tab/mixins/helpers.js index aaed46c..eeffd9f 100644 --- a/web/app/pods/components/music-tab/mixins/helpers.js +++ b/web/app/pods/components/music-tab/mixins/helpers.js @@ -349,7 +349,9 @@ export default Mixin.create({ this.set('blackoutMode', false); } - this.get('storage').set('huegasm.' + option, value); + if (!isNone(value)) { + this.get('storage').set('huegasm.' + option, value); + } }), onRepeatChange: on( diff --git a/web/yarn.lock b/web/yarn.lock index 5b719ab..9817cac 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -3,8 +3,8 @@ "@ember/test-helpers@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.1.tgz#14ba828ebc5b7b0e6eb7889352cb40af0c995349" + version "0.7.2" + resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.2.tgz#ca33170a5ce82bc921d7e84e4132aee425b7e67a" dependencies: broccoli-funnel "^2.0.1" ember-cli-babel "^6.8.1" @@ -2251,8 +2251,8 @@ ember-basic-dropdown@^0.34.0: ember-wormhole "^0.5.2" ember-cli-app-version@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-3.1.1.tgz#6be6a998b4887f79c7280729b7c77dc7821f18a7" + version "3.1.3" + resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-3.1.3.tgz#26d25f5e653ff0106f0b39da6d75518ba8ed282d" dependencies: ember-cli-babel "^6.8.0" git-repo-version "^1.0.0" @@ -5120,8 +5120,8 @@ micromatch@^2.1.5, micromatch@^2.3.7: regex-cache "^0.4.2" "mime-db@>= 1.30.0 < 2": - version "1.31.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.31.0.tgz#a49cd8f3ebf3ed1a482b60561d9105ad40ca74cb" + version "1.32.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" mime-db@~1.30.0: version "1.30.0"