feat(web): extract ui-services package
This commit is contained in:
@@ -0,0 +1,210 @@
|
||||
import { storage, StorageKey } from '@standardnotes/ui-services'
|
||||
import { WebApplication } from '@/Application/Application'
|
||||
import { AccountMenuController } from '@/Controllers/AccountMenu/AccountMenuController'
|
||||
import { destroyAllObjectProperties } from '@/Utils'
|
||||
import { ApplicationEvent, DeinitSource, WebOrDesktopDeviceInterface, InternalEventBus } from '@standardnotes/snjs'
|
||||
import { action, makeObservable, observable } from 'mobx'
|
||||
import { ActionsMenuController } from './ActionsMenuController'
|
||||
import { FeaturesController } from './FeaturesController'
|
||||
import { FilesController } from './FilesController'
|
||||
import { NotesController } from './NotesController'
|
||||
import { ItemListController } from './ItemList/ItemListController'
|
||||
import { NoteTagsController } from './NoteTagsController'
|
||||
import { NoAccountWarningController } from './NoAccountWarningController'
|
||||
import { PreferencesController } from './PreferencesController'
|
||||
import { PurchaseFlowController } from './PurchaseFlow/PurchaseFlowController'
|
||||
import { QuickSettingsController } from './QuickSettingsController'
|
||||
import { SearchOptionsController } from './SearchOptionsController'
|
||||
import { SubscriptionController } from './Subscription/SubscriptionController'
|
||||
import { SyncStatusController } from './SyncStatusController'
|
||||
import { NavigationController } from './Navigation/NavigationController'
|
||||
import { FilePreviewModalController } from './FilePreviewModalController'
|
||||
import { SelectedItemsController } from './SelectedItemsController'
|
||||
import { HistoryModalController } from './NoteHistory/HistoryModalController'
|
||||
|
||||
export class ViewControllerManager {
|
||||
readonly enableUnfinishedFeatures: boolean = window?.enabledUnfinishedFeatures
|
||||
|
||||
private unsubAppEventObserver!: () => void
|
||||
showBetaWarning: boolean
|
||||
public dealloced = false
|
||||
|
||||
readonly accountMenuController: AccountMenuController
|
||||
readonly actionsMenuController = new ActionsMenuController()
|
||||
readonly featuresController: FeaturesController
|
||||
readonly filePreviewModalController = new FilePreviewModalController()
|
||||
readonly filesController: FilesController
|
||||
readonly noAccountWarningController: NoAccountWarningController
|
||||
readonly notesController: NotesController
|
||||
readonly itemListController: ItemListController
|
||||
readonly noteTagsController: NoteTagsController
|
||||
readonly preferencesController = new PreferencesController()
|
||||
readonly purchaseFlowController: PurchaseFlowController
|
||||
readonly quickSettingsMenuController = new QuickSettingsController()
|
||||
readonly searchOptionsController: SearchOptionsController
|
||||
readonly subscriptionController: SubscriptionController
|
||||
readonly syncStatusController = new SyncStatusController()
|
||||
readonly navigationController: NavigationController
|
||||
readonly selectionController: SelectedItemsController
|
||||
readonly historyModalController: HistoryModalController
|
||||
|
||||
public isSessionsModalVisible = false
|
||||
|
||||
private appEventObserverRemovers: (() => void)[] = []
|
||||
private eventBus: InternalEventBus
|
||||
|
||||
constructor(public application: WebApplication, private device: WebOrDesktopDeviceInterface) {
|
||||
this.eventBus = new InternalEventBus()
|
||||
|
||||
this.selectionController = new SelectedItemsController(application, this.eventBus)
|
||||
|
||||
this.noteTagsController = new NoteTagsController(application, this.eventBus)
|
||||
|
||||
this.featuresController = new FeaturesController(application, this.eventBus)
|
||||
|
||||
this.navigationController = new NavigationController(application, this.featuresController, this.eventBus)
|
||||
|
||||
this.notesController = new NotesController(
|
||||
application,
|
||||
this.selectionController,
|
||||
this.noteTagsController,
|
||||
this.navigationController,
|
||||
this.eventBus,
|
||||
)
|
||||
|
||||
this.searchOptionsController = new SearchOptionsController(application, this.eventBus)
|
||||
|
||||
this.itemListController = new ItemListController(
|
||||
application,
|
||||
this.navigationController,
|
||||
this.searchOptionsController,
|
||||
this.selectionController,
|
||||
this.notesController,
|
||||
this.noteTagsController,
|
||||
this.eventBus,
|
||||
)
|
||||
|
||||
this.notesController.setServicesPostConstruction(this.itemListController)
|
||||
this.noteTagsController.setServicesPostConstruction(this.itemListController)
|
||||
this.selectionController.setServicesPostConstruction(this.itemListController)
|
||||
|
||||
this.noAccountWarningController = new NoAccountWarningController(application, this.eventBus)
|
||||
|
||||
this.accountMenuController = new AccountMenuController(application, this.eventBus)
|
||||
|
||||
this.subscriptionController = new SubscriptionController(application, this.eventBus)
|
||||
|
||||
this.purchaseFlowController = new PurchaseFlowController(application, this.eventBus)
|
||||
|
||||
this.filesController = new FilesController(
|
||||
application,
|
||||
this.notesController,
|
||||
this.filePreviewModalController,
|
||||
this.eventBus,
|
||||
)
|
||||
|
||||
this.historyModalController = new HistoryModalController(this.application, this.eventBus)
|
||||
|
||||
this.addAppEventObserver()
|
||||
|
||||
if (this.device.appVersion.includes('-beta')) {
|
||||
this.showBetaWarning = storage.get(StorageKey.ShowBetaWarning) ?? true
|
||||
} else {
|
||||
this.showBetaWarning = false
|
||||
}
|
||||
|
||||
makeObservable(this, {
|
||||
showBetaWarning: observable,
|
||||
isSessionsModalVisible: observable,
|
||||
preferencesController: observable,
|
||||
|
||||
openSessionsModal: action,
|
||||
closeSessionsModal: action,
|
||||
})
|
||||
}
|
||||
|
||||
deinit(source: DeinitSource): void {
|
||||
this.dealloced = true
|
||||
;(this.application as unknown) = undefined
|
||||
|
||||
if (source === DeinitSource.SignOut) {
|
||||
storage.remove(StorageKey.ShowBetaWarning)
|
||||
this.noAccountWarningController.reset()
|
||||
}
|
||||
|
||||
this.unsubAppEventObserver?.()
|
||||
;(this.unsubAppEventObserver as unknown) = undefined
|
||||
|
||||
this.appEventObserverRemovers.forEach((remover) => remover())
|
||||
this.appEventObserverRemovers.length = 0
|
||||
;(this.device as unknown) = undefined
|
||||
;(this.filePreviewModalController as unknown) = undefined
|
||||
;(this.preferencesController as unknown) = undefined
|
||||
;(this.quickSettingsMenuController as unknown) = undefined
|
||||
;(this.syncStatusController as unknown) = undefined
|
||||
|
||||
this.actionsMenuController.reset()
|
||||
;(this.actionsMenuController as unknown) = undefined
|
||||
|
||||
this.featuresController.deinit()
|
||||
;(this.featuresController as unknown) = undefined
|
||||
|
||||
this.accountMenuController.deinit()
|
||||
;(this.accountMenuController as unknown) = undefined
|
||||
|
||||
this.filesController.deinit()
|
||||
;(this.filesController as unknown) = undefined
|
||||
|
||||
this.noAccountWarningController.deinit()
|
||||
;(this.noAccountWarningController as unknown) = undefined
|
||||
|
||||
this.notesController.deinit()
|
||||
;(this.notesController as unknown) = undefined
|
||||
|
||||
this.itemListController.deinit()
|
||||
;(this.itemListController as unknown) = undefined
|
||||
|
||||
this.noteTagsController.deinit()
|
||||
;(this.noteTagsController as unknown) = undefined
|
||||
|
||||
this.purchaseFlowController.deinit()
|
||||
;(this.purchaseFlowController as unknown) = undefined
|
||||
|
||||
this.searchOptionsController.deinit()
|
||||
;(this.searchOptionsController as unknown) = undefined
|
||||
|
||||
this.subscriptionController.deinit()
|
||||
;(this.subscriptionController as unknown) = undefined
|
||||
|
||||
this.navigationController.deinit()
|
||||
;(this.navigationController as unknown) = undefined
|
||||
|
||||
this.historyModalController.deinit()
|
||||
;(this.historyModalController as unknown) = undefined
|
||||
|
||||
destroyAllObjectProperties(this)
|
||||
}
|
||||
|
||||
openSessionsModal(): void {
|
||||
this.isSessionsModalVisible = true
|
||||
}
|
||||
|
||||
closeSessionsModal(): void {
|
||||
this.isSessionsModalVisible = false
|
||||
}
|
||||
|
||||
addAppEventObserver() {
|
||||
this.unsubAppEventObserver = this.application.addEventObserver(async (eventName) => {
|
||||
switch (eventName) {
|
||||
case ApplicationEvent.Launched:
|
||||
if (window.location.search.includes('purchase=true')) {
|
||||
this.purchaseFlowController.openPurchaseFlow()
|
||||
}
|
||||
break
|
||||
case ApplicationEvent.SyncStatusChanged:
|
||||
this.syncStatusController.update(this.application.sync.getSyncStatus())
|
||||
break
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user