diff --git a/src/api/endpoints/i/update_home.ts b/src/api/endpoints/i/update_home.ts index b9a7642b8e..429e88529a 100644 --- a/src/api/endpoints/i/update_home.ts +++ b/src/api/endpoints/i/update_home.ts @@ -15,7 +15,7 @@ import User from '../../models/user'; */ module.exports = async (params, user, _, isSecure) => new Promise(async (res, rej) => { // Get 'home' parameter - const [home, homeErr] = $(params.home).array().each( + const [home, homeErr] = $(params.home).optional.array().each( $().strict.object() .have('name', $().string()) .have('id', $().string()) @@ -23,12 +23,38 @@ module.exports = async (params, user, _, isSecure) => new Promise(async (res, re .have('data', $().object())).$; if (homeErr) return rej('invalid home param'); - await User.update(user._id, { - $set: { - 'client_settings.home': home - } - }); + // Get 'id' parameter + const [id, idErr] = $(params.id).optional.string().$; + if (idErr) return rej('invalid id param'); - // Send response - res(); + // Get 'data' parameter + const [data, dataErr] = $(params.data).optional.object().$; + if (dataErr) return rej('invalid data param'); + + if (home) { + await User.update(user._id, { + $set: { + 'client_settings.home': home + } + }); + + res(); + } else { + if (id == null && data == null) return rej('you need to set id and data params if home param unset'); + + const _home = user.client_settings.home; + const widget = _home.find(w => w.id == id); + + if (widget == null) return rej('widget not found'); + + widget.data = data; + + await User.update(user._id, { + $set: { + 'client_settings.home': _home + } + }); + + res(); + } }); diff --git a/src/web/app/desktop/tags/home-widgets/activity.tag b/src/web/app/desktop/tags/home-widgets/activity.tag index 7bdcd334c9..00cf4ea20b 100644 --- a/src/web/app/desktop/tags/home-widgets/activity.tag +++ b/src/web/app/desktop/tags/home-widgets/activity.tag @@ -73,10 +73,13 @@ if (this.view == 2) this.view = 0; // Save view state - this.I.client_settings.home.filter(w => w.id == this.opts.id)[0].data.view = this.view; this.api('i/update_home', { - home: this.I.client_settings.home + id: this.opts.id, + data: { + view: this.view + } }).then(() => { + this.I.client_settings.home.find(w => w.id == this.opts.id).data.view = this.view; this.I.update(); }); }; diff --git a/src/web/app/desktop/tags/home-widgets/channel.tag b/src/web/app/desktop/tags/home-widgets/channel.tag index 79b57a1e8a..2c2b6e7fe3 100644 --- a/src/web/app/desktop/tags/home-widgets/channel.tag +++ b/src/web/app/desktop/tags/home-widgets/channel.tag @@ -83,10 +83,13 @@ this.zap(); // Save state - this.I.client_settings.home.filter(w => w.id == this.opts.id)[0].data.channel = this.channelId; this.api('i/update_home', { - home: this.I.client_settings.home + id: this.opts.id, + data: { + channel: this.channelId + } }).then(() => { + this.I.client_settings.home.find(w => w.id == this.opts.id).data.channel = this.channelId; this.I.update(); }); }; diff --git a/src/web/app/desktop/tags/home-widgets/server.tag b/src/web/app/desktop/tags/home-widgets/server.tag index 235867c38a..f4e38aea56 100644 --- a/src/web/app/desktop/tags/home-widgets/server.tag +++ b/src/web/app/desktop/tags/home-widgets/server.tag @@ -81,10 +81,13 @@ if (this.view == 6) this.view = 0; // Save view state - this.I.client_settings.home.filter(w => w.id == this.opts.id)[0].data.view = this.view; this.api('i/update_home', { - home: this.I.client_settings.home + id: this.opts.id, + data: { + view: this.view + } }).then(() => { + this.I.client_settings.home.find(w => w.id == this.opts.id).data.view = this.view; this.I.update(); }); }; diff --git a/src/web/app/desktop/tags/home-widgets/slideshow.tag b/src/web/app/desktop/tags/home-widgets/slideshow.tag index aa1e45fad3..9d2c06a272 100644 --- a/src/web/app/desktop/tags/home-widgets/slideshow.tag +++ b/src/web/app/desktop/tags/home-widgets/slideshow.tag @@ -88,14 +88,7 @@ if (this.size == 2) this.size = 0; this.applySize(); - - // Save state - this.I.client_settings.home.filter(w => w.id == this.opts.id)[0].data.size = this.size; - this.api('i/update_home', { - home: this.I.client_settings.home - }).then(() => { - this.I.update(); - }); + this.save(); }; this.change = () => { @@ -147,14 +140,23 @@ i.one('selected', folder => { this.folder = folder ? folder.id : null; this.fetch(); + this.save(); + }); + }; - // Save state - this.I.client_settings.home.filter(w => w.id == this.opts.id)[0].data.folder = this.folder; - this.api('i/update_home', { - home: this.I.client_settings.home - }).then(() => { - this.I.update(); - }); + this.save = () => { + // Save state + this.api('i/update_home', { + id: this.opts.id, + data: { + folder: this.folder, + size: this.size + } + }).then(() => { + const w = this.I.client_settings.home.find(w => w.id == this.opts.id); + w.data.folder = this.folder; + w.data.size = this.size; + this.I.update(); }); };