# Eventrix

| **Method**     | **attributes**                | **description**                                                                    |
| -------------- | ----------------------------- | ---------------------------------------------------------------------------------- |
| constructor    | initialState, eventsReceivers | Eventrix class constructor                                                         |
| listen         | eventName, listener           | Add event listener                                                                 |
| unlisten       | eventName, listener           | Remove event listener                                                              |
| emit           | eventName, eventData          | Emit event for eventrix instance it will run listeners and events receivers        |
| getState       | path                          | Get eventrix state                                                                 |
| useReceiver    | eventsReceiver                | Register events receiver in eventrix instance it will be used on events emitted    |
| removeReceiver | eventsReceiver                | Unregister events receiver from eventrix instance                                  |
| getParent      | -                             | Get parent eventrix instance                                                       |
| getFirstParent | -                             | Get first parent eventrix instance                                                 |
| create         | scopes                        | Create eventrix instance with scopes                                               |
| onError        | errorCallback                 | callback function to catch errors in receivers and listeners called on emit events |

#### Example of simple use of Eventrix

{% tabs %}
{% tab title="Javascript" %}

```jsx
import { Eventrix, EventsReceiver } from 'eventrix';

const usersEventsReceiver = new EventsReceiver(
    'createUserEventName',
    (eventName, eventData, stateManager) => {
        const user = eventData.user;
        const users = stateManager.getState('usersList');
        stateManager.setState('usersList', [user, ...users]);
    }
);

const initialState = {
    usersList: [],
}

const eventsReceivers = [
    usersEventsReceiver,
];

const eventrix = new Eventrix(initialState, eventsReceivers);

export default eventrix;
```

{% endtab %}

{% tab title="Typescript" %}

```typescript
import { Eventrix, EventsReceiver } from 'eventrix';
import StateManager from 'eventrix/types/StateManager';

interface User {
    id: number;
    name: string;
    age: number;
}

interface UserEventData {
    user: User;
}

interface StoreState {
    usersList: User[];
}

const usersEventsReceiver = new EventsReceiver<UserEventData, void>(
    'createUserEventName',
    (eventName, eventData, stateManager) => {
        const user = eventData.user;
        const users = stateManager.getState('usersList');
        stateManager.setState('usersList', [user, ...users]);
    }
);

const initialState = {
    usersList: [],
}

const eventsReceivers = [
    usersEventsReceiver,
];

const eventrix = new Eventrix<StoreState>(initialState, eventsReceivers);

export default eventrix;
```

{% endtab %}
{% endtabs %}

When You emit event with name "createUserEventName" usersEventsReceiver will be invoked and change state of "usersList".

{% tabs %}
{% tab title="Javascript" %}

```javascript
const user = {
    id: 1,
    name: 'Max',
    age: 30,
}

eventrix.emit('createUserEventName', { user });
```

{% endtab %}

{% tab title="Second Tab" %}

```typescript
const user: User = {
    id: 1,
    name: 'Max',
    age: 30,
}

eventrix.emit<UserEventData>('createUserEventName', { user });
```

{% endtab %}
{% endtabs %}
