diff --git a/package.json b/package.json index 7b5fdcf26..c8544bc12 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "@reach/popover": "^0.18.0", "@reach/rect": "^0.18.0", "@reach/tabs": "^0.18.0", - "@reduxjs/toolkit": "^1.8.1", + "@reduxjs/toolkit": "^2.0.1", "@sentry/browser": "^7.74.1", "@sentry/react": "^7.74.1", "@soapbox.pub/wasmboy": "^0.8.0", @@ -86,7 +86,7 @@ "@types/react-router-dom": "^5.3.3", "@types/react-sparklines": "^1.7.2", "@types/react-swipeable-views": "^0.13.1", - "@types/redux-mock-store": "^1.0.3", + "@types/redux-mock-store": "^1.0.6", "@types/semver": "^7.3.9", "@types/uuid": "^9.0.0", "@vitejs/plugin-react": "^4.0.4", @@ -145,7 +145,7 @@ "react-motion": "^0.5.2", "react-overlays": "^0.9.0", "react-popper": "^2.3.0", - "react-redux": "^9.0.0", + "react-redux": "^9.0.4", "react-router-dom": "^5.3.0", "react-router-dom-v5-compat": "^6.6.2", "react-router-scroll-4": "^1.0.0-beta.2", @@ -154,9 +154,9 @@ "react-sticky-box": "^2.0.0", "react-swipeable-views": "^0.14.0", "react-virtuoso": "^4.3.11", - "redux": "^4.1.1", + "redux": "^5.0.0", "redux-immutable": "^4.0.0", - "redux-thunk": "^2.2.0", + "redux-thunk": "^3.1.0", "reselect": "^4.0.0", "resize-observer-polyfill": "^1.5.1", "sass": "^1.66.1", diff --git a/src/jest/test-helpers.tsx b/src/jest/test-helpers.tsx index 2240d2d0e..06087e9ca 100644 --- a/src/jest/test-helpers.tsx +++ b/src/jest/test-helpers.tsx @@ -9,7 +9,7 @@ import { IntlProvider } from 'react-intl'; import { Provider } from 'react-redux'; import { MemoryRouter } from 'react-router-dom'; import { Action, applyMiddleware, createStore } from 'redux'; -import thunk from 'redux-thunk'; +import { thunk } from 'redux-thunk'; import { ChatProvider } from 'soapbox/contexts/chat-context'; import { StatProvider } from 'soapbox/contexts/stat-context'; diff --git a/src/middleware/errors.ts b/src/middleware/errors.ts index 9e423a685..6513f9baf 100644 --- a/src/middleware/errors.ts +++ b/src/middleware/errors.ts @@ -1,7 +1,6 @@ import toast from 'soapbox/toast'; -import type { AnyAction } from 'redux'; -import type { ThunkMiddleware } from 'redux-thunk'; +import type { AnyAction, Middleware } from 'redux'; /** Whether the action is considered a failure. */ const isFailType = (type: string): boolean => type.endsWith('_FAIL'); @@ -21,8 +20,9 @@ const shouldShowError = ({ type, skipAlert, error }: AnyAction): boolean => { }; /** Middleware to display Redux errors to the user. */ -const errorsMiddleware = (): ThunkMiddleware => - () => next => action => { +const errorsMiddleware = (): Middleware => + () => next => anyAction => { + const action = anyAction as AnyAction; if (shouldShowError(action)) { toast.showAlertForError(action.error); } diff --git a/src/middleware/sounds.ts b/src/middleware/sounds.ts index 1872ef6f9..e9ec764ec 100644 --- a/src/middleware/sounds.ts +++ b/src/middleware/sounds.ts @@ -1,8 +1,7 @@ -import { AnyAction } from 'redux'; import { play, soundCache } from 'soapbox/utils/sounds'; -import type { ThunkMiddleware } from 'redux-thunk'; +import type { AnyAction, Middleware } from 'redux'; import type { Sounds } from 'soapbox/utils/sounds'; interface Action extends AnyAction { @@ -12,8 +11,9 @@ interface Action extends AnyAction { } /** Middleware to play sounds in response to certain Redux actions. */ -export default function soundsMiddleware(): ThunkMiddleware { - return () => next => (action: Action) => { +export default function soundsMiddleware(): Middleware { + return () => next => anyAction => { + const action = anyAction as Action; if (action.meta?.sound && soundCache[action.meta.sound]) { play(soundCache[action.meta.sound]); } diff --git a/src/store.ts b/src/store.ts index 8aeb0a791..4b1700e26 100644 --- a/src/store.ts +++ b/src/store.ts @@ -1,5 +1,5 @@ -import { configureStore } from '@reduxjs/toolkit'; -import thunk, { ThunkDispatch } from 'redux-thunk'; +import { configureStore, Tuple } from '@reduxjs/toolkit'; +import { thunk, type ThunkDispatch } from 'redux-thunk'; import errorsMiddleware from './middleware/errors'; import soundsMiddleware from './middleware/sounds'; @@ -9,11 +9,11 @@ import type { AnyAction } from 'redux'; export const store = configureStore({ reducer: appReducer, - middleware: [ + middleware: () => new Tuple( thunk, errorsMiddleware(), soundsMiddleware(), - ], + ), devTools: true, }); diff --git a/yarn.lock b/yarn.lock index 4c87200cf..9c440e0ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1968,15 +1968,15 @@ resolved "https://registry.yarnpkg.com/@reach/utils/-/utils-0.18.0.tgz#4f3cebe093dd436eeaff633809bf0f68f4f9d2ee" integrity sha512-KdVMdpTgDyK8FzdKO9SCpiibuy/kbv3pwgfXshTI6tEcQT1OOwj7BAksnzGC0rPz0UholwC+AgkqEl3EJX3M1A== -"@reduxjs/toolkit@^1.8.1": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.8.1.tgz#94ee1981b8cf9227cda40163a04704a9544c9a9f" - integrity sha512-Q6mzbTpO9nOYRnkwpDlFOAbQnd3g7zj7CtHAZWz5SzE5lcV97Tf8f3SzOO8BoPOMYBFgfZaqTUZqgGu+a0+Fng== +"@reduxjs/toolkit@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.0.1.tgz#0a5233c1e35c1941b03aece39cceade3467a1062" + integrity sha512-fxIjrR9934cmS8YXIGd9e7s1XRsEU++aFc9DVNMFMRTM5Vtsg2DCRMj21eslGtDt43IUf9bJL3h5bwUlZleibA== dependencies: - immer "^9.0.7" - redux "^4.1.2" - redux-thunk "^2.4.1" - reselect "^4.1.5" + immer "^10.0.3" + redux "^5.0.0" + redux-thunk "^3.1.0" + reselect "^5.0.1" "@remix-run/router@1.2.1": version "1.2.1" @@ -2528,10 +2528,10 @@ dependencies: "@types/react" "*" -"@types/redux-mock-store@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/redux-mock-store/-/redux-mock-store-1.0.3.tgz#895de4a364bc4836661570aec82f2eef5989d1fb" - integrity sha512-Wqe3tJa6x9MxMN4DJnMfZoBRBRak1XTPklqj4qkVm5VBpZnC8PSADf4kLuFQ9NAdHaowfWoEeUMz7NWc2GMtnA== +"@types/redux-mock-store@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/redux-mock-store/-/redux-mock-store-1.0.6.tgz#0a03b2655028b7cf62670d41ac1de5ca1b1f5958" + integrity sha512-eg5RDfhJTXuoJjOMyXiJbaDb1B8tfTaJixscmu+jOusj6adGC0Krntz09Tf4gJgXeCqCrM5bBMd+B7ez0izcAQ== dependencies: redux "^4.0.5" @@ -5252,10 +5252,10 @@ immer@^10.0.0: resolved "https://registry.yarnpkg.com/immer/-/immer-10.0.2.tgz#11636c5b77acf529e059582d76faf338beb56141" integrity sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA== -immer@^9.0.7: - version "9.0.19" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.19.tgz#67fb97310555690b5f9cd8380d38fc0aabb6b38b" - integrity sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ== +immer@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/immer/-/immer-10.0.3.tgz#a8de42065e964aa3edf6afc282dfc7f7f34ae3c9" + integrity sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A== immutable@^4.0.0, immutable@^4.2.1: version "4.3.4" @@ -7381,10 +7381,10 @@ react-property@2.0.0: resolved "https://registry.yarnpkg.com/react-property/-/react-property-2.0.0.tgz#2156ba9d85fa4741faf1918b38efc1eae3c6a136" integrity sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw== -react-redux@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.0.1.tgz#bbdbdd55d5c3b0e996975269b7d6101b80487139" - integrity sha512-d+S89OqyChnY2J0O8wv8boRgnGo0tjvxkMLV78wx7h2ZyJvyeOQcBg4yrm7IxY36gxc63iOCfjjQAyhohKWJbA== +react-redux@^9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.0.4.tgz#6892d465f086507a517d4b53eb589876e6bc8344" + integrity sha512-9J1xh8sWO0vYq2sCxK2My/QO7MzUMRi3rpiILP/+tDr8krBHixC6JMM17fMK88+Oh3e4Ae6/sHIhNBgkUivwFA== dependencies: "@types/use-sync-external-store" "^0.0.3" use-sync-external-store "^1.0.0" @@ -7582,18 +7582,23 @@ redux-immutable@^4.0.0: resolved "https://registry.yarnpkg.com/redux-immutable/-/redux-immutable-4.0.0.tgz#3a1a32df66366462b63691f0e1dc35e472bbc9f3" integrity sha1-Ohoy32Y2ZGK2NpHw4dw15HK7yfM= -redux-thunk@^2.2.0, redux-thunk@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.1.tgz#0dd8042cf47868f4b29699941de03c9301a75714" - integrity sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q== +redux-thunk@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" + integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== -redux@^4.0.5, redux@^4.1.1, redux@^4.1.2: +redux@^4.0.5: version "4.2.0" resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13" integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA== dependencies: "@babel/runtime" "^7.9.2" +redux@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.0.tgz#29572e29a439e094ff8fec46883fc45053f6736d" + integrity sha512-blLIYmYetpZMET6Q6uCY7Jtl/Im5OBldy+vNPauA8vvsdqyt66oep4EUpAMWNHauTC6xa9JuRPhRB72rY82QGA== + reflect.getprototypeof@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" @@ -7683,11 +7688,16 @@ 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.5: +reselect@^4.0.0: version "4.1.5" resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.5.tgz#852c361247198da6756d07d9296c2b51eddb79f6" integrity sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ== +reselect@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.0.1.tgz#587cdaaeb4e0e8927cff80ebe2bbef05f74b1648" + integrity sha512-D72j2ubjgHpvuCiORWkOUxndHJrxDaSolheiz5CO+roz8ka97/4msh2E8F5qay4GawR5vzBt5MkbDHT+Rdy/Wg== + resize-observer-polyfill@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"