124 lines
3.6 KiB
JavaScript
124 lines
3.6 KiB
JavaScript
import * as memberApi from '@/api/member'
|
|
import Vue from 'vue';
|
|
|
|
const enhanceAccessToken = () => {
|
|
const {accessToken} = localStorage
|
|
if (!accessToken) return
|
|
Vue.axios.defaults.headers.common['Authorization'] = `Bearer ${accessToken}`;
|
|
}
|
|
|
|
enhanceAccessToken();
|
|
|
|
const accountStore = {
|
|
namespaced: true,
|
|
state: {
|
|
userId: '',
|
|
nickname: '',
|
|
accessToken: '',
|
|
profileImage: '',
|
|
},
|
|
getters: {
|
|
isAuthenticated(state) {
|
|
state.userId = state.userId || localStorage.userId
|
|
state.nickname = state.nickname || localStorage.nickname
|
|
state.profileImage = state.profileImage || localStorage.profileImage
|
|
state.accessToken = state.accessToken || localStorage.accessToken
|
|
|
|
return state.accessToken !== undefined &&
|
|
state.accessToken !== null &&
|
|
state.accessToken !== 'null' &&
|
|
state.accessToken !== ''
|
|
}
|
|
},
|
|
mutations: {
|
|
LOGIN(state, {userId, nickname, token, profileImage}) {
|
|
state.userId = userId
|
|
localStorage.userId = userId
|
|
|
|
state.nickname = nickname
|
|
localStorage.nickname = nickname
|
|
|
|
state.profileImage = profileImage
|
|
localStorage.profileImage = profileImage
|
|
|
|
state.accessToken = token
|
|
localStorage.accessToken = token
|
|
|
|
Vue.axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
|
|
},
|
|
|
|
LOGOUT(state) {
|
|
state.userId = ''
|
|
state.nickname = ''
|
|
state.profileImage = ''
|
|
state.accessToken = ''
|
|
|
|
localStorage.clear()
|
|
if (location.pathname === '/') {
|
|
location.reload()
|
|
} else {
|
|
location.replace("/")
|
|
}
|
|
},
|
|
},
|
|
actions: {
|
|
async LOGIN({commit}, {email, password}) {
|
|
let result = false
|
|
let errorMessage = null
|
|
|
|
try {
|
|
let res = await memberApi.login(email, password)
|
|
if (res.data.success === true) {
|
|
commit("LOGIN", res.data.data)
|
|
result = true
|
|
} else {
|
|
errorMessage = res.data.message
|
|
}
|
|
} catch (e) {
|
|
errorMessage = '로그인 정보를 확인해주세요.'
|
|
}
|
|
|
|
return new Promise((resolve, reject) => {
|
|
if (result) {
|
|
resolve();
|
|
} else {
|
|
reject(errorMessage)
|
|
}
|
|
});
|
|
},
|
|
|
|
async LOGOUT({commit}) {
|
|
let result = false
|
|
let errorMessage = null
|
|
|
|
try {
|
|
let res = await memberApi.logout()
|
|
if (res.data.success === true) {
|
|
Vue.axios.defaults.headers.common['Authorization'] = undefined;
|
|
commit("LOGOUT")
|
|
result = true
|
|
} else {
|
|
errorMessage = res.data.message
|
|
}
|
|
} catch (e) {
|
|
errorMessage = '로그인 정보를 확인해주세요.'
|
|
}
|
|
|
|
return new Promise((resolve, reject) => {
|
|
if (result) {
|
|
resolve();
|
|
} else {
|
|
reject(errorMessage)
|
|
}
|
|
});
|
|
},
|
|
|
|
LOGOUT_WITHOUT_NETWORK({commit}) {
|
|
Vue.axios.defaults.headers.common['Authorization'] = undefined;
|
|
commit("LOGOUT")
|
|
},
|
|
}
|
|
}
|
|
|
|
export default accountStore
|