From 235130852740188983fa90a649b73ebd21a860ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Bardaj=C3=AD=20Puig?= Date: Fri, 16 Dec 2022 14:26:15 +0000 Subject: [PATCH] fix: types --- app/components/home/stacking-card.tsx | 5 +- app/components/info-card.tsx | 11 ++- app/hooks/use-decrypt-wallet.ts | 2 +- app/hooks/use-global-polling.ts | 5 + app/hooks/use-watch-stacking-tx.ts | 2 + .../delegated-stacking-modal.tsx | 5 +- .../components/reveal-stx-address-ledger.tsx | 5 +- .../revoke-delegation-modal.tsx | 5 +- app/modals/send-stx/send-stx-modal.tsx | 5 +- app/modals/stacking/stacking-modal.tsx | 5 +- .../components/stacking-form-container.tsx | 17 +++- app/store/address/address.actions.ts | 5 +- app/store/keys/keys.actions.ts | 2 +- app/store/stacking/stacking.actions.ts | 13 +++ app/store/stacking/stacking.reducer.ts | 30 +++++- app/store/transaction/transaction.actions.ts | 49 +++++++--- app/utils/stacking.ts | 4 +- package.json | 19 ++-- yarn.lock | 98 +++++++------------ 19 files changed, 174 insertions(+), 113 deletions(-) diff --git a/app/components/home/stacking-card.tsx b/app/components/home/stacking-card.tsx index 0f8707510..25312911a 100644 --- a/app/components/home/stacking-card.tsx +++ b/app/components/home/stacking-card.tsx @@ -5,7 +5,7 @@ import BigNumber from 'bignumber.js'; import { RootState } from '@store/index'; import { formatPoxAddressToNetwork } from '@utils/stacking'; -import { selectStackerInfo } from '@store/stacking/stacking.reducer'; +import { selectAccountBalanceLocked, selectStackerInfo } from '@store/stacking/stacking.reducer'; import stackingImg from '@assets/images/abstract-btc-stx-bar-chart.svg'; import { InfoCard, @@ -24,6 +24,7 @@ export const StackingCard: FC = () => { const { stackerInfo } = useSelector((state: RootState) => ({ stackerInfo: selectStackerInfo(state), })); + const accountBalanceLocked = useSelector((state: RootState) => selectAccountBalanceLocked(state)); if (!stackerInfo?.isCurrentlyStacking) return null; @@ -41,7 +42,7 @@ export const StackingCard: FC = () => { fontFamily="Open Sauce" letterSpacing="-0.02em" > - {toHumanReadableStx(stackerInfo.details.amount_microstx)} + {accountBalanceLocked !== null && toHumanReadableStx(Number(accountBalanceLocked))}
diff --git a/app/components/info-card.tsx b/app/components/info-card.tsx index c76e955cf..c139bcace 100644 --- a/app/components/info-card.tsx +++ b/app/components/info-card.tsx @@ -14,14 +14,21 @@ export const InfoCard: FC = props => ( /> ); -export const InfoCardGroup: FC = ({ children, ...props }) => { +type ChildProps = BoxProps; + +type TChild = React.ReactElement; + +interface Props extends BoxProps { + children: TChild | TChild[]; +} +export const InfoCardGroup = ({ children, ...props }: Props) => { const parsedChildren = Array.isArray(children) ? children : [children]; const infoGroup = parsedChildren.flatMap((child, index) => { if (!isValidElement(child)) return null; return [ cloneElement(child, { key: index, - mb: index === parsedChildren.length ? '280px' : null, + mb: index === parsedChildren.length ? '280px' : undefined, }), index !== parsedChildren.length - 1 &&
, ]; diff --git a/app/hooks/use-decrypt-wallet.ts b/app/hooks/use-decrypt-wallet.ts index 28cb953ca..a3ef20b6b 100644 --- a/app/hooks/use-decrypt-wallet.ts +++ b/app/hooks/use-decrypt-wallet.ts @@ -31,7 +31,7 @@ export function useDecryptWallet() { ); setIsDecrypting(false); if (error) throw error; - return decryptedSoftwareWallet as NonNullable; + return decryptedSoftwareWallet; }, [encryptedMnemonic, salt] ); diff --git a/app/hooks/use-global-polling.ts b/app/hooks/use-global-polling.ts index 434c14567..7c98b2b26 100644 --- a/app/hooks/use-global-polling.ts +++ b/app/hooks/use-global-polling.ts @@ -4,6 +4,7 @@ import { useDispatch, useSelector } from 'react-redux'; import { DEFAULT_POLLING_INTERVAL } from '@constants/index'; import { selectAddress } from '@store/keys'; import { + fetchAccountBalanceLocked, fetchBlockTimeInfo, fetchCoreDetails, fetchStackerInfo, @@ -24,12 +25,14 @@ export function useGlobalAppPolling() { if (!address) return; dispatch(getAddressTransactions(address)); dispatch(getAddressDetails(address)); + dispatch(fetchAccountBalanceLocked(address)); }, [address, dispatch]); const refreshWalletDetailsWithoutLoader = useCallback(() => { if (!address) return; dispatch(getAddressTransactions(address, { displayLoading: false })); dispatch(getAddressDetails(address)); + dispatch(fetchAccountBalanceLocked(address)); }, [address, dispatch]); useNavigatorOnline({ onReconnect: initAppWithStxAddressInfo }); @@ -43,6 +46,7 @@ export function useGlobalAppPolling() { dispatch(fetchCoreDetails()); dispatch(fetchBlockTimeInfo()); dispatch(fetchStackerInfo(address)); + dispatch(fetchAccountBalanceLocked(address)); } }, [address, api, initAppWithStxAddressInfo, dispatch]); @@ -50,6 +54,7 @@ export function useGlobalAppPolling() { if (address) { dispatch(fetchStackerInfo(address)); dispatch(fetchStackingInfo()); + dispatch(fetchAccountBalanceLocked(address)); } dispatch(fetchCoreDetails()); }, 20_000); diff --git a/app/hooks/use-watch-stacking-tx.ts b/app/hooks/use-watch-stacking-tx.ts index d88696cc8..6e815be05 100644 --- a/app/hooks/use-watch-stacking-tx.ts +++ b/app/hooks/use-watch-stacking-tx.ts @@ -11,6 +11,7 @@ import { selectPoxInfo, fetchStackerInfo, removeStackingTx, + fetchAccountBalanceLocked, } from '@store/stacking'; export function useWatchStackingTx() { @@ -28,6 +29,7 @@ export function useWatchStackingTx() { if (!activeStackingTx || !address) return; await safeAwait(watchContractExecution({ nodeUrl: api.baseUrl, txId: activeStackingTx })); dispatch(fetchStackerInfo(address)); + dispatch(fetchAccountBalanceLocked(address)); setTimeout(() => dispatch(removeStackingTx()), 2000); } void run(); diff --git a/app/modals/delegated-stacking/delegated-stacking-modal.tsx b/app/modals/delegated-stacking/delegated-stacking-modal.tsx index 1ff249730..420a1e55e 100644 --- a/app/modals/delegated-stacking/delegated-stacking-modal.tsx +++ b/app/modals/delegated-stacking/delegated-stacking-modal.tsx @@ -49,8 +49,9 @@ export const DelegatedStackingModal: FC = props => { poxInfo: selectPoxInfo(state), })); - const [nodeResponseError, setNodeResponseError] = - useState(null); + const [nodeResponseError, setNodeResponseError] = useState( + null + ); const delegationTxOptions = useMemo((): ContractCallOptions => { if (!poxInfo) throw new Error('`poxInfo` undefined'); diff --git a/app/modals/receive-stx/components/reveal-stx-address-ledger.tsx b/app/modals/receive-stx/components/reveal-stx-address-ledger.tsx index 4c299de8d..d2f522bf2 100644 --- a/app/modals/receive-stx/components/reveal-stx-address-ledger.tsx +++ b/app/modals/receive-stx/components/reveal-stx-address-ledger.tsx @@ -18,8 +18,9 @@ export const RevealStxAddressLedger: FC = () => { const [ledgerAddress, setLedgerAddress] = useState(null); const [success, setSuccess] = useState(false); - const [pendingLedgerAction, setPendingLedgerAction] = - useState<'idle' | 'pending' | 'complete'>('idle'); + const [pendingLedgerAction, setPendingLedgerAction] = useState<'idle' | 'pending' | 'complete'>( + 'idle' + ); const { address: persistedAddress } = useSelector((state: RootState) => ({ address: selectAddress(state), diff --git a/app/modals/revoke-delegation/revoke-delegation-modal.tsx b/app/modals/revoke-delegation/revoke-delegation-modal.tsx index a15ddffa6..54ae265f1 100644 --- a/app/modals/revoke-delegation/revoke-delegation-modal.tsx +++ b/app/modals/revoke-delegation/revoke-delegation-modal.tsx @@ -30,8 +30,9 @@ export const RevokeDelegationModal: FC = () => { const calcFee = useCalculateFee(); const poxInfo = useSelector(selectPoxInfo); - const [nodeResponseError, setNodeResponseError] = - useState(null); + const [nodeResponseError, setNodeResponseError] = useState( + null + ); const revocationTxOptions = useMemo((): ContractCallOptions => { if (!poxInfo) throw new Error('`poxInfo` undefined'); diff --git a/app/modals/send-stx/send-stx-modal.tsx b/app/modals/send-stx/send-stx-modal.tsx index f864fd4f6..e980b98c8 100644 --- a/app/modals/send-stx/send-stx-modal.tsx +++ b/app/modals/send-stx/send-stx-modal.tsx @@ -73,8 +73,9 @@ export const SendStxModal: FC = ({ address, isOpen }) => { const [feeEstimateError, setFeeEstimateError] = useState(null); - const [nodeResponseError, setNodeResponseError] = - useState(null); + const [nodeResponseError, setNodeResponseError] = useState( + null + ); const [loading, setLoading] = useState(false); const { nonce } = useLatestNonce(); diff --git a/app/modals/stacking/stacking-modal.tsx b/app/modals/stacking/stacking-modal.tsx index 2aa65a6e7..eadba6d4d 100644 --- a/app/modals/stacking/stacking-modal.tsx +++ b/app/modals/stacking/stacking-modal.tsx @@ -42,8 +42,9 @@ export const StackingModal: FC = props => { coreNodeInfo: selectCoreNodeInfo(state), })); - const [nodeResponseError, setNodeResponseError] = - useState(null); + const [nodeResponseError, setNodeResponseError] = useState( + null + ); const stackingTxOptions = useMemo(() => { if (!poxInfo) throw new Error('poxInfo not defined'); if (!coreNodeInfo) throw new Error('Stacking requires coreNodeInfo'); diff --git a/app/pages/stacking/components/stacking-form-container.tsx b/app/pages/stacking/components/stacking-form-container.tsx index e68cf9d91..52c5b1eb8 100644 --- a/app/pages/stacking/components/stacking-form-container.tsx +++ b/app/pages/stacking/components/stacking-form-container.tsx @@ -1,10 +1,21 @@ -import React, { cloneElement, FC, isValidElement } from 'react'; +import React, { cloneElement, isValidElement } from 'react'; import { Box } from '@stacks/ui'; import { Hr } from '@components/hr'; import { increment } from '@utils/mutate-numbers'; +import { BoxProps } from '@stacks/ui-core'; -export const StackingFormContainer: FC = ({ children }) => { +interface ChildProps extends BoxProps { + step: number; +} + +type TChild = React.ReactElement; + +interface Props { + children: TChild | TChild[]; +} + +export const StackingFormContainer = ({ children }: Props) => { const parsedChildren = Array.isArray(children) ? children : [children]; const parsedFormSteps = parsedChildren.flatMap((child, index) => { if (!isValidElement(child)) return null; @@ -13,7 +24,7 @@ export const StackingFormContainer: FC = ({ children }) => { cloneElement(child, { key: index, step: increment(index), - mb: increment(index) === parsedChildren.length ? '280px' : null, + mb: increment(index) === parsedChildren.length ? '280px' : undefined, }), ]; }); diff --git a/app/store/address/address.actions.ts b/app/store/address/address.actions.ts index d0d51bb7d..7b062d93b 100644 --- a/app/store/address/address.actions.ts +++ b/app/store/address/address.actions.ts @@ -29,5 +29,6 @@ export function getAddressDetails(address: string) { }; } -export const updateAddressBalance = - createAction<{ address: string; balance: string }>('address/update-balance'); +export const updateAddressBalance = createAction<{ address: string; balance: string }>( + 'address/update-balance' +); diff --git a/app/store/keys/keys.actions.ts b/app/store/keys/keys.actions.ts index 221dff553..d56585517 100644 --- a/app/store/keys/keys.actions.ts +++ b/app/store/keys/keys.actions.ts @@ -61,7 +61,7 @@ interface SetPasswordSuccess { export const setPasswordSuccess = createAction('keys/set-password-success'); export function onboardingMnemonicGenerationStep({ stepDelayMs }: { stepDelayMs: number }) { - return async (dispatch: Dispatch) => { + return (dispatch: Dispatch) => { const plaintextMnemonic = generateSecretKey(MNEMONIC_ENTROPY); dispatch(persistMnemonicSafe(plaintextMnemonic)); setTimeout(() => dispatch(push(routes.SECRET_KEY)), stepDelayMs); diff --git a/app/store/stacking/stacking.actions.ts b/app/store/stacking/stacking.actions.ts index 463965685..a1175443a 100644 --- a/app/store/stacking/stacking.actions.ts +++ b/app/store/stacking/stacking.actions.ts @@ -48,6 +48,19 @@ export const fetchStackerInfo = createAsyncThunk( } ); +export const fetchAccountBalanceLocked = createAsyncThunk( + 'stacking/balance-locked', + async (address: string, thunkApi) => { + const state = thunkApi.getState() as RootState; + const network = selectActiveStacksNetwork(state); + const stackingClient = new StackingClient(address, network); + const [error, resp] = await safeAwait(stackingClient.getAccountBalanceLocked()); + if (resp !== undefined) return resp; + if (error) return { error }; + throw new Error(); + } +); + export const activeStackingTx = createAction<{ txId: string }>( 'stacking/call-stacking-contract-tx' ); diff --git a/app/store/stacking/stacking.reducer.ts b/app/store/stacking/stacking.reducer.ts index 5a7c6a4b8..f8b1dbe1c 100644 --- a/app/store/stacking/stacking.reducer.ts +++ b/app/store/stacking/stacking.reducer.ts @@ -18,6 +18,7 @@ import { fetchStackerInfo, activeStackingTx, removeStackingTx, + fetchAccountBalanceLocked, } from './stacking.actions'; import { stxToMicroStx } from '@utils/unit-convert'; import { StackerInfo as StackerInfoFromClient } from '@stacks/stacking'; @@ -41,10 +42,13 @@ type StackerInfo = StackerInfoFromClient | StackerInfoFail; export interface StackingState { initialRequestsComplete: Record< - 'poxInfo' | 'coreNodeInfo' | 'blockTimeInfo' | 'stackerInfo', + 'poxInfo' | 'coreNodeInfo' | 'blockTimeInfo' | 'stackerInfo' | 'accountBalanceLocked', + boolean + >; + errors: Record< + 'poxInfo' | 'coreNodeInfo' | 'blockTimeInfo' | 'stackerInfo' | 'accountBalanceLocked', boolean >; - errors: Record<'poxInfo' | 'coreNodeInfo' | 'blockTimeInfo' | 'stackerInfo', boolean>; contractCallTx: string | null; poxInfo: CoreNodePoxResponse | null; coreNodeInfo: CoreNodeInfoResponse | null; @@ -56,11 +60,12 @@ export interface StackingState { lock_period: number; unlock_height: number; pox_address: { - version: Buffer; - hashbytes: Buffer; + version: Uint8Array; + hashbytes: Uint8Array; }; }; } | null; + accountBalanceLocked: bigint | null; } const initialState: StackingState = { @@ -69,18 +74,21 @@ const initialState: StackingState = { coreNodeInfo: false, blockTimeInfo: false, stackerInfo: false, + accountBalanceLocked: false, }, errors: { poxInfo: false, coreNodeInfo: false, blockTimeInfo: false, stackerInfo: false, + accountBalanceLocked: false, }, contractCallTx: null, poxInfo: null, coreNodeInfo: null, blockTimeInfo: null, stackerInfo: null, + accountBalanceLocked: null, }; export const stackingSlice = createSlice({ @@ -88,6 +96,16 @@ export const stackingSlice = createSlice({ initialState, reducers: {}, extraReducers: { + [fetchAccountBalanceLocked.fulfilled.toString()]: (state, action: PayloadAction) => { + state.initialRequestsComplete.accountBalanceLocked = true; + state.errors.accountBalanceLocked = false; + state.accountBalanceLocked = action.payload; + }, + [fetchAccountBalanceLocked.rejected.toString()]: state => { + if (!state.initialRequestsComplete.accountBalanceLocked) { + state.errors.accountBalanceLocked = true; + } + }, [fetchStackingInfo.fulfilled.toString()]: ( state, action: PayloadAction @@ -155,6 +173,10 @@ export const stackingActions = stackingSlice.actions; export const selectStackingState = (state: RootState) => state.stacking; export const selectCoreNodeInfo = createSelector(selectStackingState, state => state.coreNodeInfo); +export const selectAccountBalanceLocked = createSelector( + selectStackingState, + state => state.accountBalanceLocked +); export const selectBlockTimeInfo = createSelector( selectStackingState, state => state.blockTimeInfo diff --git a/app/store/transaction/transaction.actions.ts b/app/store/transaction/transaction.actions.ts index 9cb0d0d17..a0ef00f70 100644 --- a/app/store/transaction/transaction.actions.ts +++ b/app/store/transaction/transaction.actions.ts @@ -1,17 +1,15 @@ import { createAction } from '@reduxjs/toolkit'; import { safeAwait } from '@stacks/ui'; -import { - PostCoreNodeTransactionsError, - AddressTransactionWithTransfers, -} from '@stacks/stacks-blockchain-api-types'; +import { AddressTransactionWithTransfers } from '@stacks/stacks-blockchain-api-types'; import urljoin from 'url-join'; -import { StacksTransaction, TxBroadcastResult } from '@stacks/transactions'; +import { StacksTransaction, TxBroadcastResultRejected } from '@stacks/transactions'; import { Api } from '../../api/api'; import { safelyFormatHexTxid } from '@utils/safe-handle-txid'; import { Dispatch, GetState } from '@store/index'; import { selectActiveNodeApi, selectActiveStacksNetwork } from '@store/stacks-node'; +import { isObject } from 'formik'; export const pendingTransactionSuccessful = createAction( 'transactions/pending-transaction-successful' @@ -58,10 +56,16 @@ export const broadcastTxFail = createAction( 'transactions/broadcast-transactions-fail' ); +function hasMessageProp(arg: unknown): arg is { message: string } { + if (!isObject(arg)) return false; + if (!Object.hasOwn(arg, 'message')) return false; + + return true; +} export interface BroadcastTransactionArgs { transaction: StacksTransaction; onBroadcastSuccess(txId: string): void; - onBroadcastFail(errorResponse?: PostCoreNodeTransactionsError): void; + onBroadcastFail(errorResponse?: TxBroadcastResultRejected): void; } export function broadcastTransaction(args: BroadcastTransactionArgs) { const { transaction, onBroadcastSuccess, onBroadcastFail } = args; @@ -77,14 +81,21 @@ export function broadcastTransaction(args: BroadcastTransactionArgs) { ); if (typeof blockchainResponse !== 'string') { // setError for ui - dispatch(broadcastTxFail(blockchainResponse as any)); + const reasonData = blockchainResponse.reason_data; + const message = hasMessageProp(reasonData) ? reasonData.message : ''; + dispatch( + broadcastTxFail({ + reason: blockchainResponse.reason, + message, + }) + ); onBroadcastFail(blockchainResponse); return; } onBroadcastSuccess(safelyFormatHexTxid(blockchainResponse)); return blockchainResponse; } catch (e) { - dispatch(broadcastTxFail(e)); + dispatch(broadcastTxFail(e as BroadcastTxFail)); onBroadcastFail(); return; } @@ -94,7 +105,7 @@ export function broadcastTransaction(args: BroadcastTransactionArgs) { export async function broadcastRawTransaction( rawTx: Uint8Array, url: string -): Promise { +): Promise { const requestHeaders = { 'Content-Type': 'application/octet-stream', }; @@ -106,11 +117,19 @@ export async function broadcastRawTransaction( }; const response = await fetch(urljoin(url, '/v2/transactions'), options); - const text = await response.text(); - try { - return JSON.parse(text) as TxBroadcastResult; - } catch (e) { - return text; - } + /** + * Variable `text` can either be, + * - a string of the transaction id, when the request is successful + * - a stringified JSON object when the request is unsuccessful + * + * source, + * https://docs.hiro.so/api#tag/Transactions/operation/post_core_node_transactions + * + * Note that in the documentation above the mimetype of successful responses + * is documented as `text/plain`, yet the responses have have a mimetype of + * `application/json`. + */ + const text = await response.text(); + return JSON.parse(text); } diff --git a/app/utils/stacking.ts b/app/utils/stacking.ts index 484153c08..f1fba8fb2 100644 --- a/app/utils/stacking.ts +++ b/app/utils/stacking.ts @@ -16,8 +16,8 @@ const poxKeyToVersionBytesMap: Record<'mainnet' | 'testnet', any> = { }; interface ConvertToPoxAddressBtc { - version: Buffer; - hashbytes: Buffer; + version: Uint8Array; + hashbytes: Uint8Array; } export function convertPoxAddressToBtc(network: 'mainnet' | 'testnet') { return ({ version, hashbytes }: ConvertToPoxAddressBtc) => { diff --git a/package.json b/package.json index 5452bbdc9..8b5ac14a5 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,9 @@ "prepare": "husky install", "typecheck": "tsc --noEmit" }, + "resolutions": { + "@types/react": "17.0.30" + }, "release": { "branches": [ { @@ -130,12 +133,12 @@ "@types/node": "14.14.37", "@types/qrcode.react": "1.0.1", "@types/ramda": "types/npm-ramda#dist", - "@types/react": "17.0.52", + "@types/react": "17", "@types/react-dom": "17.0.18", - "@types/react-redux": "7.1.16", + "@types/react-redux": "7.1.24", "@types/react-router": "5.1.13", "@types/react-router-dom": "5.1.7", - "@types/redux-logger": "3.0.8", + "@types/redux-logger": "3.0.9", "@types/regenerator-runtime": "0.13.0", "@types/rimraf": "3.0.0", "@types/source-map-support": "0.5.3", @@ -209,7 +212,7 @@ "@hot-loader/react-dom": "17.0.1", "@noble/hashes": "1.1.3", "@popperjs/core": "2.9.1", - "@reduxjs/toolkit": "1.5.1", + "@reduxjs/toolkit": "1.9.1", "@scure/base": "1.1.1", "@scure/bip32": "1.1.1", "@segment/analytics-next": "1.30.0", @@ -247,7 +250,7 @@ "minimist": "1.2.5", "os-browserify": "0.3.0", "qrcode.react": "1.0.1", - "react": "17.0.2", + "react": "17", "react-card-flip": "1.1.0", "react-dom": "17.0.2", "react-hot-loader": "4.13.0", @@ -256,12 +259,12 @@ "react-icons": "4.2.0", "react-popper": "2.2.5", "react-query": "3.13.4", - "react-redux": "7.2.3", + "react-redux": "7", "react-router": "5.2.0", "react-router-dom": "5.2.0", - "redux": "4.0.5", + "redux": "4.2.0", "redux-persist": "6.0.0", - "redux-thunk": "2.3.0", + "redux-thunk": "2.4.2", "rpc-websocket-client": "1.1.4", "rxjs": "6.6.7", "source-map-support": "0.5.19", diff --git a/yarn.lock b/yarn.lock index dfab7236c..eac8086b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1156,7 +1156,7 @@ pirates "^4.0.0" source-map-support "^0.5.16" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.20.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== @@ -3085,15 +3085,15 @@ "@react-types/overlays" "^3.6.5" "@react-types/shared" "^3.16.0" -"@reduxjs/toolkit@1.5.1": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.5.1.tgz#05daa2f6eebc70dc18cd98a90421fab7fa565dc5" - integrity sha512-PngZKuwVZsd+mimnmhiOQzoD0FiMjqVks6ituO1//Ft5UEX5Ca9of13NEjo//pU22Jk7z/mdXVsmDfgsig1osA== +"@reduxjs/toolkit@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.1.tgz#4c34dc4ddcec161535288c60da5c19c3ef15180e" + integrity sha512-HikrdY+IDgRfRYlCTGUQaiCxxDDgM1mQrRbZ6S1HFZX5ZYuJ4o8EstNmhTwHdPl2rTmLxzwSu0b3AyeyTlR+RA== dependencies: - immer "^8.0.1" - redux "^4.0.0" - redux-thunk "^2.3.0" - reselect "^4.0.0" + immer "^9.0.16" + redux "^4.2.0" + redux-thunk "^2.4.2" + reselect "^4.1.7" "@scure/base@1.1.1", "@scure/base@~1.1.0": version "1.1.1" @@ -4877,17 +4877,7 @@ dependencies: "@types/react" "^17" -"@types/react-redux@7.1.16": - version "7.1.16" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.16.tgz#0fbd04c2500c12105494c83d4a3e45c084e3cb21" - integrity sha512-f/FKzIrZwZk7YEO9E1yoxIuDNRiDducxkFlkw/GNMGEnK9n4K8wJzlJBghpSuOVDgEUHoDkDF7Gi9lHNQR4siw== - dependencies: - "@types/hoist-non-react-statics" "^3.3.0" - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - redux "^4.0.0" - -"@types/react-redux@^7.1.16": +"@types/react-redux@7.1.24", "@types/react-redux@^7.1.20": version "7.1.24" resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.24.tgz#6caaff1603aba17b27d20f8ad073e4c077e975c0" integrity sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ== @@ -4922,16 +4912,16 @@ "@types/history" "*" "@types/react" "*" -"@types/react@*": - version "18.0.26" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917" - integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== +"@types/react@*", "@types/react@17.0.30", "@types/react@^17": + version "17.0.30" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.30.tgz#2f8e6f5ab6415c091cc5e571942ee9064b17609e" + integrity sha512-3Dt/A8gd3TCXi2aRe84y7cK1K8G+N9CZRDG8kDGguOKa0kf/ZkSwTmVIDPsm/KbQOVMaDJXwhBtuOXxqwdpWVg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@17.0.52", "@types/react@^17": +"@types/react@17": version "17.0.52" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.52.tgz#10d8b907b5c563ac014a541f289ae8eaa9bf2e9b" integrity sha512-vwk8QqVODi0VaZZpDXQCmEmiOuyjEFPY7Ttaw5vjM112LOq37yz1CDJGrRJwA1fYEq4Iitd5rnjd1yWAc/bT+A== @@ -4940,10 +4930,10 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/redux-logger@3.0.8": - version "3.0.8" - resolved "https://registry.yarnpkg.com/@types/redux-logger/-/redux-logger-3.0.8.tgz#1fb6d26917bb198792bb1cf57feb31cae1532c5d" - integrity sha512-zM+cxiSw6nZtRbxpVp9SE3x/X77Z7e7YAfHD1NkxJyJbAGSXJGF0E9aqajZfPOa/sTYnuwutmlCldveExuCeLw== +"@types/redux-logger@3.0.9": + version "3.0.9" + resolved "https://registry.yarnpkg.com/@types/redux-logger/-/redux-logger-3.0.9.tgz#9193b3d51bb6ab98d25514ba7764e4f98a64d3ec" + integrity sha512-cwYhVbYNgH01aepeMwhd0ABX6fhVB2rcQ9m80u8Fl50ZODhsZ8RhQArnLTkE7/Zrfq4Sz/taNoF7DQy9pCZSKg== dependencies: redux "^4.0.0" @@ -9460,10 +9450,10 @@ immer@9.0.1: resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.1.tgz#1116368e051f9a0fd188c5136b6efb74ed69c57f" integrity sha512-7CCw1DSgr8kKYXTYOI1qMM/f5qxT5vIVMeGLDCDX8CSxsggr1Sjdoha4OhsP0AZ1UvWbyZlILHvLjaynuu02Mg== -immer@^8.0.1: - version "8.0.4" - resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.4.tgz#3a21605a4e2dded852fb2afd208ad50969737b7a" - integrity sha512-jMfL18P+/6P6epANRvRk6q8t+3gGhqsJ9EuJ25AXE+9bNTYtssvzeYbEd0mXRYWCmmXSIbnlpz6vd6iJlmGGGQ== +immer@^9.0.16: + version "9.0.16" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.16.tgz#8e7caab80118c2b54b37ad43e05758cdefad0198" + integrity sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ== "immutable@^3.8.1 || ^4.0.0-rc.1": version "4.1.0" @@ -12467,7 +12457,7 @@ react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^17.0.1: +react-is@^17.0.1, react-is@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== @@ -12494,17 +12484,17 @@ react-query@3.13.4: broadcast-channel "^3.4.1" match-sorter "^6.0.2" -react-redux@7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.3.tgz#4c084618600bb199012687da9e42123cca3f0be9" - integrity sha512-ZhAmQ1lrK+Pyi0ZXNMUZuYxYAZd59wFuVDGUt536kSGdD0ya9Q7BfsE95E3TsFLE3kOSFp5m6G5qbatE+Ic1+w== +react-redux@7: + version "7.2.9" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" + integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== dependencies: - "@babel/runtime" "^7.12.1" - "@types/react-redux" "^7.1.16" + "@babel/runtime" "^7.15.4" + "@types/react-redux" "^7.1.20" hoist-non-react-statics "^3.3.2" loose-envify "^1.4.0" prop-types "^15.7.2" - react-is "^16.13.1" + react-is "^17.0.2" react-refresh@0.9.0: version "0.9.0" @@ -12550,7 +12540,7 @@ react-transition-group@^4.4.1: loose-envify "^1.4.0" prop-types "^15.6.2" -react@17.0.2: +react@17: version "17.0.2" resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== @@ -12646,25 +12636,12 @@ redux-persist@6.0.0: resolved "https://registry.yarnpkg.com/redux-persist/-/redux-persist-6.0.0.tgz#b4d2972f9859597c130d40d4b146fecdab51b3a8" integrity sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ== -redux-thunk@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" - integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== - -redux-thunk@^2.3.0: +redux-thunk@2.4.2, redux-thunk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b" integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== -redux@4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" - integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== - dependencies: - loose-envify "^1.4.0" - symbol-observable "^1.2.0" - -redux@^4.0.0: +redux@4.2.0, redux@^4.0.0, redux@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13" integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA== @@ -12781,7 +12758,7 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -reselect@^4.0.0: +reselect@^4.1.7: version "4.1.7" resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.7.tgz#56480d9ff3d3188970ee2b76527bd94a95567a42" integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== @@ -13867,11 +13844,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -symbol-observable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"