import Em from 'ember'; export default Em.Component.extend({ classNames: ['container-fluid'], elementId: 'hueControls', bridgeIp: null, manualBridgeIp: null, bridgeUsername: null, updateGroupsData: true, groupsData: null, lightsData: null, activeLights: [], actions: { changeTab(tabName){ var index = this.get('tabList').indexOf(tabName); this.set('selectedTab', index); this.get('storage').set('huegasm.selectedTab', index); }, clearBridge() { var storage = this.get('storage'); storage.remove('huegasm.bridgeUsername'); storage.remove('huegasm.bridgeIp'); location.reload(); }, clearAllSettings() { this.get('storage').clear(); location.reload(); } }, apiURL: function(){ return 'http://' + this.get('bridgeIp') + '/api/' + this.get('bridgeUsername'); }.property('bridgeIp', 'bridgeUsername'), didInsertElement(){ // here's a weird way to automatically initialize bootstrap tooltips var observer = new MutationObserver(function(mutations) { var haveTooltip = !mutations.every(function(mutation) { return Em.isEmpty(mutation.addedNodes) || Em.isNone(mutation.addedNodes[0].classList) || mutation.addedNodes[0].classList.contains('tooltip'); }); if(haveTooltip) { Em.run.once(this, function(){ Em.$('.bootstrapTooltip').tooltip(); }); } }); observer.observe(Em.$('#hueControls')[0], {childList: true, subtree: true}); }, init() { this._super(); if(!this.get('trial')) { this.doUpdateGroupsData(); this.set('lightsDataIntervalHandle', setInterval(this.updateLightData.bind(this), 1000)); } if (!Em.isNone(this.get('storage').get('huegasm.selectedTab'))) { this.set('selectedTab', this.get('storage').get('huegasm.selectedTab')); } }, onUpdateGroupsDataChange: function(){ if(this.get('updateGroupsData')){ var self = this; setTimeout(function(){ self.doUpdateGroupsData(); }, 1000); } }.observes('updateGroupsData'), doUpdateGroupsData(){ var self = this; Em.$.get(this.get('apiURL') + '/groups', function (result, status) { if (status === 'success' ) { self.set('groupsData', result); } }); this.toggleProperty('updateGroupsData'); }, tabList: ["Lights", "Music"], selectedTab: 1, tabData: function(){ var tabData = [], selectedTab = this.get('selectedTab'); this.get('tabList').forEach(function(tab, i){ var selected = false; if(i === selectedTab){ selected = true; } tabData.push({"name": tab, "selected": selected }); }); return tabData; }.property('tabList', 'selectedTab'), lightsTabSelected: Em.computed.equal('selectedTab', 0), musicTabSelected: Em.computed.equal('selectedTab', 1), pauseLightUpdates: false, updateLightData(){ var self = this, fail = function() { clearInterval(self.get('lightsDataIntervalHandle')); self.setProperties({ bridgeIp: null, bridgeUsername: null }); }; if(!this.get('pauseLightUpdates')){ Em.$.get(this.get('apiURL') + '/lights', function (result, status) { if(!Em.isNone(result[0]) && !Em.isNone(result[0].error)){ fail(); } else if (status === 'success' && JSON.stringify(self.get('lightsData')) !== JSON.stringify(result)) { self.set('lightsData', result); } }).fail(fail); } }, dimmerOnClass: function(){ return this.get('dimmerOn') ? 'dimmerOn' : null; }.property('dimmerOn'), ready: function() { return this.get('trial') || !Em.isNone(this.get('lightsData')); }.property('lightsData', 'trial') });