diff --git a/src/app/services/auth.js b/src/app/services/auth.js index a4b1ad01..49d3e23c 100644 --- a/src/app/services/auth.js +++ b/src/app/services/auth.js @@ -1,165 +1,160 @@ import { createApi } from "@reduxjs/toolkit/query/react"; import { nanoid } from "@reduxjs/toolkit"; import baseQuery from "./base.query"; -import { - setAuthData, - updateToken, - resetAuthData, - updateInitilize, -} from "../slices/auth.data"; +import { setAuthData, updateToken, resetAuthData, updateInitialized } from "../slices/auth.data"; import BASE_URL, { KEY_DEVICE_KEY } from "../config"; const getDeviceId = () => { - let d = localStorage.getItem(KEY_DEVICE_KEY); - if (!d) { - d = `web:${nanoid()}`; - localStorage.setItem(KEY_DEVICE_KEY, d); - } - return d; + let d = localStorage.getItem(KEY_DEVICE_KEY); + if (!d) { + d = `web:${nanoid()}`; + localStorage.setItem(KEY_DEVICE_KEY, d); + } + return d; }; export const authApi = createApi({ - reducerPath: "authApi", - baseQuery, - endpoints: (builder) => ({ - login: builder.mutation({ - query: (credentials) => ({ - url: "token/login", - method: "POST", - body: { - credential: credentials, - device: getDeviceId(), - device_token: "test", - }, - }), - transformResponse: (data) => { - const { avatar_updated_at } = data.user; - data.user.avatar = - avatar_updated_at == 0 - ? "" - : `${BASE_URL}/resource/avatar?uid=${data.user.uid}&t=${avatar_updated_at}`; - return data; - }, - async onQueryStarted(params, { dispatch, queryFulfilled }) { - try { - const { data } = await queryFulfilled; - if (data) { - console.log("login resp", data); - dispatch(setAuthData(data)); - } - } catch { - console.log("login error"); - } - }, - }), - // 更新token - renew: builder.mutation({ - query: ({ token, refreshToken }) => ({ - url: "/token/renew", - method: "POST", - body: { - token, - refresh_token: refreshToken, - }, - }), - async onQueryStarted(params, { dispatch, queryFulfilled }) { - try { - const { data } = await queryFulfilled; - dispatch(updateToken(data)); - } catch { - dispatch(resetAuthData()); - console.log("renew token error"); - } - }, - }), - // 更新 device token - updateDeviceToken: builder.mutation({ - query: (device_token) => ({ - url: "/token/device_token", - method: "PUT", - body: { - device_token, - }, - }), - }), - // 获取openid - getOpenid: builder.mutation({ - query: ({ issuer, redirect_uri }) => ({ - url: "/token/openid/authorize", - method: "POST", - body: { - issuer, - redirect_uri, - }, - }), - }), - - checkInviteTokenValid: builder.mutation({ - query: (token) => ({ - url: "user/check_invite_magic_token", - method: "POST", - body: { magic_token: token }, - }), - }), - updatePassword: builder.mutation({ - query: ({ old_password, new_password }) => ({ - url: "user/change_password", - method: "POST", - body: { old_password, new_password }, - }), - }), - sendMagicLink: builder.mutation({ - query: (email) => ({ - url: "token/send_magic_link", - method: "POST", - body: { email }, - }), - }), - getMetamaskNonce: builder.query({ - query: (address) => ({ - url: `/token/metamask/nonce?public_address=${address}`, - }), - }), - getCredentials: builder.query({ - query: () => ({ - url: `/token/credentials`, - }), - }), - logout: builder.query({ - query: () => ({ url: `token/logout` }), - async onQueryStarted(params, { dispatch, queryFulfilled }) { - try { - await queryFulfilled; - dispatch(resetAuthData()); - } catch { - console.log("logout error"); - } - }, - }), - getInitialized: builder.query({ - query: () => ({ - url: `/admin/system/initialized`, - }), - async onQueryStarted(params, { dispatch, queryFulfilled }) { - try { - const { data: isInitized } = await queryFulfilled; - dispatch(updateInitilize(isInitized)); - } catch { - console.log("api initialized error"); - } - }, - }), + reducerPath: "authApi", + baseQuery, + endpoints: (builder) => ({ + login: builder.mutation({ + query: (credentials) => ({ + url: "token/login", + method: "POST", + body: { + credential: credentials, + device: getDeviceId(), + device_token: "test" + } + }), + transformResponse: (data) => { + const { avatar_updated_at } = data.user; + data.user.avatar = + avatar_updated_at == 0 + ? "" + : `${BASE_URL}/resource/avatar?uid=${data.user.uid}&t=${avatar_updated_at}`; + return data; + }, + async onQueryStarted(params, { dispatch, queryFulfilled }) { + try { + const { data } = await queryFulfilled; + if (data) { + console.log("login resp", data); + dispatch(setAuthData(data)); + } + } catch { + console.log("login error"); + } + } }), + // 更新token + renew: builder.mutation({ + query: ({ token, refreshToken }) => ({ + url: "/token/renew", + method: "POST", + body: { + token, + refresh_token: refreshToken + } + }), + async onQueryStarted(params, { dispatch, queryFulfilled }) { + try { + const { data } = await queryFulfilled; + dispatch(updateToken(data)); + } catch { + dispatch(resetAuthData()); + console.log("renew token error"); + } + } + }), + // 更新 device token + updateDeviceToken: builder.mutation({ + query: (device_token) => ({ + url: "/token/device_token", + method: "PUT", + body: { + device_token + } + }) + }), + // 获取openid + getOpenid: builder.mutation({ + query: ({ issuer, redirect_uri }) => ({ + url: "/token/openid/authorize", + method: "POST", + body: { + issuer, + redirect_uri + } + }) + }), + + checkInviteTokenValid: builder.mutation({ + query: (token) => ({ + url: "user/check_invite_magic_token", + method: "POST", + body: { magic_token: token } + }) + }), + updatePassword: builder.mutation({ + query: ({ old_password, new_password }) => ({ + url: "user/change_password", + method: "POST", + body: { old_password, new_password } + }) + }), + sendMagicLink: builder.mutation({ + query: (email) => ({ + url: "token/send_magic_link", + method: "POST", + body: { email } + }) + }), + getMetamaskNonce: builder.query({ + query: (address) => ({ + url: `/token/metamask/nonce?public_address=${address}` + }) + }), + getCredentials: builder.query({ + query: () => ({ + url: `/token/credentials` + }) + }), + logout: builder.query({ + query: () => ({ url: `token/logout` }), + async onQueryStarted(params, { dispatch, queryFulfilled }) { + try { + await queryFulfilled; + dispatch(resetAuthData()); + } catch { + console.log("logout error"); + } + } + }), + getInitialized: builder.query({ + query: () => ({ + url: `/admin/system/initialized` + }), + async onQueryStarted(params, { dispatch, queryFulfilled }) { + try { + const { data: isInitialized } = await queryFulfilled; + dispatch(updateInitialized(isInitialized)); + } catch { + console.log("api initialized error"); + } + } + }) + }) }); export const { - useGetInitializedQuery, - useSendMagicLinkMutation, - useGetCredentialsQuery, - useUpdateDeviceTokenMutation, - useGetOpenidMutation, - useRenewMutation, - useLazyGetMetamaskNonceQuery, - useLoginMutation, - useLazyLogoutQuery, - useCheckInviteTokenValidMutation, - useUpdatePasswordMutation, + useGetInitializedQuery, + useSendMagicLinkMutation, + useGetCredentialsQuery, + useUpdateDeviceTokenMutation, + useGetOpenidMutation, + useRenewMutation, + useLazyGetMetamaskNonceQuery, + useLoginMutation, + useLazyLogoutQuery, + useCheckInviteTokenValidMutation, + useUpdatePasswordMutation } = authApi; diff --git a/src/app/slices/auth.data.js b/src/app/slices/auth.data.js index 9de9da1f..cafd2a22 100644 --- a/src/app/slices/auth.data.js +++ b/src/app/slices/auth.data.js @@ -1,89 +1,78 @@ import { createSlice } from "@reduxjs/toolkit"; -import { - KEY_PWA_INSTALLED, - KEY_REFRESH_TOKEN, - KEY_TOKEN, - KEY_UID, - KEY_EXPIRE, -} from "../config"; +import { KEY_PWA_INSTALLED, KEY_REFRESH_TOKEN, KEY_TOKEN, KEY_UID, KEY_EXPIRE } from "../config"; const initialState = { - initialized: true, - uid: null, - token: localStorage.getItem(KEY_TOKEN), - expireTime: localStorage.getItem(KEY_EXPIRE) || new Date().getTime(), - refreshToken: localStorage.getItem(KEY_REFRESH_TOKEN), + initialized: true, + uid: null, + token: localStorage.getItem(KEY_TOKEN), + expireTime: localStorage.getItem(KEY_EXPIRE) || new Date().getTime(), + refreshToken: localStorage.getItem(KEY_REFRESH_TOKEN) }; const emptyState = { - initialized: true, - uid: null, - token: null, - expireTime: new Date().getTime(), - refreshToken: null, + initialized: true, + uid: null, + token: null, + expireTime: new Date().getTime(), + refreshToken: null }; const authDataSlice = createSlice({ - name: "authData", - initialState, - reducers: { - setAuthData(state, action) { - const { - initialized = true, - user: { uid }, - token, - refresh_token, - expired_in = 0, - } = action.payload; - state.initialized = initialized; - state.uid = uid; - state.token = token; - state.refreshToken = refresh_token; - // 当前时间往后推expire时长 - console.log("expire", expired_in); - const expireTime = new Date().getTime() + Number(expired_in) * 1000; - state.expireTime = expireTime; - // set local data - localStorage.setItem(KEY_EXPIRE, expireTime); - localStorage.setItem(KEY_TOKEN, token); - localStorage.setItem(KEY_REFRESH_TOKEN, refresh_token); - localStorage.setItem(KEY_UID, uid); - }, - resetAuthData() { - console.log("clear auth data"); - // remove local data - localStorage.removeItem(KEY_EXPIRE); - localStorage.removeItem(KEY_TOKEN); - localStorage.removeItem(KEY_REFRESH_TOKEN); - localStorage.removeItem(KEY_UID); - localStorage.removeItem(KEY_PWA_INSTALLED); - - return emptyState; - }, - setUid(state, action) { - const uid = action.payload; - state.uid = uid; - console.log("set uid orginal"); - }, - updateInitilize(state, action) { - const isInitized = action.payload; - state.initialized = isInitized; - }, - updateToken(state, action) { - const { token, refresh_token, expired_in } = action.payload; - console.log("refresh token"); - state.token = token; - const et = new Date().getTime() + Number(expired_in) * 1000; - state.expireTime = et; - state.refreshToken = refresh_token; - localStorage.setItem(KEY_EXPIRE, et); - localStorage.setItem(KEY_TOKEN, token); - localStorage.setItem(KEY_REFRESH_TOKEN, refresh_token); - }, + name: "authData", + initialState, + reducers: { + setAuthData(state, action) { + const { + initialized = true, + user: { uid }, + token, + refresh_token, + expired_in = 0 + } = action.payload; + state.initialized = initialized; + state.uid = uid; + state.token = token; + state.refreshToken = refresh_token; + // 当前时间往后推expire时长 + console.log("expire", expired_in); + const expireTime = new Date().getTime() + Number(expired_in) * 1000; + state.expireTime = expireTime; + // set local data + localStorage.setItem(KEY_EXPIRE, expireTime); + localStorage.setItem(KEY_TOKEN, token); + localStorage.setItem(KEY_REFRESH_TOKEN, refresh_token); + localStorage.setItem(KEY_UID, uid); }, + resetAuthData() { + console.log("clear auth data"); + // remove local data + localStorage.removeItem(KEY_EXPIRE); + localStorage.removeItem(KEY_TOKEN); + localStorage.removeItem(KEY_REFRESH_TOKEN); + localStorage.removeItem(KEY_UID); + localStorage.removeItem(KEY_PWA_INSTALLED); + + return emptyState; + }, + setUid(state, action) { + const uid = action.payload; + state.uid = uid; + console.log("set uid orginal"); + }, + updateInitialized(state, action) { + const isInitialized = action.payload; + state.initialized = isInitialized; + }, + updateToken(state, action) { + const { token, refresh_token, expired_in } = action.payload; + console.log("refresh token"); + state.token = token; + const et = new Date().getTime() + Number(expired_in) * 1000; + state.expireTime = et; + state.refreshToken = refresh_token; + localStorage.setItem(KEY_EXPIRE, et); + localStorage.setItem(KEY_TOKEN, token); + localStorage.setItem(KEY_REFRESH_TOKEN, refresh_token); + } + } }); -export const { - updateInitilize, - setAuthData, - resetAuthData, - setUid, - updateToken, -} = authDataSlice.actions; +export const { updateInitialized, setAuthData, resetAuthData, setUid, updateToken } = + authDataSlice.actions; export default authDataSlice.reducer;