feat(登录登出): 已完成用户使用账号密码登录登出

This commit is contained in:
xuan 2022-09-13 14:17:04 +08:00
parent a07ca24140
commit 5bc498ad31
14 changed files with 297 additions and 242 deletions

View File

@ -1,4 +1,4 @@
import Taro from "@tarojs/taro" import Taro from '@tarojs/taro'
import Qs from 'qs' import Qs from 'qs'
/** /**
@ -11,13 +11,9 @@ type ParamLink = 'navigateTo'|'switchTab'|'reLaunch'|'redirectTo'
export const goLink = (path = '', params = {}, way: ParamLink = 'navigateTo') => { export const goLink = (path = '', params = {}, way: ParamLink = 'navigateTo') => {
if (path) { if (path) {
let params_str = Qs.stringify(params) let params_str = Qs.stringify(params)
console.log('params_str::',params_str)
path = params_str ? path + '?' + params_str : path path = params_str ? path + '?' + params_str : path
console.log('path::', way)
Taro[way]({ url: path }) Taro[way]({ url: path })
} }
} }
/** /**
* *
@ -26,17 +22,17 @@ export const goLink = (path = '', params = {}, way: ParamLink = 'navigateTo') =>
*/ */
export const isEmptyObject = (object: any) => { export const isEmptyObject = (object: any) => {
if (object == undefined || object == null || Number.isNaN(object)) { if (object == undefined || object == null || Number.isNaN(object)) {
return true; return true
} else { } else {
if (object.constructor == Object) { if (object.constructor == Object) {
return Reflect.ownKeys(object).length==0; return Reflect.ownKeys(object).length == 0
} else if (object.constructor == Array) { } else if (object.constructor == Array) {
return object.length==0; return object.length == 0
} else if (object.constructor == String) { } else if (object.constructor == String) {
return object==""; return object == ''
} }
} }
return false; return false
} }
/** /**
@ -58,41 +54,40 @@ export const isEmptyObject = (object: any)=>{
* @param message * @param message
* @returns * @returns
*/ */
export const retrieval = (data: any, rules?: Object, message: string="请填写完信息")=>{ export const retrieval = (data: any, rules?: Object, message: string = '请填写完信息') => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (rules) { if (rules) {
const keys = Reflect.ownKeys(rules); const keys = Reflect.ownKeys(rules)
const result = keys.some((key: any) => { const result = keys.some((key: any) => {
for (let item of (rules as any)[key]) { for (let item of (rules as any)[key]) {
let _res = false
let _res = false;
if (item.validator) { if (item.validator) {
if (item.validator(data[key], item)) { if (item.validator(data[key], item)) {
_res=true; _res = true
} }
} else if (item.regex) { } else if (item.regex) {
if (!item.regex.test(data[key])) { if (!item.regex.test(data[key])) {
_res=true; _res = true
} }
} else { } else {
if (isEmptyObject(data[key])) { if (isEmptyObject(data[key])) {
_res=true; _res = true
} }
} }
message = item.message; message = item.message
return _res; return _res
} }
}); })
if (result) { if (result) {
reject(message); reject(message)
} }
} else { } else {
const keys = Reflect.ownKeys(data); const keys = Reflect.ownKeys(data)
if (keys.some((key: any) => isEmptyObject(data[key]))) { if (keys.some((key: any) => isEmptyObject(data[key]))) {
reject(message); reject(message)
} }
} }
resolve(null); resolve(null)
}) })
} }
/** /**
@ -101,43 +96,48 @@ export const retrieval = (data: any, rules?: Object, message: string="请填写
export const alert = { export const alert = {
success(title: string) { success(title: string) {
Taro.showToast({ Taro.showToast({
title,icon: "success" title,
icon: 'success',
}) })
}, },
error(title: string) { error(title: string) {
Taro.showToast({ Taro.showToast({
title,icon: "error" title,
icon: 'error',
}) })
}, },
loading(title: string, mask: true | false = false) { loading(title: string, mask: true | false = false) {
Taro.showToast({ Taro.showToast({
title,icon: "loading", title,
mask icon: 'loading',
mask,
}) })
}, },
none(title: string) { none(title: string) {
Taro.showToast({ Taro.showToast({
title,icon: "none" title,
icon: 'none',
}) })
}, },
showLoading(title: string, mask: true|false = true) { showLoading(title: string, mask: boolean = true) {
Taro.showLoading({ title, mask }) Taro.showLoading({ title, mask })
}, },
hideLoading() { hideLoading() {
Taro.hideLoading() Taro.hideLoading()
} },
} }
// 金额千位分割符 // 金额千位分割符
export const formatKbPrice = (number: string) => { export const formatKbPrice = (number: string) => {
const ret = Array.from(number).reverse().reduce((result: string[],next,i,arr) => { const ret = Array.from(number)
if((i+1)%3 === 0 && (i+1) !== arr.length) { .reverse()
.reduce((result: string[], next, i, arr) => {
if ((i + 1) % 3 === 0 && i + 1 !== arr.length) {
result.push(next, ',') result.push(next, ',')
return result; return result
} }
result.push(next); result.push(next)
return result; return result
}, []) }, [])
return ret.reverse().join(''); return ret.reverse().join('')
} }

View File

@ -1,3 +1,10 @@
.checkbox {
display: flex;
align-items: center;
&--text {
margin-left: 10px;
}
}
.checkbox_main { .checkbox_main {
display: flex; display: flex;
justify-content: center; justify-content: center;

View File

@ -14,9 +14,10 @@ type params = {
circle?: boolean circle?: boolean
round?: boolean round?: boolean
size?: CheckboxSize size?: CheckboxSize
children?: React.ReactNode
} }
export default forwardRef((props: params, ref) => { export default forwardRef((props: params, ref) => {
const { onSelect, onClose, status = false, disabled = false, circle = false, round = true, size = 'normal' } = props const { onSelect, onClose, status = false, disabled = false, circle = false, round = true, size = 'normal', children } = props
const [selected, SetSelected] = useState(false) const [selected, SetSelected] = useState(false)
const onSelectEven = () => { const onSelectEven = () => {
if (disabled) return false if (disabled) return false
@ -54,12 +55,13 @@ export default forwardRef((props: params, ref) => {
SetSelected(status) SetSelected(status)
}, [status]) }, [status])
return ( return (
<> <View className={styles.checkbox} onClick={() => onSelectEven()}>
<View className={classnames(styles.checkbox_main, getMainClassName())} onClick={() => onSelectEven()}> <View className={classnames(styles.checkbox_main, getMainClassName())}>
<View className={classnames(styles.checkbox_item, getClassName())}> <View className={classnames(styles.checkbox_item, getClassName())}>
{selected && <IconFont name='icon-a-jizhumima' size={22} color='#fff'></IconFont>} {selected && <IconFont name='icon-a-jizhumima' size={22} color='#fff'></IconFont>}
</View> </View>
</View> </View>
</> {children && <View className={styles['checkbox--text']}>{children}</View>}
</View>
) )
}) })

View File

@ -41,7 +41,6 @@ const NormalButton: FC<PropsType> = (props) => {
[styles['button--plain']]: plain, [styles['button--plain']]: plain,
[styles['button--circle']]: circle, [styles['button--circle']]: circle,
} }
console.log('classObj==>button', classObject)
return classObject return classObject
} }

View File

@ -1,11 +1,25 @@
export const SET_USERINFO = 'setUserInfo' // export const SET_USERINFO = 'setUserInfo'
export const SET_ADMINUSERINFO = 'setAdminUserInfo' // export const SET_ADMINUSERINFO = 'setAdminUserInfo'
export const SET_TOKEN = 'setToken' // export const SET_TOKEN = 'setToken'
export const SET_SESSIONKEY = 'setSessionkey' // export const SET_SESSIONKEY = 'setSessionkey'
export const SET_SORTCODE = 'setSortCode' // export const SET_SORTCODE = 'setSortCode'
export const CLEAR_TOKEN = 'clearToken' // export const CLEAR_TOKEN = 'clearToken'
export const CLEAR_SESSIONKEY = 'clearSessionkey' // export const CLEAR_SESSIONKEY = 'clearSessionkey'
export const CLEAR_USERINFO = 'clearUserInfo' // export const CLEAR_USERINFO = 'clearUserInfo'
export const CLEAR_ADMINUSERINFO = 'clearAdminUserInfo' // export const CLEAR_ADMINUSERINFO = 'clearAdminUserInfo'
export const CLEAR_SORTCODE = 'clearSortCode' // export const CLEAR_SORTCODE = 'clearSortCode'
export const LOGIN_STATUS = 'loginStatus' // export const LOGIN_STATUS = 'loginStatus'
export const enum UserInfoActionType {
SET_USERINFO = 'setUserInfo',
SET_ADMINUSERINFO = 'setAdminUserInfo',
SET_TOKEN = 'setToken',
SET_SESSIONKEY = 'setSessionkey',
SET_SORTCODE = 'setSortCode',
CLEAR_TOKEN = 'clearToken',
CLEAR_SESSIONKEY = 'clearSessionkey',
CLEAR_USERINFO = 'clearUserInfo',
CLEAR_ADMINUSERINFO = 'clearAdminUserInfo',
CLEAR_SORTCODE = 'clearSortCode',
LOGIN_STATUS = 'loginStatus',
}

View File

@ -25,8 +25,6 @@ type TabBarIndexMap = {
const CustomTabBar: FC = () => { const CustomTabBar: FC = () => {
console.log('重新渲染') console.log('重新渲染')
const { selectedId, tabItem } = useSelector((state) => { const { selectedId, tabItem } = useSelector((state) => {
console.log('sdfasdfa', state) console.log('sdfasdfa', state)
return state.tabBarData return state.tabBarData

View File

@ -1,6 +1,6 @@
import Divider from '@/components/divider' import Divider from '@/components/divider'
import IconFont from '@/components/iconfont' import IconFont from '@/components/iconfont'
import { View, Image, Text, Input, CommonEventFunction } from '@tarojs/components' import { View, Image, Text, Input } from '@tarojs/components'
import { FC, useState } from 'react' import { FC, useState } from 'react'
import styles from './index.module.scss' import styles from './index.module.scss'
import MCheckbox from '@/components/checkbox' import MCheckbox from '@/components/checkbox'
@ -8,11 +8,14 @@ import NormalButton from '@/components/normalButton'
import IconCard from '@/components/iconCard' import IconCard from '@/components/iconCard'
import {memo} from 'react' import {memo} from 'react'
import { LoginApi } from '@/api' import { LoginApi } from '@/api'
import Taro from '@tarojs/taro'
import { alert } from '@/common/common'
import useUserInfo from '@/use/useUserInfo'
const Login: FC = () => { const Login: FC = () => {
const [isRemember, setRemember] = useState(false) const [isRemember, setRemember] = useState(false)
const [eyesStatus, setEyesStatus] = useState(false) const [eyesStatus, setEyesStatus] = useState(true)
const handlePwdVisible = () => { const handlePwdVisible = () => {
setEyesStatus((value) => !value) setEyesStatus((value) => !value)
@ -30,19 +33,47 @@ const Login: FC = () => {
const [account, setAccount] = useState('') const [account, setAccount] = useState('')
const [password, setPassword] = useState('') const [password, setPassword] = useState('')
const formatInput = (value:string) => {
return value.trim()
}
const handleInputAccount = (event: any) => { const handleInputAccount = (event: any) => {
const formated = formatInput(event.detail.value)
setAccount(formated)
} }
const handleInputPassword = () => { const handleInputPassword = (event: any) => {
const formated = formatInput(event.detail.value)
setPassword(formated)
} }
const { fetchData , state} = LoginApi() const { setToken, setUserInfo } = useUserInfo()
const { fetchData } = LoginApi()
const handleLogin = async () => { const handleLogin = async () => {
await fetchData({ if (account === '' || password === '') return alert.error('账号密码不能为空!')
console.log('账户密码:', account, password)
const res = await fetchData({
account, account,
password, password,
}) })
console.log('state===>', res)
if (res.success) {
alert.success('登陆成功')
setToken(res.data.token)
setUserInfo({ ...res.data })
Taro.redirectTo({
url: '/pages/index/index',
})
} else {
alert.error('登陆失败')
}
} }
return ( return (
@ -61,9 +92,14 @@ const Login: FC = () => {
<View className={styles['input-bar']}> <View className={styles['input-bar']}>
<IconFont name='icon-mima' size={48} color='#999999'></IconFont> <IconFont name='icon-mima' size={48} color='#999999'></IconFont>
<Divider direction='vertical'></Divider> <Divider direction='vertical'></Divider>
<Input onInput={handleInputPassword} className={styles['input-bar--password']} type='safe-password' placeholder='请输入密码'></Input> <Input
onInput={handleInputPassword}
password={eyesStatus}
className={styles['input-bar--password']}
type='safe-password'
placeholder='请输入密码'></Input>
<View onClick={handlePwdVisible}> <View onClick={handlePwdVisible}>
{eyesStatus ? ( {!eyesStatus ? (
<IconFont name='icon-yanjing' size={48} color='#999999'></IconFont> <IconFont name='icon-yanjing' size={48} color='#999999'></IconFont>
) : ( ) : (
<IconFont name='icon-biyan' size={48} color='#999999'></IconFont> <IconFont name='icon-biyan' size={48} color='#999999'></IconFont>
@ -72,8 +108,9 @@ const Login: FC = () => {
</View> </View>
<View className={styles['login-options']}> <View className={styles['login-options']}>
<View className={styles['login-option']}> <View className={styles['login-option']}>
<MCheckbox status={isRemember} size='small' circle onSelect={selectCallBack} onClose={closeCallBack}></MCheckbox> <MCheckbox status={isRemember} size='small' circle onSelect={selectCallBack} onClose={closeCallBack}>
<Text className={styles.isRememberPwd}></Text>
</MCheckbox>
</View> </View>
<View className={styles['login-option']}> <View className={styles['login-option']}>
<Text className={styles.isForgetPwd}></Text> <Text className={styles.isForgetPwd}></Text>

View File

@ -1,6 +1,5 @@
import { isEmptyObject } from '@/common/common' import { View, Image, Text } from '@tarojs/components'
import { Button, View, Image, Text } from '@tarojs/components' import { FC, useState } from 'react'
import { FC, memo, useMemo, useState } from 'react'
import styles from './index.module.scss' import styles from './index.module.scss'
import defaultAvatar from '../../styles/image/defaultAvatar.png' import defaultAvatar from '../../styles/image/defaultAvatar.png'
import NormalButton from '@/components/normalButton' import NormalButton from '@/components/normalButton'
@ -9,6 +8,8 @@ import Divider from '@/components/Divider'
import LayoutBlock from '@/components/layoutBlock' import LayoutBlock from '@/components/layoutBlock'
import IconCard from '@/components/iconCard' import IconCard from '@/components/iconCard'
import IconFont from '@/components/iconfont' import IconFont from '@/components/iconfont'
import useUserInfo from '@/use/useUserInfo'
import { goLink } from '@/common/common'
type IconfontName = Parameters<typeof IconFont>['0']['name'] type IconfontName = Parameters<typeof IconFont>['0']['name']
type IconCardType = { type IconCardType = {
@ -19,11 +20,13 @@ type IconCardType = {
// 用户信息 // 用户信息
const UserInfo: FC = () => { const UserInfo: FC = () => {
const [userInfo, setUserInfo] = useState({ const { removeToken, removeUserInfo, userInfo } = useUserInfo()
avatarUrl: '', console.log('userInfo==>', userInfo)
username: '', // const [userInfo, setUserInfo] = useState({
userno: '', // avatarUrl: '',
}) // username: '',
// userno: '',
// })
const feature: IconCardType[] = [ const feature: IconCardType[] = [
@ -110,18 +113,24 @@ const UserInfo: FC = () => {
}, },
] ]
const handleLogout = () => {}
// 退出登录
const handleLogout = () => {
removeToken()
removeUserInfo()
goLink('/pages/login/index', {}, 'reLaunch')
}
return ( return (
<> <>
<LayoutBlock circle> <LayoutBlock circle>
<View className={styles.topBar}> <View className={styles.topBar}>
<View className={styles.left}> <View className={styles.left}>
<UserAvatar src={userInfo.avatarUrl} /> <UserAvatar src={userInfo.userInfo.avatar_url} />
</View> </View>
<View className={styles.middle}> <View className={styles.middle}>
<Text className={styles.username}></Text> <Text className={styles.username}>{userInfo.userInfo.user_name}</Text>
<Text className={styles.userno}>064</Text> <Text className={styles.userno}>{userInfo.userInfo.user_code}</Text>
</View> </View>
<View className={styles.right}> <View className={styles.right}>
<NormalButton type='primary' round size='normal' onClick={handleLogout}> <NormalButton type='primary' round size='normal' onClick={handleLogout}>
@ -161,13 +170,6 @@ const UserInfo: FC = () => {
})} })}
</View> </View>
</LayoutBlock> </LayoutBlock>
{/* <LayoutBlock circle>
<View className={styles.layoutTabBar}>
<View className={styles.layoutTitle}></View>
<View className={styles.layoutDescription}> </View>
</View>
asdfasdfasdfas
</LayoutBlock> */}
</> </>
) )
} }

View File

@ -19,7 +19,7 @@ const INIT = {
shopCount: Taro.getStorageSync(STORAGE_SHOPCOUNT)?JSON.parse(Taro.getStorageSync(STORAGE_SHOPCOUNT)).shopCount:0, shopCount: Taro.getStorageSync(STORAGE_SHOPCOUNT)?JSON.parse(Taro.getStorageSync(STORAGE_SHOPCOUNT)).shopCount:0,
} }
export default function counter (state = INIT, action: Action) { export default (state = INIT, action: Action) => {
const {type, data} = action const {type, data} = action
switch (type) { switch (type) {
case SET_SHOPCOUNT: case SET_SHOPCOUNT:

View File

@ -5,7 +5,7 @@ import { DataParam as userInfoParam } from './userInfo';
import { DataParam as commonDataParam } from './commonData'; import { DataParam as commonDataParam } from './commonData';
import { TabBarData as tabbarDataParam } from './tabBar'; import { TabBarData as tabbarDataParam } from './tabBar';
type Params = { type Params = {
userInfo: userInfoParam userInfoData: userInfoParam
commonData: commonDataParam commonData: commonDataParam
tabBarData: tabbarDataParam tabBarData: tabbarDataParam
} }

View File

@ -1,10 +1,10 @@
import { combineReducers } from 'redux' import { combineReducers } from 'redux'
import userInfo from './userInfo' import userInfoData from './userInfo'
import commonData from './commonData' import commonData from './commonData'
import tabBarReducer from './tabBar' import tabBarReducer from './tabBar'
export type Reducers = { export type Reducers = {
userInfo: typeof userInfo userInfoData: typeof userInfoData
commonData: typeof commonData commonData: typeof commonData
tabBarData: typeof tabBarReducer tabBarData: typeof tabBarReducer
} }
@ -12,7 +12,7 @@ export type Reducers = {
export type ReducersKey = keyof Reducers export type ReducersKey = keyof Reducers
export default combineReducers<Reducers>({ export default combineReducers<Reducers>({
userInfo, userInfoData,
commonData, commonData,
tabBarData: tabBarReducer, tabBarData: tabBarReducer,
}) })

View File

@ -1,31 +1,18 @@
import Taro from '@tarojs/taro' import Taro from '@tarojs/taro'
import { import { UserInfoActionType } from '../constants/userInfo'
SET_USERINFO,
SET_ADMINUSERINFO,
SET_TOKEN,
SET_SESSIONKEY,
SET_SORTCODE,
CLEAR_TOKEN,
CLEAR_USERINFO,
CLEAR_SESSIONKEY,
CLEAR_ADMINUSERINFO,
CLEAR_SORTCODE,
LOGIN_STATUS
} from '../constants/userInfo'
export type UserParam = { export type UserParam = {
nickName?:string, department_code?: string
phone?:string, department_id?: string
avatarUrl?:string, department_name?: string
city?: string, physical_warehouse?: number
country?: string, physical_warehouse_name?: string
province?: string, token?: string
gender?: number, user_code?: number
language?: string, user_id?: string
timestamp?: number, user_name?: number
physical_warehouse?: number, avatar_url?: string
physical_warehouse_name?: string,
} }
export type UserAdminParam = { export type UserAdminParam = {
@ -38,8 +25,8 @@ export type UserAdminParam = {
user_id?: number, user_id?: number,
user_name?: string, user_name?: string,
wechat_user_open_id?: number wechat_user_open_id?: number
is_authorize_name?: false|true, is_authorize_name?: boolean,
is_authorize_phone?: false|true, is_authorize_phone?: boolean,
phone?:string, phone?:string,
authentication_status?:number, authentication_status?:number,
authentication_status_name: string, authentication_status_name: string,
@ -64,11 +51,11 @@ export type DataParam = {
userInfo: UserParam, userInfo: UserParam,
adminUserInfo: UserAdminParam, adminUserInfo: UserAdminParam,
sort_code: SortCodeParam sort_code: SortCodeParam
logingStatus?: false //登录状态 true 正在登录 logingStatus?: boolean //登录状态 true 正在登录
} }
type Action = { export type UserInfoAction = {
type?: string, type: UserInfoActionType
data?: DataParam data?: DataParam
} }
@ -82,40 +69,40 @@ const INIT_USER = {
logingStatus: false logingStatus: false
} }
export default function counter (state = INIT_USER, action: Action) { export default (state = INIT_USER, action: UserInfoAction) => {
const { type, data } = action const { type, data } = action
switch (type) { switch (type) {
case SET_USERINFO: case UserInfoActionType.SET_USERINFO:
Taro.setStorageSync('userInfo', JSON.stringify(data?.userInfo)) Taro.setStorageSync('userInfo', JSON.stringify(data?.userInfo))
return { ...state, ...data } return { ...state, ...data }
case SET_ADMINUSERINFO: case UserInfoActionType.SET_ADMINUSERINFO:
Taro.setStorageSync('adminUserInfo', JSON.stringify(data?.adminUserInfo)) Taro.setStorageSync('adminUserInfo', JSON.stringify(data?.adminUserInfo))
return { ...state, ...data } return { ...state, ...data }
case SET_TOKEN: case UserInfoActionType.SET_TOKEN:
Taro.setStorageSync('token', data?.token) Taro.setStorageSync('token', data?.token)
return { ...state, ...data } return { ...state, ...data }
case SET_SESSIONKEY: case UserInfoActionType.SET_SESSIONKEY:
Taro.setStorageSync('session_key', data?.session_key) Taro.setStorageSync('session_key', data?.session_key)
return { ...state, ...data } return { ...state, ...data }
case SET_SORTCODE: case UserInfoActionType.SET_SORTCODE:
Taro.setStorageSync('sort_code', JSON.stringify(data?.sort_code)) Taro.setStorageSync('sort_code', JSON.stringify(data?.sort_code))
return { ...state, ...data } return { ...state, ...data }
case CLEAR_TOKEN: case UserInfoActionType.CLEAR_TOKEN:
Taro.removeStorageSync('token') Taro.removeStorageSync('token')
return { ...state, token: '' } return { ...state, token: '' }
case CLEAR_SESSIONKEY: case UserInfoActionType.CLEAR_SESSIONKEY:
Taro.removeStorageSync('session_key') Taro.removeStorageSync('session_key')
return { ...state, session_key: '' } return { ...state, session_key: '' }
case CLEAR_USERINFO: case UserInfoActionType.CLEAR_USERINFO:
Taro.removeStorageSync('userInfo') Taro.removeStorageSync('userInfo')
return { ...state, userInfo: null } return { ...state, userInfo: null }
case CLEAR_ADMINUSERINFO: case UserInfoActionType.CLEAR_ADMINUSERINFO:
Taro.removeStorageSync('adminUserInfo') Taro.removeStorageSync('adminUserInfo')
return { ...state, adminUserInfo: null } return { ...state, adminUserInfo: null }
case CLEAR_SORTCODE: case UserInfoActionType.CLEAR_SORTCODE:
Taro.removeStorageSync('sort_code') Taro.removeStorageSync('sort_code')
return { ...state, sortCode: null } return { ...state, sortCode: null }
case LOGIN_STATUS: case UserInfoActionType.LOGIN_STATUS:
return { ...state, ...data } return { ...state, ...data }
default: default:
return state return state

View File

@ -122,6 +122,7 @@ export const useRequest = (
} }
const stateRef = useRef({ ...params }) const stateRef = useRef({ ...params })
console.log('stateRef==>', stateRef)
const [state, setState] = useState({ ...stateRef.current }) const [state, setState] = useState({ ...stateRef.current })
const { removeToken, removeSessionKey, removeUserInfo } = useUserInfo() const { removeToken, removeSessionKey, removeUserInfo } = useUserInfo()
const { login } = useLoginRequest() const { login } = useLoginRequest()
@ -197,9 +198,10 @@ export const useRequest = (
stateRef.current.error = false stateRef.current.error = false
stateRef.current.loading = false stateRef.current.loading = false
setState(() => ({...stateRef.current})) setState(() => ({...stateRef.current}))
console.log('request result stateRef', stateRef.current)
console.log('request result state', state)
return stateRef.current return stateRef.current
} }
return { return {
fetchData, fetchData,
state, state,

View File

@ -1,40 +1,47 @@
import { useDispatch, useSelector } from 'react-redux' import { useDispatch } from 'react-redux'
import { CLEAR_SESSIONKEY, SET_USERINFO, SET_TOKEN, SET_SESSIONKEY, CLEAR_USERINFO, CLEAR_TOKEN, SET_ADMINUSERINFO, SET_SORTCODE } from '@/constants/userInfo' import { UserInfoActionType } from '@/constants/userInfo'
import { DataParam, UserParam, UserAdminParam, SortCodeParam } from '@/reducers/userInfo' import { DataParam, UserParam, UserAdminParam, SortCodeParam, UserInfoAction } from '@/reducers/userInfo'
import { Dispatch } from 'redux'
import { useSelector } from '@/reducers/hooks'
export default () => { export default () => {
const userInfo = useSelector((state: DataParam) => state.userInfo) as DataParam const userInfo = useSelector((state) => state.userInfoData)
const dispatch = useDispatch() const dispatch = useDispatch<Dispatch<UserInfoAction>>()
const setToken = (token: string) => { const setToken = (token: string) => {
dispatch({ type: SET_TOKEN, data: { token } }) // @ts-ignore
dispatch({ type: UserInfoActionType.SET_TOKEN, data: { token } })
} }
const setSessionKey = (sessionkey: string) => { const setSessionKey = (sessionkey: string) => {
dispatch({ type: SET_SESSIONKEY, data: { session_key: sessionkey } }) // @ts-ignore
dispatch({ type: UserInfoActionType.SET_SESSIONKEY, data: { session_key: sessionkey } })
} }
const setUserInfo = (userInfo: UserParam) => { const setUserInfo = (userInfo: UserParam) => {
dispatch({ type: SET_USERINFO, data: { userInfo } }) // @ts-ignore
dispatch({ type: UserInfoActionType.SET_USERINFO, data: { userInfo } })
} }
const setAdminUserInfo = (adminUserInfo: UserAdminParam) => { const setAdminUserInfo = (adminUserInfo: UserAdminParam) => {
dispatch({ type: SET_ADMINUSERINFO, data: { adminUserInfo } }) // @ts-ignore
dispatch({ type: UserInfoActionType.SET_ADMINUSERINFO, data: { adminUserInfo } })
} }
const setSortCode = (sortCode: SortCodeParam) => { const setSortCode = (sortCode: SortCodeParam) => {
dispatch({ type: SET_SORTCODE, data: { sort_code: sortCode } }) // @ts-ignore
dispatch({ type: UserInfoActionType.SET_SORTCODE, data: { sort_code: sortCode } })
} }
const removeUserInfo = () => { const removeUserInfo = () => {
dispatch({ type: CLEAR_USERINFO }) dispatch({ type: UserInfoActionType.CLEAR_USERINFO })
} }
const removeToken = () => { const removeToken = () => {
dispatch({ type: CLEAR_TOKEN }) dispatch({ type: UserInfoActionType.CLEAR_TOKEN })
} }
const removeSessionKey = () => { const removeSessionKey = () => {
dispatch({ type: CLEAR_SESSIONKEY }) dispatch({ type: UserInfoActionType.CLEAR_SESSIONKEY })
} }
return { return {