Files
standardnotes-app-web/app/assets/javascripts/ui_models/note_controller_group.ts

85 lines
2.0 KiB
TypeScript

import { removeFromArray, UuidString } from '@standardnotes/snjs';
import { NoteController } from './note_controller';
import { WebApplication } from './application';
type NoteControllerGroupChangeCallback = () => void;
export class NoteControllerGroup {
public noteControllers: NoteController[] = [];
private application: WebApplication;
changeObservers: NoteControllerGroupChangeCallback[] = [];
constructor(application: WebApplication) {
this.application = application;
}
public deinit() {
(this.application as unknown) = undefined;
for (const controller of this.noteControllers) {
this.deleteController(controller);
}
}
async createNoteController(
noteUuid?: string,
noteTitle?: string,
noteTag?: UuidString
) {
const controller = new NoteController(
this.application,
noteUuid,
noteTitle,
noteTag
);
await controller.initialize();
this.noteControllers.push(controller);
this.notifyObservers();
}
deleteController(controller: NoteController) {
controller.deinit();
removeFromArray(this.noteControllers, controller);
}
closeController(controller: NoteController) {
this.deleteController(controller);
this.notifyObservers();
}
closeActiveController() {
const activeController = this.activeNoteController;
if (activeController) {
this.deleteController(activeController);
}
}
closeAllControllers() {
for (const controller of this.noteControllers) {
this.deleteController(controller);
}
}
get activeNoteController() {
return this.noteControllers[0];
}
/**
* Notifies observer when the active controller has changed.
*/
public addChangeObserver(callback: NoteControllerGroupChangeCallback) {
this.changeObservers.push(callback);
if (this.activeNoteController) {
callback();
}
return () => {
removeFromArray(this.changeObservers, callback);
};
}
private notifyObservers() {
for (const observer of this.changeObservers) {
observer();
}
}
}