README.md 6.29 KB
Newer Older
Carlos Panato's avatar
Carlos Panato committed
1
# Mattermost Redux ![CircleCI branch](https://img.shields.io/circleci/project/github/mattermost/mattermost-redux/release-5.11.svg)
2

3
The project purpose is consolidating the storage, web utilities and logic of the webapp and React Native mobile clients into a single driver. We encourage you to use mattermost-redux to power your own Mattermost clients or integrations.
4

Joram Wilander's avatar
Joram Wilander committed
5
[Redux](http://redux.js.org/docs/introduction/) is the backbone for this project and many of the design decisions and patterns stem from it.
6

Joram Wilander's avatar
Joram Wilander committed
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
Mattermost is an open source Slack-alternative used by thousands of companies around the world in more than 12 languages. Learn more at https://mattermost.com.

# Usage

### Basic Usage

To hook up your application to the mattermost-redux store:

```
import configureServiceStore from 'mattermost-redux/store';

configureServiceStore(yourInitialState, yourAppReducers, yourOfflineOptions);

const store = configureStore();

// use store
```

* `yourInitialState` - any initial state for any extra reducers you may have (set to `{}` if none)
* `yourAppReducers` - any reducers from your app (set to `{}` if none)
* `yourOfflineOptions` - any offline options, specified using [this redux-offline configuration object](https://github.com/jevakallio/redux-offline#configuration-object)

### Web Client Usage

If you're only looking to use the v4 JavaScript web client for the Mattermost server:

33
With async/await:
Joram Wilander's avatar
Joram Wilander committed
34 35 36 37 38 39
```
import {Client4} from 'mattermost-redux/client';

Client4.setUrl('https://your-mattermost-url.com');

async function loginAndGetUser(username, password) {
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
    try {
        await Client4.login(username, password);
    } catch (error) {
        console.error(error);
        return null;
    }

    let user;
    try {
        user = await Client4.getMe();
    } catch (error) {
        console.error(error);
        return null;
    }

    return user;
Joram Wilander's avatar
Joram Wilander committed
56 57 58 59
}

```

60 61 62 63 64 65 66
With promises:
```
import {Client4} from 'mattermost-redux/client';

Client4.setUrl('https://your-mattermost-url.com');

function loginAndGetUser(username, password, callback) {
67 68 69 70 71
    Client4
        .login(username, password)
        .then(Client4.getMe)
        .then(callback)
        .catch(console.error);
72 73 74
}
```

Joram Wilander's avatar
Joram Wilander committed
75 76 77 78 79 80 81 82 83
If you already have a [personal access token](https://docs.mattermost.com/guides/developer/personal-access-tokens.html) or session token, you can set the token manually instead of logging in:

```
import {Client4} from 'mattermost-redux/client';

Client4.setUrl('https://your-mattermost-url.com');
Client4.setToken(yourToken);
```

Brett McBride's avatar
Brett McBride committed
84 85 86 87 88 89 90 91 92 93
### Browser Usage

To build a browser-compatible client via `webpack`:

```
$ git clone <this repo>
$ cd mattermost-redux
$ make bundle
```

94
This will generate `lib/mattermost.client4.js`, and `lib/mattermost.websocket.js` which can be loaded in a browser. Also note that `babel-polyfill` is required.
Brett McBride's avatar
Brett McBride committed
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

```
<script src="/path/to/babel/polyfill.js"></script>
<script src="/path/to/mattermost.client4.js"></script>
<script src="/path/to/mattermost.websocket.js"></script>
<script type="text/javascript">
    const client = Mattermost.client4.default();
    const wsClient = Mattermost.websocket.default;
    var token;
    client.setUrl('https://your-mattermost-url.com');
    /* use an existing personal access token */
    client.setToken('yourToken');
    client.setIncludeCookies(false);
    /* login and obtain a token */
    client.login(username, password)
    .then(function(user){
        console.log(`Logged in as ${user.email}`);
        token = client.getToken();
    })
    .then(function(){
        wsClient.initialize(token, {}, {}, {connectionUrl: 'wss://your-mattermost-url.com/api/v4/websocket'});
    })
    .catch(function(err){
        console.error(err);
    });
</script>
```

Brett McBride's avatar
Brett McBride committed
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
### node.js Usage

Running the client from node.js requires making the `fetch` and `WebSocket` packages globally available, and the use of `babel-polyfill`:

```
require('babel-polyfill');
require('isomorphic-fetch');
if (!global.WebSocket) {
    global.WebSocket = require('ws');
}
const Client4 = require('./client/client4.js').default;
const client = new Client4;
const wsClient = require('./client/websocket_client.js').default;
var token;

wsClient.setEventCallback(function(event){
    console.log(event);
});

client.setUrl('https://your-mattermost-url.com');
client.login(username, password)
.then(function(me){
    console.log(`logged in as ${me.email}`);
    token = client.getToken();
})
.then(function(){
    wsClient.initialize(token, {}, {}, {connectionUrl: 'wss://your-mattermost-url.com/api/v4/websocket'});
})
.catch(function(err){
    console.error(err);
});
```

156 157
# How to Contribute

158 159
### How to Build mattermost-redux

160 161 162 163 164 165 166 167 168
You only need to build mattermost-redux if you are developing it. 

#### Webapp Development
If your mattermost-webapp and mattermost-redux are in the same directory, you only 
need to run `npm run dev` or `npm run dev:watch`.
 
If you have mattermost-webapp in other directory or you are developing your own 
application, you can define the environment variable `WEBAPP_DIR` to change the 
destination app
JoramWilander's avatar
JoramWilander committed
169
(e. g. `WEBAPP_DIR=/tmp/mattermost-webapp`).
170

171 172 173 174 175 176 177 178 179 180 181
#### React Native (Mobile) Development
If your mattermost-mobile and mattermost-redux are in the same directory, you only 
need to run `npm run dev-mobile` or `npm run dev-mobile:watch`.
 
If you have mattermost-mobile in other directory or you are developing your own 
application, you can define the environment variable `MOBILE_DIR` to change the 
destination app
(e. g. `MOBILE_DIR=/tmp/mattermost-mobile`).

#### Resetting apps to use package redux
If you want to go back to using the package specified redux in your web or mobile
182
app you can stop the server and run `rm -rf .npminstall` to force
183 184
your project to reset to the specified package version on next server start.  

185
### Contribute Code
186

187 188 189
If you're contributing to help [migrate the webapp to Redux](https://docs.mattermost.com/developer/webapp-to-redux.html) go ahead and submit your PR. If you're just fixing a small bug or adding a small improvement then feel free to submit a PR for it. For everything else, please either work on an issue labeled `[Help Wanted]` or open an issue if there's something else that you'd like to work on.

Feel free to drop by [the Redux channel](https://pre-release.mattermost.com/core/channels/redux) on our Mattermost instance.
190 191 192

### Running the Tests

193
`make test` will run the unit tests against a mocked server.