mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-01 13:54:35 +03:00
481bdfbe1a
no issue - if `user.accessibility` is `null` as it is for newly created users then toggling the expansion state of custom views menus failed to save because we were assuming there was an object available
61 lines
1.9 KiB
JavaScript
61 lines
1.9 KiB
JavaScript
import Service from '@ember/service';
|
|
import {action} from '@ember/object';
|
|
import {observes} from '@ember-decorators/object';
|
|
import {inject as service} from '@ember/service';
|
|
import {set} from '@ember/object';
|
|
import {tracked} from '@glimmer/tracking';
|
|
|
|
const DEFAULT_SETTINGS = {
|
|
expanded: {
|
|
posts: true
|
|
}
|
|
};
|
|
|
|
export default class NavigationService extends Service {
|
|
@service session;
|
|
|
|
@tracked settings;
|
|
|
|
constructor() {
|
|
super(...arguments);
|
|
this.settings = Object.assign({}, DEFAULT_SETTINGS);
|
|
this.updateSettings();
|
|
}
|
|
|
|
// eslint-disable-next-line ghost/ember/no-observers
|
|
@observes('session.isAuthenticated', 'session.user.accessibility')
|
|
async updateSettings() {
|
|
// avoid fetching user before authenticated otherwise the 403 can fire
|
|
// during authentication and cause errors during setup/signin
|
|
if (!this.session.isAuthenticated) {
|
|
return;
|
|
}
|
|
|
|
let user = await this.session.user;
|
|
let userSettings = JSON.parse(user.get('accessibility')) || {};
|
|
this.settings = userSettings.navigation || Object.assign({}, DEFAULT_SETTINGS);
|
|
}
|
|
|
|
@action
|
|
async toggleExpansion(key) {
|
|
if (!this.settings.expanded) {
|
|
this.settings.expanded = {};
|
|
}
|
|
|
|
// set is still needed here because we're not tracking deep keys
|
|
// and Ember picks up that our templates are dependent on them and
|
|
// complains. TODO: can we avoid set?
|
|
set(this.settings.expanded, key, !this.settings.expanded[key]);
|
|
|
|
return await this._saveNavigationSettings();
|
|
}
|
|
|
|
async _saveNavigationSettings() {
|
|
let user = await this.session.user;
|
|
let userSettings = JSON.parse(user.get('accessibility')) || {};
|
|
userSettings.navigation = this.settings;
|
|
user.set('accessibility', JSON.stringify(userSettings));
|
|
return user.save();
|
|
}
|
|
}
|