diff --git a/src/js/App.js b/src/js/App.js index 4660d0db..ed3f5b7a 100755 --- a/src/js/App.js +++ b/src/js/App.js @@ -94,6 +94,7 @@ export class App extends React.Component { && ( message.match(/Websocket/i) || message.match(/NotSupportedError/i) + || message.match(/NotSupportedError: The element has no supported sources./i) || message.match(/Non-Error promise rejection captured with keys: call, message, value/i) || message.match(/Cannot read property 'addChunk' of undefined/i) ) @@ -106,24 +107,30 @@ export class App extends React.Component { }); } - // Load query param settings - const configs = ['ui', 'spotify', 'pusher', 'snapcast', 'mopidy', 'google', 'lastfm', 'genius']; + // Accept incoming preconfiguration via URL parameters and inject into application state. + // For example: iris?snapcast={"enabled":true,"host":"myserver.local"} const params = new URLSearchParams(window.location.search); - const changed = []; - const urlParams = params.forEach((v, k) => { - if (!configs.includes(k)) return; - try { - storage.set(k, JSON.parse(v)); - changed.push(k); - } catch (error) { - console.error(error); - } - }); - if (changed.length > 0) { - changed.forEach((k) => params.delete(k)); - const url = window.location.toString().replace(window.location.search, params.toString()); - console.log(`Settings changed, redirecting to ${url}`, changed); - window.location.assign(url); + if (params) { + params.forEach((value, key) => { + try { + const json = JSON.parse(value); + switch (key) { + case 'ui': + case 'spotify': + case 'pusher': + case 'snapcast': + case 'mopidy': + this.props[`${key}Actions`].set(json); + changed.push(key); + break; + default: + break; + } + } catch (e) { + console.error('Preconfiguration failed', { e, key, value }) + return; + } + }); } this.handleInstallPrompt = this.handleInstallPrompt.bind(this); diff --git a/src/js/services/pusher/actions.js b/src/js/services/pusher/actions.js index da13b4d1..07e2794c 100755 --- a/src/js/services/pusher/actions.js +++ b/src/js/services/pusher/actions.js @@ -1,3 +1,10 @@ +export function set(data) { + return { + type: 'PUSHER_SET', + data, + }; +} + export function setPort(port) { return { type: 'PUSHER_SET_PORT', diff --git a/src/js/services/pusher/reducer.js b/src/js/services/pusher/reducer.js index 9c3467bd..58e98b8b 100755 --- a/src/js/services/pusher/reducer.js +++ b/src/js/services/pusher/reducer.js @@ -17,6 +17,9 @@ export default function reducer(pusher = {}, action) { case 'PUSHER_DISCONNECTED': return { ...pusher, connected: false, connecting: false }; + case 'PUSHER_SET': + return { ...pusher, ...action.data }; + case 'PUSHER_SET_PORT': return { ...pusher, port: action.port };