Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
m1k1o
GitHub Repository: m1k1o/neko
Path: blob/master/client/src/store/index.ts
1301 views
1
import Vue from 'vue'
2
import Vuex from 'vuex'
3
import { useAccessor, mutationTree, getterTree, actionTree } from 'typed-vuex'
4
import { EVENT } from '~/neko/events'
5
import { AdminLockResource } from '~/neko/messages'
6
import { get, set } from '~/utils/localstorage'
7
8
import * as video from './video'
9
import * as chat from './chat'
10
import * as files from './files'
11
import * as remote from './remote'
12
import * as user from './user'
13
import * as settings from './settings'
14
import * as client from './client'
15
import * as emoji from './emoji'
16
17
export const state = () => ({
18
displayname: get<string>('displayname', ''),
19
password: get<string>('password', ''),
20
active: false,
21
connecting: false,
22
connected: false,
23
locked: {} as Record<string, boolean>,
24
})
25
26
export const mutations = mutationTree(state, {
27
setActive(state) {
28
state.active = true
29
},
30
31
setLogin(state, { displayname, password }: { displayname: string; password: string }) {
32
state.displayname = displayname
33
state.password = password
34
},
35
36
setLocked(state, resource: string) {
37
Vue.set(state.locked, resource, true)
38
},
39
40
setUnlocked(state, resource: string) {
41
Vue.set(state.locked, resource, false)
42
},
43
44
setConnnecting(state) {
45
state.connected = false
46
state.connecting = true
47
},
48
49
setConnected(state, connected: boolean) {
50
state.connected = connected
51
state.connecting = false
52
if (connected) {
53
set('displayname', state.displayname)
54
set('password', state.password)
55
}
56
},
57
})
58
59
export const getters = getterTree(state, {
60
isLocked: (state) => (resource: AdminLockResource) => resource in state.locked && state.locked[resource],
61
})
62
63
export const actions = actionTree(
64
{ state, getters, mutations },
65
{
66
initialise() {
67
accessor.emoji.initialise()
68
accessor.settings.initialise()
69
},
70
71
lock(_, resource: AdminLockResource) {
72
if (!accessor.connected || !accessor.user.admin) {
73
return
74
}
75
76
$client.sendMessage(EVENT.ADMIN.LOCK, { resource })
77
},
78
79
unlock(_, resource: AdminLockResource) {
80
if (!accessor.connected || !accessor.user.admin) {
81
return
82
}
83
84
$client.sendMessage(EVENT.ADMIN.UNLOCK, { resource })
85
},
86
87
toggleLock(_, resource: AdminLockResource) {
88
if (accessor.isLocked(resource)) {
89
accessor.unlock(resource)
90
} else {
91
accessor.lock(resource)
92
}
93
},
94
95
login(store, { displayname, password }: { displayname: string; password: string }) {
96
accessor.setLogin({ displayname, password })
97
$client.login(password, displayname)
98
},
99
100
logout() {
101
accessor.setLogin({ displayname: '', password: '' })
102
set('displayname', '')
103
set('password', '')
104
$client.logout()
105
},
106
},
107
)
108
109
export const storePattern = {
110
state,
111
mutations,
112
actions,
113
getters,
114
modules: { video, chat, files, user, remote, settings, client, emoji },
115
}
116
117
Vue.use(Vuex)
118
119
const store = new Vuex.Store(storePattern)
120
export const accessor = useAccessor(store, storePattern)
121
122
Vue.prototype.$accessor = accessor
123
124
declare module 'vue/types/vue' {
125
interface Vue {
126
$accessor: typeof accessor
127
}
128
}
129
130
export default store
131
132