diff --git a/package-lock.json b/package-lock.json index 29be2840..403b138a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@mui/material": "^5.15.2", "@mui/x-data-grid": "^6.18.6", "@mui/x-date-pickers": "^6.18.6", - "@reduxjs/toolkit": "^1.9.7", + "@reduxjs/toolkit": "^2.0.1", "@web3modal/ethereum": "^2.7.1", "@web3modal/react": "^2.7.1", "abi-coder": "^4.1.1", @@ -44,7 +44,7 @@ "react-dom": "^18.2.0", "react-hook-form": "^7.49.2", "react-i18next": "^12.3.1", - "react-redux": "^8.1.3", + "react-redux": "^9.0.4", "redis": "^4.6.12", "redis-om": "^0.4.3", "request-ip": "^3.3.0", @@ -3547,18 +3547,18 @@ } }, "node_modules/@reduxjs/toolkit": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", - "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.0.1.tgz", + "integrity": "sha512-fxIjrR9934cmS8YXIGd9e7s1XRsEU++aFc9DVNMFMRTM5Vtsg2DCRMj21eslGtDt43IUf9bJL3h5bwUlZleibA==", "dependencies": { - "immer": "^9.0.21", - "redux": "^4.2.1", - "redux-thunk": "^2.4.2", - "reselect": "^4.1.8" + "immer": "^10.0.3", + "redux": "^5.0.0", + "redux-thunk": "^3.1.0", + "reselect": "^5.0.1" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18", - "react-redux": "^7.2.1 || ^8.0.2" + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "peerDependenciesMeta": { "react": { @@ -3569,6 +3569,11 @@ } } }, + "node_modules/@reduxjs/toolkit/node_modules/reselect": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.0.1.tgz", + "integrity": "sha512-D72j2ubjgHpvuCiORWkOUxndHJrxDaSolheiz5CO+roz8ka97/4msh2E8F5qay4GawR5vzBt5MkbDHT+Rdy/Wg==" + }, "node_modules/@rushstack/eslint-patch": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz", @@ -4307,7 +4312,7 @@ "version": "18.2.18", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", - "devOptional": true, + "dev": true, "dependencies": { "@types/react": "*" } @@ -8848,9 +8853,9 @@ } }, "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.3.tgz", + "integrity": "sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -12275,35 +12280,23 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-redux": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", - "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.0.4.tgz", + "integrity": "sha512-9J1xh8sWO0vYq2sCxK2My/QO7MzUMRi3rpiILP/+tDr8krBHixC6JMM17fMK88+Oh3e4Ae6/sHIhNBgkUivwFA==", "dependencies": { - "@babel/runtime": "^7.12.1", - "@types/hoist-non-react-statics": "^3.3.1", "@types/use-sync-external-store": "^0.0.3", - "hoist-non-react-statics": "^3.3.2", - "react-is": "^18.0.0", "use-sync-external-store": "^1.0.0" }, "peerDependencies": { - "@types/react": "^16.8 || ^17.0 || ^18.0", - "@types/react-dom": "^16.8 || ^17.0 || ^18.0", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0", - "react-native": ">=0.59", - "redux": "^4 || ^5.0.0-beta.0" + "@types/react": "^18.2.25", + "react": "^18.0", + "react-native": ">=0.69", + "redux": "^5.0.0" }, "peerDependenciesMeta": { "@types/react": { "optional": true }, - "@types/react-dom": { - "optional": true - }, - "react-dom": { - "optional": true - }, "react-native": { "optional": true }, @@ -12312,11 +12305,6 @@ } } }, - "node_modules/react-redux/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, "node_modules/react-simple-animate": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/react-simple-animate/-/react-simple-animate-3.5.2.tgz", @@ -12442,19 +12430,16 @@ } }, "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "dependencies": { - "@babel/runtime": "^7.9.2" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" }, "node_modules/redux-thunk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", - "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", "peerDependencies": { - "redux": "^4" + "redux": "^5.0.0" } }, "node_modules/reflect.getprototypeof": { @@ -16769,14 +16754,21 @@ "requires": {} }, "@reduxjs/toolkit": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", - "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.0.1.tgz", + "integrity": "sha512-fxIjrR9934cmS8YXIGd9e7s1XRsEU++aFc9DVNMFMRTM5Vtsg2DCRMj21eslGtDt43IUf9bJL3h5bwUlZleibA==", "requires": { - "immer": "^9.0.21", - "redux": "^4.2.1", - "redux-thunk": "^2.4.2", - "reselect": "^4.1.8" + "immer": "^10.0.3", + "redux": "^5.0.0", + "redux-thunk": "^3.1.0", + "reselect": "^5.0.1" + }, + "dependencies": { + "reselect": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.0.1.tgz", + "integrity": "sha512-D72j2ubjgHpvuCiORWkOUxndHJrxDaSolheiz5CO+roz8ka97/4msh2E8F5qay4GawR5vzBt5MkbDHT+Rdy/Wg==" + } } }, "@rushstack/eslint-patch": { @@ -17407,7 +17399,7 @@ "version": "18.2.18", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", - "devOptional": true, + "dev": true, "requires": { "@types/react": "*" } @@ -20928,9 +20920,9 @@ "dev": true }, "immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.3.tgz", + "integrity": "sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==" }, "import-fresh": { "version": "3.3.0", @@ -23401,23 +23393,12 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-redux": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", - "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.0.4.tgz", + "integrity": "sha512-9J1xh8sWO0vYq2sCxK2My/QO7MzUMRi3rpiILP/+tDr8krBHixC6JMM17fMK88+Oh3e4Ae6/sHIhNBgkUivwFA==", "requires": { - "@babel/runtime": "^7.12.1", - "@types/hoist-non-react-statics": "^3.3.1", "@types/use-sync-external-store": "^0.0.3", - "hoist-non-react-statics": "^3.3.2", - "react-is": "^18.0.0", "use-sync-external-store": "^1.0.0" - }, - "dependencies": { - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - } } }, "react-simple-animate": { @@ -23515,17 +23496,14 @@ "dev": true }, "redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "requires": { - "@babel/runtime": "^7.9.2" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" }, "redux-thunk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", - "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", "requires": {} }, "reflect.getprototypeof": { diff --git a/package.json b/package.json index 6e80a70b..1a99f68b 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@mui/material": "^5.15.2", "@mui/x-data-grid": "^6.18.6", "@mui/x-date-pickers": "^6.18.6", - "@reduxjs/toolkit": "^1.9.7", + "@reduxjs/toolkit": "^2.0.1", "@web3modal/ethereum": "^2.7.1", "@web3modal/react": "^2.7.1", "abi-coder": "^4.1.1", @@ -52,7 +52,7 @@ "react-dom": "^18.2.0", "react-hook-form": "^7.49.2", "react-i18next": "^12.3.1", - "react-redux": "^8.1.3", + "react-redux": "^9.0.4", "redis": "^4.6.12", "redis-om": "^0.4.3", "request-ip": "^3.3.0", diff --git a/src/redux/slices/account.ts b/src/redux/slices/account.ts index 419d4ea0..2e32eb54 100644 --- a/src/redux/slices/account.ts +++ b/src/redux/slices/account.ts @@ -21,7 +21,7 @@ const emptyUsd = { decimals: 6, }; -const initialState: AccountState = { +export const INITIAL_ACCOUNT_STATE: AccountState = { address: undefined, balance: emptyEth, balanceUsd1: emptyUsd, @@ -30,7 +30,7 @@ const initialState: AccountState = { export const accountSlice = createSlice({ name: 'account', - initialState, + initialState: INITIAL_ACCOUNT_STATE, reducers: { setAccount(state, action: PayloadAction<string>) { state.address = action.payload; diff --git a/src/redux/slices/application.ts b/src/redux/slices/application.ts index 8f19c1f7..8fc23318 100644 --- a/src/redux/slices/application.ts +++ b/src/redux/slices/application.ts @@ -16,7 +16,7 @@ export interface ApplicationState { premiumCalculationInProgress: boolean; } -const initialState: ApplicationState = { +export const INITIAL_APPLICATION_STATE: ApplicationState = { productComponentState: ComponentState.Active, bundles: [], isLoadingBundles: false, @@ -31,7 +31,7 @@ const initialState: ApplicationState = { export const applicationSlice = createSlice({ name: 'application', - initialState, + initialState: INITIAL_APPLICATION_STATE, reducers: { addBundle: (state, action: PayloadAction<BundleData>) => { const hasBundle = state.bundles.find((bundle) => bundle.id === action.payload.id) !== undefined; diff --git a/src/redux/slices/bundles.ts b/src/redux/slices/bundles.ts index 771cfac9..2fceb28a 100644 --- a/src/redux/slices/bundles.ts +++ b/src/redux/slices/bundles.ts @@ -21,7 +21,7 @@ export interface BundlesState { isShowBundleExtend: boolean; } -const initialState: BundlesState = { +export const INITIAL_BUNDLES_STATE: BundlesState = { bundles: [], maxActiveBundles: 0, showBundle: undefined, @@ -34,7 +34,7 @@ const initialState: BundlesState = { export const bundlesSlice = createSlice({ name: 'bundles', - initialState, + initialState: INITIAL_BUNDLES_STATE, reducers: { addBundle: (state, action: PayloadAction<BundleData>) => { const hasBundle = state.bundles.find((bundle) => bundle.id === action.payload.id) !== undefined; diff --git a/src/redux/slices/chain.ts b/src/redux/slices/chain.ts index a841635c..571953cf 100644 --- a/src/redux/slices/chain.ts +++ b/src/redux/slices/chain.ts @@ -19,7 +19,7 @@ export interface ChainState { blockTime: number, } -const initialState: ChainState = { +export const INITIAL_CHAIN_STATE: ChainState = { chainId: "0x0", isConnected: false, isExpectedChain: true, @@ -32,7 +32,7 @@ const initialState: ChainState = { export const chainSlice = createSlice({ name: 'chain', - initialState, + initialState: INITIAL_CHAIN_STATE, reducers: { connectChain(state, action: PayloadAction<ChainState>) { state.provider?.removeAllListeners(); @@ -40,7 +40,7 @@ export const chainSlice = createSlice({ }, disconnectChain(state) { state.provider?.removeAllListeners(); - Object.assign(state, initialState); + Object.assign(state, INITIAL_CHAIN_STATE); }, updateSigner(state, action: PayloadAction<Signer>) { state.signer = action.payload; diff --git a/src/redux/slices/policies.ts b/src/redux/slices/policies.ts index 1e5165d9..e1602912 100644 --- a/src/redux/slices/policies.ts +++ b/src/redux/slices/policies.ts @@ -9,7 +9,7 @@ export interface PoliciesState { isDepegged: boolean; } -const initialState: PoliciesState = { +export const INITIAL_POLICIES_STATE: PoliciesState = { policies: [], claimedPolicy: null, isLoading: false, @@ -18,7 +18,7 @@ const initialState: PoliciesState = { export const policiesSlice = createSlice({ name: 'policies', - initialState, + initialState: INITIAL_POLICIES_STATE, reducers: { addPolicy: (state, action: PayloadAction<PolicyData>) => { if (action.payload.id !== '') { diff --git a/src/redux/slices/price.ts b/src/redux/slices/price.ts index e2b072f1..f25e3da4 100644 --- a/src/redux/slices/price.ts +++ b/src/redux/slices/price.ts @@ -31,7 +31,7 @@ const initialPrice = { } as PriceInfo; -const initialState: PriceState = { +export const INITIAL_PRICE_STATE: PriceState = { symbol: "USDC", name: "USD Coin", decimals: 8, @@ -47,7 +47,7 @@ const initialState: PriceState = { export const priceSlice = createSlice({ name: 'price', - initialState, + initialState: INITIAL_PRICE_STATE, reducers: { setCoin: (state, action: PayloadAction<{ symbol: string, name: string, decimals: number}>) => { state.symbol = action.payload.symbol; diff --git a/src/redux/slices/transaction.ts b/src/redux/slices/transaction.ts index b14f7f29..b03b335f 100644 --- a/src/redux/slices/transaction.ts +++ b/src/redux/slices/transaction.ts @@ -10,7 +10,7 @@ export interface TransactionState { waitingForTransactionParams: any; } -const initialState: TransactionState = { +export const INITIAL_TRANSACTION_STATE: TransactionState = { isActive: null, isWaitingForUser: false, waitingForUserParams: {}, @@ -20,7 +20,7 @@ const initialState: TransactionState = { export const transactionSlice = createSlice({ name: 'transaction', - initialState, + initialState: INITIAL_TRANSACTION_STATE, reducers: { start: (state, action: PayloadAction<{ type?: TrxType }>) => { // console.log('start', action.payload.type); diff --git a/src/redux/store.ts b/src/redux/store.ts index ca51f48c..e4ac183d 100644 --- a/src/redux/store.ts +++ b/src/redux/store.ts @@ -1,4 +1,4 @@ -import { combineReducers, configureStore, PreloadedState } from '@reduxjs/toolkit'; +import { combineReducers, configureStore } from '@reduxjs/toolkit'; import accountReducer from './slices/account'; import applicationReducer from './slices/application'; import bundlesReducer from './slices/bundles'; @@ -18,7 +18,7 @@ const rootReducer = combineReducers({ transaction: transactionReducer, }) -export const setupStore = (preloadedState?: PreloadedState<RootState>) => { +export const setupStore = (preloadedState?: RootState) => { return configureStore({ reducer: rootReducer, preloadedState diff --git a/src/version.json b/src/version.json index 0bfa7f3e..f1925d3c 100644 --- a/src/version.json +++ b/src/version.json @@ -1 +1 @@ -{ "name": "depeg-ui", "version": "dev", "date": "202T-0D-A1" } \ No newline at end of file +{"name": "depeg-interface", "version": "1.2.7", "date": "2023-12-27" } diff --git a/tests/util/render_with_provider.tsx b/tests/util/render_with_provider.tsx index db0872c9..1c3f368e 100644 --- a/tests/util/render_with_provider.tsx +++ b/tests/util/render_with_provider.tsx @@ -1,24 +1,40 @@ -import React, { PropsWithChildren } from 'react' -import { render } from '@testing-library/react' -import type { RenderOptions } from '@testing-library/react' -import type { PreloadedState } from '@reduxjs/toolkit' -import { Provider } from 'react-redux' -import { RootState, AppStore, setupStore } from '../../src/redux/store' import { LocalizationProvider } from '@mui/x-date-pickers' import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs' +import type { RenderOptions } from '@testing-library/react' +import { render } from '@testing-library/react' +import React, { PropsWithChildren } from 'react' +import { Provider } from 'react-redux' +import { AccountState, INITIAL_ACCOUNT_STATE } from '../../src/redux/slices/account' +import { ApplicationState, INITIAL_APPLICATION_STATE } from '../../src/redux/slices/application' +import { BundlesState, INITIAL_BUNDLES_STATE } from '../../src/redux/slices/bundles' +import { ChainState, INITIAL_CHAIN_STATE } from '../../src/redux/slices/chain' +import { INITIAL_POLICIES_STATE, PoliciesState } from '../../src/redux/slices/policies' +import { INITIAL_PRICE_STATE, PriceState } from '../../src/redux/slices/price' +import { INITIAL_TRANSACTION_STATE } from '../../src/redux/slices/transaction' +import { AppStore, RootState, setupStore } from '../../src/redux/store' // This type interface extends the default options for render from RTL, as well // as allows the user to specify other things such as initialState, store. interface ExtendedRenderOptions extends Omit<RenderOptions, 'queries'> { - preloadedState?: PreloadedState<RootState> + preloadedState?: RootState store?: AppStore } +export const EMPTY_ROOT_STATE: RootState = { + account: INITIAL_ACCOUNT_STATE, + application: INITIAL_APPLICATION_STATE, + bundles: INITIAL_BUNDLES_STATE, + chain: INITIAL_CHAIN_STATE, + policies: INITIAL_POLICIES_STATE, + price: INITIAL_PRICE_STATE, + transaction: INITIAL_TRANSACTION_STATE, +}; + export function renderWithProviders( ui: React.ReactElement, { - preloadedState = {}, + preloadedState = EMPTY_ROOT_STATE, // Automatically create a store instance if no store was passed in store = setupStore(preloadedState), ...renderOptions