Commit fe0f27b0 authored by mayi's avatar mayi
Browse files

运用redux react-redux

parent 6ee8216e
This diff is collapsed.
......@@ -7246,6 +7246,14 @@
"terser": "^4.6.3"
}
},
"html-parse-stringify": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
"integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
"requires": {
"void-elements": "3.1.0"
}
},
"html-webpack-plugin": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz",
......@@ -7473,6 +7481,14 @@
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
"integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
},
"i18next": {
"version": "20.3.1",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-20.3.1.tgz",
"integrity": "sha512-WTY07KreR5z2LBSzAIKs05zpR5tgUT98C4fD96e7Risbc/HZePwF6AEnb9VkjdeSeRn9PDqQBay7ZkphuXt0Xw==",
"requires": {
"@babel/runtime": "^7.12.0"
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
......@@ -12607,6 +12623,25 @@
"resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.8.tgz",
"integrity": "sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw=="
},
"react-i18next": {
"version": "11.10.0",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.10.0.tgz",
"integrity": "sha512-Vn0Xw2MczBZHKciWdayx4J+P3S9Im2FWIzUPV2O7iUVFqIOhMv6o9mVTJN1gEi/MA2FZzorjvaEijglCMeehZQ==",
"requires": {
"@babel/runtime": "^7.14.0",
"html-parse-stringify": "^3.0.1"
},
"dependencies": {
"@babel/runtime": {
"version": "7.14.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz",
"integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==",
"requires": {
"regenerator-runtime": "^0.13.4"
}
}
}
},
"react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
......@@ -15400,6 +15435,11 @@
"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
"integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
},
"void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
"integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk="
},
"w3c-hr-time": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
......
......@@ -2,14 +2,15 @@ import * as React from "react";
import { Component } from "react";
import { Layout, Typography, Input, Menu, Button, Dropdown } from "antd";
import { useTranslation } from "react-i18next";
export const Footer: React.FC = () => {
const {t} = useTranslation();
return <>
<Layout.Footer>
<Typography.Title level={3} style={{textAlign: 'center'}}>
版权所有 @ React 旅游网
{t('footer.detail')}
</Typography.Title>
</Layout.Footer></>;
};
//函数式组件
import * as React from "react";
import { Component } from "react";
import logo from "../../assets/logo.svg";
......
//类组件
import * as React from "react";
import { Component } from "react";
import logo from "../../assets/logo.svg";
import styles from "./Header.module.css";
import { withTranslation, WithTranslation } from "react-i18next";
import { connect } from "react-redux";
import { Dispatch } from "redux";
import {
changeLanguageActionCreator,
addLanguageActionCreator,
} from "../../redux/language/languageActions";
import {
Layout,
Typography,
Input,
Menu,
Button,
Dropdown,
MenuItemProps,
} from "antd";
import { GlobalOutlined } from "@ant-design/icons";
import { withRouter, RouteComponentProps } from "react-router-dom";
import { RootState } from "../../redux/store";
const mapStateToProps = (state: RootState) => {
return {
language: state.language,
languageList: state.languageList,
};
};
const mapDispatchToProps =(dispatch:Dispatch) =>{
return{
changeLanguage:(code:'en'|'zh')=>{
const action =changeLanguageActionCreator(code)
dispatch(action)
},
addLanguage:(name:string,code:string)=>{
const action = addLanguageActionCreator(name,code)
dispatch(action)
}
}
}
class HeaderComponent extends React.Component<
RouteComponentProps & WithTranslation & ReturnType<typeof mapStateToProps>&ReturnType<typeof mapDispatchToProps>
> {
changeLanguage = (e) => {
if (e.key === "new") {
this.props.addLanguage("新语言", "新语言");
} else {
this.props.changeLanguage(e.key);
}
};
render() {
const { t } = this.props;
console.log(this.props);
const { history } = this.props;
return (
<>
<div className={styles["app-header"]}>
{/* top-header */}
<div className={styles["top-header"]}>
<div className={styles["inner"]}>
<Typography.Text>{t("header.slogan")}</Typography.Text>
<Dropdown.Button
style={{ marginLeft: 15 }}
overlay={
<Menu onClick={this.changeLanguage}>
{this.props.languageList.map((item, index) => (
<Menu.Item key={item.code}>{item.name}</Menu.Item>
))}
<Menu.Item key={"new"}>{t("header.slogan")}</Menu.Item>
</Menu>
}
icon={<GlobalOutlined />}
>
{this.props.language === "zh" ? "中文" : "English"}
</Dropdown.Button>
<Button.Group className={styles["button-group"]}>
<Button onClick={() => history.push("/register")}>
{t("header.register")}
</Button>
<Button onClick={() => history.push("/signin")}>登陆</Button>
</Button.Group>
</div>
</div>
<Layout.Header className={styles["main-header"]}>
<span>
<img src={logo} alt="logo" className={styles["App-logo"]} />
<Typography.Title level={3} className={styles.title}>
{t("header.title")}
</Typography.Title>
</span>
<Input.Search
placeholder={"请输入旅游目的地、主题、或关键字"}
className={styles["search-input"]}
/>
</Layout.Header>
<Menu mode={"horizontal"} className={styles["main-menu"]}>
<Menu.Item key={1}>旅游首页</Menu.Item>
<Menu.Item key={2}>周末游</Menu.Item>
<Menu.Item key={3}>跟团游</Menu.Item>
<Menu.Item key="4"> 自由行 </Menu.Item>
<Menu.Item key="5"> 私家团 </Menu.Item>
<Menu.Item key="6"> 邮轮 </Menu.Item>
<Menu.Item key="7"> 酒店+景点 </Menu.Item>
<Menu.Item key="8"> 当地玩乐 </Menu.Item>
<Menu.Item key="9"> 主题游 </Menu.Item>
<Menu.Item key="10"> 定制游 </Menu.Item>
<Menu.Item key="11"> 游学 </Menu.Item>
<Menu.Item key="12"> 签证 </Menu.Item>
<Menu.Item key="13"> 企业游 </Menu.Item>
<Menu.Item key="14"> 高端游 </Menu.Item>
<Menu.Item key="15"> 爱玩户外 </Menu.Item>
<Menu.Item key="16"> 保险 </Menu.Item>
</Menu>
</div>
</>
);
}
}
export const Header = connect(mapStateToProps,mapDispatchToProps)(
withTranslation()(withRouter(HeaderComponent))
);
export * from './Header'
\ No newline at end of file
export * from './HeaderClass'
\ No newline at end of file
import * as React from "react";
import {withRouter,RouteComponentProps} from 'react-router-dom'
import { withRouter, RouteComponentProps } from "react-router-dom";
import { Typography, Image } from "antd";
interface PropsType extends RouteComponentProps {
id: string | number;
......@@ -9,7 +9,7 @@ interface PropsType extends RouteComponentProps {
title: string;
}
const ProductImageComponent: React.FC<PropsType> = ({
const ProductImageComponent: React.FC<PropsType> = ({
id,
size,
imageSrc,
......@@ -17,10 +17,10 @@ interface PropsType extends RouteComponentProps {
title,
history,
location,
match
match,
}) => {
return (
<div onClick={()=>history.push(`detail/${id}`)}>
<div onClick={() => history.push(`detail/${id}`)}>
{size === "large" ? (
<Image src={imageSrc} height={280} width={480} />
) : (
......@@ -35,4 +35,4 @@ interface PropsType extends RouteComponentProps {
</div>
);
};
export const ProductImage = withRouter(ProductImageComponent)
\ No newline at end of file
export const ProductImage = withRouter(ProductImageComponent);
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import translation_en from "./en.json";
import translation_zh from "./zh.json";
const resources = {
en: {
translation: translation_en,
},
zh: {
translation: translation_zh,
},
};
i18n
.use(initReactI18next) // passes i18n down to react-i18next
.init({
resources,
lng: "zh",
// keySeparator: false, // we do not use keys in form messages.welcome
// header.slogan
interpolation: {
escapeValue: false, // react already safes from xss
},
});
export default i18n;
{
"header": {
"slogan": "Make travel happier",
"add_new_language": "add new language",
"title": "React Travel",
"register":"Register",
"signin":"Sign In",
"home_page": "Home",
"weekend": "Weekend",
"group": "Group",
"backpack": "Backpack",
"private": "Private",
"cruise": "Cruise",
"hotel": "Hotel & Attractions",
"local": "Local",
"theme": "Theme",
"custom": "Custom",
"study": "Study",
"visa":"Visa",
"enterprise":"Enterprise",
"high_end":"High-end",
"outdoor":"Outdoor",
"insurance":"Insurance"
},
"footer": {
"detail" : "All rights reserved @ ReactTravel.com"
},
"home_page": {
"hot_recommended": "Hot Recommended",
"new_arrival": "New arrival",
"domestic_travel": "Domestic travel",
"joint_venture": "Joint Venture",
"start_from": "(start from)"
}
}
\ No newline at end of file
{
"header": {
"slogan": "让旅行更幸福",
"add_new_language": "添加新语言",
"title": "React 旅游网",
"register":"注册",
"signin":"登陆",
"home_page": "旅游首页",
"weekend": "周末游",
"group": "跟团游",
"backpack": "自由行",
"private": "私家团",
"cruise": "邮轮",
"hotel": "酒店+景点",
"local": "当地玩乐",
"theme": "主题游",
"custom": "定制游",
"study": "游学",
"visa":"签证",
"enterprise":"企业游",
"high_end":"高端游",
"outdoor":"爱玩户外",
"insurance":"保险"
},
"footer": {
"detail" : "版权所有 @ React 旅游网"
},
"home_page": {
"hot_recommended": "爆款推荐",
"new_arrival": "新品上市",
"domestic_travel": "国内游推荐",
"joint_venture": "合作企业",
"start_from": "(起)"
}
}
\ No newline at end of file
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import 'antd/dist/antd.css'
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import "./i18n/configs";
import "antd/dist/antd.css";
import { Provider } from "react-redux";
import store from "./redux/store";
ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>,
document.getElementById('root')
document.getElementById("root")
);
import * as React from "react";
// import { Component } from "react";
import {withTranslation,WithTranslation} from 'react-i18next'
import {
Header,
Footer,
......@@ -15,12 +16,13 @@ import sideImage2 from "../../assets/images/sider_2019_02-04.png";
import sideImage3 from "../../assets/images/sider_2019_12-09.png";
import { Row, Col, Typography } from "antd";
export class HomePage extends React.Component {
export class HomePageComponent extends React.Component<WithTranslation> {
// constructor(props: HomePageProps) {
// super(props);
// this.state = { : };
// }
render() {
const {t} = this.props
return (
<>
<Header />
......@@ -42,7 +44,7 @@ export class HomePage extends React.Component {
<ProductCollection
title={
<Typography.Title level={3} type="warning">
爆款推荐
{t("home_page.hot_recommended")}
</Typography.Title>
}
sideImage={sideImage1}
......@@ -51,7 +53,7 @@ export class HomePage extends React.Component {
<ProductCollection
title={
<Typography.Title level={3} type="danger">
新品上市
{t("home_page.new_arrival")}
</Typography.Title>
}
sideImage={sideImage2}
......@@ -60,7 +62,7 @@ export class HomePage extends React.Component {
<ProductCollection
title={
<Typography.Title level={3} type="success">
国内游推荐
{t("home_page.domestic_travel")}
</Typography.Title>
}
sideImage={sideImage3}
......@@ -76,3 +78,4 @@ export class HomePage extends React.Component {
}
export const HomePage =withTranslation()(HomePageComponent)
\ No newline at end of file
import i18n from "i18next";
import {CHANGE_LANGUAGE,ADD_LANGUAGE,languageActionTypes} from './languageActions'
export interface LanguageState {
language: "en" | "zh";
languageList: { name: string; code: string }[];
}
const defaultState: LanguageState = {
language: "zh",
languageList: [
{ name: "中文", code: "zh" },
{ name: "English", code: "en" },
],
};
// eslint-disable-next-line import/no-anonymous-default-export
export default (state = defaultState, action:languageActionTypes) => {
switch (action.type) {
case CHANGE_LANGUAGE:
i18n.changeLanguage(action.payload);//此处会导致不是纯函数
return { ...state, language: action.payload };
case ADD_LANGUAGE:
return {
...state,
languageList: [...state.languageList, action.payload],
};
default:
return state;
}
};
import language from "./language";
export const CHANGE_LANGUAGE = "changeLanguage";
export const ADD_LANGUAGE = "addLanguage";
interface changeLanguageActionCreator {
type: typeof CHANGE_LANGUAGE;
payload: "en" | "zh";
}
interface addLanguageActionCreator {
type: typeof ADD_LANGUAGE;
payload: { name: string; code: string };
}
export type languageActionTypes =
| changeLanguageActionCreator
| addLanguageActionCreator;
export const changeLanguageActionCreator = (
languageCode: "en" | "zh"
): changeLanguageActionCreator => {
return {
type: CHANGE_LANGUAGE,
payload: languageCode,
};
};
export const addLanguageActionCreator = (
name: string,
code: string
): addLanguageActionCreator => {
return {
type: ADD_LANGUAGE,
payload: { name, code },
};
};
import { createStore } from "redux";
import languageReducer from "./language/language";
const store = createStore(languageReducer);
export type RootState =ReturnType<typeof store.getState>
export default store;
......@@ -1192,7 +1192,7 @@
dependencies:
regenerator-runtime "^0.13.4"
 
"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6"
integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==
......@@ -1810,6 +1810,14 @@
resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934"
integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==
 
"@types/hoist-non-react-statics@^3.3.0":
version "3.3.1"
resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==
dependencies:
"@types/react" "*"
hoist-non-react-statics "^3.3.0"
"@types/html-minifier-terser@^5.0.0":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50"
......@@ -1899,6 +1907,16 @@
dependencies:
"@types/react" "^16"
 
"@types/react-redux@^7.1.16":
version "7.1.16"
resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.16.tgz#0fbd04c2500c12105494c83d4a3e45c084e3cb21"
integrity sha512-f/FKzIrZwZk7YEO9E1yoxIuDNRiDducxkFlkw/GNMGEnK9n4K8wJzlJBghpSuOVDgEUHoDkDF7Gi9lHNQR4siw==
dependencies:
"@types/hoist-non-react-statics" "^3.3.0"
"@types/react" "*"
hoist-non-react-statics "^3.3.0"
redux "^4.0.0"
"@types/react-router-dom@^5.1.7":
version "5.1.7"
resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.7.tgz#a126d9ea76079ffbbdb0d9225073eb5797ab7271"
......@@ -5669,7 +5687,7 @@ hmac-drbg@^1.0.1:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.1"
 
hoist-non-react-statics@^3.1.0:
hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
......@@ -5736,6 +5754,13 @@ html-minifier-terser@^5.0.1:
relateurl "^0.2.7"
terser "^4.6.3"
 
html-parse-stringify@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2"
integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==
dependencies:
void-elements "3.1.0"
html-webpack-plugin@4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c"
......@@ -5851,6 +5876,13 @@ human-signals@^1.1.1:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
 
i18next@^20.3.1:
version "20.3.1"
resolved "https://registry.yarnpkg.com/i18next/-/i18next-20.3.1.tgz#b51dd281a2eec8087753edf1727e160dac8a5554"
integrity sha512-WTY07KreR5z2LBSzAIKs05zpR5tgUT98C4fD96e7Risbc/HZePwF6AEnb9VkjdeSeRn9PDqQBay7ZkphuXt0Xw==
dependencies:
"@babel/runtime" "^7.12.0"
iconv-lite@0.4.24, iconv-lite@^0.4.4:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
......@@ -9728,7 +9760,15 @@ react-error-overlay@^6.0.9:
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a"
integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==
 
react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1:
react-i18next@^11.10.0:
version "11.10.0"
resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.10.0.tgz#f34257447e18e710e36d8fd3f721dd7d37c7004f"
integrity sha512-Vn0Xw2MczBZHKciWdayx4J+P3S9Im2FWIzUPV2O7iUVFqIOhMv6o9mVTJN1gEi/MA2FZzorjvaEijglCMeehZQ==
dependencies:
"@babel/runtime" "^7.14.0"
html-parse-stringify "^3.0.1"
react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
......@@ -9738,6 +9778,18 @@ react-is@^17.0.1:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
 
react-redux@^7.2.4:
version "7.2.4"
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.4.tgz#1ebb474032b72d806de2e0519cd07761e222e225"
integrity sha512-hOQ5eOSkEJEXdpIKbnRyl04LhaWabkDPV+Ix97wqQX3T3d2NQ8DUblNXXtNMavc7DpswyQM6xfaN4HQDKNY2JA==
dependencies:
"@babel/runtime" "^7.12.1"
"@types/react-redux" "^7.1.16"
hoist-non-react-statics "^3.3.2"
loose-envify "^1.4.0"
prop-types "^15.7.2"
react-is "^16.13.1"
react-refresh@^0.8.3:
version "0.8.3"
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f"
......@@ -9935,6 +9987,13 @@ redent@^3.0.0:
indent-string "^4.0.0"
strip-indent "^3.0.0"
 
redux@^4.0.0, redux@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.0.tgz#eb049679f2f523c379f1aff345c8612f294c88d4"
integrity sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g==
dependencies:
"@babel/runtime" "^7.9.2"
regenerate-unicode-properties@^8.2.0:
version "8.2.0"
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
......@@ -11716,6 +11775,11 @@ vm-browserify@^1.0.1:
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
 
void-elements@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09"
integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=
w3c-hr-time@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment