text: import Service, {inject as service} from '@ember/service';
  import {action, set} from '@ember/object';
  import {observes} from '@ember-decorators/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,user}', '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 || !this.session.user) {
              return;
          }
  
          let userSettings = JSON.parse(this.session.user.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 = this.session.user;
          let userSettings = JSON.parse(user.get('accessibility')) || {};
          userSettings.navigation = this.settings;
          user.set('accessibility', JSON.stringify(userSettings));
          return user.save();
      }
  }
  