@connect
works great when I'm trying to access the store within a react component. But how should I access it in some other bit of code. For eg: let's say I want to use an authorization token for creating my axios instance that can be used globally in my app, what would be the best way to achieve that?
This is my api.js
// tooling modules
import axios from 'axios'
// configuration
const api = axios.create()
api.defaults.baseURL = 'http://localhost:5001/api/v1'
api.defaults.headers.common['Authorization'] = 'AUTH_TOKEN' // need the token here
api.defaults.headers.post['Content-Type'] = 'application/json'
export default api
Now I want to access a data point from my store, here is what that would look like if I was trying to fetch it within a react component using @connect
// connect to store
@connect((store) => {
return {
auth: store.auth
}
})
export default class App extends Component {
componentWillMount() {
// this is how I would get it in my react component
console.log(this.props.auth.tokens.authorization_token)
}
render() {...}
}
Any insights or workflow patterns out there?
Like @sanchit proposed middleware is a nice solution if you are already defining your axios instance globally.
You can create a middleware like:
And use it like this:
It will set the token on every action but you could only listen for actions that change the token for example.
Export the store from the module you called createStore with. Then you are assured it will both be created and will not pollute the global window space.
MyStore.js
or
MyClient.js
or if you used default
For Multiple Store Use Cases
If you need multiple instances of a store, export a factory function. I would recommend making it
async
(returning apromise
).On the client (in an
async
block(Seems like
Middleware
is the way to go.Refer the official documentation and this issue on their repo
This question is quite old, but I think it worth sharing my idea.
Rather than storing token in redux store, I store it in memory.
* When app loaded, read TOKEN from AsyncStorage (or somewhere else) and set it to set it to
Here is a snippet code I have done.
Simply way to use it
Note that every time you refresh token, make sure to call updateToken({your token}) in order to keep it the latest.
This is another alternative I used in my project, and I wish go get your ideas.
For TypeScript 2.0 it would look like this:
MyStore.ts
MyClient.tsx
Found a solution. So I import the store in my api util and subscribe to it there. And in that listener function I set the axios' global defaults with my newly fetched token.
This is what my new
api.js
looks like:Maybe it can be further improved, cause currently it seems a bit inelegant. What I could do later is add a middleware to my store and set the token then and there.