src/reopen-project-list-view.js

Summary

Maintainability
A
3 hrs
Test Coverage
const SelectListView = require('atom-select-list');

module.exports = class ReopenProjectListView {
  constructor(callback) {
    this.callback = callback;
    this.selectListView = new SelectListView({
      emptyMessage: 'No projects in history.',
      itemsClassList: ['mark-active'],
      items: [],
      filterKeyForItem: project => project.name,
      elementForItem: project => {
        let element = document.createElement('li');
        if (project.name === this.currentProjectName) {
          element.classList.add('active');
        }
        element.textContent = project.name;
        return element;
      },
      didConfirmSelection: project => {
        this.cancel();
        this.callback(project.value);
      },
      didCancelSelection: () => {
        this.cancel();
      }
    });
    this.selectListView.element.classList.add('reopen-project');
  }

  get element() {
    return this.selectListView.element;
  }

  dispose() {
    this.cancel();
    return this.selectListView.destroy();
  }

  cancel() {
    if (this.panel != null) {
      this.panel.destroy();
    }
    this.panel = null;
    this.currentProjectName = null;
    if (this.previouslyFocusedElement) {
      this.previouslyFocusedElement.focus();
      this.previouslyFocusedElement = null;
    }
  }

  attach() {
    this.previouslyFocusedElement = document.activeElement;
    if (this.panel == null) {
      this.panel = atom.workspace.addModalPanel({ item: this });
    }
    this.selectListView.focus();
    this.selectListView.reset();
  }

  async toggle() {
    if (this.panel != null) {
      this.cancel();
    } else {
      this.currentProjectName =
        atom.project != null ? this.makeName(atom.project.getPaths()) : null;
      const projects = atom.history
        .getProjects()
        .map(p => ({ name: this.makeName(p.paths), value: p.paths }));
      await this.selectListView.update({ items: projects });
      this.attach();
    }
  }

  makeName(paths) {
    return paths.join(', ');
  }
};