undux
Version:
Dead simple state management for React
55 lines (47 loc) • 1.32 kB
text/typescript
import { StoreDefinition } from '..'
export function withReduxDevtools<State extends object>(
store: StoreDefinition<State>,
): StoreDefinition<State> {
let devtools = window.__REDUX_DEVTOOLS_EXTENSION__
if (!devtools) {
console.error(
'Undux withReduxDevtools plugin: Cannot find Redux Devtools browser extension. Is it installed?',
)
return store
}
let devTools = devtools.connect()
let wasTriggeredByDevtools = false
let jumpToState = (newState: State) => {
let oldState = store.getState()
for (let key in newState) {
if (key in oldState) {
wasTriggeredByDevtools = true
store.set(key as keyof State)(newState[key as keyof State])
wasTriggeredByDevtools = false
}
}
}
devTools.subscribe((message) => {
switch (message.type) {
case 'START':
devTools.send(null, store.getState())
return
case 'DISPATCH':
if (!message.state) {
return
}
switch (message.payload.type) {
case 'JUMP_TO_ACTION':
case 'JUMP_TO_STATE':
jumpToState(JSON.parse(message.state))
}
}
})
store.onAll().subscribe(({ key }) => {
if (wasTriggeredByDevtools) {
return
}
devTools.send(key, store.getState())
})
return store
}