11import Vue from 'vue'
2+ import { AxiosRequestConfig } from 'axios'
3+ import { ILoginPayload , IUser } from '@/interface/User/ILogin'
4+ import { ILoginCheckPayload , ILoginCheck } from '@/interface/User/ILoginCheck'
5+ import { ILogoutPayload , ILogout } from '@/interface/User/ILogout'
6+ import { setToken , unsetToken , cancelToken } from '@/utilities/'
27
38/**
49 * store 用インターフェイス
510 */
6- export interface StateInterface {
11+ export interface IState {
12+ /**
13+ * ユーザー情報
14+ */
15+ authUser : IUser | null
16+ /**
17+ * ログイン中かどうか
18+ */
719 loggedIn : boolean
20+ /**
21+ * ローディング
22+ */
23+ busy : {
24+ register : boolean
25+ login : boolean
26+ loginCheck : boolean
27+ logout : boolean
28+ }
829}
930
1031/**
1132 * state
1233 */
13- export const state = ( ) : StateInterface => ( {
14- loggedIn : false
34+ export const state = ( ) : IState => ( {
35+ authUser : null ,
36+ loggedIn : false ,
37+ busy : {
38+ register : false ,
39+ login : false ,
40+ loginCheck : false ,
41+ logout : false
42+ }
1543} )
1644
1745/**
1846 * getters
1947 */
2048export const getters = {
21- isAuthenticated ( state : StateInterface ) {
49+ isAuthenticated ( state : IState ) : boolean {
2250 return ! ! state . loggedIn
2351 }
2452}
@@ -27,11 +55,28 @@ export const getters = {
2755 * mutations
2856 */
2957export const mutations = {
58+ /**
59+ * ユーザー情報を更新する
60+ */
61+ SET_USER : function ( state : IState , user : IUser ) : void {
62+ state . authUser = user
63+ } ,
3064 /**
3165 * ログイン状態を更新する
3266 */
33- updateLoginStatus ( state : StateInterface , status : boolean ) : void {
67+ updateLoginStatus ( state : IState , status : boolean ) : void {
3468 state . loggedIn = status
69+ } ,
70+ /**
71+ * 処理中ステータスを更新する
72+ */
73+ updateBusyStatus (
74+ state : IState ,
75+ payload : [ keyof IState [ 'busy' ] , boolean ]
76+ ) : void {
77+ const [ key , status ] = payload
78+
79+ Vue . set ( state . busy , key , status )
3580 }
3681}
3782
@@ -49,17 +94,49 @@ export const actions = {
4994 this : Vue ,
5095 // @ts -ignore
5196 { state, commit } : any ,
52- token : string
53- ) : Promise < void > {
54- console . log ( 'login:' , token === 'hisasann' )
97+ payload : ILoginPayload
98+ ) : Promise < IUser | void > {
99+ console . log ( 'login payload:' , payload )
100+
101+ // ログイン中、またはすでにログイン済みなら処理を抜ける
102+ if ( state . busy . login || state . loggedIn ) {
103+ return
104+ }
105+
106+ // TODO: payload の validation はここかな
107+
108+ commit ( 'updateBusyStatus' , [ 'login' , true ] )
55109
56110 try {
57- // TODO サーバーにログイン
111+ const {
112+ data,
113+ headers,
114+ status,
115+ statusText,
116+ config
117+ } = await this . $axios . post < IUser > (
118+ this . $C . API_ENDPOINT . LOGIN ,
119+ {
120+ username : payload . username ,
121+ password : payload . password
122+ } ,
123+ {
124+ cancelToken : cancelToken . getToken ( payload )
125+ } as AxiosRequestConfig
126+ )
127+
128+ setToken ( headers [ 'access-token' ] )
58129
59- // 値をストアに保存
60- await commit ( 'updateLoginStatus' , token === 'hisasann' )
130+ // ログイン状態を更新
131+ commit ( 'updateLoginStatus' , data . loggedIn )
132+ // ユーザー情報をストアに保存
133+ commit ( 'SET_USER' , data )
134+
135+ return data
61136 } catch ( err ) {
62- console . log ( err )
137+ throw new Error ( err )
138+ } finally {
139+ commit ( 'updateBusyStatus' , [ 'login' , false ] )
63140 }
64141 } ,
65142
@@ -71,17 +148,43 @@ export const actions = {
71148 async logout (
72149 this : Vue ,
73150 // @ts -ignore
74- { state, commit } : any
75- ) : Promise < void > {
151+ { state, commit } : any ,
152+ payload : ILogoutPayload
153+ ) : Promise < ILogout | void > {
76154 console . log ( 'logout' )
77155
156+ // 処理中、未ログインなら中断
157+ if ( state . busy . logout ) {
158+ return
159+ }
160+
161+ commit ( 'updateBusyStatus' , [ 'logout' , true ] )
162+
78163 try {
79- // TODO サーバーからログアウト
164+ const token : string = payload . token
165+ const {
166+ data,
167+ headers,
168+ status,
169+ statusText,
170+ config
171+ } = await this . $axios . post < ILogout > ( this . $C . API_ENDPOINT . LOGOUT , { } , {
172+ headers : {
173+ 'access-token' : token
174+ } ,
175+ cancelToken : cancelToken . getToken ( payload )
176+ } as AxiosRequestConfig )
177+
178+ unsetToken ( )
80179
81- // 値をストアに保存
82- await commit ( 'updateLoginStatus' , false )
180+ // ログイン状態を更新
181+ commit ( 'updateLoginStatus' , data . loggedIn )
182+
183+ return data
83184 } catch ( err ) {
84- console . log ( err )
185+ throw new Error ( err )
186+ } finally {
187+ commit ( 'updateBusyStatus' , [ 'logout' , false ] )
85188 }
86189 } ,
87190
@@ -95,17 +198,46 @@ export const actions = {
95198 this : Vue ,
96199 // @ts -ignore
97200 { state, commit } : any ,
98- token : string
99- ) : Promise < void > {
100- console . log ( 'loginCheck:' , token === 'hisasann' )
201+ payload : ILoginCheckPayload
202+ ) : Promise < ILoginCheck | void > {
203+ console . log ( 'loginCheck' , payload )
204+
205+ commit ( 'updateBusyStatus' , [ 'loginCheck' , true ] )
101206
102207 try {
103- // TODO ログインチェックとは?
208+ const postHeaders = { }
209+ const token : string | undefined = payload . token
210+ if ( token ) {
211+ postHeaders [ 'access-token' ] = token
212+ }
213+
214+ const {
215+ data,
216+ headers,
217+ status,
218+ statusText,
219+ config
220+ } = await this . $axios . post < ILoginCheck > (
221+ this . $C . API_ENDPOINT . LOGIN_CHECK ,
222+ { } ,
223+ {
224+ headers : postHeaders ,
225+ cancelToken : cancelToken . getToken ( payload )
226+ } as AxiosRequestConfig
227+ )
228+
229+ if ( headers [ 'access-token' ] && data . loggedIn ) {
230+ setToken ( headers [ 'access-token' ] )
231+ }
232+
233+ // ログイン状態を更新
234+ commit ( 'updateLoginStatus' , data . loggedIn )
104235
105- // 値をストアに保存
106- await commit ( 'updateLoginStatus' , token === 'hisasann' )
236+ return data
107237 } catch ( err ) {
108- console . log ( err )
238+ throw new Error ( err )
239+ } finally {
240+ commit ( 'updateBusyStatus' , [ 'loginCheck' , false ] )
109241 }
110242 }
111243}
0 commit comments