Motivation
The first thing of motivation to make this library it was an idea to gather together all
features what my team is used in projects that we was designed in that time.
The second thing it is that what I wanted to make just open source library
to help people to decide own problems with which I faced. The third thing
it is that I wanted to grow up, and I wanted to involve more people to this project
and that they are also can design auxiliary library is better.
Functionality
Boilerplate
https://github.com/aleksdp/react-isomorphic-example
Descriptions
reducers
- authentication
- fetchData
- navigator
- modals
Authentication it is stores current user data, you can rewrite this reducer for yourself
FetchData - it is common reducer that stores all fetched data from remote server
Navigator reducer needs to store info about browser what you are using and current locale
Modals - it is common reducer to store data about opening or closing modals window
settings
You can define baseUrl, locale, userAgent like this:
import {
setBaseUrl,
setLocale,
setUserAgent
} from 'react-isomorphic-tools'
setBaseUrl('http://github.com/api')
setLocale('en')
setUserAgent(req.headers.get('user-agent'))
actions
Authorization
import {fetcher} from 'react-isomorphic-tools'
import {AUTH_LOGIN_SUCCESS, AUTH_LOGOUT_SUCCESS} from 'react-isomorphic-tools/lib/constants'
const onSubmit = async (form) => dispatch => {
const user = await fetcher('/login', {
method: 'POST',
params: {
login: form.login,
password: form.password
}
})
dispatch({
type: AUTH_LOGIN_SUCCESS,
payload: user
})
}
const logout = () => dispatch => {
dispatch({
type: AUTH_LOGOUT_SUCCESS
})
}
Navigator
import {setLocale, setUserAgent} from 'react-isomorphic-tools'
const defaultLocale = 'en'
const userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
store.dispatch(setLocale(defaultLocale))
store.dispatch(setUserAgent(userAgent))
It's more neccessary for server side rendering to define locale and userAgent that rendering will properly
Modals
import {openModal, closeModal, closeAllModals} from 'react-isomorphic-tools'
const open = () => dispatch => {
dispatch(openModal('test'))
}
const close = () => dispatch => {
dispatch(closeModal('test'))
}
const closeAll = () => dispatch => {
dispatch(closeAllModals())
}
Preload actions (fetchData reducer)
There are two options how to use fetchData
import {fetchToState} from 'react-isomorphic-tools'
const fetchItems = (userId) => dispatch => {
return dispatch(fetchToState('/posts', {
key: 'posts',
method: 'GET',
params: {
filter:{
userId
}
}
}))
}
import {fetcher} from 'react-isomorphic-tools'
import {request, success, fail} from 'react-isomorphic-tools/lib/actions/fetchToState'
const fetchItems = async (userId) => dispatch => {
const key = 'posts'
const object = {
method: 'GET',
params: {
filter:{
userId
}
}
}
const url = '/posts'
try{
request({key, request: {params: object.params, url}})
const posts = fetcher(url, object)
success({key, request: {params: object.params, url}, response: posts})
}
catch(e){
dispatch(fail({key, e}))
}
}
Don't you seem that the first example is simpler?) Yes, the function fetchToState just wrapped fetcher
but for it we need to define key, to tell reducer that we want to store data in defined key of store.
It's simple, we want to make these things simpler!
Usage fetchToState in Container
import React from 'react'
import {connect} from 'react-redux'
@connect(state=>({
posts: state.fetchData.posts && state.fetchData.posts.response,
postsObject: state.fetchData.posts
}))
export default class PostsContainer extends React.Component {
render(){
console.log(this.props.posts)
console.log(this.props.postsObject)
return null
}
}
fetcher && fetchToState
import {fetcher} from 'react-isomorphic-tools'
fetcher('/posts', {
method: 'GET',
params: {
filters: {
eq: 'freshly'
}
}
})
fetcher(url, options)
- options.params: object will stringify and attached to request body. Only for method GET it will attached to query string with
qs
library - options.queryParams: object will stringify with
qs
library and attached to query string for all method except GET method - options.type: null || form-data - default null, if defined form-data You can attach form data object to params it will attach directly instead of stringify to string
- options.baseUrl: string custom rewrite baseUrl for request
- options.method: string in APPERCASE || 'GET' - default
- options.customHeaders: object || default it uses internal object of header that includes authorization token
- options.key = string || 'undefined' - default // only for
fetchToState
Link & NavLink
import {Link, NavLink} from 'react-isomorphic-tools'
const component = () => {
return (
<div>
<Link {...props}/>
<NavLink {...props}/>
</div>
)
}
- props - the same that defined for react-router v4 with some changes
- props.to.query: object will stringify with
qs
library and attach to to.search :object