-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathuser.ts
82 lines (72 loc) · 1.83 KB
/
user.ts
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
import { Module } from 'vuex'
import { RootState } from '../global'
import { Ability, reset } from 'v-access'
import { userLogin, fetchUserAbilities } from '@/effects'
import VueRouter from 'vue-router'
import { RouteSetting } from '@/router'
export interface UserState {
token: string
abilities: Ability[]
routes: RouteSetting[]
}
export interface UserAbility {
name: string
uid: string
create_at: string
}
export const userMutationTypes = {
setToken: 'setToken',
setUserAbilities: 'setUserAbilities',
setUserRoutes: 'setUserRoutes'
}
const user: Module<UserState, RootState> = {
namespaced: true,
state: {
token: '',
abilities: [],
// this is user private routes, not all routes
routes: []
},
getters: {
hasLogin({ token }) {
return Boolean(token)
}
},
mutations: {
[userMutationTypes.setToken](state, token) {
state.token = token
},
[userMutationTypes.setUserAbilities](state, abilities) {
state.abilities = abilities
},
[userMutationTypes.setUserRoutes](state, routes) {
state.routes = routes
}
},
actions: {
async login(
{ commit },
{ username, password }: Record<'username' | 'password', string>
) {
const { token } = await userLogin(username, password)
token && commit('setToken', token)
},
async fetchUserAbilities({ commit }) {
const abilities = await fetchUserAbilities()
if (abilities && abilities.length) {
const abilitiesIds = abilities.map(
(ability: Record<'name', string>) => ability.name
)
commit('setUserAbilities', abilitiesIds)
}
},
async logout({ dispatch }, router: VueRouter) {
reset(router)
await dispatch('resetState', null, { root: true })
router.push({
name: 'Login'
})
}
}
}
export default user