瀏覽代碼

feat / login system

[baozhangchao] 3 年之前
父節點
當前提交
f22034d32d

+ 1
- 1
config/dev.js 查看文件

@@ -3,7 +3,7 @@ module.exports = {
3 3
     NODE_ENV: '"development"'
4 4
   },
5 5
   defineConstants: {
6
-    HOST: '"http://sgl-v2-test.njyunzhi.com"',
6
+    HOST: '"https://machine.njyunzhi.com"',
7 7
     OSS: '""',
8 8
     // VERSION: '"2.0.33"',
9 9
   },

+ 2
- 1
config/prod.js 查看文件

@@ -3,7 +3,8 @@ module.exports = {
3 3
     NODE_ENV: '"production"'
4 4
   },
5 5
   defineConstants: {
6
-    HOST: '"http://sgl-v2-test.njyunzhi.com"',
6
+    HOST: '"https://machine.njyunzhi.com"',
7
+
7 8
     OSS: '""',
8 9
     // VERSION: '"2.0.33"',
9 10
   },

+ 70
- 20625
package-lock.json
文件差異過大導致無法顯示
查看文件


+ 1
- 2
package.json 查看文件

@@ -40,10 +40,9 @@
40 40
     "@tarojs/react": "3.3.6",
41 41
     "@tarojs/runtime": "3.3.6",
42 42
     "@tarojs/taro": "3.3.6",
43
+    "@zjxpcyc/react-tiny-store": "^1.0.0",
43 44
     "react": "^17.0.0",
44 45
     "react-dom": "^17.0.0",
45
-    "react-redux": "^7.2.6",
46
-    "redux": "^4.1.2",
47 46
     "weui-miniprogram": "^1.2.3"
48 47
   },
49 48
   "devDependencies": {

+ 10
- 11
src/app.js 查看文件

@@ -1,8 +1,6 @@
1 1
 import { Component } from 'react'
2 2
 import Taro from '@tarojs/taro'
3
-import { login } from '@/services/login'
4
-
5
-import store from './store'
3
+import store, { StoreRoot } from './store'
6 4
 
7 5
 import './app.less'
8 6
 
@@ -14,17 +12,14 @@ class App extends Component {
14 12
   componentDidShow () { }
15 13
   onLaunch (options) {
16 14
     // 登录获取人员信息
15
+
16
+    const { logins } = store.getModel('userData').getState()
17
+
17 18
     Taro.login({
18 19
       success: (res) => {
19 20
         const { code } = res;
20
-        login({ code })
21
-
22
-
23
-        const action = { type: "SET_VISIBILITY_FILTER", state: { cookis: 'a1sd54a5wd654s' } }
24
-        store.dispatch(action)
25
-
21
+        logins({ code })
26 22
 
27
-        console.log(store.getState());
28 23
       }
29 24
     })
30 25
 
@@ -32,7 +27,11 @@ class App extends Component {
32 27
 
33 28
   // this.props.children 是将要会渲染的页面
34 29
   render () {
35
-    return this.props.children
30
+    return (
31
+      <StoreRoot>
32
+        {this.props.children}
33
+      </StoreRoot>
34
+    )
36 35
   }
37 36
 }
38 37
 export default App

+ 0
- 1
src/pages/OrderInfo/index.jsx 查看文件

@@ -2,7 +2,6 @@ import { View, Text } from "@tarojs/components"
2 2
 import { useState } from "react"
3 3
 import CustomNav from '@/components/CustomNav'
4 4
 import ButtontWX from '@/components/ButtontWX'
5
-import store from "@/store"
6 5
 // import BottomMoadl from '@/components/BottomMoadl/index'
7 6
 
8 7
 

+ 48
- 9
src/pages/UserLogin/index.jsx 查看文件

@@ -1,18 +1,24 @@
1 1
 
2 2
 import { useState } from 'react'
3 3
 import Taro from '@tarojs/taro'
4
+import { getUserQcode, setUserPhone } from '@/services/login'
4 5
 
5
-import { View, Image, Input, Text } from '@tarojs/components'
6
+import { View, Image, Input, Text, Form } from '@tarojs/components'
6 7
 import CustomNav from '@/components/CustomNav'
7 8
 import ButtontWX from '@/components/ButtontWX'
8 9
 import checkedImg from '@/assets/lolginImages/checkedImg.png'
9 10
 import unselectedImg from '@/assets/lolginImages/unselectedImg.png'
11
+import { useModel } from '@/store'
12
+
10 13
 
11 14
 import './style.less'
12 15
 
13 16
 
14 17
 export default (props) => {
15 18
 
19
+  const { person, setUserPhoneInfo } = useModel('userData')
20
+
21
+
16 22
   const [countCenter, setCountCenter] = useState({
17 23
     count: 60,
18 24
     toast: false,
@@ -21,14 +27,22 @@ export default (props) => {
21 27
   })
22 28
 
23 29
   const [checkImage, setCheckImage] = useState(false)
24
-  const [InputCodeValue, setInputCodeValue] = useState('')
25 30
 
26
-  const InputCode = (r) => {
27
-    setInputCodeValue(r.detail.value)
31
+  const [InputPhoneValue, setInputPhoneValue] = useState('18082043755')
32
+  const [InputCodeValue, setInputCodeValue] = useState('375501')
33
+
34
+  const onInputPhone = (r) => {
35
+    setInputPhoneValue(r.detail.value)
36
+    console.log("🚀 ~ file: index.jsx ~ line 26 ~ InputCodeValue", InputPhoneValue)
37
+
28 38
   }
39
+  const onInputCode = (r) => {
40
+    setInputCodeValue(r.detail.value)
29 41
 
42
+  }
43
+  //获取验证码
30 44
   const getCode = (r) => {
31
-    if (InputCodeValue === '' || !(/^1[3456789]\d{9}$/.test(InputCodeValue))) {
45
+    if (InputPhoneValue === '' || !(/^1[3456789]\d{9}$/.test(InputPhoneValue))) {
32 46
       console.log('提示')
33 47
       Taro.showToast({
34 48
         title: '手机号码有误',
@@ -37,6 +51,13 @@ export default (props) => {
37 51
       })
38 52
 
39 53
     } else {
54
+      getUserQcode({ phone: InputPhoneValue }).then(() => {
55
+        Taro.showToast({
56
+          title: '验证码发送成功',
57
+          icon: 'none',
58
+          duration: 2000
59
+        })
60
+      })
40 61
       let count = countCenter.count
41 62
       const timer = setInterval(() => {
42 63
         setCountCenter({
@@ -61,13 +82,30 @@ export default (props) => {
61 82
 
62 83
 
63 84
   const getUserLogin = () => {
64
-    if (!checkImage) {
85
+    if (InputPhoneValue === '' || !(/^1[3456789]\d{9}$/.test(InputPhoneValue))) {
86
+      console.log('提示')
65 87
       Taro.showToast({
66
-        title: '下方协议未勾选',
88
+        title: '手机号或验证码有误',
67 89
         icon: 'none',
68 90
         duration: 2000
69 91
       })
92
+    } else {
93
+      if (!checkImage) {
94
+        Taro.showToast({
95
+          title: '下方协议未勾选',
96
+          icon: 'none',
97
+          duration: 2000
98
+        })
99
+      } else {
100
+        setUserPhone(person.personId, { captcha: InputCodeValue, phone: InputPhoneValue }).then((e) => {
101
+          console.log('e', e);
102
+          Taro.reLaunch({ url: '/pages/index/index?tab=2&userOk' });
103
+        })
104
+        // console.log('person', person);
105
+      }
106
+
70 107
     }
108
+
71 109
   }
72 110
 
73 111
 
@@ -87,14 +125,15 @@ export default (props) => {
87 125
         <View>
88 126
           <View className='loginPhone-box' >
89 127
             <View className='loginPhone-box-loginPhoneView'>+86</View>
90
-            <Input maxlength={11} placeholder='请输入手机号码' type={Number} onInput={InputCode} />
128
+            <Input maxlength={11} placeholder='请输入手机号码' type={Number} value={InputPhoneValue} onInput={onInputPhone} />
129
+
91 130
             <ButtontWX opacity={countCenter.show_btn ? '0.7' : '11'} disabled={countCenter.show_btn} onClick={getCode} butText={countCenter.code_ts} butWidth={94} butHeight={34} butFontSize={15} butBorderRadius={10} />
92 131
           </View>
93 132
           <View className='loginPhone-box'>
94 133
             <View className='loginPhone-box-loginPhoneView'>
95 134
               <Image style={{ width: '16px', height: '20px', margin: 'auto 2.8vw auto 2.8vw' }} src={require("@/assets/lolginImages/phoneCode.png")} />
96 135
             </View>
97
-            <Input maxlength={10} placeholder='请输入验证码' />
136
+            <Input maxlength={10} placeholder='请输入验证码' value={InputCodeValue} onInput={onInputCode} />
98 137
           </View>
99 138
         </View>
100 139
       </View>

+ 0
- 13
src/pages/index/tabs/Homes.jsx 查看文件

@@ -7,7 +7,6 @@ import searchs from '@/assets/homesImgaes/searchs.png'//搜索图片
7 7
 import carsListImga from '@/assets/homesImgaes/carsListImga.png'//农机列表图片
8 8
 
9 9
 
10
-import store from '@/store'
11 10
 
12 11
 import './HomesCss/style.less'
13 12
 
@@ -39,18 +38,6 @@ export default (props) => {
39 38
   const goToCarsList = () => {//更多
40 39
     Taro.navigateTo({ url: '/pages/MoreCars/index' })
41 40
 
42
-    // let value = store.getState()
43
-    // console.log('value-Home里面取值', store.getState());
44
-    // if (value.appid == '') {
45
-    //   Taro.showToast({
46
-    //     title: '成功',
47
-    //     icon: 'success',
48
-    //     duration: 2000
49
-    //   })
50
-    // } else {
51
-
52
-    // }
53
-
54 41
   }
55 42
 
56 43
   const startReserve = () => {

+ 20
- 9
src/pages/index/tabs/Mine.jsx 查看文件

@@ -1,7 +1,7 @@
1 1
 
2 2
 import { View, Image } from "@tarojs/components"
3 3
 import Taro from "@tarojs/taro"
4
-import { useState } from "react"
4
+import { useState, useEffect } from "react"
5 5
 import UserCellBox from '@/components/UserCellBox'
6 6
 import addresss from '@/assets/mineImgaes/addresss.png'//地址
7 7
 import aboutUs from '@/assets/mineImgaes/aboutUs.png'//关于我们
@@ -9,11 +9,15 @@ import feedbacks from '@/assets/mineImgaes/feedbacks.png'//意见反馈
9 9
 import helpCenter from '@/assets/mineImgaes/helpCenter.png'//帮助中心
10 10
 import versionUpdate from '@/assets/mineImgaes/versionUpdate.png'//版本更新
11 11
 import userRight from '@/assets/mineImgaes/userRight.png'//版本更新
12
-import store from "@/store"
12
+import { useModel } from "@/store"
13
+
14
+
15
+
13 16
 import './MineCss/style.less'
14 17
 
15 18
 
16 19
 export default (props) => {
20
+  const { person } = useModel('userData')
17 21
   const [isLoginBox, setIsLoginBox] = useState(false)
18 22
   const userList = [
19 23
     { userTitle: '关于我们', userImg: aboutUs, pageType: 0 },
@@ -22,6 +26,18 @@ export default (props) => {
22 26
     { userTitle: '意见反馈', userImg: feedbacks, pageType: 3 },
23 27
   ]
24 28
 
29
+  const $instance = Taro.getCurrentInstance()
30
+
31
+
32
+  useEffect(() => {
33
+    console.log($instance.router.params)
34
+    if ($instance.router.params.userOk || person.phone) {
35
+      setIsLoginBox(true)
36
+    } else {
37
+      console.log('没有',);
38
+    }
39
+  }, [$instance.router.params, person])
40
+
25 41
 
26 42
   const setAddress = (dd) => {
27 43
     Taro.navigateTo({ url: `/pages/MyAddressInfo/index?id${dd}` })
@@ -29,12 +45,7 @@ export default (props) => {
29 45
   }
30 46
 
31 47
   const userLoginnow = () => {
32
-    const action = { type: "SET_VISIBILITY_FILTER", state: { appid: '55555555555' } }
33
-    store.dispatch(action)
34
-    console.log(store.getState());
35
-
36
-
37
-    // Taro.navigateTo({ url: `/pages/UserLogin/index?id` })
48
+    Taro.navigateTo({ url: `/pages/UserLogin/index?id` })
38 49
     // setIsLoginBox(true)
39 50
   }
40 51
   const goToPages = (res) => {
@@ -80,7 +91,7 @@ export default (props) => {
80 91
                 <Image className='User-Avatar-background-trueBox-userImg' src='https://profile.csdnimg.cn/3/1/5/0_qq_42551866' />
81 92
                 <View className='User-Avatar-background-trueBox-name'>
82 93
                   <View >鲍zhangchao</View>
83
-                  <View >18082043755</View>
94
+                  <View >{person.phone}</View>
84 95
                 </View>
85 96
 
86 97
               </View>

+ 16
- 1
src/services/login.js 查看文件

@@ -4,4 +4,19 @@ import request from '@/utils/request'
4 4
  * @param {*} data 
5 5
  * @returns 
6 6
  */
7
-export const login = (data) => request('/login', { data, method: 'post' })
7
+export const login = (data) => request('/login', { data, method: 'post' })
8
+
9
+/**
10
+ * 发送验证码
11
+ * @param {*} data 
12
+ * @returns 
13
+ */
14
+export const getUserQcode = (params) => request('/sms-captcha', { method: 'post', params })
15
+
16
+/**
17
+* 验证码登陆
18
+* @param {*} 
19
+* @returns 
20
+*/
21
+
22
+export const setUserPhone = (id, data) => request(`/person/${id}/phone`, { method: 'put', data })

+ 12
- 4
src/store/index.js 查看文件

@@ -1,8 +1,16 @@
1
-import { createStore } from 'redux'
2
-import reducer from './reducers'
1
+import { createStore, createStoreRoot, createModelHook } from '@zjxpcyc/react-tiny-store'
2
+import userData from './userData'
3 3
 
4
+const store = createStore()
5
+const models = { userData, }
4 6
 
5
-const store = createStore(reducer) // 创建数据存储仓库
6 7
 
7 8
 
8
-export default store   
9
+const useModel = createModelHook(store)
10
+const StoreRoot = createStoreRoot(store, models)
11
+
12
+export default store
13
+export {
14
+  useModel,
15
+  StoreRoot,
16
+}

+ 0
- 43
src/store/reducers.js 查看文件

@@ -1,43 +0,0 @@
1
-const defaultState = {
2
-  appid: '',
3
-  cookis: ''
4
-}
5
-console.log(defaultState, 'defaultState');
6
-
7
-
8
-function todoApp (state = defaultState, action) {
9
-  state = JSON.parse(JSON.stringify(state)) //深度
10
-  switch (action.type) {
11
-    case 'SET_VISIBILITY_FILTER':
12
-      state = {
13
-        ...defaultState,
14
-        ...action.state
15
-      }
16
-      return state;
17
-    default:
18
-      return state;
19
-
20
-
21
-
22
-  }
23
-}
24
-
25
-
26
-// function fn (state = defaultState, action) {
27
-//   state = JSON.parse(JSON.stringify(state)) //深度
28
-
29
-//   switch (action.type) {
30
-//     case "setVisibilityFilter":
31
-//       state = {
32
-//         ...defaultState,
33
-//         ...action.state
34
-//       }
35
-//       return state;
36
-//     default:
37
-//       return state;
38
-//   }
39
-
40
-// }
41
-
42
-const state = todoApp
43
-export default state

+ 35
- 0
src/store/userData.js 查看文件

@@ -0,0 +1,35 @@
1
+import { useState } from "react"
2
+import { login } from '@/services/login'
3
+
4
+
5
+
6
+export default () => {
7
+  const [person, setPerson] = useState()
8
+  const [sessionKey, setSessionKey] = useState()
9
+  const [userPhoneInfo, setUserPhoneInfo] = useState()
10
+
11
+  console.log("🚀 ~ file: userData.js ~ line 8 ~ person", person)
12
+
13
+
14
+
15
+  const logins = (params) => {
16
+    login(params).then((res) => {
17
+      const { person: taPerson, sessionKey: skey } = res;
18
+      setPerson(taPerson);
19
+      setSessionKey(skey);
20
+    })
21
+  }
22
+
23
+  return {
24
+    person,
25
+    sessionKey,
26
+
27
+    setPerson,
28
+    setSessionKey,
29
+
30
+    userPhoneInfo,
31
+    setUserPhoneInfo,
32
+
33
+    logins,
34
+  }
35
+}

+ 4
- 4
src/utils/request.js 查看文件

@@ -8,15 +8,15 @@ export default (url, options) => {
8 8
   const queryStr = getQueryString(params)
9 9
 
10 10
   if (!appid) {
11
-    const { miniProgram } = Taro.getAccountInfoSync
12
-    appid = miniProgram.appid
11
+    const { miniProgram } = Taro.getAccountInfoSync()
12
+    appid = miniProgram.appId
13 13
   }
14 14
 
15 15
   const urlWithParams = queryStr ? `${url}?${queryStr}` : url;
16
-  const nwUrl = `${HOST}/api/wx${appid}${urlWithParams}`
16
+  const nwUrl = `${HOST}/api/wx/${appid}${urlWithParams}`
17 17
 
18 18
   const authToken = Taro.getStorageSync('token')
19
-  const tokenHeader = authToken ? { 'X-Authorization-JWT': authToken } : {}
19
+  const tokenHeader = authToken ? { Authorization: authToken } : {}
20 20
   const nwHeader = {
21 21
     ...(header || {}),
22 22
     ...tokenHeader,

+ 13
- 55
yarn.lock 查看文件

@@ -1046,7 +1046,7 @@
1046 1046
     core-js-pure "^3.20.2"
1047 1047
     regenerator-runtime "^0.13.4"
1048 1048
 
1049
-"@babel/runtime@^7.11.2", "@babel/runtime@^7.15.4", "@babel/runtime@^7.7.6", "@babel/runtime@^7.7.7", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
1049
+"@babel/runtime@^7.11.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.7.7", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
1050 1050
   version "7.17.7"
1051 1051
   resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.7.tgz"
1052 1052
   integrity sha512-L6rvG9GDxaLgFjg41K+5Yv9OMrU98sWe+Ykmc6FDJW/+vYZMhdOMKkISgzptMaERHvS2Y2lw9MDRm2gHhlQQoA==
@@ -1542,14 +1542,6 @@
1542 1542
     "@types/minimatch" "*"
1543 1543
     "@types/node" "*"
1544 1544
 
1545
-"@types/hoist-non-react-statics@^3.3.0":
1546
-  version "3.3.1"
1547
-  resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz"
1548
-  integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==
1549
-  dependencies:
1550
-    "@types/react" "*"
1551
-    hoist-non-react-statics "^3.3.0"
1552
-
1553 1545
 "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8":
1554 1546
   version "7.0.9"
1555 1547
   resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz"
@@ -1597,17 +1589,7 @@
1597 1589
   resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz"
1598 1590
   integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==
1599 1591
 
1600
-"@types/react-redux@^7.1.20":
1601
-  version "7.1.23"
1602
-  resolved "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.23.tgz"
1603
-  integrity sha512-D02o3FPfqQlfu2WeEYwh3x2otYd2Dk1o8wAfsA0B1C2AJEFxE663Ozu7JzuWbznGgW248NaOF6wsqCGNq9d3qw==
1604
-  dependencies:
1605
-    "@types/hoist-non-react-statics" "^3.3.0"
1606
-    "@types/react" "*"
1607
-    hoist-non-react-statics "^3.3.0"
1608
-    redux "^4.0.0"
1609
-
1610
-"@types/react@*", "@types/react@^17.0.2":
1592
+"@types/react@^17.0.2":
1611 1593
   version "17.0.39"
1612 1594
   resolved "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz"
1613 1595
   integrity sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug==
@@ -1932,6 +1914,13 @@
1932 1914
   resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz"
1933 1915
   integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
1934 1916
 
1917
+"@zjxpcyc/react-tiny-store@^1.0.0":
1918
+  version "1.0.0"
1919
+  resolved "https://registry.yarnpkg.com/@zjxpcyc/react-tiny-store/-/react-tiny-store-1.0.0.tgz#316a2a0336273c1c014bf2f55a513583770c7181"
1920
+  integrity sha512-ykPq4Tlfv4dr8HHSsBHBzcms8R3dld80FaZruMwxhIUqTQ+ypIDvQYqpajnnvS9sOPDZNqWyd9+mRiyKcADf9g==
1921
+  dependencies:
1922
+    fast-deep-equal "^3.1.3"
1923
+
1935 1924
 abab@^2.0.0:
1936 1925
   version "2.0.5"
1937 1926
   resolved "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz"
@@ -4564,9 +4553,9 @@ extsprintf@1.3.0, extsprintf@^1.2.0:
4564 4553
   resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz"
4565 4554
   integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
4566 4555
 
4567
-fast-deep-equal@^3.1.1:
4556
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
4568 4557
   version "3.1.3"
4569
-  resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
4558
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
4570 4559
   integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
4571 4560
 
4572 4561
 fast-glob@^2.0.2:
@@ -5239,13 +5228,6 @@ hmac-drbg@^1.0.1:
5239 5228
     minimalistic-assert "^1.0.0"
5240 5229
     minimalistic-crypto-utils "^1.0.1"
5241 5230
 
5242
-hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2:
5243
-  version "3.3.2"
5244
-  resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz"
5245
-  integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
5246
-  dependencies:
5247
-    react-is "^16.7.0"
5248
-
5249 5231
 hosted-git-info@^2.1.4:
5250 5232
   version "2.8.9"
5251 5233
   resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz"
@@ -7980,7 +7962,7 @@ promise-inflight@^1.0.1:
7980 7962
   resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz"
7981 7963
   integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
7982 7964
 
7983
-prop-types@^15.7.2, prop-types@^15.8.1:
7965
+prop-types@^15.8.1:
7984 7966
   version "15.8.1"
7985 7967
   resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
7986 7968
   integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@@ -8167,16 +8149,11 @@ react-dom@^17.0.0:
8167 8149
     object-assign "^4.1.1"
8168 8150
     scheduler "^0.20.2"
8169 8151
 
8170
-react-is@^16.13.1, react-is@^16.7.0:
8152
+react-is@^16.13.1:
8171 8153
   version "16.13.1"
8172 8154
   resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
8173 8155
   integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
8174 8156
 
8175
-react-is@^17.0.2:
8176
-  version "17.0.2"
8177
-  resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz"
8178
-  integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
8179
-
8180 8157
 react-reconciler@0.26.1:
8181 8158
   version "0.26.1"
8182 8159
   resolved "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.26.1.tgz"
@@ -8186,18 +8163,6 @@ react-reconciler@0.26.1:
8186 8163
     object-assign "^4.1.1"
8187 8164
     scheduler "^0.20.1"
8188 8165
 
8189
-react-redux@^7.2.6:
8190
-  version "7.2.6"
8191
-  resolved "https://registry.npmjs.org/react-redux/-/react-redux-7.2.6.tgz"
8192
-  integrity sha512-10RPdsz0UUrRL1NZE0ejTkucnclYSgXp5q+tB5SWx2qeG2ZJQJyymgAhwKy73yiL/13btfB6fPr+rgbMAaZIAQ==
8193
-  dependencies:
8194
-    "@babel/runtime" "^7.15.4"
8195
-    "@types/react-redux" "^7.1.20"
8196
-    hoist-non-react-statics "^3.3.2"
8197
-    loose-envify "^1.4.0"
8198
-    prop-types "^15.7.2"
8199
-    react-is "^17.0.2"
8200
-
8201 8166
 react-refresh@0.9.0:
8202 8167
   version "0.9.0"
8203 8168
   resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz"
@@ -8293,13 +8258,6 @@ redent@^2.0.0:
8293 8258
     indent-string "^3.0.0"
8294 8259
     strip-indent "^2.0.0"
8295 8260
 
8296
-redux@^4.0.0, redux@^4.1.2:
8297
-  version "4.1.2"
8298
-  resolved "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz"
8299
-  integrity sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==
8300
-  dependencies:
8301
-    "@babel/runtime" "^7.9.2"
8302
-
8303 8261
 reflect-metadata@^0.1.13:
8304 8262
   version "0.1.13"
8305 8263
   resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz"