diff --git a/.eslintignore b/.eslintignore
index d79cdbb..81a97e2 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -3,6 +3,7 @@ android/**
ios/**
__tests__/**
**/tests/***
+web-build/**
.eslintrc.js
e2e/**/*.*
metrics/*
@@ -10,4 +11,6 @@ jest.setup.js
babel.config.js
reports
report.json
-**/tests/*.test.js
\ No newline at end of file
+growthbook.js
+**/tests/*.test.js
+webpack.config.js
\ No newline at end of file
diff --git a/.eslintrc.js b/.eslintrc.js
index a2da718..7d646b7 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -21,7 +21,6 @@ module.exports = {
'immutable',
'sonarjs',
'prettier',
- 'redux-saga',
'react-native',
'react',
'react-hooks',
@@ -95,8 +94,6 @@ module.exports = {
'react/require-extension': 0,
'react/self-closing-comp': 0,
'react/sort-comp': 0,
- 'redux-saga/no-yield-in-race': 2,
- 'redux-saga/yield-effects': 2,
'require-yield': 0,
'react/no-array-index-key': 0,
'react/jsx-curly-newline': 0,
@@ -119,7 +116,7 @@ module.exports = {
}
],
'no-shadow': 'error',
- complexity: ['error', 2],
+ complexity: ['error', 4],
'no-empty': 'error',
'import/order': [
'error',
@@ -145,7 +142,8 @@ module.exports = {
}
],
'fp/no-nil': 0,
- 'fp/no-unused-expression': 0
+ 'fp/no-unused-expression': 0,
+ 'fp/no-throw': 0
},
settings: {
'import/resolver': {
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 9166e58..22ad456 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -1,9 +1,9 @@
name: react-native-template
on:
push:
- branches: [ master ]
+ branches: [master, dev]
pull_request:
- branches: [ master ]
+ branches: [master, dev]
jobs:
install-and-test:
runs-on: ubuntu-latest
@@ -13,7 +13,7 @@ jobs:
run: yarn
- name: Lint
- run: npm run lint
+ run: yarn lint
- name: Test and generate coverage report
uses: artiomtr/jest-coverage-report-action@v2.2.9
diff --git a/.github/workflows/cd-prod-ios.yaml b/.github/workflows/cd-prod-ios.yaml
deleted file mode 100644
index e69de29..0000000
diff --git a/app/app.js b/app/app.js
index 68c5387..f099239 100644
--- a/app/app.js
+++ b/app/app.js
@@ -1,24 +1,19 @@
import React from 'react';
+import { RecoilRoot } from 'recoil';
import { I18nextProvider } from 'react-i18next';
+import 'react-native-gesture-handler';
import LanguageProvider from '@atoms/LanguageProvider';
import RootScreen from '@scenes/RootScreen';
import i18n from '@app/i18n';
-import createStore from '@app/rootReducer';
-import { Provider } from 'react-redux';
-import { PersistGate } from 'redux-persist/lib/integration/react';
-import 'react-native-gesture-handler';
-const { store, persistor } = createStore();
const App = () => (
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
);
export default App;
diff --git a/app/assets/images/wednesday-logo-new.png b/app/assets/images/wednesday-logo-new.png
new file mode 100644
index 0000000..a7a9a9d
Binary files /dev/null and b/app/assets/images/wednesday-logo-new.png differ
diff --git a/app/assets/images/wednesday-logo-old.png b/app/assets/images/wednesday-logo-old.png
new file mode 100755
index 0000000..db6d8a5
Binary files /dev/null and b/app/assets/images/wednesday-logo-old.png differ
diff --git a/app/assets/images/wednesday-logo.png b/app/assets/images/wednesday-logo.png
old mode 100755
new mode 100644
index db6d8a5..c7f3a03
Binary files a/app/assets/images/wednesday-logo.png and b/app/assets/images/wednesday-logo.png differ
diff --git a/app/assets/images/wednesday-logo.svg b/app/assets/images/wednesday-logo.svg
new file mode 100644
index 0000000..00ba80b
--- /dev/null
+++ b/app/assets/images/wednesday-logo.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/app/components/atoms/Container/tests/__snapshots__/index.test.js.snap b/app/components/atoms/Container/tests/__snapshots__/index.test.js.snap
index 1a1f520..0cf3656 100644
--- a/app/components/atoms/Container/tests/__snapshots__/index.test.js.snap
+++ b/app/components/atoms/Container/tests/__snapshots__/index.test.js.snap
@@ -3,12 +3,14 @@
exports[` should render and match the snapshot 1`] = `
diff --git a/app/components/atoms/LanguageProvider/actions.js b/app/components/atoms/LanguageProvider/actions.js
deleted file mode 100644
index 8dfbef5..0000000
--- a/app/components/atoms/LanguageProvider/actions.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *
- * LanguageProvider actions
- *
- */
-
-import { CHANGE_LOCALE } from './constants';
-/**
- * Changes the locale/language of the application.
- * @param {string} languageLocale - The new locale/language to set.
- * @returns {object} An action object with type 'CHANGE_LOCALE' and the new locale/language.
- */
-export function changeLocale(languageLocale) {
- return {
- type: CHANGE_LOCALE,
- locale: languageLocale
- };
-}
diff --git a/app/components/atoms/LanguageProvider/constants.js b/app/components/atoms/LanguageProvider/constants.js
deleted file mode 100644
index f4d838d..0000000
--- a/app/components/atoms/LanguageProvider/constants.js
+++ /dev/null
@@ -1 +0,0 @@
-export const CHANGE_LOCALE = 'changeLocale';
diff --git a/app/components/atoms/LanguageProvider/reducer.js b/app/components/atoms/LanguageProvider/reducer.js
deleted file mode 100644
index b67a969..0000000
--- a/app/components/atoms/LanguageProvider/reducer.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/* eslint-disable sonarjs/no-small-switch */
-/*
- *
- * LanguageProvider reducer
- *
- */
-import { createActions } from 'reduxsauce';
-import { fromJS } from 'immutable';
-import produce from 'immer';
-import { DEFAULT_LOCALE } from '@app/i18n';
-
-export const {
- Types: languageProviderTypes,
- Creators: languageProviderActions
-} = createActions({
- changeLocale: ['locale']
-});
-
-export const initialState = fromJS({
- locale: DEFAULT_LOCALE
-});
-
-/* eslint-disable default-case, no-param-reassign */
-export const languageProviderReducer = (state = initialState, action) =>
- produce(state, (/* draft */) => {
- switch (action.type) {
- case languageProviderTypes.CHANGE_LOCALE:
- return state.set('locale', action.locale);
- default:
- return state;
- }
- });
-
-export default languageProviderReducer;
diff --git a/app/components/atoms/LanguageProvider/selectors.js b/app/components/atoms/LanguageProvider/selectors.js
deleted file mode 100644
index c5d4462..0000000
--- a/app/components/atoms/LanguageProvider/selectors.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { createSelector } from 'reselect';
-import { initialState } from './reducer';
-
-/**
- * Direct selector to the languageToggle state domain
- */
-const selectLanguage = state => (state.language || initialState).toJS();
-
-/**
- * Select the language locale
- */
-
-const makeSelectLocale = () =>
- createSelector(selectLanguage, languageState => languageState.locale);
-
-export { selectLanguage, makeSelectLocale };
diff --git a/app/components/atoms/LanguageProvider/tests/action.test.js b/app/components/atoms/LanguageProvider/tests/action.test.js
deleted file mode 100644
index 29e5b1c..0000000
--- a/app/components/atoms/LanguageProvider/tests/action.test.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import { changeLocale } from '../actions';
-import { CHANGE_LOCALE } from '../constants';
-
-describe('changeLocale action creator', () => {
- it('should create an action to change the locale', () => {
- const languageLocale = 'en';
- const expectedAction = {
- type: CHANGE_LOCALE,
- locale: languageLocale
- };
- const action = changeLocale(languageLocale);
- expect(action).toEqual(expectedAction);
- });
-});
diff --git a/app/components/atoms/LanguageProvider/tests/index.test.js b/app/components/atoms/LanguageProvider/tests/index.test.js
index a728fea..f103dcc 100644
--- a/app/components/atoms/LanguageProvider/tests/index.test.js
+++ b/app/components/atoms/LanguageProvider/tests/index.test.js
@@ -1,38 +1,30 @@
-// import React from 'react';
-// import { render } from '@testing-library/react-native';
-// import { Provider } from 'react-redux';
-// import T from '@atoms/T';
-// import createStore from 'app/rootReducer';
-// import { translationMessages } from 'app/i18n';
-// import { renderWithI18next } from '@utils/testUtils';
-// import { Text } from 'react-native';
-// import ConnectedLanguageProvider, { LanguageProvider } from '../index';
-// describe(' container tests', () => {
-// it('should render its children', () => {
-// const children = (
-//
-// Test
-//
-// );
-// const container = renderWithI18next(
-//
-// {children}
-//
-// );
-// expect(container.firstChild).not.toBeNull();
-// });
-// });
-// const setupReduxStore = () => ({ reduxStore: createStore().store });
-// describe(' container tests', () => {
-// it('should render the default language messages', () => {
-// const { reduxStore } = setupReduxStore();
-// const { queryByText } = render(
-//
-//
-//
-//
-//
-// );
-// expect(queryByText('because')).not.toBeNull();
-// });
-// });
+import React from 'react';
+import { render } from '@testing-library/react-native';
+import T from '@atoms/T';
+import { renderWithI18next } from '@utils/testUtils';
+import { Text } from 'react-native';
+import ConnectedLanguageProvider, { LanguageProvider } from '../index';
+describe(' container tests', () => {
+ it('should render its children', () => {
+ const children = (
+
+ Test
+
+ );
+ const container = renderWithI18next(
+ {children}
+ );
+ expect(container.firstChild).not.toBeNull();
+ });
+});
+
+describe(' container tests', () => {
+ it('should render the default language messages', () => {
+ const { queryByText } = render(
+
+
+
+ );
+ expect(queryByText('because')).not.toBeNull();
+ });
+});
diff --git a/app/components/atoms/LanguageProvider/tests/reducer.test.js b/app/components/atoms/LanguageProvider/tests/reducer.test.js
deleted file mode 100644
index f1288dc..0000000
--- a/app/components/atoms/LanguageProvider/tests/reducer.test.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import {
- initialState,
- languageProviderTypes,
- languageProviderReducer
-} from '../reducer';
-const setupMockedState = state => ({ mockedState: state });
-/* eslint-disable default-case, no-param-reassign */
-describe('Tests for LanguageProvider actions', () => {
- it('returns the initial state', () => {
- const { mockedState } = setupMockedState(initialState);
- expect(languageProviderReducer(undefined, {})).toEqual(mockedState);
- });
-
- it('changes the locale', () => {
- const locale = 'de';
- const { mockedState } = setupMockedState(
- initialState.set('locale', locale)
- );
- expect(
- languageProviderReducer(undefined, {
- type: languageProviderTypes.CHANGE_LOCALE,
- locale
- })
- ).toEqual(mockedState);
- });
-});
diff --git a/app/components/atoms/LanguageProvider/tests/selectors.test.js b/app/components/atoms/LanguageProvider/tests/selectors.test.js
deleted file mode 100644
index e4fb65d..0000000
--- a/app/components/atoms/LanguageProvider/tests/selectors.test.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { fromJS } from 'immutable';
-import { selectLanguage } from '../selectors';
-
-describe('Tests for LanguageProvider selectors', () => {
- it('should select the global state', () => {
- const globalState = {};
- const mockedState = {
- language: fromJS(globalState)
- };
- expect(selectLanguage(mockedState)).toEqual(globalState);
- });
-});
diff --git a/app/components/molecules/CharacterWithQuote/tests/__snapshots__/index.test.js.snap b/app/components/molecules/CharacterWithQuote/tests/__snapshots__/index.test.js.snap
index 1d2d373..e32d2e2 100644
--- a/app/components/molecules/CharacterWithQuote/tests/__snapshots__/index.test.js.snap
+++ b/app/components/molecules/CharacterWithQuote/tests/__snapshots__/index.test.js.snap
@@ -4,27 +4,29 @@ exports[` Should render and match the snapshot 1`] = `
[
wednesday_lover
,
because
,
@@ -36,27 +38,30 @@ exports[` Should render and match the snapshot 1`] = `
}
}
style={
- {
- "height": 80,
- "marginBottom": 0,
- "marginLeft": "auto",
- "marginRight": "auto",
- "marginTop": 0,
- "width": 80,
- }
+ [
+ {
+ "height": 80,
+ "marginBottom": 0,
+ "marginLeft": "auto",
+ "marginRight": "auto",
+ "marginTop": 0,
+ "width": 80,
+ },
+ ]
}
testID="character-image"
/>,
,
]
`;
diff --git a/app/components/molecules/LogoWithInstructions/tests/__snapshots__/index.test.js.snap b/app/components/molecules/LogoWithInstructions/tests/__snapshots__/index.test.js.snap
index 5f9e96c..6dba70c 100644
--- a/app/components/molecules/LogoWithInstructions/tests/__snapshots__/index.test.js.snap
+++ b/app/components/molecules/LogoWithInstructions/tests/__snapshots__/index.test.js.snap
@@ -15,7 +15,7 @@ exports[` Should render and match the snapshot 1`] = `
resizeMode="contain"
source={
{
- "testUri": "../../../app/assets/images/wednesday-logo.png",
+ "testUri": "../../../app/assets/images/wednesday-logo-new.png",
}
}
style={
@@ -29,15 +29,16 @@ exports[` Should render and match the snapshot 1`] = `
`;
diff --git a/app/components/organisms/SimpsonsLoveWednesday/tests/__snapshots__/index.test.js.snap b/app/components/organisms/SimpsonsLoveWednesday/tests/__snapshots__/index.test.js.snap
index 5395716..8870df6 100644
--- a/app/components/organisms/SimpsonsLoveWednesday/tests/__snapshots__/index.test.js.snap
+++ b/app/components/organisms/SimpsonsLoveWednesday/tests/__snapshots__/index.test.js.snap
@@ -16,7 +16,7 @@ exports[` Should render and match the snapshot 1`] = `
resizeMode="contain"
source={
{
- "testUri": "../../../app/assets/images/wednesday-logo.png",
+ "testUri": "../../../app/assets/images/wednesday-logo-new.png",
}
}
style={
@@ -30,43 +30,50 @@ exports[` Should render and match the snapshot 1`] = `
,
wednesday_lover
because
@@ -78,27 +85,30 @@ exports[` Should render and match the snapshot 1`] = `
}
}
style={
- {
- "height": 80,
- "marginBottom": 0,
- "marginLeft": "auto",
- "marginRight": "auto",
- "marginTop": 0,
- "width": 80,
- }
+ [
+ {
+ "height": 80,
+ "marginBottom": 0,
+ "marginLeft": "auto",
+ "marginRight": "auto",
+ "marginTop": 0,
+ "width": 80,
+ },
+ ]
}
testID="character-image"
/>
,
]
diff --git a/app/i18n.js b/app/i18n.js
index b3a509d..5338e08 100644
--- a/app/i18n.js
+++ b/app/i18n.js
@@ -10,20 +10,10 @@ import { initReactI18next } from 'react-i18next';
* script `extract-intl`, and must use CommonJS module syntax
* You CANNOT use import/export in this file.
*/
-const addLocaleData = require('react-intl').addLocaleData; //eslint-disable-line
-
-const enLocaleData = require('react-intl/locale-data/en');
const enTranslationMessages = require('./translations/en.json');
-addLocaleData(enLocaleData);
-export const DEFAULT_LOCALE = 'en';
-
-// prettier-ignore
-export const appLocales = [
- 'en',
-];
-const languageDetector = {
+export const languageDetector = {
type: 'languageDetector',
async: true,
detect: cb => cb('en'),
@@ -48,22 +38,3 @@ i18n
});
export default i18n;
-
-export const formatTranslationMessages = (locale, messages) => {
- const defaultFormattedMessages =
- locale !== DEFAULT_LOCALE
- ? formatTranslationMessages(DEFAULT_LOCALE, enTranslationMessages)
- : {};
- const flattenFormattedMessages = (formattedMessages, key) => {
- const formattedMessage =
- !messages[key] && locale !== DEFAULT_LOCALE
- ? defaultFormattedMessages[key]
- : messages[key];
- return Object.assign(formattedMessages, { [key]: formattedMessage });
- };
- return Object.keys(messages).reduce(flattenFormattedMessages, {});
-};
-
-export const translationMessages = {
- en: formatTranslationMessages('en', enTranslationMessages)
-};
diff --git a/app/i18n.test.js b/app/i18n.test.js
index 0f3c5c8..9d082be 100644
--- a/app/i18n.test.js
+++ b/app/i18n.test.js
@@ -1,51 +1,10 @@
-// import { formatTranslationMessages } from './i18n';
-
-// jest.mock('app/translations/en.json', () => ({
-// message1: 'default message',
-// message2: 'default message 2'
-// }));
-
-// const esTranslationMessages = {
-// message1: 'mensaje predeterminado',
-// message2: ''
-// };
-
-// describe('Tests for formatTranslationMessages', () => {
-// it('should build only defaults when DEFAULT_LOCALE', () => {
-// const result = formatTranslationMessages('en', { a: 'a' });
-
-// expect(result).toEqual({ a: 'a' });
-// });
-
-// it('should combine default locale and current locale when not DEFAULT_LOCALE', () => {
-// const result = formatTranslationMessages('', esTranslationMessages);
-
-// expect(result).toEqual({
-// message1: 'mensaje predeterminado',
-// message2: 'default message 2'
-// });
-// });
-// });
-
import i18next from 'i18next';
import { initReactI18next } from 'react-i18next';
-
-jest.mock('i18next', () => ({
- use: jest.fn().mockReturnThis(),
- init: jest.fn().mockReturnThis()
-}));
-
-jest.mock('react-i18next', () => ({
- initReactI18next: {
- type: '3rdParty',
- init: jest.fn()
- }
-}));
+import { languageDetector } from './i18n';
describe('i18n configuration', () => {
it('should configure i18next with the correct settings', () => {
// Import the i18n configuration
- require('./i18n');
// Verify that the language detector was used
expect(i18next.use).toHaveBeenCalledWith(
@@ -65,7 +24,7 @@ describe('i18n configuration', () => {
expect(i18next.init).toHaveBeenCalledWith(
expect.objectContaining({
fallbackLng: 'en',
- debug: true,
+ debug: false,
resources: {
en: {
translation: expect.any(Object) // This should match the contents of enTranslationMessages
@@ -79,10 +38,6 @@ describe('i18n configuration', () => {
});
it('should detect language as "en" using the language detector', () => {
- const languageDetector = {
- detect: jest.fn()
- };
-
// Call the detect function and ensure it was passed 'en'
languageDetector.detect(language => {
expect(language).toBe('en');
diff --git a/app/navigators/appNavigator.js b/app/navigators/appNavigator.js
index 3ad9469..51fee5b 100644
--- a/app/navigators/appNavigator.js
+++ b/app/navigators/appNavigator.js
@@ -13,7 +13,10 @@ const Stack = createStackNavigator();
export default function AppNavigator() {
return (
-
+
diff --git a/app/rootReducer.js b/app/rootReducer.js
deleted file mode 100644
index 21cf2ff..0000000
--- a/app/rootReducer.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { combineReducers } from 'redux';
-import { exampleContainerReducer as example } from '@scenes/ExampleScreen/reducer';
-import configureStore from '@app/utils/createStore';
-import rootSaga from '@app/rootSaga';
-
-export default () => {
- const rootReducer = combineReducers({
- example
- });
-
- return configureStore(rootReducer, rootSaga);
-};
diff --git a/app/rootSaga.js b/app/rootSaga.js
deleted file mode 100644
index a025ca9..0000000
--- a/app/rootSaga.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { fork } from 'redux-saga/effects';
-import exampleSaga from '@scenes/ExampleScreen/saga';
-import startupSaga from '@scenes/RootScreen/saga';
-/**
- * Root saga generator function that orchestrates other sagas.
- * This function sets up and manages the execution of multiple sagas using fork effects.
- * @returns {IterableIterator} An iterator for managing the execution of sagas.
- */
-export default function* root() {
- yield fork(exampleSaga);
- yield fork(startupSaga);
-}
diff --git a/app/scenes/ExampleScreen/index.js b/app/scenes/ExampleScreen/index.js
index 0102d4b..fc6f3c3 100644
--- a/app/scenes/ExampleScreen/index.js
+++ b/app/scenes/ExampleScreen/index.js
@@ -1,28 +1,20 @@
+import React, { useEffect } from 'react';
import { Button, Platform, View, ActivityIndicator } from 'react-native';
-import { connect } from 'react-redux';
-import { compose } from 'redux';
-import { PropTypes } from 'prop-types';
+import {
+ useRecoilState,
+ useSetRecoilState,
+ useRecoilValueLoadable
+} from 'recoil';
import styled from 'styled-components/native';
-import { createStructuredSelector } from 'reselect';
-import { injectIntl } from 'react-intl';
-import React, { useEffect } from 'react';
+import { useTranslation } from 'react-i18next';
import AppContainer from '@atoms/Container';
import SimpsonsLoveWednesday from '@organisms/SimpsonsLoveWednesday';
+import If from '@app/components/atoms/If';
+import { conditionalOperatorFunction } from '@app/utils/common';
+import { LoadingStates } from '@app/utils/constants';
-import {
- selectUser,
- selectUserIsLoading,
- selectUserErrorMessage
-} from './selectors';
-import { exampleScreenActions } from './reducer';
-
-/**
- * This is an example of a container component.
- *
- * This screen displays a little help message and informations about a fake user.
- * Feel free to remove it.
- */
+import { userState, fetchUserSelector, fetchTriggerState } from './recoilState';
const Container = styled(AppContainer)`
margin: 30px;
@@ -38,56 +30,58 @@ const CustomButtonParentView = styled(View)`
max-width: 80px;
align-self: center;
`;
+
const instructions = Platform.select({
ios: 'Press Cmd+R to reload,\nCmd+D or shake for dev menu.',
android:
'Double tap R on your keyboard to reload,\nShake or press menu button for dev menu.'
});
-const ExampleScreen = props => {
+const ExampleScreen = () => {
+ const [user, setUser] = useRecoilState(userState);
+ const setFetchTrigger = useSetRecoilState(fetchTriggerState);
+ const userLoadable = useRecoilValueLoadable(fetchUserSelector);
+ const { t } = useTranslation();
const requestFetchUser = () => {
- props.fetchUser();
+ setFetchTrigger(prev => prev + 1);
};
+
useEffect(() => {
requestFetchUser();
}, []);
+
+ useEffect(() => {
+ if (userLoadable.state === LoadingStates.HAS_VALUE) {
+ setUser(userLoadable.contents);
+ }
+ }, [userLoadable?.contents?.character]);
+
return (
- {props.userIsLoading ? (
+
+
+
+
+
+
+ }
+ >
- ) : (
-
-
-
-
-
-
- )}
+
);
};
-ExampleScreen.propTypes = {
- user: PropTypes.object,
- userIsLoading: PropTypes.bool,
- userErrorMessage: PropTypes.string,
- fetchUser: PropTypes.func
-};
-
-const mapStateToProps = createStructuredSelector({
- user: selectUser(),
- userIsLoading: selectUserIsLoading(),
- userErrorMessage: selectUserErrorMessage()
-});
-
-const mapDispatchToProps = dispatch => ({
- fetchUser: () => dispatch(exampleScreenActions.requestFetchUser())
-});
-
-const withConnect = connect(mapStateToProps, mapDispatchToProps);
-export default compose(withConnect)(ExampleScreen);
+export default ExampleScreen;
export { ExampleScreen as ExampleScreenTest };
diff --git a/app/scenes/ExampleScreen/recoilState.js b/app/scenes/ExampleScreen/recoilState.js
new file mode 100644
index 0000000..619bada
--- /dev/null
+++ b/app/scenes/ExampleScreen/recoilState.js
@@ -0,0 +1,50 @@
+import { atom, selector } from 'recoil';
+import { getUser } from '@app/services/userService';
+import { Errors } from '@app/utils/errors';
+import { errorHandlerFunction } from '@app/utils/common';
+
+const stateKeys = {
+ USER_STATE: 'userState',
+ USER_IS_LOADING_STATE: 'userIsLoadingState',
+ USER_ERROR_MESSAGE_STATE: 'userErrorMessageState',
+ FETCH_TRIGGER_STATE: 'fetchTriggerState',
+ FETCH_USER_SELECTOR: 'fetchUserSelector'
+};
+
+// Atom to manage user state
+export const userState = atom({
+ key: stateKeys.USER_STATE,
+ default: null
+});
+
+// Atom to manage loading state
+export const userIsLoadingState = atom({
+ key: stateKeys.USER_IS_LOADING_STATE,
+ default: false
+});
+
+// Atom to manage error messages
+export const userErrorMessageState = atom({
+ key: stateKeys.USER_ERROR_MESSAGE_STATE,
+ default: null
+});
+
+// Atom to trigger a fetch
+export const fetchTriggerState = atom({
+ key: stateKeys.FETCH_TRIGGER_STATE,
+ default: 0 // This will be incremented to trigger re-fetching
+});
+
+// Selector to fetch user data
+export const fetchUserSelector = selector({
+ key: stateKeys.FETCH_USER_SELECTOR,
+ get: async ({ get }) => {
+ get(fetchTriggerState); // Read the trigger state to force re-fetch
+
+ const response = await getUser();
+
+ errorHandlerFunction(response, Errors.GET_USER_ERROR);
+ const { data } = response;
+ return data[0];
+ }
+});
diff --git a/app/scenes/ExampleScreen/reducer.js b/app/scenes/ExampleScreen/reducer.js
deleted file mode 100644
index 44bf660..0000000
--- a/app/scenes/ExampleScreen/reducer.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import { createActions } from 'reduxsauce';
-import { fromJS } from 'immutable';
-import produce from 'immer';
-export const {
- Types: exampleScreenTypes,
- Creators: exampleScreenActions
-} = createActions({
- // Fetch user informations
- requestFetchUser: null,
- // User information was successfully fetched
- successFetchUser: ['user'],
- // An error occurred
- failureFetchUser: ['errorMessage']
-});
-
-export const initialState = fromJS({
- user: {},
- userIsLoading: false,
- userErrorMessage: null
-});
-
-export const fetchUser = state =>
- state.set('userIsLoading', true).set('userErrorMessage', null);
-
-export const successFetchUser = (state, { user }) =>
- state
- .set('user', user)
- .set('userIsLoading', false)
- .set('userErrorMessage', null);
-
-export const failureFetchUser = (state, { errorMessage }) =>
- state
- .set('user', {})
- .set('userIsLoading', false)
- .set('userErrorMessage', errorMessage);
-
-/**
- * @see https://github.com/infinitered/reduxsauce#createreducer
- */
-export const exampleContainerReducer = (state = initialState, action) =>
- produce(state, () => {
- switch (action.type) {
- case exampleScreenTypes.REQUEST_FETCH_USER:
- return fetchUser(state);
- case exampleScreenTypes.SUCCESS_FETCH_USER:
- return successFetchUser(state, action);
- case exampleScreenTypes.FAILURE_FETCH_USER:
- return failureFetchUser(state, action);
- default:
- return state;
- }
- });
diff --git a/app/scenes/ExampleScreen/saga.js b/app/scenes/ExampleScreen/saga.js
deleted file mode 100644
index 6c3feaa..0000000
--- a/app/scenes/ExampleScreen/saga.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import { put, call, takeLatest } from 'redux-saga/effects';
-import get from 'lodash/get';
-import { getUser } from '@app/services/userService';
-import { exampleScreenActions, exampleScreenTypes } from './reducer';
-
-/**
- * A saga can contain multiple functions.
- *
- * This example saga contains only one to fetch fake user informations.
- * Feel free to remove it.
- */
-export function* fetchUser() {
- const response = yield call(getUser);
- if (response.ok) {
- const { data } = response;
- yield put(exampleScreenActions.successFetchUser(get(data, '0')));
- } else {
- yield put(
- exampleScreenActions.failureFetchUser(
- 'There was an error while fetching user informations.'
- )
- );
- }
-}
-/**
- * Saga responsible for managing user search requests and fetching user data.
- * Watches for specific action types and triggers corresponding worker sagas.
- * @returns {IterableIterator} An iterator for handling user search and data fetching.
- */
-export default function* searchListContainerSaga() {
- yield takeLatest(exampleScreenTypes.REQUEST_FETCH_USER, fetchUser);
-}
diff --git a/app/scenes/ExampleScreen/selectors.js b/app/scenes/ExampleScreen/selectors.js
deleted file mode 100644
index 80845c3..0000000
--- a/app/scenes/ExampleScreen/selectors.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import { createSelector } from 'reselect';
-import get from 'lodash/get';
-import { initialState } from './reducer';
-
-export const selectExampleDomain = state =>
- (state.example || initialState).toJS();
-
-export const selectUser = () =>
- createSelector(selectExampleDomain, substate => get(substate, 'user', null));
-
-export const selectUserIsLoading = () =>
- createSelector(selectExampleDomain, substate =>
- get(substate, 'userIsLoading', null)
- );
-
-export const selectUserErrorMessage = () =>
- createSelector(selectExampleDomain, substate =>
- get(substate, 'userErrorMessage', null)
- );
diff --git a/app/scenes/ExampleScreen/tests/__snapshots__/index.test.js.snap b/app/scenes/ExampleScreen/tests/__snapshots__/index.test.js.snap
deleted file mode 100644
index 387c173..0000000
--- a/app/scenes/ExampleScreen/tests/__snapshots__/index.test.js.snap
+++ /dev/null
@@ -1,205 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[` Container tests should render and match the snapshot 1`] = `
-
-
-
-
-
-
-
- Press Cmd+R to reload,
-Cmd+D or shake for dev menu.
-
-
-
-
- wednesday_lover
-
-
- because
-
-
-
-
-
-
-
-
- Refresh
-
-
-
-
-
-
-`;
diff --git a/app/scenes/ExampleScreen/tests/index.test.js b/app/scenes/ExampleScreen/tests/index.test.js
index 6038f51..f084fe6 100644
--- a/app/scenes/ExampleScreen/tests/index.test.js
+++ b/app/scenes/ExampleScreen/tests/index.test.js
@@ -1,43 +1,105 @@
-/**
- *
- * Tests for ExampleScreen
- *
- */
-
import React from 'react';
-import { renderProvider } from 'app/utils/testUtils';
+import {
+ RecoilRoot,
+ useRecoilValueLoadable,
+ useSetRecoilState,
+ useRecoilState
+} from 'recoil';
+import { render, fireEvent } from '@testing-library/react-native';
import { ExampleScreenTest } from '../index';
-const setupJest = () => ({ submitSpy: jest.fn() });
-describe(' Container tests', () => {
- it('should render and match the snapshot', () => {
- const { submitSpy } = setupJest();
- const baseElement = renderProvider(
-
+
+jest.mock('recoil', () => ({
+ ...jest.requireActual('recoil'),
+ useRecoilValueLoadable: jest.fn(),
+ useSetRecoilState: jest.fn(),
+ useRecoilState: jest.fn()
+}));
+
+describe('ExampleScreen', () => {
+ const mockSetFetchTrigger = jest.fn();
+ const mockSetUser = jest.fn();
+ const mockUseRecoilState = jest.fn();
+
+ beforeEach(() => {
+ useSetRecoilState.mockReturnValue(mockSetFetchTrigger);
+ useRecoilValueLoadable.mockReturnValue({ state: 'loading' });
+ mockUseRecoilState.mockReturnValue([null, mockSetUser]);
+ useRecoilState.mockImplementation(mockUseRecoilState);
+ jest.spyOn(global.console, 'error').mockImplementation(() => {});
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+
+ test('renders loading indicator initially', () => {
+ const { getByTestId } = render(
+
+
+
);
- expect(baseElement).toMatchSnapshot();
+
+ expect(getByTestId('loader')).toBeTruthy();
});
- it('should fetch the user data on mount', () => {
- const { submitSpy } = setupJest();
- renderProvider();
- expect(submitSpy).toHaveBeenCalled();
+ test('renders content when userLoadable.state is "hasValue"', () => {
+ useRecoilValueLoadable.mockReturnValue({
+ state: 'hasValue',
+ contents: { character: 'Homer' }
+ });
+
+ const { getByTestId } = render(
+
+
+
+ );
+
+ expect(getByTestId('example-container-content')).toBeTruthy();
+ });
+
+ test('renders error message when userLoadable.state is "hasError"', () => {
+ useRecoilValueLoadable.mockReturnValue({
+ state: 'hasError',
+ contents: { message: 'Error occurred' }
+ });
+
+ const { getByText } = render(
+
+
+
+ );
+
+ expect(getByText('Error occurred')).toBeTruthy();
});
- it('should render ActivityIndicator if userIsLoading is true', () => {
- const { submitSpy } = setupJest();
- const { getByTestId } = renderProvider(
-
+
+ test('calls requestFetchUser on button press', () => {
+ useRecoilValueLoadable.mockReturnValue({
+ state: 'hasValue',
+ contents: { character: 'Homer' }
+ });
+
+ const { getByText } = render(
+
+
+
);
- expect(getByTestId('loader').type).toBe('ActivityIndicator');
- expect(submitSpy).toHaveBeenCalled();
+ fireEvent.press(getByText('refresh'));
+ expect(mockSetFetchTrigger).toHaveBeenCalled();
});
- it('should not render ActivityIndicator if userIsLoading is false, should instead render exampleContainerContent', () => {
- const { submitSpy } = setupJest();
- const { getByTestId } = renderProvider(
-
+ test('sets user when userLoadable.state is "hasValue"', () => {
+ useRecoilValueLoadable.mockReturnValue({
+ state: 'hasValue',
+ contents: { character: 'Homer' }
+ });
+
+ render(
+
+
+
);
- expect(getByTestId('example-container-content').type).toBe('View');
- expect(submitSpy).toHaveBeenCalled();
+
+ expect(mockSetUser).toHaveBeenCalledWith({ character: 'Homer' });
});
});
diff --git a/app/scenes/ExampleScreen/tests/recoilState.test.js b/app/scenes/ExampleScreen/tests/recoilState.test.js
new file mode 100644
index 0000000..9afe529
--- /dev/null
+++ b/app/scenes/ExampleScreen/tests/recoilState.test.js
@@ -0,0 +1,181 @@
+import React, { Suspense } from 'react';
+import { RecoilRoot, useRecoilState, useRecoilValue } from 'recoil';
+import TestRenderer from 'react-test-renderer';
+import { getUser } from '@app/services/userService';
+import { Errors } from '@app/utils/errors';
+import {
+ userState,
+ userIsLoadingState,
+ userErrorMessageState,
+ fetchTriggerState,
+ fetchUserSelector
+} from '../recoilState';
+
+jest.mock('@app/services/userService');
+
+describe('Recoil Atoms and Selector', () => {
+ let testContainer = {};
+
+ const TestComponent = ({ atom, newValue }) => {
+ const [value, setValue] = useRecoilState(atom);
+
+ if (newValue !== undefined) {
+ setValue(newValue);
+ }
+
+ testContainer = { value, setValue };
+ return null;
+ };
+
+ const SelectorTestComponent = ({ selector }) => {
+ const value = useRecoilValue(selector);
+ testContainer = { value };
+ return null;
+ };
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ testContainer = {};
+ });
+
+ describe('userState atom', () => {
+ it('should have a default value of null', () => {
+ TestRenderer.create(
+
+
+
+ );
+ expect(testContainer.value).toBeNull();
+ });
+
+ it('should update the user state', () => {
+ TestRenderer.create(
+
+
+
+ );
+ const { setValue } = testContainer;
+
+ TestRenderer.act(() => {
+ setValue({ id: 1, name: 'John Doe' });
+ });
+
+ expect(testContainer.value).toEqual({ id: 1, name: 'John Doe' });
+ });
+ });
+
+ describe('userIsLoadingState atom', () => {
+ it('should have a default value of false', () => {
+ TestRenderer.create(
+
+
+
+ );
+ expect(testContainer.value).toBe(false);
+ });
+
+ it('should update the loading state', () => {
+ TestRenderer.create(
+
+
+
+ );
+ const { setValue } = testContainer;
+
+ TestRenderer.act(() => {
+ setValue(true);
+ });
+
+ expect(testContainer.value).toBe(true);
+ });
+ });
+
+ describe('userErrorMessageState atom', () => {
+ it('should have a default value of null', () => {
+ TestRenderer.create(
+
+
+
+ );
+ expect(testContainer.value).toBeNull();
+ });
+
+ it('should update the error message state', () => {
+ TestRenderer.create(
+
+
+
+ );
+ const { setValue } = testContainer;
+
+ TestRenderer.act(() => {
+ setValue('An error occurred');
+ });
+
+ expect(testContainer.value).toBe('An error occurred');
+ });
+ });
+
+ describe('fetchTriggerState atom', () => {
+ it('should have a default value of 0', () => {
+ TestRenderer.create(
+
+
+
+ );
+ expect(testContainer.value).toBe(0);
+ });
+
+ it('should increment the trigger state', () => {
+ TestRenderer.create(
+
+
+
+ );
+ const { setValue } = testContainer;
+
+ TestRenderer.act(() => {
+ setValue(prev => prev + 1);
+ });
+
+ expect(testContainer.value).toBe(1);
+ });
+ });
+
+ describe('fetchUserSelector', () => {
+ it('should fetch and return user data when successful', async () => {
+ const mockUser = [{ id: 1, name: 'John Doe' }];
+ getUser.mockResolvedValueOnce({ ok: true, data: mockUser });
+
+ await TestRenderer.act(async () => {
+ TestRenderer.create(
+
+
+
+
+
+ );
+ });
+
+ expect(testContainer.value).toEqual(mockUser[0]);
+ });
+
+ it('should throw an error when the fetch fails', async () => {
+ getUser.mockResolvedValueOnce({ ok: false });
+
+ await TestRenderer.act(async () => {
+ try {
+ TestRenderer.create(
+
+
+
+
+
+ );
+ } catch (error) {
+ expect(error.message).toBe(Errors.USER_FETCH_ERROR);
+ }
+ });
+ });
+ });
+});
diff --git a/app/scenes/ExampleScreen/tests/reducer.test.js b/app/scenes/ExampleScreen/tests/reducer.test.js
deleted file mode 100644
index 9356002..0000000
--- a/app/scenes/ExampleScreen/tests/reducer.test.js
+++ /dev/null
@@ -1,58 +0,0 @@
-import {
- exampleContainerReducer,
- initialState,
- exampleScreenTypes
-} from '../reducer';
-
-/* eslint-disable default-case, no-param-reassign */
-const setupState = () => ({
- state: initialState,
- user: 'Mohammed Ali Chherawalla'
-});
-describe('Tests for reducers used in the ExampleScreen', () => {
- it('should return the initial state', () => {
- const { state } = setupState();
- expect(exampleContainerReducer(undefined, {})).toEqual(state);
- });
-
- it('should ensure that userLoading = true when an action of type REQUEST_FETCH_USER is dispatched', () => {
- const { state, user } = setupState();
- const expectedResult = state
- .set('userIsLoading', true)
- .set('userErrorMessage', null);
- expect(
- exampleContainerReducer(state, {
- type: exampleScreenTypes.REQUEST_FETCH_USER,
- user
- })
- ).toEqual(expectedResult);
- });
-
- it('should ensure that the user data is present and userLoading = false when SUCCESS_FETCH_USER is dispatched', () => {
- const { state, user } = setupState();
- const expectedResult = state
- .set('user', { name: user })
- .set('userIsLoading', false)
- .set('userErrorMessage', null);
- expect(
- exampleContainerReducer(state, {
- type: exampleScreenTypes.SUCCESS_FETCH_USER,
- user: { name: user }
- })
- ).toEqual(expectedResult);
- });
-
- it('should ensure that the userErrorMessage has some data and userLoading = false when FAILURE_FETCH_USER is dispatched', () => {
- const { state } = setupState();
- const expectedResult = state
- .set('user', {})
- .set('userIsLoading', false)
- .set('userErrorMessage', 'There was some error');
- expect(
- exampleContainerReducer(state, {
- type: exampleScreenTypes.FAILURE_FETCH_USER,
- errorMessage: 'There was some error'
- })
- ).toEqual(expectedResult);
- });
-});
diff --git a/app/scenes/ExampleScreen/tests/saga.test.js b/app/scenes/ExampleScreen/tests/saga.test.js
deleted file mode 100644
index afb028f..0000000
--- a/app/scenes/ExampleScreen/tests/saga.test.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Test sagas
- */
-
-/* eslint-disable redux-saga/yield-effects */
-
-import { takeLatest, call, put } from 'redux-saga/effects';
-import { getUser } from 'app/services/userService';
-import { apiResponseGenerator } from 'app/utils/testUtils';
-import exampleScreenSaga, { fetchUser } from '../saga';
-import { exampleScreenTypes } from '../reducer';
-
-describe('Tests for the sagas used in the ExampleScreen', () => {
- const generator = exampleScreenSaga();
-
- it('should start task to watch for REQUEST_FETCH_USER action', () => {
- expect(generator.next().value).toEqual(
- takeLatest(exampleScreenTypes.REQUEST_FETCH_USER, fetchUser)
- );
- });
-
- it('should ensure that the action FAILURE_FETCH_USER is dispatched when the api call fails', () => {
- const method = fetchUser();
- const res = method.next().value;
- expect(res).toEqual(call(getUser));
- expect(method.next(apiResponseGenerator(false)).value).toEqual(
- put({
- type: exampleScreenTypes.FAILURE_FETCH_USER,
- errorMessage: 'There was an error while fetching user informations.'
- })
- );
- });
-
- it('should ensure that the action SUCCESS_FETCH_USER is dispatched when the api call succeeds', () => {
- const method = fetchUser();
- const res = method.next().value;
- expect(res).toEqual(call(getUser));
- const userResponse = {
- quote: 'Thank you. Come again.',
- character: 'Mohammed Ali Chherawalla',
- image:
- 'https://cdn.glitch.com/3c3ffadc-3406-4440-bb95-d40ec8fcde72%2FApuNahasapeemapetilon.png?1497567511629',
- characterDirection: 'Left'
- };
- expect(
- method.next(apiResponseGenerator(true, [userResponse])).value
- ).toEqual(
- put({ type: exampleScreenTypes.SUCCESS_FETCH_USER, user: userResponse })
- );
- });
-});
diff --git a/app/scenes/ExampleScreen/tests/selectors.test.js b/app/scenes/ExampleScreen/tests/selectors.test.js
deleted file mode 100644
index 1072308..0000000
--- a/app/scenes/ExampleScreen/tests/selectors.test.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import { fromJS } from 'immutable';
-import {
- selectUser,
- selectUserIsLoading,
- selectUserErrorMessage
-} from '../selectors';
-
-const setupMockedState = () => {
- const username = 'Mohammed Ali Chherawalla';
- const userErrorMessage = 'Some error';
- const userIsLoading = false;
- return {
- username,
- userErrorMessage,
- userIsLoading,
- mockedState: {
- example: fromJS({
- user: {
- username
- },
- userErrorMessage,
- userIsLoading
- })
- }
- };
-};
-describe('Tests for selectors to get data from state for the ExampleScreen', () => {
- it('should select the user state', () => {
- const { mockedState, username } = setupMockedState();
- const userSelector = selectUser();
- expect(userSelector(mockedState)).toEqual({ username });
- });
-
- it('should select userIsLoading', () => {
- const { mockedState, userIsLoading } = setupMockedState();
- const userIsLoadingSelector = selectUserIsLoading();
- expect(userIsLoadingSelector(mockedState)).toEqual(userIsLoading);
- });
-
- it('should select the userErrorMessage', () => {
- const { mockedState, userErrorMessage } = setupMockedState();
- const userErrorMessageSelector = selectUserErrorMessage();
- expect(userErrorMessageSelector(mockedState)).toEqual(userErrorMessage);
- });
-});
diff --git a/app/scenes/RootScreen/index.js b/app/scenes/RootScreen/index.js
index 3bdcfed..29488f4 100644
--- a/app/scenes/RootScreen/index.js
+++ b/app/scenes/RootScreen/index.js
@@ -1,30 +1,26 @@
-import { connect } from 'react-redux';
-import { PropTypes } from 'prop-types';
+import React, { useEffect } from 'react';
+import { useRecoilValue } from 'recoil';
import AppNavigator from '@navigators/appNavigator';
import Container from '@atoms/Container';
-import React, { useEffect } from 'react';
-import { setTopLevelNavigator } from '@app/services/navigationService';
-import { rootScreenActions } from './reducer';
+import { navigateAndReset } from '@app/services/navigationService';
+import { appState } from './recoilState';
+
+const RootScreen = () => {
+ const app = useRecoilValue(appState);
-const RootScreen = props => {
useEffect(() => {
- // Run the startup function when the component mounts
- props.startup();
- }, []);
+ // Startup function
+ if (!app) {
+ setTimeout(() => navigateAndReset('MainScreen'), 1000);
+ }
+ }, [app]);
return (
-
+
);
};
-RootScreen.propTypes = {
- startup: PropTypes.func
-};
-
-const mapDispatchToProps = dispatch => ({
- startup: () => dispatch(rootScreenActions.startup())
-});
-export default connect(null, mapDispatchToProps)(RootScreen);
+export default RootScreen;
export { RootScreen as RootScreenTest };
diff --git a/app/scenes/RootScreen/recoilState.js b/app/scenes/RootScreen/recoilState.js
new file mode 100644
index 0000000..506fa62
--- /dev/null
+++ b/app/scenes/RootScreen/recoilState.js
@@ -0,0 +1,10 @@
+import { atom } from 'recoil';
+
+const stateKeys = {
+ APP_STATE: 'appState'
+};
+
+export const appState = atom({
+ key: stateKeys.APP_STATE,
+ default: null
+});
diff --git a/app/scenes/RootScreen/reducer.js b/app/scenes/RootScreen/reducer.js
deleted file mode 100644
index 4dee4e6..0000000
--- a/app/scenes/RootScreen/reducer.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/* eslint-disable sonarjs/no-small-switch */
-import { createActions } from 'reduxsauce';
-import { fromJS } from 'immutable';
-import produce from 'immer';
-export const {
- Types: rootScreenTypes,
- Creators: rootScreenActions
-} = createActions({
- // This action is triggered when the application starts
- startup: null
-});
-
-export const initialState = fromJS({
- app: null
-});
-
-export const rootContainerReducer = (state = initialState, action) =>
- produce(state, () => {
- switch (action.type) {
- default:
- return state;
- }
- });
diff --git a/app/scenes/RootScreen/saga.js b/app/scenes/RootScreen/saga.js
deleted file mode 100644
index ebbc178..0000000
--- a/app/scenes/RootScreen/saga.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import { takeLatest } from 'redux-saga/effects';
-import { navigateAndReset } from '@app/services/navigationService';
-import { rootScreenTypes } from './reducer';
-
-/**
- * The startup saga is the place to define behavior to execute when the application starts.
- */
-export function* startup() {
- setTimeout(() => navigateAndReset('MainScreen'), 1000);
-}
-/**
- * Generator function for the startup saga.
- * Watches for the latest occurrence of the specified action type and triggers the startup process.
- *
- * @generator
- * @function startUpSaga
- * @yields {Effect} Effect object representing the takeLatest behavior
- */
-export default function* startUpSaga() {
- yield takeLatest(rootScreenTypes.STARTUP, startup);
-}
diff --git a/app/scenes/RootScreen/tests/__snapshots__/index.test.js.snap b/app/scenes/RootScreen/tests/__snapshots__/index.test.js.snap
index b50f01e..6b935d3 100644
--- a/app/scenes/RootScreen/tests/__snapshots__/index.test.js.snap
+++ b/app/scenes/RootScreen/tests/__snapshots__/index.test.js.snap
@@ -1,268 +1,3 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[` container should render and match the snapshot 1`] = `
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-`;
+exports[` should render and match the snapshot 1`] = `undefined`;
diff --git a/app/scenes/RootScreen/tests/index.test.js b/app/scenes/RootScreen/tests/index.test.js
index b2df0e6..6a7fd81 100644
--- a/app/scenes/RootScreen/tests/index.test.js
+++ b/app/scenes/RootScreen/tests/index.test.js
@@ -1,34 +1,73 @@
-/**
- *
- * Tests for HomeScreen
- *
- */
-
import React from 'react';
-import { renderWithI18next } from 'app/utils/testUtils';
+import { useRecoilValue } from 'recoil';
+import { render, waitFor } from '@testing-library/react-native';
+import { navigateAndReset } from '@app/services/navigationService';
import { RootScreenTest } from '../index';
-export const setupJest = () => ({ submitSpy: jest.fn() });
-describe(' container', () => {
+
+jest.mock('recoil');
+jest.mock('@app/services/navigationService');
+
+describe('', () => {
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
it('should render and match the snapshot', () => {
- const { submitSpy } = setupJest();
- const baseElement = renderWithI18next(
-
- );
+ useRecoilValue.mockReturnValue(true); // Mock app state as truthy
+ const { baseElement } = render();
expect(baseElement).toMatchSnapshot();
});
- it('should call the startup prop on mount', () => {
- const { submitSpy } = setupJest();
- renderWithI18next();
- expect(submitSpy).toHaveBeenCalled();
+ it('should render the Container and AppNavigator components', () => {
+ useRecoilValue.mockReturnValue(true); // Mock app state as truthy
+ const { getByTestId } = render();
+
+ const rootScreenContainer = getByTestId('root-screen');
+ expect(rootScreenContainer).toBeTruthy();
+
+ // Check that AppNavigator is rendered within Container
+ expect(rootScreenContainer.children.length).toBeGreaterThan(0);
});
- it('should not render rootSceen Container', () => {
- const { submitSpy } = setupJest();
- const { getByTestId } = renderWithI18next(
-
+ it('should call navigateAndReset when appState is falsy', async () => {
+ useRecoilValue.mockReturnValue(null); // Mock app state as falsy
+ render();
+
+ await waitFor(
+ () => {
+ expect(navigateAndReset).toHaveBeenCalledWith('MainScreen');
+ },
+ { timeout: 1500 }
);
- expect(getByTestId('root-screen').type).toBe('View');
- expect(submitSpy).toHaveBeenCalled();
+ });
+
+ it('should not call navigateAndReset when appState is truthy', async () => {
+ useRecoilValue.mockReturnValue(true); // Mock app state as truthy
+ render();
+
+ await waitFor(() => {
+ expect(navigateAndReset).not.toHaveBeenCalled();
+ });
+ });
+
+ it('should handle changes to appState', async () => {
+ const { rerender } = render();
+
+ // First render with a falsy app state
+ useRecoilValue.mockReturnValueOnce(null);
+ rerender();
+ await waitFor(
+ () => {
+ expect(navigateAndReset).toHaveBeenCalledWith('MainScreen');
+ },
+ { timeout: 1500 }
+ );
+
+ // Re-render with a truthy app state
+ useRecoilValue.mockReturnValueOnce(true);
+ rerender();
+ await waitFor(() => {
+ expect(navigateAndReset).toHaveBeenCalledTimes(1); // Should not be called again
+ });
});
});
diff --git a/app/scenes/RootScreen/tests/reducer.test.js b/app/scenes/RootScreen/tests/reducer.test.js
deleted file mode 100644
index 90666cb..0000000
--- a/app/scenes/RootScreen/tests/reducer.test.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import {
- rootContainerReducer,
- initialState,
- rootScreenTypes
-} from '../reducer';
-
-/* eslint-disable default-case, no-param-reassign */
-describe('Tests for RootScreen reducers', () => {
- const setupTests = () => ({ state: initialState });
-
- it('should return the initial state', () => {
- const { state } = setupTests();
- expect(rootContainerReducer(undefined, {})).toEqual(state);
- });
-
- it('should return the initial state when an action of type STARTUP is dispatched', () => {
- const { state } = setupTests();
- // since startup is called to initiate screen navigation the store should remain intact
- expect(
- rootContainerReducer(state, {
- type: rootScreenTypes.STARTUP
- })
- ).toEqual(state);
- });
-
- it('should return the initial state when an action of type NONEXIST is dispatched', () => {
- const { state } = setupTests();
- // since startup is called to initiate screen navigation the store should remain intact
- expect(
- rootContainerReducer(state, {
- type: rootScreenTypes.NONEXIST
- })
- ).toEqual(state);
- });
-});
diff --git a/app/scenes/RootScreen/tests/saga.test.js b/app/scenes/RootScreen/tests/saga.test.js
deleted file mode 100644
index 8a682ff..0000000
--- a/app/scenes/RootScreen/tests/saga.test.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * Test sagas
- */
-
-/* eslint-disable redux-saga/yield-effects */
-
-import { takeLatest } from 'redux-saga/effects';
-import { navigateAndReset } from '@app/services/navigationService';
-import { timeout } from 'app/utils/testUtils';
-import rootScreenSaga, { startup } from '../saga';
-import { rootScreenTypes } from '../reducer';
-
-jest.mock('@app/services/navigationService', () => ({
- ...jest.requireActual('@app/services/navigationService'),
- navigateAndReset: jest.fn()
-}));
-describe('Tests for RootScreen sagas', () => {
- afterEach(() => {
- jest.clearAllMocks();
- });
-
- it('should start task to watch for STARTUP action', () => {
- const generator = rootScreenSaga();
- expect(generator.next().value).toEqual(
- takeLatest(rootScreenTypes.STARTUP, startup)
- );
- });
-
- it('should ensure that the navigation service is called after waiting for 1000ms', async () => {
- const method = startup();
- method.next();
- await timeout(1000);
- expect(navigateAndReset).toHaveBeenCalled();
- expect(navigateAndReset).toHaveBeenCalledWith('MainScreen');
- });
-
- it('should ensure that the navigation service is called after waiting for 1000ms', async () => {
- const method = startup();
- method.next();
- await timeout(650);
- expect(navigateAndReset).not.toHaveBeenCalled();
- await timeout(200);
- expect(navigateAndReset).not.toHaveBeenCalled();
- });
-});
diff --git a/app/scenes/SplashScreen/tests/__snapshots__/index.test.js.snap b/app/scenes/SplashScreen/tests/__snapshots__/index.test.js.snap
index 1bca2e5..616908f 100644
--- a/app/scenes/SplashScreen/tests/__snapshots__/index.test.js.snap
+++ b/app/scenes/SplashScreen/tests/__snapshots__/index.test.js.snap
@@ -24,16 +24,18 @@ exports[` should render and match the snapshot 1`] = `
resizeMode="contain"
source={
{
- "testUri": "../../../app/assets/images/wednesday-logo.png",
+ "testUri": "../../../app/assets/images/wednesday-logo-new.png",
}
}
style={
- {
- "alignItems": "center",
- "display": "flex",
- "justifyContent": "center",
- "width": 200,
- }
+ [
+ {
+ "alignItems": "center",
+ "display": "flex",
+ "justifyContent": "center",
+ "width": 200,
+ },
+ ]
}
/>
diff --git a/app/services/tests/userService.test.js b/app/services/tests/userService.test.js
index fc453f5..2463abc 100644
--- a/app/services/tests/userService.test.js
+++ b/app/services/tests/userService.test.js
@@ -1,10 +1,26 @@
import MockAdapter from 'axios-mock-adapter';
-import { getApiClient } from 'app/utils/apiUtils';
+import { generateApiClient } from 'app/utils/apiUtils';
import { getUser } from '../userService';
+jest.mock('app/utils/apiUtils', () => ({
+ generateApiClient: jest.fn(() => ({
+ get: () =>
+ Promise.resolve({
+ data: [
+ {
+ quote: 'Thank you. Come again.',
+ character: 'Mohammed Ali Chherawalla',
+ image:
+ 'https://cdn.glitch.com/3c3ffadc-3406-4440-bb95-d40ec8fcde72%2FApuNahasapeemapetilon.png?1497567511629',
+ characterDirection: 'Left'
+ }
+ ]
+ })
+ }))
+}));
+
describe('UserService tests', () => {
it('should make the api call to "/quotes?count=1"', async () => {
- const mock = new MockAdapter(getApiClient().axiosInstance);
const data = [
{
quote: 'Thank you. Come again.',
@@ -14,7 +30,6 @@ describe('UserService tests', () => {
characterDirection: 'Left'
}
];
- mock.onGet('/quotes?count=1').reply(200, data);
const res = await getUser();
expect(res.data).toEqual(data);
});
diff --git a/app/services/userService.js b/app/services/userService.js
index 850b8be..92ea608 100644
--- a/app/services/userService.js
+++ b/app/services/userService.js
@@ -1,4 +1,23 @@
+import { set } from 'lodash';
import { generateApiClient } from '@app/utils/apiUtils';
-const configApi = generateApiClient('configApi');
-export const getUser = () => configApi.get('quotes?count=1');
+const createApiClient = async () => generateApiClient('configApi');
+const getApiClient = async () => {
+ try {
+ if (!client.apiClient) {
+ set(client, 'apiClient', createApiClient());
+ }
+ return client.apiClient;
+ } catch (error) {
+ throw new Error(error);
+ }
+};
+const client = { apiClient: null };
+export const getUser = async () => {
+ try {
+ const apiClient = await getApiClient();
+ return apiClient.get('quotes?count=1');
+ } catch (error) {
+ throw new Error(error);
+ }
+};
diff --git a/app/themes/images.js b/app/themes/images.js
index dd5936a..d5e74d3 100644
--- a/app/themes/images.js
+++ b/app/themes/images.js
@@ -2,7 +2,7 @@
* Images should be stored in the `app/assets/images` directory and referenced using variables defined here.
*/
import logo from '@app/assets/images/logo.png';
-import wednesdayLogo from '@app/assets/images/wednesday-logo.png';
+import wednesdayLogo from '@app/assets/images/wednesday-logo-new.png';
export default {
logo,
diff --git a/app/translations/en.json b/app/translations/en.json
index 1141c18..0b511b1 100644
--- a/app/translations/en.json
+++ b/app/translations/en.json
@@ -4,5 +4,6 @@
"dont_live_in_europe": "I don't live in europe",
"because": "because",
"wednesday_lover": "{{username}} loves Wednesday",
- "get_started": "To get started, edit App.js"
+ "get_started": "To get started, edit App.js",
+ "refresh": "Refresh"
}
diff --git a/app/utils/apiUtils.js b/app/utils/apiUtils.js
index 724fdcc..32946e8 100644
--- a/app/utils/apiUtils.js
+++ b/app/utils/apiUtils.js
@@ -1,54 +1,80 @@
/* eslint-disable sonarjs/no-small-switch */
/* eslint-disable fp/no-mutating-assign */
-import { create } from 'apisauce';
+import axios from 'axios';
import mapKeysDeep from 'map-keys-deep';
import camelCase from 'lodash/camelCase';
import snakeCase from 'lodash/snakeCase';
-import { Config } from '@app/config/index';
import get from 'lodash/get';
+import { set } from 'lodash';
+import { Config } from '@app/config/index';
+
export const apiClients = {
configApi: null,
default: null
};
-export const getApiClient = (type = 'configApi') => apiClients[type];
+
+export const getApiClient = (type = 'configApi') =>
+ get(apiClients, type, apiClients.default);
+
export const generateApiClient = (type = 'configApi') => {
switch (type) {
case 'configApi':
- Object.assign(apiClients, {
- [type]: createApiClientWithTransForm(Config.API_URL)
- });
+ set(apiClients, type, createApiClientWithTransForm(Config.API_URL));
+
return get(apiClients, type);
default:
- Object.assign(apiClients, {
- default: createApiClientWithTransForm(Config.API_URL)
- });
+ set(apiClients, 'default', createApiClientWithTransForm(Config.API_URL));
return apiClients.default;
}
};
export const createApiClientWithTransForm = baseURL => {
- const api = create({
- baseURL,
- headers: { 'Content-Type': 'application/json' }
- });
- api.addResponseTransform(response => {
- const { ok, data } = response;
- if (ok && data) {
- Object.assign(response, {
- data: mapKeysDeep(data, keys => camelCase(keys))
- });
- }
- return response;
- });
-
- api.addRequestTransform(request => {
- const { data } = request;
- if (data) {
- Object.assign(request, {
- data: mapKeysDeep(data, keys => snakeCase(keys))
- });
- }
- return request;
- });
- return api;
+ try {
+ const api = axios.create({
+ baseURL,
+ headers: { 'Content-Type': 'application/json' }
+ });
+
+ // Response interceptor to transform keys to camelCase and structure response
+ api.interceptors.response.use(
+ response => {
+ const { data } = response;
+ if (data) {
+ const keysData = mapKeysDeep(data, keys => camelCase(keys));
+ return {
+ ok: true,
+ data: keysData,
+ error: null,
+ originalResponse: response
+ };
+ }
+ return {
+ ok: true,
+ data: response.data,
+ error: null,
+ originalResponse: response
+ };
+ },
+ error => ({
+ ok: false,
+ data: null,
+ error: error || 'Something went wrong',
+ originalResponse: error.response
+ })
+ );
+
+ // Request interceptor to transform keys to snake_case
+ api.interceptors.request.use(request => {
+ const { data } = request;
+ if (data) {
+ const keysData = mapKeysDeep(data, keys => snakeCase(keys));
+ return { ...request, data: keysData };
+ }
+ return request;
+ });
+
+ return api;
+ } catch (err) {
+ throw new Error(err);
+ }
};
diff --git a/app/utils/common.js b/app/utils/common.js
index 3a13210..e5a6e4f 100644
--- a/app/utils/common.js
+++ b/app/utils/common.js
@@ -1,2 +1,8 @@
export const conditionalOperatorFunction = (condition, val1, val2) =>
condition ? val1 : val2;
+
+export const errorHandlerFunction = (response, error) => {
+ if (!response.ok) {
+ throw new Error(error);
+ }
+};
diff --git a/app/utils/constants.js b/app/utils/constants.js
new file mode 100644
index 0000000..2f79971
--- /dev/null
+++ b/app/utils/constants.js
@@ -0,0 +1,5 @@
+export const LoadingStates = {
+ LOADING: 'loading',
+ HAS_ERROR: 'hasError',
+ HAS_VALUE: 'hasValue'
+};
diff --git a/app/utils/createStore.js b/app/utils/createStore.js
deleted file mode 100644
index de1d58b..0000000
--- a/app/utils/createStore.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import { applyMiddleware, compose, createStore } from 'redux';
-import createSagaMiddleware from 'redux-saga';
-import AsyncStorage from '@react-native-async-storage/async-storage';
-import { persistReducer, persistStore } from 'redux-persist';
-import immutableTransform from 'redux-persist-transform-immutable';
-/**
- * This import defaults to localStorage for web and AsyncStorage for react-native.
- *
- * Keep in mind this storage *is not secure*. Do not use it to store sensitive information
- * (like API tokens, private and sensitive data, etc.).
- *
- * If you need to store sensitive information, use redux-persist-sensitive-storage.
- * @see https://github.com/CodingZeal/redux-persist-sensitive-storage
- */
-
-const persistConfig = {
- key: 'root',
- transforms: [immutableTransform()],
- storage: AsyncStorage,
- /**
- * Blacklist state that we do not need/want to persist
- */
- blacklist: [
- // 'auth',
- ]
-};
-
-export default (rootReducer, rootSaga) => {
- // Connect the sagas to the redux store
- const sagaMiddleware = createSagaMiddleware();
- const middleware = [sagaMiddleware];
- const enhancers = [applyMiddleware(...middleware)];
-
- // Redux persist
- const persistedReducer = persistReducer(persistConfig, rootReducer);
-
- const store = createStore(persistedReducer, compose(...enhancers));
- const persistor = persistStore(store);
-
- // Kick off the root saga
- sagaMiddleware.run(rootSaga);
-
- return { store, persistor };
-};
diff --git a/app/utils/errors.js b/app/utils/errors.js
new file mode 100644
index 0000000..edc0b4c
--- /dev/null
+++ b/app/utils/errors.js
@@ -0,0 +1,3 @@
+export const Errors = {
+ USER_FETCH_ERROR: "'There was an error while fetching user information.'"
+};
diff --git a/app/utils/testUtils.js b/app/utils/testUtils.js
index 671b27e..c6bed54 100644
--- a/app/utils/testUtils.js
+++ b/app/utils/testUtils.js
@@ -1,10 +1,8 @@
import React from 'react';
-import { render } from '@testing-library/react-native';
-import { Provider } from 'react-redux';
-import createStore from 'app/rootReducer';
+import { RecoilRoot } from 'recoil';
import { I18nextProvider } from 'react-i18next';
-import i18n from '@app/utils/i18nextTestUtils'; // assuming i18n is configured in this file
-import ConnectedLanguageProvider from '@atoms/LanguageProvider';
+import { render } from '@testing-library/react-native';
+import i18n from '@app/utils/i18nextTestUtils';
export const apiResponseGenerator = (ok, data) => ({
ok,
@@ -12,15 +10,16 @@ export const apiResponseGenerator = (ok, data) => ({
});
export const renderWithI18next = (children, renderFunction = render) =>
- renderFunction({children});
-
-export const renderProvider = children => {
- const { store } = createStore();
- return render(
-
+ renderFunction(
+
{children}
-
+
);
-};
+export const renderProvider = children =>
+ render(
+
+ {children}
+
+ );
export const timeout = ms => new Promise(resolve => setTimeout(resolve, ms));
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 0de6069..3129955 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -1092,19 +1092,19 @@ PODS:
- glog
- RCT-Folly (= 2022.05.16.00)
- React-Core
- - RNReanimated (3.15.0):
+ - RNReanimated (3.15.1):
- glog
- RCT-Folly (= 2022.05.16.00)
- React-Core
- ReactCommon/turbomodule/core
- - RNReanimated/reanimated (= 3.15.0)
- - RNReanimated/worklets (= 3.15.0)
- - RNReanimated/reanimated (3.15.0):
+ - RNReanimated/reanimated (= 3.15.1)
+ - RNReanimated/worklets (= 3.15.1)
+ - RNReanimated/reanimated (3.15.1):
- glog
- RCT-Folly (= 2022.05.16.00)
- React-Core
- ReactCommon/turbomodule/core
- - RNReanimated/worklets (3.15.0):
+ - RNReanimated/worklets (3.15.1):
- glog
- RCT-Folly (= 2022.05.16.00)
- React-Core
@@ -1113,6 +1113,14 @@ PODS:
- glog
- RCT-Folly (= 2022.05.16.00)
- React-Core
+ - RNSentry (5.31.1):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2022.05.16.00)
+ - React-Core
+ - React-hermes
+ - Sentry/HybridSDK (= 8.36.0)
+ - Sentry/HybridSDK (8.36.0)
- SocketRocket (0.6.1)
- Yoga (1.14.0)
@@ -1183,12 +1191,14 @@ DEPENDENCIES:
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
- RNReanimated (from `../node_modules/react-native-reanimated`)
- RNScreens (from `../node_modules/react-native-screens`)
+ - "RNSentry (from `../node_modules/@sentry/react-native`)"
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
SPEC REPOS:
trunk:
- fmt
- libevent
+ - Sentry
- SocketRocket
EXTERNAL SOURCES:
@@ -1319,6 +1329,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-reanimated"
RNScreens:
:path: "../node_modules/react-native-screens"
+ RNSentry:
+ :path: "../node_modules/@sentry/react-native"
Yoga:
:path: "../node_modules/react-native/ReactCommon/yoga"
@@ -1386,10 +1398,12 @@ SPEC CHECKSUMS:
RNCAsyncStorage: 826b603ae9c0f88b5ac4e956801f755109fa4d5c
RNCMaskedView: 0e1bc4bfa8365eba5fbbb71e07fbdc0555249489
RNGestureHandler: 96439cf6543defdde87459e48cd1a3f0e45a008e
- RNReanimated: ba95f6d26ca4b8a8f7f2b15f62a3513750762f6b
+ RNReanimated: fe9610fb0eebdd1fe8f38421bebcaa9afa0fe6b2
RNScreens: b6b64d956af3715adbfe84808694ae82d3fec74f
+ RNSentry: e244f62ec77e716d295c60c56939300b01a7c56f
+ Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57
SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17
- Yoga: d17d2cc8105eed528474683b42e2ea310e1daf61
+ Yoga: 805bf71192903b20fc14babe48080582fee65a80
PODFILE CHECKSUM: 71a7eba1109c7de188217c03cf1824ab1d487aec
diff --git a/ios/reactnativetemplatews.xcodeproj/project.pbxproj b/ios/reactnativetemplatews.xcodeproj/project.pbxproj
index 352679e..b1cee91 100644
--- a/ios/reactnativetemplatews.xcodeproj/project.pbxproj
+++ b/ios/reactnativetemplatews.xcodeproj/project.pbxproj
@@ -144,14 +144,14 @@
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "reactnativetemplatews" */;
buildPhases = (
08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */,
- D7DA99F475224976C3F63D6B /* [Expo] Configure project */,
+ C8AAE751E72886F594637352 /* [Expo] Configure project */,
13B07F871A680F5B00A75B9A /* Sources */,
13B07F8C1A680F5B00A75B9A /* Frameworks */,
13B07F8E1A680F5B00A75B9A /* Resources */,
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */,
- 599D80DE15B63C654B8D3C08 /* [CP] Embed Pods Frameworks */,
598EDDAFCB7E43A189BDFC8C /* Upload Debug Symbols to Sentry */,
+ F0C186D25537B1B0B872041F /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -244,6 +244,20 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
+ 598EDDAFCB7E43A189BDFC8C /* Upload Debug Symbols to Sentry */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Upload Debug Symbols to Sentry";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh ../node_modules/@sentry/react-native/scripts/sentry-xcode-debug-files.sh";
+ };
800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@@ -256,6 +270,7 @@
"${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/RNCAsyncStorage/RNCAsyncStorage_resources.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/Sentry/Sentry.bundle",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
@@ -264,25 +279,49 @@
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNCAsyncStorage_resources.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Sentry.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-reactnativetemplatews/Pods-reactnativetemplatews-resources.sh\"\n";
showEnvVarsInLog = 0;
};
- 598EDDAFCB7E43A189BDFC8C /* Upload Debug Symbols to Sentry */ = {
+ C8AAE751E72886F594637352 /* [Expo] Configure project */ = {
isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ );
+ name = "[Expo] Configure project";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
runOnlyForDeploymentPostprocessing = 0;
- name = "Upload Debug Symbols to Sentry";
+ shellPath = /bin/sh;
+ shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-reactnativetemplatews/expo-configure-project.sh\"\n";
+ };
+ F0C186D25537B1B0B872041F /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
inputPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-reactnativetemplatews/Pods-reactnativetemplatews-frameworks.sh",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
);
+ name = "[CP] Embed Pods Frameworks";
outputPaths = (
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
);
+ runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "/bin/sh ../node_modules/@sentry/react-native/scripts/sentry-xcode-debug-files.sh";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-reactnativetemplatews/Pods-reactnativetemplatews-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
diff --git a/jest.config.js b/jestconfig.js
similarity index 100%
rename from jest.config.js
rename to jestconfig.js
diff --git a/package.json b/package.json
index d1b8b94..f91424b 100644
--- a/package.json
+++ b/package.json
@@ -5,11 +5,11 @@
"ios": "expo run:ios",
"web": "expo start --web",
"eject": "expo eject",
- "test": "jest --detectOpenHandles --coverage --config=jest.config.js",
- "test:staged": "jest --findRelatedTests --config=jest.config.js",
+ "test": "jest --detectOpenHandles --coverage",
+ "test:staged": "jest --findRelatedTests ",
"lint": "npm run lint:js",
- "lint:eslint": "eslint --ignore-path .gitignore",
- "lint:eslint:fix": "eslint --ignore-path .gitignore --fix",
+ "lint:eslint": "eslint --ignore-path .eslintignore",
+ "lint:eslint:fix": "eslint --ignore-path .eslintignore --fix",
"lint:js": "npm run lint:eslint -- . ",
"lint:staged": "lint-staged",
"rename": "react-native-rename",
@@ -46,7 +46,7 @@
"@react-navigation/native": "^6.1.17",
"@react-navigation/stack": "^6.3.29",
"@sentry/react-native": "^5.30.0",
- "apisauce": "^3.0.1",
+ "axios": "^0.27.2",
"axios-mock-adapter": "^1.17.0",
"babel-plugin-module-resolver": "^5.0.0",
"babel-plugin-react-intl": "8.2.25",
@@ -57,7 +57,7 @@
"eslint-plugin-security": "^3.0.0",
"eslint-plugin-sonarjs": "^0.25.1",
"expo": "^50.0.17",
- "expo-crypto": "^12.8.1",
+ "expo-crypto": "^13.0.2",
"expo-image-picker": "~14.7.1",
"expo-splash-screen": "~0.26.4",
"expo-status-bar": "~1.11.1",
@@ -83,13 +83,8 @@
"react-redux": "^9.1.1",
"react-router-dom": "^6.22.3",
"recoil": "^0.7.7",
- "redux": "^5.0.1",
- "redux-persist": "^6.0.0",
- "redux-persist-transform-immutable": "^5.0.0",
- "redux-saga": "^1.0.2",
- "reduxsauce": "^1.0.1",
"reselect": "^5.1.0",
- "styled-components": "^6.1.8"
+ "styled-components": "~5.3.0"
},
"resolutions": {
"styled-components": "^5"
diff --git a/setupTests.js b/setupTests.js
index 8c86245..400043a 100644
--- a/setupTests.js
+++ b/setupTests.js
@@ -2,13 +2,6 @@ import mockAsyncStorage from '@react-native-async-storage/async-storage/jest/asy
import { LogBox } from 'react-native';
jest.mock('@react-native-async-storage/async-storage', () => mockAsyncStorage);
-jest.mock('redux-persist', () => {
- const real = jest.requireActual('redux-persist');
- return {
- ...real,
- persistReducer: jest.fn().mockImplementation((config, reducers) => reducers)
- };
-});
jest.mock('i18next', () => {
const originalI18next = jest.requireActual('i18next');
diff --git a/web-build/register-service-worker.js b/web-build/register-service-worker.js
index 94ece4f..ea75e33 100644
--- a/web-build/register-service-worker.js
+++ b/web-build/register-service-worker.js
@@ -1,13 +1,13 @@
/* eslint-env browser */
if ('serviceWorker' in navigator) {
- window.addEventListener('load', function () {
+ window.addEventListener('load', function() {
navigator.serviceWorker
.register('/expo-service-worker.js', { scope: '/' })
- .then(function (info) {
- // console.info('Registered service-worker', info);
+ .then(function(info) {
+ console.info('Registered service-worker', info);
})
- .catch(function (error) {
+ .catch(function(error) {
console.info('Failed to register service-worker', error);
});
});
diff --git a/yarn.lock b/yarn.lock
index 23c1661..aacf722 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -81,12 +81,12 @@
eslint-visitor-keys "^2.1.0"
semver "^6.3.1"
-"@babel/generator@^7.20.0", "@babel/generator@^7.20.5", "@babel/generator@^7.25.0", "@babel/generator@^7.25.4", "@babel/generator@^7.7.2":
- version "7.25.5"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.5.tgz#b31cf05b3fe8c32d206b6dad03bb0aacbde73450"
- integrity sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==
+"@babel/generator@^7.20.0", "@babel/generator@^7.20.5", "@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c"
+ integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==
dependencies:
- "@babel/types" "^7.25.4"
+ "@babel/types" "^7.25.6"
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.25"
jsesc "^2.5.1"
@@ -262,12 +262,12 @@
"@babel/types" "^7.25.0"
"@babel/helpers@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a"
- integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60"
+ integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==
dependencies:
"@babel/template" "^7.25.0"
- "@babel/types" "^7.25.0"
+ "@babel/types" "^7.25.6"
"@babel/highlight@^7.10.4", "@babel/highlight@^7.24.7":
version "7.24.7"
@@ -279,12 +279,12 @@
js-tokens "^4.0.0"
picocolors "^1.0.0"
-"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.4":
- version "7.25.4"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.4.tgz#af4f2df7d02440286b7de57b1c21acfb2a6f257a"
- integrity sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==
+"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f"
+ integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==
dependencies:
- "@babel/types" "^7.25.4"
+ "@babel/types" "^7.25.6"
"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4", "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3":
version "7.25.3"
@@ -473,18 +473,18 @@
"@babel/helper-plugin-utils" "^7.24.7"
"@babel/plugin-syntax-import-assertions@^7.24.1", "@babel/plugin-syntax-import-assertions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778"
- integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz#bb918905c58711b86f9710d74a3744b6c56573b5"
+ integrity sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.8"
"@babel/plugin-syntax-import-attributes@^7.24.1", "@babel/plugin-syntax-import-attributes@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca"
- integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde"
+ integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.8"
"@babel/plugin-syntax-import-meta@^7.10.4":
version "7.10.4"
@@ -1337,10 +1337,10 @@
resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.8", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4":
- version "7.25.4"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.4.tgz#6ef37d678428306e7d75f054d5b1bdb8cf8aa8ee"
- integrity sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.8", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2"
+ integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==
dependencies:
regenerator-runtime "^0.14.0"
@@ -1354,22 +1354,22 @@
"@babel/types" "^7.25.0"
"@babel/traverse@^7.0.0", "@babel/traverse@^7.20.0", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3", "@babel/traverse@^7.25.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.4":
- version "7.25.4"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.4.tgz#648678046990f2957407e3086e97044f13c3e18e"
- integrity sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41"
+ integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==
dependencies:
"@babel/code-frame" "^7.24.7"
- "@babel/generator" "^7.25.4"
- "@babel/parser" "^7.25.4"
+ "@babel/generator" "^7.25.6"
+ "@babel/parser" "^7.25.6"
"@babel/template" "^7.25.0"
- "@babel/types" "^7.25.4"
+ "@babel/types" "^7.25.6"
debug "^4.3.1"
globals "^11.1.0"
-"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.4", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.9.5":
- version "7.25.4"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.4.tgz#6bcb46c72fdf1012a209d016c07f769e10adcb5f"
- integrity sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==
+"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.9.5":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6"
+ integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==
dependencies:
"@babel/helper-string-parser" "^7.24.8"
"@babel/helper-validator-identifier" "^7.24.7"
@@ -1387,13 +1387,6 @@
dependencies:
"@types/hammerjs" "^2.0.36"
-"@emotion/is-prop-valid@1.2.2":
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz#d4175076679c6a26faa92b03bb786f9e52612337"
- integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==
- dependencies:
- "@emotion/memoize" "^0.8.1"
-
"@emotion/is-prop-valid@^1.1.0":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz#bd84ba972195e8a2d42462387581560ef780e4e2"
@@ -1401,11 +1394,6 @@
dependencies:
"@emotion/memoize" "^0.9.0"
-"@emotion/memoize@^0.8.1":
- version "0.8.1"
- resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
- integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
-
"@emotion/memoize@^0.9.0":
version "0.9.0"
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102"
@@ -1416,11 +1404,6 @@
resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04"
integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==
-"@emotion/unitless@0.8.1":
- version "0.8.1"
- resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3"
- integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
-
"@emotion/unitless@^0.7.4":
version "0.7.5"
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
@@ -2703,54 +2686,16 @@
color "^4.2.3"
warn-once "^0.1.0"
-"@redux-saga/core@^1.3.0":
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.3.0.tgz#2ce08b73d407fc6ea9e7f7d83d2e97d981a3a8b8"
- integrity sha512-L+i+qIGuyWn7CIg7k1MteHGfttKPmxwZR5E7OsGikCL2LzYA0RERlaUY00Y3P3ZV2EYgrsYlBrGs6cJP5OKKqA==
- dependencies:
- "@babel/runtime" "^7.6.3"
- "@redux-saga/deferred" "^1.2.1"
- "@redux-saga/delay-p" "^1.2.1"
- "@redux-saga/is" "^1.1.3"
- "@redux-saga/symbols" "^1.1.3"
- "@redux-saga/types" "^1.2.1"
- typescript-tuple "^2.2.1"
-
-"@redux-saga/deferred@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@redux-saga/deferred/-/deferred-1.2.1.tgz#aca373a08ccafd6f3481037f2f7ee97f2c87c3ec"
- integrity sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g==
-
-"@redux-saga/delay-p@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@redux-saga/delay-p/-/delay-p-1.2.1.tgz#e72ac4731c5080a21f75b61bedc31cb639d9e446"
- integrity sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w==
- dependencies:
- "@redux-saga/symbols" "^1.1.3"
-
-"@redux-saga/is@^1.1.3":
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/@redux-saga/is/-/is-1.1.3.tgz#b333f31967e87e32b4e6b02c75b78d609dd4ad73"
- integrity sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q==
- dependencies:
- "@redux-saga/symbols" "^1.1.3"
- "@redux-saga/types" "^1.2.1"
-
-"@redux-saga/symbols@^1.1.3":
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/@redux-saga/symbols/-/symbols-1.1.3.tgz#b731d56201719e96dc887dc3ae9016e761654367"
- integrity sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg==
-
-"@redux-saga/types@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.2.1.tgz#9403f51c17cae37edf870c6bc0c81c1ece5ccef8"
- integrity sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==
-
"@remix-run/router@1.19.1":
version "1.19.1"
resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.19.1.tgz#984771bfd1de2715f42394c87fb716c1349e014f"
integrity sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==
+"@rtsao/scc@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8"
+ integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==
+
"@samverschueren/stream-to-observable@^0.3.0":
version "0.3.1"
resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz#a21117b19ee9be70c379ec1877537ef2e1c63301"
@@ -2813,45 +2758,45 @@
"@sentry/types" "7.119.0"
"@sentry/utils" "7.119.0"
-"@sentry/cli-darwin@2.31.2":
- version "2.31.2"
- resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.31.2.tgz#faeb87d09d8b21b8b8dd2e2aa848b538f01ddd26"
- integrity sha512-BHA/JJXj1dlnoZQdK4efRCtHRnbBfzbIZUKAze7oRR1RfNqERI84BVUQeKateD3jWSJXQfEuclIShc61KOpbKw==
-
-"@sentry/cli-linux-arm64@2.31.2":
- version "2.31.2"
- resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.31.2.tgz#669c9c3f7f9130d26f5db732f793378863d58869"
- integrity sha512-FLVKkJ/rWvPy/ka7OrUdRW63a/z8HYI1Gt8Pr6rWs50hb7YJja8lM8IO10tYmcFE/tODICsnHO9HTeUg2g2d1w==
-
-"@sentry/cli-linux-arm@2.31.2":
- version "2.31.2"
- resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.31.2.tgz#3e36ed7db09e922f00221281252e58dfd8755ea5"
- integrity sha512-W8k5mGYYZz/I/OxZH65YAK7dCkQAl+wbuoASGOQjUy5VDgqH0QJ8kGJufXvFPM+f3ZQGcKAnVsZ6tFqZXETBAw==
-
-"@sentry/cli-linux-i686@2.31.2":
- version "2.31.2"
- resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.31.2.tgz#02b7da274369b78a5676c20bb26cc37caed5244b"
- integrity sha512-A64QtzaPi3MYFpZ+Fwmi0mrSyXgeLJ0cWr4jdeTGrzNpeowSteKgd6tRKU+LVq0k5shKE7wdnHk+jXnoajulMA==
-
-"@sentry/cli-linux-x64@2.31.2":
- version "2.31.2"
- resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.31.2.tgz#54f74a9e5925db9ddafebc0efd4056c5377be5fd"
- integrity sha512-YL/r+15R4mOEiU3mzn7iFQOeFEUB6KxeKGTTrtpeOGynVUGIdq4nV5rHow5JDbIzOuBS3SpOmcIMluvo1NCh0g==
-
-"@sentry/cli-win32-i686@2.31.2":
- version "2.31.2"
- resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.31.2.tgz#5dab845a824be0927566171aa05f015e887fe82d"
- integrity sha512-Az/2bmW+TFI059RE0mSBIxTBcoShIclz7BDebmIoCkZ+retrwAzpmBnBCDAHow+Yi43utOow+3/4idGa2OxcLw==
-
-"@sentry/cli-win32-x64@2.31.2":
- version "2.31.2"
- resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.31.2.tgz#e12fec0a54f6d9cced5235fbc68ba8f94165634b"
- integrity sha512-XIzyRnJu539NhpFa+JYkotzVwv3NrZ/4GfHB/JWA2zReRvsk39jJG8D5HOmm0B9JA63QQT7Dt39RW8g3lkmb6w==
-
-"@sentry/cli@2.31.2":
- version "2.31.2"
- resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.31.2.tgz#39df8e52966aa8db4f9c51f4bc77abd62b6a630e"
- integrity sha512-2aKyUx6La2P+pplL8+2vO67qJ+c1C79KYWAyQBE0JIT5kvKK9JpwtdNoK1F0/2mRpwhhYPADCz3sVIRqmL8cQQ==
+"@sentry/cli-darwin@2.34.0":
+ version "2.34.0"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.34.0.tgz#a67a2246e763fb42c561562d3b1bd80ea38b518c"
+ integrity sha512-mzQj58xxRej8uATdXgwHq3KZC2HhfGIyl+jVTh7nXzizOS5OsYZtShpGRxwfeC3eNZ6NqY7h0FWxJD6cUFgauA==
+
+"@sentry/cli-linux-arm64@2.34.0":
+ version "2.34.0"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.34.0.tgz#bb35b2d7db3ec453a46ec9bb41cf273668cbab84"
+ integrity sha512-Sgl6b2BYI0uNB9WfJLkq4UZsOAXo35uwemtrXIJOz0zc9V4QIFwvmMYXAHpNVC3Z/dSU5PaWBJHEtUKouX5mOQ==
+
+"@sentry/cli-linux-arm@2.34.0":
+ version "2.34.0"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.34.0.tgz#1f778b259d5cc9d3bd56aa7ddf2a5913be86794c"
+ integrity sha512-FkNc22FOKU57h+s8ZkqTz/5Y+6GrCK2fSde2dntofOPJheBBuaYz7CDq0dEM9GuBCcvogQj8sf2hMb8+gdJrgA==
+
+"@sentry/cli-linux-i686@2.34.0":
+ version "2.34.0"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.34.0.tgz#0e00b03f0960c89e9ad97a757e40f39d5bf0d922"
+ integrity sha512-W7QNzOsbhzsRY5deRsHCqJH4C/yNxwlX6b1JqBO1s7Zb0t5KhM3fFgZJ4DmLZMOvngnJ2wSuyDQCwTNPyEWsAw==
+
+"@sentry/cli-linux-x64@2.34.0":
+ version "2.34.0"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.34.0.tgz#68476f5665293d44d5719746c581c88d5ea30c0b"
+ integrity sha512-EJCzldxeNsEIgf5ASj0E9/6J5SwUVgtfoiOYjhBxj2e41jEDlh6o5uMNE4H+J2GX3zPFrN3LgsZYevgPqA35Mw==
+
+"@sentry/cli-win32-i686@2.34.0":
+ version "2.34.0"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.34.0.tgz#2550aef7d10915f656680e5ce9bde17fb80d7a37"
+ integrity sha512-bITy/IiT/y1MZhvKSt5UrBEDUNcOtQV20BZDyPriPijBcJ/1U69lgH3IM4bxIaTiicFnMdxbOlQhRSdm8SKURg==
+
+"@sentry/cli-win32-x64@2.34.0":
+ version "2.34.0"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.34.0.tgz#8d37e659f39c85a7b6a2ddb89a3d6ea79aac745a"
+ integrity sha512-wpP/w7Fhsr7+cbCgE/OI8hSh3pqESRpcdNgtBQjMuKN2FSE1E+GHrk5GB+fKZG2OAV4IN4HxE/z3NioAJeThfQ==
+
+"@sentry/cli@2.34.0":
+ version "2.34.0"
+ resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.34.0.tgz#58367aa7f05bf42e2d7330a5f51b60eaf1735f16"
+ integrity sha512-hS3MRtEOT1Y27ufBesTTg4xJx6Msf77U609ncy2u7z8uoTZgO8HNsq9DwuxitX5MTrREEJ+frCMFsYvwqkQcJw==
dependencies:
https-proxy-agent "^5.0.0"
node-fetch "^2.6.7"
@@ -2859,13 +2804,13 @@
proxy-from-env "^1.1.0"
which "^2.0.2"
optionalDependencies:
- "@sentry/cli-darwin" "2.31.2"
- "@sentry/cli-linux-arm" "2.31.2"
- "@sentry/cli-linux-arm64" "2.31.2"
- "@sentry/cli-linux-i686" "2.31.2"
- "@sentry/cli-linux-x64" "2.31.2"
- "@sentry/cli-win32-i686" "2.31.2"
- "@sentry/cli-win32-x64" "2.31.2"
+ "@sentry/cli-darwin" "2.34.0"
+ "@sentry/cli-linux-arm" "2.34.0"
+ "@sentry/cli-linux-arm64" "2.34.0"
+ "@sentry/cli-linux-i686" "2.34.0"
+ "@sentry/cli-linux-x64" "2.34.0"
+ "@sentry/cli-win32-i686" "2.34.0"
+ "@sentry/cli-win32-x64" "2.34.0"
"@sentry/core@7.119.0":
version "7.119.0"
@@ -2895,13 +2840,13 @@
localforage "^1.8.1"
"@sentry/react-native@^5.30.0":
- version "5.30.0"
- resolved "https://registry.yarnpkg.com/@sentry/react-native/-/react-native-5.30.0.tgz#dbf3ef54254f59fc33127d7c1931e1aa4b8f978b"
- integrity sha512-6p2o+x5V9Hfe+6UPbMsMrEYPqv39HnkHbz7fZ6YGVqbcdmoXlztFJYtWUZgUCxAaq53L/LPbfmwJwxsdaPxGKg==
+ version "5.31.1"
+ resolved "https://registry.yarnpkg.com/@sentry/react-native/-/react-native-5.31.1.tgz#bd32aa2cf4305cf26742e73ae663f31d4917bcad"
+ integrity sha512-qk+/RXxcqrleXzyeQ6APlcYm2mI78Up7d711ShFsO+xndF9CowFk1hZvg5gWiGsVFAC0d4s3LGjqc4wMEJlOtw==
dependencies:
"@sentry/babel-plugin-component-annotate" "2.20.1"
"@sentry/browser" "7.119.0"
- "@sentry/cli" "2.31.2"
+ "@sentry/cli" "2.34.0"
"@sentry/core" "7.119.0"
"@sentry/hub" "7.119.0"
"@sentry/integrations" "7.119.0"
@@ -2979,9 +2924,9 @@
"@sinonjs/commons" "^3.0.0"
"@testing-library/react-native@^12.4.5":
- version "12.6.0"
- resolved "https://registry.yarnpkg.com/@testing-library/react-native/-/react-native-12.6.0.tgz#016b19070c85b0ca8a3081a405a9e22eaa1f534d"
- integrity sha512-godF8rqf4tuolaiGwy7jZXleYfObCwb3b8LW9592DinMrno6idFsLVCovuMrhl8+YbTA3b4yMBn4BbSKY4lDjQ==
+ version "12.6.1"
+ resolved "https://registry.yarnpkg.com/@testing-library/react-native/-/react-native-12.6.1.tgz#dbb6b00246a3cffbffa18bbbb618fab968c0de28"
+ integrity sha512-ykXKeQEkqJ/lk0dqGfEspODjV5skmUh/6vVtyGZQsneFrcqGZJrO4uGhmChICLbnEKkstxXkjXeyoB7z8k9InQ==
dependencies:
jest-matcher-utils "^29.7.0"
pretty-format "^29.7.0"
@@ -3169,9 +3114,9 @@
"@types/node" "*"
"@types/node@*":
- version "22.5.0"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.0.tgz#10f01fe9465166b4cab72e75f60d8b99d019f958"
- integrity sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==
+ version "22.5.3"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.3.tgz#91a374e42c6e7ccb5893a87f1775f36ce1671d65"
+ integrity sha512-njripolh85IA9SQGTAqbmnNZTdxv7X/4OYGPz8tgy5JDr8MP+uDBa921GpYEoDDnwm0Hmn5ZPeJgiiSTPoOzkQ==
dependencies:
undici-types "~6.19.2"
@@ -3238,16 +3183,6 @@
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8"
integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==
-"@types/stylis@4.2.5":
- version "4.2.5"
- resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.5.tgz#1daa6456f40959d06157698a653a9ab0a70281df"
- integrity sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==
-
-"@types/use-sync-external-store@^0.0.3":
- version "0.0.3"
- resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43"
- integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==
-
"@types/ws@^8.5.5":
version "8.5.12"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e"
@@ -3850,13 +3785,6 @@ anymatch@^3.0.3, anymatch@~3.1.2:
normalize-path "^3.0.0"
picomatch "^2.0.4"
-apisauce@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/apisauce/-/apisauce-3.0.1.tgz#ecee5276f6c3528f28cd635834fc6b8be0519c61"
- integrity sha512-4HEmETv0skPW+bFS4TzB5nQ5y2TdafbUpnAjp83MW8Re9lHwngao2hpnk7aIaxExJqSTxkpWl+ThgZbqjx2bpQ==
- dependencies:
- axios "^1.4.0"
-
appdirsjs@^1.2.4:
version "1.2.7"
resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.7.tgz#50b4b7948a26ba6090d4aede2ae2dc2b051be3b3"
@@ -3916,7 +3844,7 @@ array-flatten@1.1.1:
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
-array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8:
+array-includes@^3.1.6, array-includes@^3.1.8:
version "3.1.8"
resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d"
integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==
@@ -3962,7 +3890,7 @@ array.prototype.findlast@^1.2.5:
es-object-atoms "^1.0.0"
es-shim-unscopables "^1.0.2"
-array.prototype.findlastindex@^1.2.3:
+array.prototype.findlastindex@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d"
integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==
@@ -4073,7 +4001,7 @@ available-typed-arrays@^1.0.7:
dependencies:
possible-typed-array-names "^1.0.0"
-axe-core@^4.9.1:
+axe-core@^4.10.0:
version "4.10.0"
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.0.tgz#d9e56ab0147278272739a000880196cdfe113b59"
integrity sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==
@@ -4086,21 +4014,18 @@ axios-mock-adapter@^1.17.0:
fast-deep-equal "^3.1.3"
is-buffer "^2.0.5"
-axios@^1.4.0:
- version "1.7.5"
- resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.5.tgz#21eed340eb5daf47d29b6e002424b3e88c8c54b1"
- integrity sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==
+axios@^0.27.2:
+ version "0.27.2"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
+ integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
dependencies:
- follow-redirects "^1.15.6"
+ follow-redirects "^1.14.9"
form-data "^4.0.0"
- proxy-from-env "^1.1.0"
-axobject-query@~3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1"
- integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==
- dependencies:
- deep-equal "^2.0.5"
+axobject-query@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee"
+ integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==
babel-code-frame@^6.26.0:
version "6.26.0"
@@ -5077,9 +5002,9 @@ caniuse-api@^3.0.0:
lodash.uniq "^4.5.0"
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646:
- version "1.0.30001653"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz#b8af452f8f33b1c77f122780a4aecebea0caca56"
- integrity sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==
+ version "1.0.30001655"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz#0ce881f5a19a2dcfda2ecd927df4d5c1684b982f"
+ integrity sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==
chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
version "1.1.3"
@@ -5216,9 +5141,9 @@ ci-info@^3.2.0, ci-info@^3.3.0:
integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
cjs-module-lexer@^1.0.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c"
- integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.0.tgz#677de7ed7efff67cc40c9bf1897fea79d41b5215"
+ integrity sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g==
clean-css@^5.2.2:
version "5.3.3"
@@ -5717,7 +5642,7 @@ css-select@^5.1.0:
domutils "^3.0.1"
nth-check "^2.0.1"
-css-to-react-native@3.2.0, css-to-react-native@^3.0.0:
+css-to-react-native@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32"
integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==
@@ -5800,11 +5725,6 @@ csso@^4.2.0:
dependencies:
css-tree "^1.1.2"
-csstype@3.1.3:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
- integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
-
cycle@1.0.x:
version "1.0.3"
resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
@@ -6474,9 +6394,9 @@ es-to-primitive@^1.2.1:
is-symbol "^1.0.2"
escalade@^3.1.1, escalade@^3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
- integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
escape-html@~1.0.3:
version "1.0.3"
@@ -6580,10 +6500,10 @@ eslint-import-resolver-reactnative@^1.0.2:
eslint-import-resolver-node "^0.2.3"
find-root "^1.0.0"
-eslint-module-utils@^2.8.0:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34"
- integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==
+eslint-module-utils@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.9.0.tgz#95d4ac038a68cd3f63482659dffe0883900eb342"
+ integrity sha512-McVbYmwA3NEKwRQY5g4aWMdcZE5xZxV8i8l7CqJSrameuGSQJtSWaL/LxTEzSKKaCcOhlpDR8XEfYXWPrdo/ZQ==
dependencies:
debug "^3.2.7"
@@ -6672,25 +6592,26 @@ eslint-plugin-immutable@^1.0.0:
integrity sha512-ybjqMiL+hgrkgdHfkZjhgJS+Pkwb/iVmPNzbgsMbb2EZKNp3LOYfyce70w0P69LPy6UZgMq3j9kCTQk2hu6/fw==
eslint-plugin-import@^2.16.0, eslint-plugin-import@^2.25.2:
- version "2.29.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643"
- integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==
+ version "2.30.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz#21ceea0fc462657195989dd780e50c92fe95f449"
+ integrity sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==
dependencies:
- array-includes "^3.1.7"
- array.prototype.findlastindex "^1.2.3"
+ "@rtsao/scc" "^1.1.0"
+ array-includes "^3.1.8"
+ array.prototype.findlastindex "^1.2.5"
array.prototype.flat "^1.3.2"
array.prototype.flatmap "^1.3.2"
debug "^3.2.7"
doctrine "^2.1.0"
eslint-import-resolver-node "^0.3.9"
- eslint-module-utils "^2.8.0"
- hasown "^2.0.0"
- is-core-module "^2.13.1"
+ eslint-module-utils "^2.9.0"
+ hasown "^2.0.2"
+ is-core-module "^2.15.1"
is-glob "^4.0.3"
minimatch "^3.1.2"
- object.fromentries "^2.0.7"
- object.groupby "^1.0.1"
- object.values "^1.1.7"
+ object.fromentries "^2.0.8"
+ object.groupby "^1.0.3"
+ object.values "^1.2.0"
semver "^6.3.1"
tsconfig-paths "^3.15.0"
@@ -6709,16 +6630,16 @@ eslint-plugin-jest@^26.5.3:
"@typescript-eslint/utils" "^5.10.0"
eslint-plugin-jsx-a11y@^6.1.1, eslint-plugin-jsx-a11y@^6.7.1:
- version "6.9.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz#67ab8ff460d4d3d6a0b4a570e9c1670a0a8245c8"
- integrity sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==
+ version "6.10.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz#36fb9dead91cafd085ddbe3829602fb10ef28339"
+ integrity sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==
dependencies:
aria-query "~5.1.3"
array-includes "^3.1.8"
array.prototype.flatmap "^1.3.2"
ast-types-flow "^0.0.8"
- axe-core "^4.9.1"
- axobject-query "~3.1.1"
+ axe-core "^4.10.0"
+ axobject-query "^4.1.0"
damerau-levenshtein "^1.0.8"
emoji-regex "^9.2.2"
es-iterator-helpers "^1.0.19"
@@ -6800,9 +6721,9 @@ eslint-plugin-react-native@^4.0.0:
eslint-plugin-react-native-globals "^0.1.1"
eslint-plugin-react@^7.12.4, eslint-plugin-react@^7.30.1:
- version "7.35.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz#00b1e4559896710e58af6358898f2ff917ea4c41"
- integrity sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==
+ version "7.35.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.2.tgz#d32500d3ec268656d5071918bfec78cfd8b070ed"
+ integrity sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ==
dependencies:
array-includes "^3.1.8"
array.prototype.findlast "^1.2.5"
@@ -7165,10 +7086,10 @@ expo-constants@~15.4.0:
dependencies:
"@expo/config" "~8.5.0"
-expo-crypto@^12.8.1:
- version "12.8.1"
- resolved "https://registry.yarnpkg.com/expo-crypto/-/expo-crypto-12.8.1.tgz#c7de01a61e89a0600f8f62ef6e71de4e6d3fcbae"
- integrity sha512-EJEzmfBUSkGfALTlZRKUbh1RMKF7mWI12vkhO2w6bhGO4bjgGB8XzUHgLfrvSjphDFMx/lwaR6bAQDmXKO9UkQ==
+expo-crypto@^13.0.2:
+ version "13.0.2"
+ resolved "https://registry.yarnpkg.com/expo-crypto/-/expo-crypto-13.0.2.tgz#e892874f571967f588b1f1e2e4924cafaf4f6823"
+ integrity sha512-7f/IMPYJZkBM21LNEMXGrNo/0uXSVfZTwufUdpNKedJR0fm5fH4DCSN79ZddlV26nF90PuXjK2inIbI6lb0qRA==
dependencies:
base64-js "^1.3.0"
@@ -7361,9 +7282,9 @@ fast-uri@^3.0.1:
integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==
fast-xml-parser@^4.0.12, fast-xml-parser@^4.2.4:
- version "4.4.1"
- resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f"
- integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz#2882b7d01a6825dfdf909638f2de0256351def37"
+ integrity sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==
dependencies:
strnum "^1.0.5"
@@ -7486,12 +7407,11 @@ finalhandler@1.2.0:
unpipe "~1.0.0"
find-babel-config@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-2.1.1.tgz#93703fc8e068db5e4c57592900c5715dd04b7e5b"
- integrity sha512-5Ji+EAysHGe1OipH7GN4qDjok5Z1uw5KAwDCbicU/4wyTZY7CqOCzcWbG7J5ad9mazq67k89fXlbc1MuIfl9uA==
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-2.1.2.tgz#2841b1bfbbbcdb971e1e39df8cbc43dafa901716"
+ integrity sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg==
dependencies:
json5 "^2.2.3"
- path-exists "^4.0.0"
find-cache-dir@^2.0.0:
version "2.1.0"
@@ -7589,19 +7509,19 @@ flow-enums-runtime@^0.0.6:
integrity sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==
flow-parser@0.*:
- version "0.244.0"
- resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.244.0.tgz#dc75ef468959ca72ad5fd89a6a9b0503c141ea8a"
- integrity sha512-Dkc88m5k8bx1VvHTO9HEJ7tvMcSb3Zvcv1PY4OHK7pHdtdY2aUjhmPy6vpjVJ2uUUOIybRlb91sXE8g4doChtA==
+ version "0.245.1"
+ resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.245.1.tgz#03c97e6c6dff38fc6d0f956c8f79a493e01a88e8"
+ integrity sha512-KaVIjRdCY+APtxQijfV1c7GN1bofByIlR7E6omQLW0sghkA8hh8uufQOqTf3oAAVTExsSLafmdL/QwyvE/gdEg==
flow-parser@^0.206.0:
version "0.206.0"
resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.206.0.tgz#f4f794f8026535278393308e01ea72f31000bfef"
integrity sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==
-follow-redirects@^1.0.0, follow-redirects@^1.15.6:
- version "1.15.6"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
- integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
+follow-redirects@^1.0.0, follow-redirects@^1.14.9:
+ version "1.15.8"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.8.tgz#ae67b97ae32e0a7b36066a5448938374ec18d13d"
+ integrity sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig==
fontfaceobserver@^2.1.0:
version "2.3.0"
@@ -8640,7 +8560,7 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
-is-core-module@^2.13.0, is-core-module@^2.13.1:
+is-core-module@^2.13.0, is-core-module@^2.15.1:
version "2.15.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37"
integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
@@ -9442,11 +9362,6 @@ js-yaml@^4.1.0:
dependencies:
argparse "^2.0.1"
-jsan@^3.1.13:
- version "3.1.14"
- resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.14.tgz#197fee2d260b85acacb049c1ffa41bd09fb1f213"
- integrity sha512-wStfgOJqMv4QKktuH273f5fyi3D3vy2pHOiSDGPvpcS/q+wb/M7AK3vkCcaHbkZxDOlDU/lDJgccygKSG2OhtA==
-
jsc-android@^250231.0.0:
version "250231.0.0"
resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250231.0.0.tgz#91720f8df382a108872fa4b3f558f33ba5e95262"
@@ -9592,9 +9507,9 @@ language-tags@^1.0.9:
language-subtag-registry "^0.3.20"
launch-editor@^2.6.0:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.8.1.tgz#3bda72af213ec9b46b170e39661916ec66c2f463"
- integrity sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA==
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.8.2.tgz#939e1b3469f9d5471e4eaacedd51b3b7c45352cd"
+ integrity sha512-eF5slEUZXmi6WvFzI3dYcv+hA24/iKnROf24HztcURJpSz9RBmBgz5cNCVOeguouf1llrwy6Yctl4C4HM+xI8g==
dependencies:
picocolors "^1.0.0"
shell-quote "^1.8.1"
@@ -10531,6 +10446,11 @@ mz@^2.7.0:
object-assign "^4.0.1"
thenify-all "^1.0.0"
+nanoid@3.3.5:
+ version "3.3.5"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.5.tgz#07ef5fb44ece2bc8574af317015e645d5f681422"
+ integrity sha512-nvgaJGpIANf4+VWJAaDGORQyMzhFkze8aXVdrHq+BaSvzfpOuponEysaVFKV/0Bca5V+3SBiDvRabEPbpalEBg==
+
nanoid@^3.1.23, nanoid@^3.3.7:
version "3.3.7"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
@@ -10738,7 +10658,7 @@ object.entries@^1.1.2, object.entries@^1.1.8:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
-object.fromentries@^2.0.7, object.fromentries@^2.0.8:
+object.fromentries@^2.0.8:
version "2.0.8"
resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65"
integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==
@@ -10748,7 +10668,7 @@ object.fromentries@^2.0.7, object.fromentries@^2.0.8:
es-abstract "^1.23.2"
es-object-atoms "^1.0.0"
-object.groupby@^1.0.1:
+object.groupby@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e"
integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==
@@ -10757,7 +10677,7 @@ object.groupby@^1.0.1:
define-properties "^1.2.1"
es-abstract "^1.23.2"
-object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0:
+object.values@^1.1.6, object.values@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b"
integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==
@@ -11154,9 +11074,9 @@ path-type@^4.0.0:
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
picocolors@^1.0.0, picocolors@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
- integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59"
+ integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1:
version "2.3.1"
@@ -11497,19 +11417,10 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
-postcss@8.4.38:
- version "8.4.38"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e"
- integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
- dependencies:
- nanoid "^3.3.7"
- picocolors "^1.0.0"
- source-map-js "^1.2.0"
-
postcss@^8.3.5, postcss@^8.4.33, postcss@~8.4.32:
- version "8.4.41"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681"
- integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==
+ version "8.4.45"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.45.tgz#538d13d89a16ef71edbf75d895284ae06b79e603"
+ integrity sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==
dependencies:
nanoid "^3.3.7"
picocolors "^1.0.1"
@@ -11777,11 +11688,6 @@ queue@6.0.2:
dependencies:
inherits "~2.0.3"
-ramda@^0.29.1:
- version "0.29.1"
- resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.29.1.tgz#408a6165b9555b7ba2fc62555804b6c5a2eca196"
- integrity sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==
-
randombytes@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@@ -11903,9 +11809,9 @@ react-native-gesture-handler@~2.16.0:
prop-types "^15.7.2"
react-native-reanimated@^3.7.1:
- version "3.15.0"
- resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.15.0.tgz#8814af7c78bbdf4c92bbd583f2266febf962e66a"
- integrity sha512-yGxOyYAAu/5CyjonM2SgsM5sviiiK8HiHL9jT1bKfRxMLnNX9cFP8/UXRkbMT7ZXIfOlCvNFR0AqnphpuXIPVA==
+ version "3.15.1"
+ resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.15.1.tgz#59fb0ce9de7b8c7add2bcea80911cce332349a0e"
+ integrity sha512-DbBeUUExtJ1x1nfE94I8qgDgWjq5ztM3IO/+XFO+agOkPeVpBs5cRnxHfJKrjqJ2MgwhJOUDmtHxo+tDsoeitg==
dependencies:
"@babel/plugin-transform-arrow-functions" "^7.0.0-0"
"@babel/plugin-transform-class-properties" "^7.0.0-0"
@@ -12014,14 +11920,6 @@ react-proxy@^1.1.7:
lodash "^4.6.1"
react-deep-force-update "^1.0.0"
-react-redux@^9.1.1:
- version "9.1.2"
- resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.2.tgz#deba38c64c3403e9abd0c3fbeab69ffd9d8a7e4b"
- integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==
- dependencies:
- "@types/use-sync-external-store" "^0.0.3"
- use-sync-external-store "^1.0.0"
-
react-refresh@0.14.0:
version "0.14.0"
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e"
@@ -12152,37 +12050,6 @@ redent@^3.0.0:
indent-string "^4.0.0"
strip-indent "^3.0.0"
-redux-persist-transform-immutable@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/redux-persist-transform-immutable/-/redux-persist-transform-immutable-5.0.0.tgz#0ae277b4d8d662016f62af394df2572525ad6671"
- integrity sha512-Gf7pNqHIVrCM459BzyqT25A8+8/PP6ce57kXY+PEgYnWn8jQRCAZaSNxw7T1eqKGXrJfICnMQ39RwehvMqlJMg==
- dependencies:
- remotedev-serialize "^0.1.0"
-
-redux-persist@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/redux-persist/-/redux-persist-6.0.0.tgz#b4d2972f9859597c130d40d4b146fecdab51b3a8"
- integrity sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==
-
-redux-saga@^1.0.2:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.3.0.tgz#a59ada7c28010189355356b99738c9fcb7ade30e"
- integrity sha512-J9RvCeAZXSTAibFY0kGw6Iy4EdyDNW7k6Q+liwX+bsck7QVsU78zz8vpBRweEfANxnnlG/xGGeOvf6r8UXzNJQ==
- dependencies:
- "@redux-saga/core" "^1.3.0"
-
-redux@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b"
- integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==
-
-reduxsauce@^1.0.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/reduxsauce/-/reduxsauce-1.3.0.tgz#52239c534b54c68e8577b110d129b434f74bee5f"
- integrity sha512-/QaG1JrkXY3uZXjUClpm7sK0MfB7EPJLu2goqyHBknMqdx3nw2ZXAlScewsl901oSQD6bMs4DsiHD4S3Zxrppg==
- dependencies:
- ramda "^0.29.1"
-
reflect.getprototypeof@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859"
@@ -12298,13 +12165,6 @@ relateurl@^0.2.7:
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==
-remotedev-serialize@^0.1.0:
- version "0.1.9"
- resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.9.tgz#5e67e05cbca75d408d769d057dc59d0f56cd2c43"
- integrity sha512-5tFdZg9mSaAWTv6xmQ7HtHjKMLSFQFExEZOtJe10PLsv1wb7cy7kYHtBvTYRro27/3fRGEcQBRNKSaixOpb69w==
- dependencies:
- jsan "^3.1.13"
-
remove-trailing-slash@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz#be2285a59f39c74d1bce4f825950061915e3780d"
@@ -12755,7 +12615,7 @@ shallow-clone@^3.0.0:
dependencies:
kind-of "^6.0.2"
-shallowequal@1.1.0, shallowequal@^1.1.0:
+shallowequal@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
@@ -13277,7 +13137,7 @@ style-loader@^3.3.1:
resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7"
integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==
-styled-components@^5:
+styled-components@^5, styled-components@~5.3.0:
version "5.3.11"
resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.11.tgz#9fda7bf1108e39bf3f3e612fcc18170dedcd57a8"
integrity sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==
@@ -13293,21 +13153,6 @@ styled-components@^5:
shallowequal "^1.1.0"
supports-color "^5.5.0"
-styled-components@^6.1.8:
- version "6.1.12"
- resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.12.tgz#0d9d511aacfb9052936146dcc2856559e6fae4df"
- integrity sha512-n/O4PzRPhbYI0k1vKKayfti3C/IGcPf+DqcrOB7O/ab9x4u/zjqraneT5N45+sIe87cxrCApXM8Bna7NYxwoTA==
- dependencies:
- "@emotion/is-prop-valid" "1.2.2"
- "@emotion/unitless" "0.8.1"
- "@types/stylis" "4.2.5"
- css-to-react-native "3.2.0"
- csstype "3.1.3"
- postcss "8.4.38"
- shallowequal "1.1.0"
- stylis "4.3.2"
- tslib "2.6.2"
-
stylehacks@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9"
@@ -13321,11 +13166,6 @@ styleq@^0.1.3:
resolved "https://registry.yarnpkg.com/styleq/-/styleq-0.1.3.tgz#8efb2892debd51ce7b31dc09c227ad920decab71"
integrity sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==
-stylis@4.3.2:
- version "4.3.2"
- resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.2.tgz#8f76b70777dd53eb669c6f58c997bf0a9972e444"
- integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==
-
sucrase@3.34.0:
version "3.34.0"
resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f"
@@ -13636,11 +13476,6 @@ tsconfig-paths@^3.15.0:
minimist "^1.2.6"
strip-bom "^3.0.0"
-tslib@2.6.2:
- version "2.6.2"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
- integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
-
tslib@^1.8.1, tslib@^1.9.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
@@ -13764,25 +13599,6 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
-typescript-compare@^0.0.2:
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/typescript-compare/-/typescript-compare-0.0.2.tgz#7ee40a400a406c2ea0a7e551efd3309021d5f425"
- integrity sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==
- dependencies:
- typescript-logic "^0.0.0"
-
-typescript-logic@^0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/typescript-logic/-/typescript-logic-0.0.0.tgz#66ebd82a2548f2b444a43667bec120b496890196"
- integrity sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==
-
-typescript-tuple@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/typescript-tuple/-/typescript-tuple-2.2.1.tgz#7d9813fb4b355f69ac55032e0363e8bb0f04dad2"
- integrity sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==
- dependencies:
- typescript-compare "^0.0.2"
-
typescript@^3.2.1:
version "3.9.10"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8"
@@ -13930,11 +13746,6 @@ use-latest-callback@^0.2.1:
resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.2.1.tgz#4d4e6a9e4817b13142834850dcfa8d24ca4569cf"
integrity sha512-QWlq8Is8BGWBf883QOEQP5HWYX/kMI+JTbJ5rdtvJLmXTIh9XoHIO3PQcmQl8BU44VKxow1kbQUHa6mQSMALDQ==
-use-sync-external-store@^1.0.0:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9"
- integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==
-
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
@@ -14466,9 +14277,9 @@ yaml@^1.10.2:
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
yaml@^2.2.1:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.0.tgz#c6165a721cf8000e91c36490a41d7be25176cf5d"
- integrity sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130"
+ integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==
yargs-parser@^18.1.2:
version "18.1.3"