Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
m1k1o
GitHub Repository: m1k1o/neko
Path: blob/master/client/src/store/remote.ts
1301 views
1
import { getterTree, mutationTree, actionTree } from 'typed-vuex'
2
import { Member } from '~/neko/types'
3
import { EVENT } from '~/neko/events'
4
import { accessor } from '~/store'
5
6
const keyboardModifierState = (capsLock: boolean, numLock: boolean, scrollLock: boolean) =>
7
Number(capsLock) + 2 * Number(numLock) + 4 * Number(scrollLock)
8
9
export const namespaced = true
10
11
export const state = () => ({
12
id: '',
13
clipboard: '',
14
locked: false,
15
implicitHosting: true,
16
fileTransfer: true,
17
keyboardModifierState: -1,
18
})
19
20
export const getters = getterTree(state, {
21
controlling: (state, getters, root) => {
22
return root.user.id === state.id
23
},
24
hosting: (state, getters, root) => {
25
return root.user.id === state.id || state.implicitHosting
26
},
27
hosted: (state) => {
28
return state.id !== '' || state.implicitHosting
29
},
30
host: (state, getters, root) => {
31
return root.user.members[state.id] || (state.implicitHosting && root.user.id) || null
32
},
33
})
34
35
export const mutations = mutationTree(state, {
36
setHost(state, host: string | Member) {
37
if (typeof host === 'string') {
38
state.id = host
39
} else {
40
state.id = host.id
41
}
42
},
43
44
setClipboard(state, clipboard: string) {
45
state.clipboard = clipboard
46
},
47
48
setKeyboardModifierState(state, { capsLock, numLock, scrollLock }) {
49
state.keyboardModifierState = keyboardModifierState(capsLock, numLock, scrollLock)
50
},
51
52
setLocked(state, locked: boolean) {
53
state.locked = locked
54
},
55
56
setImplicitHosting(state, val: boolean) {
57
state.implicitHosting = val
58
},
59
60
setFileTransfer(state, val: boolean) {
61
state.fileTransfer = val
62
},
63
64
reset(state) {
65
state.id = ''
66
state.clipboard = ''
67
state.locked = false
68
},
69
})
70
71
export const actions = actionTree(
72
{ state, getters, mutations },
73
{
74
sendClipboard({ getters }, clipboard: string) {
75
if (!accessor.connected || !getters.hosting) {
76
return
77
}
78
79
$client.sendMessage(EVENT.CONTROL.CLIPBOARD, { text: clipboard })
80
},
81
82
toggle({ getters }) {
83
if (!accessor.connected) {
84
return
85
}
86
87
if (!getters.hosting) {
88
$client.sendMessage(EVENT.CONTROL.REQUEST)
89
} else {
90
$client.sendMessage(EVENT.CONTROL.RELEASE)
91
}
92
},
93
94
request({ getters }) {
95
if (!accessor.connected || getters.controlling) {
96
return
97
}
98
99
$client.sendMessage(EVENT.CONTROL.REQUEST)
100
},
101
102
release({ getters }) {
103
if (!accessor.connected || !getters.hosting) {
104
return
105
}
106
107
$client.sendMessage(EVENT.CONTROL.RELEASE)
108
},
109
110
give({ getters }, member: string | Member) {
111
if (!accessor.connected || !getters.hosting) {
112
return
113
}
114
115
if (typeof member === 'string') {
116
member = accessor.user.members[member]
117
}
118
119
if (!member) {
120
return
121
}
122
123
$client.sendMessage(EVENT.CONTROL.GIVE, { id: member.id })
124
},
125
126
adminControl() {
127
if (!accessor.connected || !accessor.user.admin) {
128
return
129
}
130
131
$client.sendMessage(EVENT.ADMIN.CONTROL)
132
},
133
134
adminRelease() {
135
if (!accessor.connected || !accessor.user.admin) {
136
return
137
}
138
139
$client.sendMessage(EVENT.ADMIN.RELEASE)
140
},
141
142
adminGive(store, member: string | Member) {
143
if (!accessor.connected) {
144
return
145
}
146
147
if (typeof member === 'string') {
148
member = accessor.user.members[member]
149
}
150
151
if (!member) {
152
return
153
}
154
155
$client.sendMessage(EVENT.ADMIN.GIVE, { id: member.id })
156
},
157
158
changeKeyboard({ getters }) {
159
if (!accessor.connected || !getters.hosting) {
160
return
161
}
162
163
$client.sendMessage(EVENT.CONTROL.KEYBOARD, { layout: accessor.settings.keyboard_layout })
164
},
165
166
syncKeyboardModifierState({ state }, { capsLock, numLock, scrollLock }) {
167
if (state.keyboardModifierState === keyboardModifierState(capsLock, numLock, scrollLock)) {
168
return
169
}
170
171
accessor.remote.setKeyboardModifierState({ capsLock, numLock, scrollLock })
172
$client.sendMessage(EVENT.CONTROL.KEYBOARD, { capsLock, numLock, scrollLock })
173
},
174
},
175
)
176
177