Skip to content
Advertisement

replacing createStore with configureStore

I updated my packages and VScode told me that createStore was depreciated. So I went about replacing it

My store file, I have included the original line as a comment at the bottom

import { configureStore } from '@reduxjs/toolkit';
import { Action, createStore } from 'redux'

export type State = { context: AudioContext | null}

export const START_AUDIO = "startAudio";

const initialState = {context: null}
  
const reducer = (state: State = initialState, action: Action<String>) => {
    switch (action.type) {
        case START_AUDIO:
            if (state.context == null) {
                return {
                    ...state,
                    context: new AudioContext()
                }
            }
    }
    return state
}

export const Store = configureStore({reducer})
// export const Store = createStore(reducer)

Using redux

export function AudioContext() {
    const dispatch = useDispatch<Dispatch<Action<String>>>();
    const context = useSelector((state: State) => state.context)
    return (
        <button disabled={(context == null) ? false : true} onClick={() => dispatch({type: START_AUDIO}) }>Start Audio Context</button>
    )
}

App component

import '../styles/globals.css'
import Head from 'next/head'
import { Store } from '../code/util/store/store'
import { Provider } from 'react-redux'
import { AppProps } from 'next/app';

export default function MyApp({ Component, pageProps }: AppProps) {
  return (<>
    <Head>
      <title>Test App</title>
      <link rel="icon" href="/favicon.ico" />
    </Head>
    <Provider store={Store}>
      <Component {...pageProps} />
    </Provider>
  </>)
}

With configureStore() the console is giving me a warning about putting non-serizible objects in state. They say its possible but when I try to use it i get a Maximum call stack size error.

I have tried removing other uses (apart from setting it) of the redux state object and I still got both errors, I have also tried using a string, this removes the warning and the error. So it would seem that using an AudioContext in state isn’t supported any longer for whatever reason.

Am I doing this wrong? Should I stop using Redux for this? How else can I achieve this?

I found this issue on github however, according to my node_modules im running 7.18.0 of @babel/core

Advertisement

Answer

Generally, Redux is a state management tool – state meaning pretty much: data. Usually that data should be represented as a plain JavaScript object or array, not a class instance.

What you are doing here is more of a “dependency injection” use case: you have a certain class with provided functionality that you want to pass down to child components.

In this case I’d recommend you to use React Context, as Context is a dependency injection mechanism (but not very suited for state value propagation – but that’s nothing you want to do here in the first place).

User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement