Chore/retire redux

This commit is contained in:
Sofiya Tepikin
2022-09-10 16:00:19 +00:00
parent 7d0fa07976
commit 176e4f6a70
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 PropTypes from 'prop-types'
import moment from 'moment' import moment from 'moment'
import { connect } from 'react-redux'
import { navigate } from '../slices/navigation'
import AppText from './common/app-text' import AppText from './common/app-text'
import Button from './common/button' import Button from './common/button'
@@ -136,15 +133,9 @@ const styles = StyleSheet.create({
}, },
}) })
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
}
}
Home.propTypes = { Home.propTypes = {
navigate: PropTypes.func, navigate: PropTypes.func,
setDate: 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 React, { useState, useEffect } from 'react'
import { Provider } from 'react-redux'
import nodejs from 'nodejs-mobile-react-native' import nodejs from 'nodejs-mobile-react-native'
import { getLicenseFlag, saveEncryptionFlag } from '../local-storage' import { getLicenseFlag, saveEncryptionFlag } from '../local-storage'
@@ -11,8 +10,6 @@ import AppStatusBar from './common/app-status-bar'
import License from './License' import License from './License'
import PasswordPrompt from './password-prompt' import PasswordPrompt from './password-prompt'
import store from '../store'
export default function AppWrapper() { export default function AppWrapper() {
const [isLoading, setIsLoading] = useState(true) const [isLoading, setIsLoading] = useState(true)
const [isLicenseAccepted, setIsLicenseAccepted] = useState(false) const [isLicenseAccepted, setIsLicenseAccepted] = useState(false)
@@ -45,13 +42,13 @@ export default function AppWrapper() {
} }
return ( return (
<Provider store={store}> <>
<AppStatusBar /> <AppStatusBar />
{isDbEncrypted ? ( {isDbEncrypted ? (
<PasswordPrompt enableShowApp={() => setIsDbEncrypted(false)} /> <PasswordPrompt enableShowApp={() => setIsDbEncrypted(false)} />
) : ( ) : (
<App restartApp={() => checkIsDbEncrypted()} /> <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 { BackHandler, StyleSheet, View } from 'react-native'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import { connect } from 'react-redux'
import { LocalDate } from '@js-joda/core' import { LocalDate } from '@js-joda/core'
import { getNavigation, navigate, goBack } from '../slices/navigation'
import Header from './header' import Header from './header'
import Menu from './menu' import Menu from './menu'
import { viewsList } from './views' import { viewsList } from './views'
import { isSettingsView } from './pages' import { isSettingsView, pages } from './pages'
import { headerTitles } from '../i18n/en/labels' import { headerTitles } from '../i18n/en/labels'
import setupNotifications from '../lib/notifications' import setupNotifications from '../lib/notifications'
@@ -36,9 +33,14 @@ class App extends Component {
this.state = { this.state = {
date: LocalDate.now().toString(), 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) => { setDate = (date) => {
@@ -46,13 +48,14 @@ class App extends Component {
} }
goBack = () => { goBack = () => {
const { currentPage } = this.props.navigation const { currentPage } = this.state
if (currentPage === 'Home') { if (currentPage === 'Home') {
closeDb() closeDb()
BackHandler.exitApp() BackHandler.exitApp()
} else { } else {
this.props.goBack() const { parent } = pages.find((p) => p.component === currentPage)
this.navigate(parent)
} }
return true return true
@@ -63,9 +66,9 @@ class App extends Component {
} }
render() { render() {
const { navigation, goBack, restartApp } = this.props const { goBack, restartApp } = this.props
const { date } = this.state const { date, currentPage } = this.state
const { currentPage } = navigation const { navigate } = this
if (!currentPage) { if (!currentPage) {
return false return false
@@ -80,19 +83,21 @@ class App extends Component {
const headerProps = { const headerProps = {
title, title,
handleBack: isSettingsSubView ? goBack : null, handleBack: isSettingsSubView ? goBack : null,
navigate,
} }
const pageProps = { const pageProps = {
date, date,
setDate: this.setDate, setDate: this.setDate,
isTemperatureEditView, isTemperatureEditView,
navigate,
} }
return ( return (
<View style={styles.container}> <View style={styles.container}>
<Header {...headerProps} /> <Header {...headerProps} />
<Page {...pageProps} restartApp={restartApp} /> <Page {...pageProps} restartApp={restartApp} />
<Menu /> <Menu currentPage={currentPage} navigate={navigate} />
</View> </View>
) )
} }
@@ -104,17 +109,4 @@ const styles = StyleSheet.create({
}, },
}) })
const mapStateToProps = (state) => { export default App
return {
navigation: getNavigation(state),
}
}
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
goBack: () => dispatch(goBack()),
}
}
export default connect(mapStateToProps, mapDispatchToProps)(App)
+1 -10
View File
@@ -3,9 +3,6 @@ import PropTypes from 'prop-types'
import { StyleSheet, View } from 'react-native' import { StyleSheet, View } from 'react-native'
import { CalendarList } from 'react-native-calendars' import { CalendarList } from 'react-native-calendars'
import { connect } from 'react-redux'
import { navigate } from '../slices/navigation'
import { getBleedingDaysSortedByDate } from '../db' import { getBleedingDaysSortedByDate } from '../db'
import cycleModule from '../lib/cycle' import cycleModule from '../lib/cycle'
import nothingChanged from '../db/db-unchanged' import nothingChanged from '../db/db-unchanged'
@@ -88,10 +85,4 @@ const styles = StyleSheet.create({
container: { flex: 1 }, container: { flex: 1 },
}) })
const mapDispatchToProps = (dispatch) => { export default CalendarView
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(CalendarView)
+2 -11
View File
@@ -19,9 +19,6 @@ import NoData from './no-data'
import Tutorial from './tutorial' import Tutorial from './tutorial'
import YAxis from './y-axis' import YAxis from './y-axis'
import { connect } from 'react-redux'
import { navigate } from '../../slices/navigation'
import { getCycleDaysSortedByDate } from '../../db' import { getCycleDaysSortedByDate } from '../../db'
import nothingChanged from '../../db/db-unchanged' import nothingChanged from '../../db/db-unchanged'
import { import {
@@ -167,7 +164,7 @@ class CycleChart extends Component {
onLayout={this.onLayout} onLayout={this.onLayout}
scrollViewStyle={styles.page} scrollViewStyle={styles.page}
> >
{!hasDataToDisplay && <NoData />} {!hasDataToDisplay && <NoData navigate={this.props.navigate} />}
{hasDataToDisplay && !chartHeight && !chartLoaded && <AppLoadingView />} {hasDataToDisplay && !chartHeight && !chartLoaded && <AppLoadingView />}
<View style={styles.chartContainer}> <View style={styles.chartContainer}>
{shouldShowHint && chartLoaded && ( {shouldShowHint && chartLoaded && (
@@ -261,10 +258,4 @@ const styles = StyleSheet.create({
}, },
}) })
const mapDispatchToProps = (dispatch) => { export default CycleChart
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(CycleChart)
+1 -10
View File
@@ -1,9 +1,6 @@
import React, { Component } from 'react' import React, { Component } from 'react'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import { TouchableOpacity } from 'react-native' import { TouchableOpacity } from 'react-native'
import { connect } from 'react-redux'
import { navigate } from '../../slices/navigation'
import { getCycleDay } from '../../db' import { getCycleDay } from '../../db'
@@ -128,10 +125,4 @@ class DayColumn extends Component {
} }
} }
const mapDispatchToProps = (dispatch) => { export default DayColumn
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(DayColumn)
+1 -10
View File
@@ -5,9 +5,6 @@ import PropTypes from 'prop-types'
import AppText from '../common/app-text' import AppText from '../common/app-text'
import Button from '../common/button' import Button from '../common/button'
import { connect } from 'react-redux'
import { navigate } from '../../slices/navigation'
import { Containers } from '../../styles' import { Containers } from '../../styles'
import { shared } from '../../i18n/en/labels' import { shared } from '../../i18n/en/labels'
@@ -37,10 +34,4 @@ const styles = StyleSheet.create({
}, },
}) })
const mapDispatchToProps = (dispatch) => { export default NoData
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(NoData)
+8 -2
View File
@@ -6,6 +6,7 @@ import {
TouchableOpacity, TouchableOpacity,
View, View,
} from 'react-native' } from 'react-native'
import PropTypes from 'prop-types'
import AppIcon from '../common/app-icon' import AppIcon from '../common/app-icon'
import CloseIcon from '../common/close-icon' import CloseIcon from '../common/close-icon'
@@ -39,7 +40,7 @@ export default class HamburgerMenu extends Component {
const { shouldShowMenu } = this.state const { shouldShowMenu } = this.state
return ( return (
<React.Fragment> <>
{!shouldShowMenu && ( {!shouldShowMenu && (
<TouchableOpacity onPress={this.toggleMenu} hitSlop={HIT_SLOP}> <TouchableOpacity onPress={this.toggleMenu} hitSlop={HIT_SLOP}>
<AppIcon name="dots-three-vertical" color={Colors.orange} /> <AppIcon name="dots-three-vertical" color={Colors.orange} />
@@ -65,16 +66,21 @@ export default class HamburgerMenu extends Component {
item={item} item={item}
key={item.name} key={item.name}
closeMenu={this.toggleMenu} closeMenu={this.toggleMenu}
navigate={this.props.navigate}
/> />
))} ))}
</View> </View>
</Modal> </Modal>
)} )}
</React.Fragment> </>
) )
} }
} }
HamburgerMenu.propTypes = {
navigate: PropTypes.func,
}
const styles = StyleSheet.create({ const styles = StyleSheet.create({
blackBackground: { blackBackground: {
backgroundColor: 'black', backgroundColor: 'black',
+14 -5
View File
@@ -1,5 +1,5 @@
import React from 'react' import React from 'react'
import { StyleSheet, View } from 'react-native' import { StyleSheet, TouchableOpacity, View } from 'react-native'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import Logo from './logo' import Logo from './logo'
@@ -7,21 +7,30 @@ import HamburgerMenu from './hamburger-menu'
import { Colors, Containers, Sizes } from '../../styles' import { Colors, Containers, Sizes } from '../../styles'
const Header = ({ isSideMenuEnabled }) => { const Header = ({ isStatic, navigate }) => {
return ( return (
<View style={styles.header}> <View style={styles.header}>
{isStatic ? (
<Logo /> <Logo />
{isSideMenuEnabled && <HamburgerMenu />} ) : (
<>
<TouchableOpacity onPress={() => navigate('Home')}>
<Logo />
</TouchableOpacity>
<HamburgerMenu navigate={navigate} />
</>
)}
</View> </View>
) )
} }
Header.propTypes = { Header.propTypes = {
isSideMenuEnabled: PropTypes.bool, isStatic: PropTypes.bool,
navigate: PropTypes.func,
} }
Header.defaultProps = { Header.defaultProps = {
isSideMenuEnabled: true, isStatic: false,
} }
const styles = StyleSheet.create({ const styles = StyleSheet.create({
+4 -22
View File
@@ -1,24 +1,12 @@
import React from 'react' import React from 'react'
import { StyleSheet, TouchableOpacity } from 'react-native' import { StyleSheet } from 'react-native'
import PropTypes from 'prop-types'
import AppText from '../common/app-text' import AppText from '../common/app-text'
import { connect } from 'react-redux'
import { navigate } from '../../slices/navigation'
import { Colors, Fonts, Sizes } from '../../styles' import { Colors, Fonts, Sizes } from '../../styles'
const Logo = ({ navigate }) => { const Logo = () => {
return ( return <AppText style={styles.logo}>drip.</AppText>
<TouchableOpacity onPress={() => navigate('Home')}>
<AppText style={styles.logo}>drip.</AppText>
</TouchableOpacity>
)
}
Logo.propTypes = {
navigate: PropTypes.func.isRequired,
} }
const styles = StyleSheet.create({ const styles = StyleSheet.create({
@@ -29,10 +17,4 @@ const styles = StyleSheet.create({
}, },
}) })
const mapDispatchToProps = (dispatch) => { export default Logo
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(Logo)
+1 -10
View File
@@ -4,9 +4,6 @@ import PropTypes from 'prop-types'
import AppText from '../common/app-text' import AppText from '../common/app-text'
import { connect } from 'react-redux'
import { navigate } from '../../slices/navigation'
import { Typography } from '../../styles' import { Typography } from '../../styles'
const MenuItem = ({ item, navigate, closeMenu }) => { const MenuItem = ({ item, navigate, closeMenu }) => {
@@ -35,10 +32,4 @@ const styles = StyleSheet.create({
}, },
}) })
const mapDispatchToProps = (dispatch) => { export default MenuItem
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(MenuItem)
+9 -2
View File
@@ -1,12 +1,13 @@
import React from 'react' import React from 'react'
import { StyleSheet, View } from 'react-native' import { StyleSheet, View } from 'react-native'
import PropTypes from 'prop-types'
import MenuItem from './menu-item' import MenuItem from './menu-item'
import { Containers } from '../../styles' import { Containers } from '../../styles'
import { pages } from '../pages' import { pages } from '../pages'
const Menu = () => { const Menu = ({ currentPage, navigate }) => {
const menuItems = pages.filter((page) => page.isInMenu) const menuItems = pages.filter((page) => page.isInMenu)
return ( return (
@@ -14,7 +15,8 @@ const Menu = () => {
{menuItems.map(({ icon, label, component }) => { {menuItems.map(({ icon, label, component }) => {
return ( return (
<MenuItem <MenuItem
component={component} isActive={component === currentPage}
onPress={() => navigate(component)}
icon={icon} icon={icon}
key={label} key={label}
label={label} label={label}
@@ -25,6 +27,11 @@ const Menu = () => {
) )
} }
Menu.propTypes = {
currentPage: PropTypes.string,
navigate: PropTypes.func,
}
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: { container: {
backgroundColor: 'white', backgroundColor: 'white',
+5 -22
View File
@@ -4,18 +4,14 @@ import { StyleSheet, Text, TouchableOpacity } from 'react-native'
import Icon from '../common/menu-icon' 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' import { Colors, Containers, Fonts, Sizes, Spacing } from '../../styles'
const MenuItem = ({ component, icon, label, navigate, navigation }) => { const MenuItem = ({ isActive, icon, label, onPress }) => {
const isActive = component === navigation.currentPage
const textStyle = isActive ? styles.menuTextActive : styles.menuText const textStyle = isActive ? styles.menuTextActive : styles.menuText
const testID = isActive ? 'activeMenuItem' : `menuItem${label}` const testID = isActive ? 'activeMenuItem' : `menuItem${label}`
return ( return (
<TouchableOpacity style={styles.button} onPress={() => navigate(component)}> <TouchableOpacity style={styles.button} onPress={onPress}>
<Icon name={icon} isActive={isActive} /> <Icon name={icon} isActive={isActive} />
<Text testID={testID} style={textStyle}> <Text testID={testID} style={textStyle}>
{label} {label}
@@ -25,11 +21,10 @@ const MenuItem = ({ component, icon, label, navigate, navigation }) => {
} }
MenuItem.propTypes = { MenuItem.propTypes = {
component: PropTypes.string.isRequired, isActive: PropTypes.bool.isRequired,
icon: PropTypes.string.isRequired, icon: PropTypes.string.isRequired,
label: PropTypes.string.isRequired, label: PropTypes.string.isRequired,
navigation: PropTypes.object, onPress: PropTypes.func.isRequired,
navigate: PropTypes.func,
} }
const text = { const text = {
@@ -53,16 +48,4 @@ const styles = StyleSheet.create({
}, },
}) })
const mapStateToProps = (state) => { export default MenuItem
return {
navigation: getNavigation(state),
}
}
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(mapStateToProps, mapDispatchToProps)(MenuItem)
+1 -1
View File
@@ -82,7 +82,7 @@ export default class PasswordPrompt extends Component {
return ( return (
<React.Fragment> <React.Fragment>
<Header isSideMenuEnabled={false} /> <Header isStatic />
<AppPage contentContainerStyle={styles.contentContainer}> <AppPage contentContainerStyle={styles.contentContainer}>
<AppTextInput <AppTextInput
isKeyboardOffset={false} isKeyboardOffset={false}
+1 -10
View File
@@ -6,9 +6,6 @@ import AppIcon from '../common/app-icon'
import AppText from '../common/app-text' import AppText from '../common/app-text'
import Segment from '../common/segment' import Segment from '../common/segment'
import { connect } from 'react-redux'
import { navigate } from '../../slices/navigation'
import { Colors, Containers, Sizes } from '../../styles' import { Colors, Containers, Sizes } from '../../styles'
const MenuItem = ({ item, last, navigate }) => { const MenuItem = ({ item, last, navigate }) => {
@@ -45,10 +42,4 @@ const styles = StyleSheet.create({
}, },
}) })
const mapDispatchToProps = (dispatch) => { export default MenuItem
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(MenuItem)
+1 -10
View File
@@ -1,9 +1,6 @@
import React, { Component } from 'react' import React, { Component } from 'react'
import { connect } from 'react-redux'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import { navigate } from '../../../slices/navigation'
import { changeDbEncryption } from '../../../db' import { changeDbEncryption } from '../../../db'
import AppPage from '../../common/app-page' import AppPage from '../../common/app-page'
@@ -94,10 +91,4 @@ class PasswordSetting extends Component {
} }
} }
const mapDispatchToProps = (dispatch) => { export default PasswordSetting
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(PasswordSetting)
+9 -2
View File
@@ -1,4 +1,5 @@
import React from 'react' import React from 'react'
import PropTypes from 'prop-types'
import AppPage from '../common/app-page' import AppPage from '../common/app-page'
import MenuItem from './menu-item' import MenuItem from './menu-item'
@@ -13,16 +14,22 @@ const menu = [
{ ...menuItems.password, component: 'Password' }, { ...menuItems.password, component: 'Password' },
] ]
const SettingsMenu = () => { const SettingsMenu = ({ navigate }) => {
return ( return (
<AppPage title={settingsLabels.title}> <AppPage title={settingsLabels.title}>
{menu.map((menuItem, i) => { {menu.map((menuItem, i) => {
const last = menu.length === i + 1 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> </AppPage>
) )
} }
SettingsMenu.propTypes = {
navigate: PropTypes.func.isRequired,
}
export default SettingsMenu export default SettingsMenu
+1 -2
View File
@@ -10,7 +10,6 @@ import labels from '../i18n/en/settings'
import { getBleedingDaysSortedByDate } from '../db' import { getBleedingDaysSortedByDate } from '../db'
import cycleModule from './cycle' import cycleModule from './cycle'
import nothingChanged from '../db/db-unchanged' import nothingChanged from '../db/db-unchanged'
import store from '../store'
export default function setupNotifications(navigate, setDate) { export default function setupNotifications(navigate, setDate) {
Notification.configure({ Notification.configure({
@@ -18,7 +17,7 @@ export default function setupNotifications(navigate, setDate) {
// https://github.com/zo0r/react-native-push-notification/issues/966#issuecomment-479069106 // https://github.com/zo0r/react-native-push-notification/issues/966#issuecomment-479069106
if (notification.data?.id === '1' || notification.id === '1') { if (notification.data?.id === '1' || notification.id === '1') {
const todayDate = LocalDate.now().toString() const todayDate = LocalDate.now().toString()
store.dispatch(setDate(todayDate)) setDate(todayDate)
navigate('TemperatureEditView') navigate('TemperatureEditView')
} else { } else {
navigate('Home') navigate('Home')
+1 -4
View File
@@ -16,7 +16,7 @@
"log": "react-native log-android", "log": "react-native log-android",
"test": "jest test && npm run lint", "test": "jest test && npm run lint",
"test-watch": "jest --watch test", "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", "devtool": "adb shell input keyevent 82",
"build-android-release": "cd android && ./gradlew clean && ./gradlew assembleRelease && cd ..", "build-android-release": "cd android && ./gradlew clean && ./gradlew assembleRelease && cd ..",
"update-version": "node ./tools/bin/update-version.js", "update-version": "node ./tools/bin/update-version.js",
@@ -55,10 +55,7 @@
"react-native-simple-toast": "^1.1.3", "react-native-simple-toast": "^1.1.3",
"react-native-size-matters": "^0.4.0", "react-native-size-matters": "^0.4.0",
"react-native-vector-icons": "^9.2.0", "react-native-vector-icons": "^9.2.0",
"react-redux": "^6.0.0",
"realm": "^10.16.0", "realm": "^10.16.0",
"redux": "^4.0.1",
"redux-starter-kit": "^0.6.3",
"sympto": "3.0.1" "sympto": "3.0.1"
}, },
"devDependencies": { "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: dependencies:
regenerator-runtime "^0.13.4" 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" version "7.15.4"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a"
integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==
@@ -2960,11 +2960,6 @@ csvtojson@^2.0.8:
lodash "^4.17.3" lodash "^4.17.3"
strip-bom "^2.0.0" 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: dashdash@^1.12.0:
version "1.14.1" version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 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" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 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: fast-json-stable-stringify@^2.0.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 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: dependencies:
source-map "^0.7.3" 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" version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
@@ -4215,13 +4205,6 @@ iconv-lite@^0.6.2:
dependencies: dependencies:
safer-buffer ">= 2.1.2 < 3.0.0" 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: ieee754@^1.1.13:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 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" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2"
integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== 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: immutable@^4.0.0-rc.12:
version "4.1.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" 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" has "^1.0.3"
side-channel "^1.0.4" side-channel "^1.0.4"
invariant@^2.1.0, invariant@^2.2.4: invariant@^2.2.4:
version "2.2.4" version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== 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" 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== 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" version "5.0.1"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== 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" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 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: pbxproj-dom@^1.0.11:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/pbxproj-dom/-/pbxproj-dom-1.2.0.tgz#1cf4101163bd666eba9eb92a5b8f616ce824ea85" 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" "@babel/runtime" "^7.14.5"
html-parse-stringify "^3.0.1" 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" version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -6961,18 +6934,6 @@ react-native@0.65.2:
whatwg-fetch "^3.0.0" whatwg-fetch "^3.0.0"
ws "^6.1.4" 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: react-refresh@^0.4.0:
version "0.4.3" version "0.4.3"
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" 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" prop-types "15.5.8"
ts-object-utils "0.0.5" 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: regenerate-unicode-properties@^10.0.1:
version "10.0.1" version "10.0.1"
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" 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" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== 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: resolve-cwd@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" 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" loose-envify "^1.1.0"
object-assign "^4.1.1" 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: semver@7.0.0:
version "7.0.0" version "7.0.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" 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" has-symbols "^1.0.3"
which-boxed-primitive "^1.0.2" 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: unherit@^1.0.4:
version "1.1.3" version "1.1.3"
resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22"