Repository navigation
Expand file tree
/
Copy pathpermissionsModel.ts
More file actions
70 lines (66 loc) · 2.32 KB
/
Copy pathpermissionsModel.ts
File metadata and controls
70 lines (66 loc) · 2.32 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
import { nanoid } from 'nanoid'
import Routes from '../@types/Routes'
import Share from '../@types/Share'
import { alertActionCreator as alert } from '../actions/alert'
import { clearActionCreator } from '../actions/clear'
import store from '../stores/app'
import storage from '../util/storage'
import timestamp from '../util/timestamp'
import { permissionsStore, persistPermissions } from './permissionsStore'
import db from './thoughtspace'
import { accessTokenLocal } from './thoughtspaceSession'
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const permissionsModel: { [key in keyof Routes['share']]: any } = {
add: ({ name, role }: Pick<Share, 'name' | 'role'>) => {
const accessToken = nanoid()
permissionsStore.update({
entries: {
...permissionsStore.getState().entries,
[accessToken]: {
created: timestamp(),
name: name || '',
role,
},
},
})
void persistPermissions()
store.dispatch(alert(`Added ${name ? `"${name}"` : 'device'}`))
return { accessToken }
},
delete: async (accessToken: string, { name }: { name?: string } = {}) => {
const prev = permissionsStore.getState().entries
const next = { ...prev }
delete next[accessToken]
permissionsStore.update({ entries: next })
await persistPermissions()
if (accessToken !== accessTokenLocal) {
store.dispatch(alert(`Removed ${name ? `"${name}"` : 'device'}`))
} else if (Object.keys(next).length > 1) {
store.dispatch([clearActionCreator(), alert(`Removed this device from the thoughtspace`)])
} else {
storage.clear()
await db.clear()
store.dispatch(clearActionCreator())
// TODO: Do a full reset without refreshing the page.
window.location.reload()
}
},
update: (accessToken: string, { name, role }: Share) => {
const entries = permissionsStore.getState().entries
const permission = entries[accessToken]!
permissionsStore.update({
entries: {
...entries,
[accessToken]: {
...(permission || null),
created: timestamp(),
...(name ? { name } : null),
...(role ? { role } : null),
},
},
})
void persistPermissions()
store.dispatch(alert(`${name ? ` "${name}"` : 'Device '} updated`))
},
}
export default permissionsModel