Upgrading preconfiguration to support redux

This commit is contained in:
James Barnsley
2021-10-02 20:17:23 +13:00
parent ced8a26635
commit 99a1629d8d
3 changed files with 34 additions and 17 deletions

View File

@ -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);

View File

@ -1,3 +1,10 @@
export function set(data) {
return {
type: 'PUSHER_SET',
data,
};
}
export function setPort(port) {
return {
type: 'PUSHER_SET_PORT',

View File

@ -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 };