Merge branch 'chore/retire-redux' into 'main'

Chore/retire redux

See merge request bloodyhealth/drip!511
This commit is contained in:
Sofiya Tepikin
2022-09-10 16:00:19 +00:00
22 changed files with 86 additions and 320 deletions
+1 -10
View File
@@ -3,9 +3,6 @@ import { ScrollView, StyleSheet, View } from 'react-native'
import PropTypes from 'prop-types'
import moment from 'moment'
import { connect } from 'react-redux'
import { navigate } from '../slices/navigation'
import AppText from './common/app-text'
import Button from './common/button'
@@ -136,15 +133,9 @@ const styles = StyleSheet.create({
},
})
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
}
}
Home.propTypes = {
navigate: PropTypes.func,
setDate: PropTypes.func,
}
export default connect(null, mapDispatchToProps)(Home)
export default Home
+2 -5
View File
@@ -1,5 +1,4 @@
import React, { useState, useEffect } from 'react'
import { Provider } from 'react-redux'
import nodejs from 'nodejs-mobile-react-native'
import { getLicenseFlag, saveEncryptionFlag } from '../local-storage'
@@ -11,8 +10,6 @@ import AppStatusBar from './common/app-status-bar'
import License from './License'
import PasswordPrompt from './password-prompt'
import store from '../store'
export default function AppWrapper() {
const [isLoading, setIsLoading] = useState(true)
const [isLicenseAccepted, setIsLicenseAccepted] = useState(false)
@@ -45,13 +42,13 @@ export default function AppWrapper() {
}
return (
<Provider store={store}>
<>
<AppStatusBar />
{isDbEncrypted ? (
<PasswordPrompt enableShowApp={() => setIsDbEncrypted(false)} />
) : (
<App restartApp={() => checkIsDbEncrypted()} />
)}
</Provider>
</>
)
}
+17 -25
View File
@@ -2,15 +2,12 @@ import React, { Component } from 'react'
import { BackHandler, StyleSheet, View } from 'react-native'
import PropTypes from 'prop-types'
import { connect } from 'react-redux'
import { LocalDate } from '@js-joda/core'
import { getNavigation, navigate, goBack } from '../slices/navigation'
import Header from './header'
import Menu from './menu'
import { viewsList } from './views'
import { isSettingsView } from './pages'
import { isSettingsView, pages } from './pages'
import { headerTitles } from '../i18n/en/labels'
import setupNotifications from '../lib/notifications'
@@ -36,9 +33,14 @@ class App extends Component {
this.state = {
date: LocalDate.now().toString(),
currentPage: 'Home',
}
setupNotifications(this.props.navigate, this.props.setDate)
setupNotifications(this.navigate, this.setDate)
}
navigate = (page) => {
this.setState({ currentPage: page })
}
setDate = (date) => {
@@ -46,13 +48,14 @@ class App extends Component {
}
goBack = () => {
const { currentPage } = this.props.navigation
const { currentPage } = this.state
if (currentPage === 'Home') {
closeDb()
BackHandler.exitApp()
} else {
this.props.goBack()
const { parent } = pages.find((p) => p.component === currentPage)
this.navigate(parent)
}
return true
@@ -63,9 +66,9 @@ class App extends Component {
}
render() {
const { navigation, goBack, restartApp } = this.props
const { date } = this.state
const { currentPage } = navigation
const { goBack, restartApp } = this.props
const { date, currentPage } = this.state
const { navigate } = this
if (!currentPage) {
return false
@@ -80,19 +83,21 @@ class App extends Component {
const headerProps = {
title,
handleBack: isSettingsSubView ? goBack : null,
navigate,
}
const pageProps = {
date,
setDate: this.setDate,
isTemperatureEditView,
navigate,
}
return (
<View style={styles.container}>
<Header {...headerProps} />
<Page {...pageProps} restartApp={restartApp} />
<Menu />
<Menu currentPage={currentPage} navigate={navigate} />
</View>
)
}
@@ -104,17 +109,4 @@ const styles = StyleSheet.create({
},
})
const mapStateToProps = (state) => {
return {
navigation: getNavigation(state),
}
}
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
goBack: () => dispatch(goBack()),
}
}
export default connect(mapStateToProps, mapDispatchToProps)(App)
export default App
+1 -10
View File
@@ -3,9 +3,6 @@ import PropTypes from 'prop-types'
import { StyleSheet, View } from 'react-native'
import { CalendarList } from 'react-native-calendars'
import { connect } from 'react-redux'
import { navigate } from '../slices/navigation'
import { getBleedingDaysSortedByDate } from '../db'
import cycleModule from '../lib/cycle'
import nothingChanged from '../db/db-unchanged'
@@ -88,10 +85,4 @@ const styles = StyleSheet.create({
container: { flex: 1 },
})
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(CalendarView)
export default CalendarView
+2 -11
View File
@@ -19,9 +19,6 @@ import NoData from './no-data'
import Tutorial from './tutorial'
import YAxis from './y-axis'
import { connect } from 'react-redux'
import { navigate } from '../../slices/navigation'
import { getCycleDaysSortedByDate } from '../../db'
import nothingChanged from '../../db/db-unchanged'
import {
@@ -167,7 +164,7 @@ class CycleChart extends Component {
onLayout={this.onLayout}
scrollViewStyle={styles.page}
>
{!hasDataToDisplay && <NoData />}
{!hasDataToDisplay && <NoData navigate={this.props.navigate} />}
{hasDataToDisplay && !chartHeight && !chartLoaded && <AppLoadingView />}
<View style={styles.chartContainer}>
{shouldShowHint && chartLoaded && (
@@ -261,10 +258,4 @@ const styles = StyleSheet.create({
},
})
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(CycleChart)
export default CycleChart
+1 -10
View File
@@ -1,9 +1,6 @@
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import { TouchableOpacity } from 'react-native'
import { connect } from 'react-redux'
import { navigate } from '../../slices/navigation'
import { getCycleDay } from '../../db'
@@ -128,10 +125,4 @@ class DayColumn extends Component {
}
}
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(DayColumn)
export default DayColumn
+1 -10
View File
@@ -5,9 +5,6 @@ import PropTypes from 'prop-types'
import AppText from '../common/app-text'
import Button from '../common/button'
import { connect } from 'react-redux'
import { navigate } from '../../slices/navigation'
import { Containers } from '../../styles'
import { shared } from '../../i18n/en/labels'
@@ -37,10 +34,4 @@ const styles = StyleSheet.create({
},
})
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(NoData)
export default NoData
+8 -2
View File
@@ -6,6 +6,7 @@ import {
TouchableOpacity,
View,
} from 'react-native'
import PropTypes from 'prop-types'
import AppIcon from '../common/app-icon'
import CloseIcon from '../common/close-icon'
@@ -39,7 +40,7 @@ export default class HamburgerMenu extends Component {
const { shouldShowMenu } = this.state
return (
<React.Fragment>
<>
{!shouldShowMenu && (
<TouchableOpacity onPress={this.toggleMenu} hitSlop={HIT_SLOP}>
<AppIcon name="dots-three-vertical" color={Colors.orange} />
@@ -65,16 +66,21 @@ export default class HamburgerMenu extends Component {
item={item}
key={item.name}
closeMenu={this.toggleMenu}
navigate={this.props.navigate}
/>
))}
</View>
</Modal>
)}
</React.Fragment>
</>
)
}
}
HamburgerMenu.propTypes = {
navigate: PropTypes.func,
}
const styles = StyleSheet.create({
blackBackground: {
backgroundColor: 'black',
+15 -6
View File
@@ -1,5 +1,5 @@
import React from 'react'
import { StyleSheet, View } from 'react-native'
import { StyleSheet, TouchableOpacity, View } from 'react-native'
import PropTypes from 'prop-types'
import Logo from './logo'
@@ -7,21 +7,30 @@ import HamburgerMenu from './hamburger-menu'
import { Colors, Containers, Sizes } from '../../styles'
const Header = ({ isSideMenuEnabled }) => {
const Header = ({ isStatic, navigate }) => {
return (
<View style={styles.header}>
<Logo />
{isSideMenuEnabled && <HamburgerMenu />}
{isStatic ? (
<Logo />
) : (
<>
<TouchableOpacity onPress={() => navigate('Home')}>
<Logo />
</TouchableOpacity>
<HamburgerMenu navigate={navigate} />
</>
)}
</View>
)
}
Header.propTypes = {
isSideMenuEnabled: PropTypes.bool,
isStatic: PropTypes.bool,
navigate: PropTypes.func,
}
Header.defaultProps = {
isSideMenuEnabled: true,
isStatic: false,
}
const styles = StyleSheet.create({
+4 -22
View File
@@ -1,24 +1,12 @@
import React from 'react'
import { StyleSheet, TouchableOpacity } from 'react-native'
import PropTypes from 'prop-types'
import { StyleSheet } from 'react-native'
import AppText from '../common/app-text'
import { connect } from 'react-redux'
import { navigate } from '../../slices/navigation'
import { Colors, Fonts, Sizes } from '../../styles'
const Logo = ({ navigate }) => {
return (
<TouchableOpacity onPress={() => navigate('Home')}>
<AppText style={styles.logo}>drip.</AppText>
</TouchableOpacity>
)
}
Logo.propTypes = {
navigate: PropTypes.func.isRequired,
const Logo = () => {
return <AppText style={styles.logo}>drip.</AppText>
}
const styles = StyleSheet.create({
@@ -29,10 +17,4 @@ const styles = StyleSheet.create({
},
})
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(Logo)
export default Logo
+1 -10
View File
@@ -4,9 +4,6 @@ import PropTypes from 'prop-types'
import AppText from '../common/app-text'
import { connect } from 'react-redux'
import { navigate } from '../../slices/navigation'
import { Typography } from '../../styles'
const MenuItem = ({ item, navigate, closeMenu }) => {
@@ -35,10 +32,4 @@ const styles = StyleSheet.create({
},
})
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(MenuItem)
export default MenuItem
+9 -2
View File
@@ -1,12 +1,13 @@
import React from 'react'
import { StyleSheet, View } from 'react-native'
import PropTypes from 'prop-types'
import MenuItem from './menu-item'
import { Containers } from '../../styles'
import { pages } from '../pages'
const Menu = () => {
const Menu = ({ currentPage, navigate }) => {
const menuItems = pages.filter((page) => page.isInMenu)
return (
@@ -14,7 +15,8 @@ const Menu = () => {
{menuItems.map(({ icon, label, component }) => {
return (
<MenuItem
component={component}
isActive={component === currentPage}
onPress={() => navigate(component)}
icon={icon}
key={label}
label={label}
@@ -25,6 +27,11 @@ const Menu = () => {
)
}
Menu.propTypes = {
currentPage: PropTypes.string,
navigate: PropTypes.func,
}
const styles = StyleSheet.create({
container: {
backgroundColor: 'white',
+5 -22
View File
@@ -4,18 +4,14 @@ import { StyleSheet, Text, TouchableOpacity } from 'react-native'
import Icon from '../common/menu-icon'
import { connect } from 'react-redux'
import { getNavigation, navigate } from '../../slices/navigation'
import { Colors, Containers, Fonts, Sizes, Spacing } from '../../styles'
const MenuItem = ({ component, icon, label, navigate, navigation }) => {
const isActive = component === navigation.currentPage
const MenuItem = ({ isActive, icon, label, onPress }) => {
const textStyle = isActive ? styles.menuTextActive : styles.menuText
const testID = isActive ? 'activeMenuItem' : `menuItem${label}`
return (
<TouchableOpacity style={styles.button} onPress={() => navigate(component)}>
<TouchableOpacity style={styles.button} onPress={onPress}>
<Icon name={icon} isActive={isActive} />
<Text testID={testID} style={textStyle}>
{label}
@@ -25,11 +21,10 @@ const MenuItem = ({ component, icon, label, navigate, navigation }) => {
}
MenuItem.propTypes = {
component: PropTypes.string.isRequired,
isActive: PropTypes.bool.isRequired,
icon: PropTypes.string.isRequired,
label: PropTypes.string.isRequired,
navigation: PropTypes.object,
navigate: PropTypes.func,
onPress: PropTypes.func.isRequired,
}
const text = {
@@ -53,16 +48,4 @@ const styles = StyleSheet.create({
},
})
const mapStateToProps = (state) => {
return {
navigation: getNavigation(state),
}
}
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(mapStateToProps, mapDispatchToProps)(MenuItem)
export default MenuItem
+1 -1
View File
@@ -82,7 +82,7 @@ export default class PasswordPrompt extends Component {
return (
<React.Fragment>
<Header isSideMenuEnabled={false} />
<Header isStatic />
<AppPage contentContainerStyle={styles.contentContainer}>
<AppTextInput
isKeyboardOffset={false}
+1 -10
View File
@@ -6,9 +6,6 @@ import AppIcon from '../common/app-icon'
import AppText from '../common/app-text'
import Segment from '../common/segment'
import { connect } from 'react-redux'
import { navigate } from '../../slices/navigation'
import { Colors, Containers, Sizes } from '../../styles'
const MenuItem = ({ item, last, navigate }) => {
@@ -45,10 +42,4 @@ const styles = StyleSheet.create({
},
})
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(MenuItem)
export default MenuItem
+1 -10
View File
@@ -1,9 +1,6 @@
import React, { Component } from 'react'
import { connect } from 'react-redux'
import PropTypes from 'prop-types'
import { navigate } from '../../../slices/navigation'
import { changeDbEncryption } from '../../../db'
import AppPage from '../../common/app-page'
@@ -94,10 +91,4 @@ class PasswordSetting extends Component {
}
}
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(PasswordSetting)
export default PasswordSetting
+9 -2
View File
@@ -1,4 +1,5 @@
import React from 'react'
import PropTypes from 'prop-types'
import AppPage from '../common/app-page'
import MenuItem from './menu-item'
@@ -13,16 +14,22 @@ const menu = [
{ ...menuItems.password, component: 'Password' },
]
const SettingsMenu = () => {
const SettingsMenu = ({ navigate }) => {
return (
<AppPage title={settingsLabels.title}>
{menu.map((menuItem, i) => {
const last = menu.length === i + 1
return <MenuItem item={menuItem} key={i} last={last} />
return (
<MenuItem item={menuItem} key={i} last={last} navigate={navigate} />
)
})}
</AppPage>
)
}
SettingsMenu.propTypes = {
navigate: PropTypes.func.isRequired,
}
export default SettingsMenu
+1 -2
View File
@@ -10,7 +10,6 @@ import labels from '../i18n/en/settings'
import { getBleedingDaysSortedByDate } from '../db'
import cycleModule from './cycle'
import nothingChanged from '../db/db-unchanged'
import store from '../store'
export default function setupNotifications(navigate, setDate) {
Notification.configure({
@@ -18,7 +17,7 @@ export default function setupNotifications(navigate, setDate) {
// https://github.com/zo0r/react-native-push-notification/issues/966#issuecomment-479069106
if (notification.data?.id === '1' || notification.id === '1') {
const todayDate = LocalDate.now().toString()
store.dispatch(setDate(todayDate))
setDate(todayDate)
navigate('TemperatureEditView')
} else {
navigate('Home')
+1 -4
View File
@@ -16,7 +16,7 @@
"log": "react-native log-android",
"test": "jest test && npm run lint",
"test-watch": "jest --watch test",
"lint": "eslint components lib test styles slices db",
"lint": "eslint components lib test styles db",
"devtool": "adb shell input keyevent 82",
"build-android-release": "cd android && ./gradlew clean && ./gradlew assembleRelease && cd ..",
"update-version": "node ./tools/bin/update-version.js",
@@ -55,10 +55,7 @@
"react-native-simple-toast": "^1.1.3",
"react-native-size-matters": "^0.4.0",
"react-native-vector-icons": "^9.2.0",
"react-redux": "^6.0.0",
"realm": "^10.16.0",
"redux": "^4.0.1",
"redux-starter-kit": "^0.6.3",
"sympto": "3.0.1"
},
"devDependencies": {
-31
View File
@@ -1,31 +0,0 @@
import { createSlice } from 'redux-starter-kit'
import { pages } from '../components/pages'
const navigationSlice = createSlice({
slice: 'navigation',
initialState: {
currentPage: 'Home',
},
reducers: {
navigate: (_state, action) => {
return {
currentPage: action.payload,
}
},
goBack: ({ currentPage }) => {
const page = pages.find((p) => p.component === currentPage)
return {
currentPage: page.parent,
}
},
},
})
// Extract the action creators object and the reducer
const { actions, reducer, selectors } = navigationSlice
// Extract and export each action creator by name
export const { navigate, goBack } = actions
export const { getNavigation } = selectors
export default reducer
-11
View File
@@ -1,11 +0,0 @@
import { combineReducers, createStore } from 'redux'
import navigation from './slices/navigation'
const reducer = combineReducers({
navigation,
})
const store = createStore(reducer)
export default store
+5 -104
View File
@@ -1078,7 +1078,7 @@
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.14.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
"@babel/runtime@^7.14.5", "@babel/runtime@^7.8.4":
version "7.15.4"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a"
integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==
@@ -2960,11 +2960,6 @@ csvtojson@^2.0.8:
lodash "^4.17.3"
strip-bom "^2.0.0"
curriable@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/curriable/-/curriable-1.3.0.tgz#cb054bc7bbc1f440cbc613527b8a05b57e19e1ab"
integrity sha512-7kfjDPRSF+pguU0TlfSFBMCd8XlmF29ZAiXcq/zaN4LhZvWdvV0Y72AvaWFqInXZG9Yg1kA1UMkpE9lFBKMpQA==
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@@ -3626,11 +3621,6 @@ fast-deep-equal@^3.1.1:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-equals@^1.2.1:
version "1.6.3"
resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-1.6.3.tgz#84839a1ce20627c463e1892f2ae316380c81b459"
integrity sha512-4WKW0AL5+WEqO0zWavAfYGY1qwLsBgE//DN4TTcVEN2UlINgkv9b3vm2iHicoenWKSX9mKWmGOsU/iI5IST7pQ==
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
@@ -4125,7 +4115,7 @@ hermes-profile-transformer@^0.0.6:
dependencies:
source-map "^0.7.3"
hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1:
hoist-non-react-statics@^3.3.1:
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==
@@ -4215,13 +4205,6 @@ iconv-lite@^0.6.2:
dependencies:
safer-buffer ">= 2.1.2 < 3.0.0"
identitate@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/identitate/-/identitate-1.0.1.tgz#4b8bed39454f1d7a476e60ff0e4f82a094841dfc"
integrity sha512-xnDJ0JYhiZjBDuJRKbHoVzj5yP9FhATxLyUYswQyPdnJrwzGVBqS6DOmvKJi1lk7P+4dkL+hhUhuOZIcOUtG5A==
dependencies:
pathington "^1.0.1"
ieee754@^1.1.13:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
@@ -4242,11 +4225,6 @@ image-size@^0.6.0:
resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2"
integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==
immer@^2.1.5:
version "2.1.5"
resolved "https://registry.yarnpkg.com/immer/-/immer-2.1.5.tgz#0389947455c5a2c7a47f1e6f415c9d1a62a1ebed"
integrity sha512-xyjQyTBYIeiz6jd02Hg12jV+9QISwF1crLcwTlzHpWH4e0ryNWj1kacpTwimK3bJV5NKKXw458G2vpqoB/inFA==
immutable@^4.0.0-rc.12:
version "4.1.0"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef"
@@ -4313,7 +4291,7 @@ internal-slot@^1.0.3:
has "^1.0.3"
side-channel "^1.0.4"
invariant@^2.1.0, invariant@^2.2.4:
invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
@@ -5283,7 +5261,7 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
json-stringify-safe@~5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
@@ -6553,11 +6531,6 @@ path-parse@^1.0.6:
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
pathington@^1.0.1, pathington@^1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/pathington/-/pathington-1.1.7.tgz#caf2d2db899a31fea4e81e3657af6acde5171903"
integrity sha512-JxzhUzagDfNIOm4qqwQqP3rWeo7rNNOfIahy4n+3GTEdwXLqw5cJHUR0soSopQtNEv763lzxb6eA2xBllpR8zw==
pbxproj-dom@^1.0.11:
version "1.2.0"
resolved "https://registry.yarnpkg.com/pbxproj-dom/-/pbxproj-dom-1.2.0.tgz#1cf4101163bd666eba9eb92a5b8f616ce824ea85"
@@ -6801,7 +6774,7 @@ react-i18next@^11.18.3:
"@babel/runtime" "^7.14.5"
html-parse-stringify "^3.0.1"
react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.2:
react-is@^16.13.1, react-is@^16.7.0:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -6961,18 +6934,6 @@ react-native@0.65.2:
whatwg-fetch "^3.0.0"
ws "^6.1.4"
react-redux@^6.0.0:
version "6.0.1"
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-6.0.1.tgz#0d423e2c1cb10ada87293d47e7de7c329623ba4d"
integrity sha512-T52I52Kxhbqy/6TEfBv85rQSDz6+Y28V/pf52vDWs1YRXG19mcFOGfHnY2HsNFHyhP+ST34Aih98fvt6tqwVcQ==
dependencies:
"@babel/runtime" "^7.3.1"
hoist-non-react-statics "^3.3.0"
invariant "^2.2.4"
loose-envify "^1.4.0"
prop-types "^15.7.2"
react-is "^16.8.2"
react-refresh@^0.4.0:
version "0.4.3"
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53"
@@ -7067,43 +7028,6 @@ recyclerlistview@^3.0.5:
prop-types "15.5.8"
ts-object-utils "0.0.5"
redux-devtools-extension@^2.13.8:
version "2.13.9"
resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz#6b764e8028b507adcb75a1cae790f71e6be08ae7"
integrity sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A==
redux-immutable-state-invariant@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/redux-immutable-state-invariant/-/redux-immutable-state-invariant-2.1.0.tgz#308fd3cc7415a0e7f11f51ec997b6379c7055ce1"
integrity sha512-3czbDKs35FwiBRsx/3KabUk5zSOoTXC+cgVofGkpBNv3jQcqIe5JrHcF5AmVt7B/4hyJ8MijBIpCJ8cife6yJg==
dependencies:
invariant "^2.1.0"
json-stringify-safe "^5.0.1"
redux-starter-kit@^0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/redux-starter-kit/-/redux-starter-kit-0.6.3.tgz#bafde49b8ff35dff0f4f43700d7ed9973754c96e"
integrity sha512-A+7UjgmFrWdKksHl8xTGxDw6Bv8QJ+wrTubBscFNs5gIezGHOdwjqTTSVX4xMgQkgPtVfSPj/Bo+5o6f71/eTA==
dependencies:
immer "^2.1.5"
redux "^4.0.0"
redux-devtools-extension "^2.13.8"
redux-immutable-state-invariant "^2.1.0"
redux-thunk "^2.2.0"
selectorator "^4.0.3"
redux-thunk@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==
redux@^4.0.0, redux@^4.0.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.1.tgz#76f1c439bb42043f985fbd9bf21990e60bd67f47"
integrity sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw==
dependencies:
"@babel/runtime" "^7.9.2"
regenerate-unicode-properties@^10.0.1:
version "10.0.1"
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56"
@@ -7284,11 +7208,6 @@ requires-port@^1.0.0:
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
reselect@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7"
integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==
resolve-cwd@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
@@ -7431,16 +7350,6 @@ scheduler@^0.20.2:
loose-envify "^1.1.0"
object-assign "^4.1.1"
selectorator@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/selectorator/-/selectorator-4.0.3.tgz#d33b11027da7e6838de277cd6eb1134125aa788b"
integrity sha512-A8+paRhzTab4Qm/38RAVnCgEZFbpn5xIWLyTCDqvyU3Obhmo94RS6UK1H00bVH7+U609sOhqbFJha09POsWURA==
dependencies:
fast-equals "^1.2.1"
identitate "^1.0.0"
reselect "^4.0.0"
unchanged "^2.0.1"
semver@7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
@@ -8302,14 +8211,6 @@ unbox-primitive@^1.0.2:
has-symbols "^1.0.3"
which-boxed-primitive "^1.0.2"
unchanged@^2.0.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/unchanged/-/unchanged-2.2.1.tgz#426f8b3c3b98a95a4acc801b0ba67babaabe1bec"
integrity sha512-pMlMNfqtfjOVpDAKVBH+LjnhnTwWYUrJq9fU3nGRYrw6JnprJEH1/cehJikRTf+o6dmkpX5XRRspb5mUAhxeZQ==
dependencies:
curriable "^1.3.0"
pathington "^1.1.7"
unherit@^1.0.4:
version "1.1.3"
resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22"