Appearance
Redux integration
To integrate Redux state manager with Alette Signal, install Redux first:
sh
pnpm add @reduxjs/toolkit@latestsh
npm install @reduxjs/toolkit@latestsh
yarn add @reduxjs/toolkit@latestExposing store to middleware
To expose Redux store to middleware, pass Redux store functions to api context:
ts
// 'src/api/base.ts'
import { client, setContext } from '@alette/signal';
import { store } from '../store';
declare module "@alette/signal" {
interface IGlobalContext {
getState: typeof store.getState,
dispatch: typeof store.dispatch,
}
}
export const api = client(
setContext({
getState: store.getState,
dispatch: store.dispatch,
}),
);WARNING
Passing entire Redux store object to the api context is not recommended - dispatch() and getState() is enough for most use cases.
Dispatching actions
To dispatch a Redux action, extract the dispatch() function from the api context and call it with an action:
ts
import { showNotification } from '../store/notifications/actions';
const deletePost = mutation(
/*...*/
tap((deletedPost, { context: { dispatch } }) => {
dispatch(showNotification({
title: `Post "${deletedPost.title}" was successfully deleted.`
}))
})
);Selecting state
To select state using Redux selectors, get Redux state by calling getState() extracted from the api context, and pass it to a redux selector:
ts
import { showNotification } from '../store/notifications/actions';
import { getCurrentUser } from '../store/user/selectors';
const deletePost = mutation(
/*...*/
tap((deletedPost, { context: { dispatch, getState } }) => {
const { name } = getCurrentUser(getState());
dispatch(
showNotification({
title: `Post "${deletedPost.title}" was deleted `
+ `by "${name}".`
})
)
})
);