Skip to content

qiwi/redux-signal-bus

Folders and files

NameName
Last commit message
Last commit date

Latest commit

656842e · Jul 26, 2019

History

45 Commits
Jul 26, 2019
Jul 5, 2018
Jul 26, 2019
Jul 26, 2019
Jul 26, 2019
Jul 26, 2019
Jul 26, 2019
Oct 10, 2018
Feb 18, 2019
Jul 5, 2018
Jul 26, 2019
Jul 26, 2019
Jun 16, 2019
Jul 26, 2019

Repository files navigation

redux-signal-bus

buildStatus dependencyStatus devDependencyStatus Maintainability js-standard-style coverage

We'll create our own notification bus with ttl, filters, blackjack and hookers over redux.

Install

    yarn add @qiwi/redux-signal-bus
    npm i @qiwi/redux-signal-bus

Usage

Inject to store

Since store.getReducer was replaced from redux, there's no tricky way to inject reducer to chain. So you need to wrap bus instance manually in accordance to your app architecture

    const bus = new Bus()
    const store = createStore({[bus.getScope()]: bus.getReducer(), ...})
    bus.configure({store})
Bind with component
    class Item extends Component {
      render (props) {
        return props.bus.listen('foo')
      }
    }
    export default bus.connect(Item)

Don't forget to wrap your app with redux provider

    <Provider store={store}><App/></Provider>

or just inject the store by hand

    const ItemWithBus = bus.connect(Item)
    const component = new ItemWithBus({store})
Bus API
    export type IFilterValue = | string | RegExp | Function | any
    export interface IBus {
        scope: string;
        store: IStore;
        dispatcher: IDispatcher;
        
        constructor(): IBus;
        configure(opts: IBusOpts): IBus;
        emit(name: string, data?: ?any, ttl?: ?number, silent: ?ISilent): void;
        listen(value: IFilterValue, silent: ?ISilent, skipCompact: ?boolean): ISignalStack;
        erase(value: IFilterValue, silent: ?ISilent): ISignalStack;
        capture(value: IFilterValue, silent: ?ISilent): ISignalStack;
        connect(component: IReactComponent): IReactComponent;
        getReducer(): IReducer;
        getScope(): string;
        hashUpdate(): void
    }

Usage examples are placed in ./example dir. In general it looks like this:

import bus from '../bus'
import React, {Component} from 'react'

class BarComponent extends Component {
  render(props) {
    return (<div>
      Signals from from the 'FooComponent':
      {props.bus.listen('foo').map(({data}) => JSON.stringify(data)).join(', ')}
    </div>)
  }
}

export default bus.connect(BarComponent)