-
-
Notifications
You must be signed in to change notification settings - Fork 530
Expand file tree
/
Copy pathPreferencesSessionController.ts
More file actions
124 lines (105 loc) · 3.83 KB
/
PreferencesSessionController.ts
File metadata and controls
124 lines (105 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import { action, makeAutoObservable, observable } from 'mobx'
import { WebApplication } from '@/Application/WebApplication'
import { PackageProvider } from '../Panes/Plugins/PackageProvider'
import { securityPrefsHasBubble } from '../Panes/Security/securityPrefsHasBubble'
import { PreferencePaneId, StatusServiceEvent } from '@standardnotes/services'
import { isDesktopApplication } from '@/Utils'
import { PreferencesMenuItem } from './PreferencesMenuItem'
import { SelectableMenuItem } from './SelectableMenuItem'
import { PREFERENCES_MENU_ITEMS, READY_PREFERENCES_MENU_ITEMS } from './MenuItems'
/**
* Unlike PreferencesController, the PreferencesSessionController is ephemeral and bound to a single opening of the
* Preferences menu. It is created and destroyed each time the menu is opened and closed.
*/
export class PreferencesSessionController {
private _selectedPane: PreferencePaneId = PreferencePaneId.Account
private _menu: PreferencesMenuItem[]
private _extensionLatestVersions: PackageProvider = new PackageProvider(new Map())
constructor(
private application: WebApplication,
private readonly _enableUnfinishedFeatures: boolean,
) {
const menuItems = this._enableUnfinishedFeatures
? PREFERENCES_MENU_ITEMS.slice()
: READY_PREFERENCES_MENU_ITEMS.slice()
if (application.featuresController.isVaultsEnabled()) {
menuItems.push({ id: PreferencePaneId.Vaults, label: 'Vaults', icon: 'safe-square', order: 5 })
}
if (isDesktopApplication()) {
menuItems.push({ id: PreferencePaneId.HomeServer, label: 'Home Server', icon: 'server', order: 5 })
}
this._menu = menuItems.sort((a, b) => a.order - b.order)
this.loadLatestVersions()
makeAutoObservable<
PreferencesSessionController,
| '_selectedPane'
| '_twoFactorAuth'
| '_extensionPanes'
| '_extensionLatestVersions'
| 'loadLatestVersions'
| 'updateMenuBubbleCounts'
>(this, {
_twoFactorAuth: observable,
_selectedPane: observable,
_extensionPanes: observable.ref,
_extensionLatestVersions: observable.ref,
loadLatestVersions: action,
updateMenuBubbleCounts: action,
})
this.application.status.addEventObserver((event) => {
if (event === StatusServiceEvent.PreferencesBubbleCountChanged) {
this.updateMenuBubbleCounts()
}
})
}
private updateMenuBubbleCounts(): void {
this._menu = this._menu.map((item) => {
return {
...item,
bubbleCount: this.application.status.getPreferencesBubbleCount(item.id),
}
})
}
private loadLatestVersions(): void {
PackageProvider.load()
.then((versions) => {
if (versions) {
this._extensionLatestVersions = versions
}
})
.catch(console.error)
}
get extensionsLatestVersions(): PackageProvider {
return this._extensionLatestVersions
}
get menuItems(): SelectableMenuItem[] {
const menuItems = this._menu.map((preference) => {
const item: SelectableMenuItem = {
...preference,
selected: preference.id === this._selectedPane,
bubbleCount: this.application.status.getPreferencesBubbleCount(preference.id),
hasErrorIndicator: this.sectionHasBubble(preference.id),
}
return item
})
return menuItems
}
get selectedMenuItem(): PreferencesMenuItem | undefined {
return this._menu.find((item) => item.id === this._selectedPane)
}
get selectedPaneId(): PreferencePaneId {
if (this.selectedMenuItem != undefined) {
return this.selectedMenuItem.id
}
return PreferencePaneId.Account
}
selectPane = (key: PreferencePaneId) => {
this._selectedPane = key
}
sectionHasBubble(id: PreferencePaneId): boolean {
if (id === PreferencePaneId.Security) {
return securityPrefsHasBubble(this.application)
}
return false
}
}