Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
a251419
chore(package): update react-testing-library to version 4.0.0
greenkeeper[bot] Jun 19, 2018
061d9c2
chore(package): update react-testing-library to version 4.0.1
greenkeeper[bot] Jun 19, 2018
0ce1b0a
chore(package): update rollup to version 0.61.0
greenkeeper[bot] Jun 20, 2018
bed9a0e
Merge pull request #7 from dleitee/greenkeeper/rollup-0.61.0
dleitee Jun 22, 2018
821f75f
fix(tests): Fix tests after updates on react-testing-library.
dleitee Jun 22, 2018
6ca0a68
Merge branch 'greenkeeper/react-testing-library-4.0.0' into greenkeep…
dleitee Jun 22, 2018
3675924
Merge pull request #11 from dleitee/greenkeeper/react-testing-library…
dleitee Jun 22, 2018
abf452b
Merge branch 'master' into greenkeeper/react-testing-library-4.0.0
dleitee Jun 22, 2018
ed52e59
Merge pull request #6 from dleitee/greenkeeper/react-testing-library-…
dleitee Jun 22, 2018
e387079
chore(package): update eslint-config-airbnb to version 17.0.0
greenkeeper[bot] Jun 22, 2018
46f5d6f
Merge pull request #12 from dleitee/greenkeeper/eslint-config-airbnb-…
dleitee Jun 22, 2018
022662d
chore(package): update eslint to version 5.0.0
greenkeeper[bot] Jun 23, 2018
bb7724e
Merge pull request #13 from dleitee/greenkeeper/eslint-5.0.0
dleitee Jun 24, 2018
0f3d922
chore(package): update rollup to version 0.62.0
greenkeeper[bot] Jun 27, 2018
7d867a9
Merge pull request #16 from dleitee/greenkeeper/rollup-0.62.0
dleitee Jun 28, 2018
5cf5ebe
fix(package): update fetches to version 0.2.0
greenkeeper[bot] Jun 30, 2018
dba229c
Merge pull request #17 from dleitee/greenkeeper/fetches-0.2.0
dleitee Jun 30, 2018
88828de
2.0.0-0
dleitee Jun 24, 2018
ee7c96b
feat(request): Set request component to have a children as a function.
dleitee Jun 24, 2018
16d26c8
chore(package): Update package.json
dleitee Jul 1, 2018
fb77dcc
feat(request): Add ability to do a basic request into Request component.
dleitee Jul 1, 2018
0f866b2
feat(request): Abort the promises when component will unmount.
dleitee Jul 1, 2018
66bb49b
style(eslint): Fix eslint errors.
dleitee Jul 1, 2018
931748e
feat(request): Add support to multiple requests in only one Request c…
dleitee Jul 1, 2018
585290a
feat(request): Add support to skip request.
dleitee Jul 1, 2018
f41f557
feat(request): Add support to config each fetch request.
dleitee Jul 1, 2018
c996a3c
feat(request): Add support to data as a props of Request component.
dleitee Jul 1, 2018
1252e96
feat(request): Add support to delay a request.
dleitee Jul 1, 2018
f4601df
feat(request): Add support to a poolInterval
dleitee Jul 1, 2018
f674f1a
v2.0.0-1 - Request Component
dleitee Jul 1, 2018
5c66397
v2.0.0-2 - Request Component
dleitee Jul 1, 2018
907c48f
fix(request): Fix type into pollInterval
dleitee Jul 1, 2018
fd4996a
v2.0.0-3 - Request Component - Fix typo
dleitee Jul 1, 2018
8897a62
Merge branch 'version/2.0.0' into feature/request-component
dleitee Jul 1, 2018
2a9232a
build(babel): Update babel plugins.
dleitee Jul 8, 2018
7a19cdc
refactor(fetches): Transform fetches into a peer dependency.
dleitee Jul 8, 2018
03dd509
feat(abort-controller): Use native AbortController to remove the libr…
dleitee Jul 8, 2018
39eacd2
build(eslint): Update eslint to ignore peerDependencies on import/no-…
dleitee Jul 8, 2018
724b14b
feat(request): Export Request component into index file.
dleitee Jul 8, 2018
e2eec75
test(jest): Add fetches as devDependency and set plugins into babelrc.
dleitee Jul 8, 2018
602f8d2
build(dependencies): Update fetches dependencies
dleitee Jul 9, 2018
f1169d1
feat(request): Add support to cache.
dleitee Jul 9, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 18 additions & 3 deletions .babelrc
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,26 @@
"plugins": ["transform-object-rest-spread"],
"env": {
"test": {
"presets": ["env", "react"]
"presets": ["env", "react"],
"plugins": [
"transform-class-properties",
["transform-runtime", {
"polyfill": false,
"regenerator": true
}]
]
},
"rollup": {
"presets": [["env", {"modules": false}], "react"],
"plugins": ["transform-object-rest-spread", "external-helpers"]
},
"plugins": [
"transform-object-rest-spread",
"external-helpers",
"transform-class-properties",
["transform-runtime", {
"polyfill": false,
"regenerator": true
}]
]
}
}
}
1 change: 1 addition & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
"newlines-between": "always"
}
],
"import/no-unresolved": ["error", { "ignore": ["fetches"] }],
"react/jsx-filename-extension": "off",
"arrow-parens": ["error", "as-needed"],
"prettier/prettier": [
Expand Down
23 changes: 14 additions & 9 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "react-fetches",
"version": "2.0.0-0",
"version": "2.0.0-3",
"description": "A new way to perform fetch requests with react.",
"main": "./lib/module.js",
"scripts": {
Expand All @@ -10,44 +10,49 @@
},
"repository": {
"type": "git",
"url": "git+https://github.com/dleitee/fetches.git"
"url": "git+https://github.com/dleitee/react-fetches.git"
},
"license": "ISC",
"bugs": {
"url": "https://github.com/dleitee/fetches/issues"
"url": "https://github.com/dleitee/react-fetches/issues"
},
"homepage": "https://github.com/dleitee/fetches#readme",
"homepage": "https://github.com/dleitee/react-fetches#readme",
"author": "Daniel Leite de Oliveira <dleitee@gmail.com> (https://github.com/dleitee)",
"dependencies": {
"fetches": "^0.1.3",
"lodash.frompairs": "^4.0.1",
"p-is-promise": "^1.1.0",
"prop-types": "^15.6.1",
"react": "^16.3.2",
"react-dom": "^16.4.0"
},
"peerDependencies": {
"fetches": "^0.2.1"
},
"devDependencies": {
"babel-core": "^6.26.3",
"babel-eslint": "^8.2.3",
"babel-jest": "^23.0.1",
"babel-plugin-external-helpers": "^6.22.0",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-object-rest-spread": "^6.26.0",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-env": "^1.7.0",
"babel-preset-react": "^6.24.1",
"dom-testing-library": "^2.3.2",
"eslint": "^4.19.1",
"eslint-config-airbnb": "^16.1.0",
"eslint": "^5.0.0",
"eslint-config-airbnb": "^17.0.0",
"eslint-config-cheesecakelabs": "^2.0.3",
"eslint-plugin-import": "^2.12.0",
"eslint-plugin-jsx-a11y": "^6.0.3",
"eslint-plugin-react": "^7.9.1",
"fetches": "^0.2.1",
"form-data": "^2.3.2",
"jest": "^23.1.0",
"lodash.get": "^4.4.2",
"nock": "^9.2.6",
"node-fetch": "^2.1.2",
"react-testing-library": "^3.1.3",
"rollup": "^0.60.0",
"react-testing-library": "^4.0.1",
"rollup": "^0.62.0",
"rollup-plugin-babel": "^3.0.4",
"rollup-plugin-commonjs": "^9.1.3",
"rollup-plugin-node-resolve": "^3.3.0"
Expand Down
2 changes: 1 addition & 1 deletion rollup.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export default {
format: 'cjs',
},
plugins: [
babel({ exclude: 'node_modules/**' }),
babel({ exclude: 'node_modules/**', runtimeHelpers: true }),
resolve({
modulesOnly: true,
jsnext: true,
Expand Down
46 changes: 46 additions & 0 deletions src/components/request/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import React from 'react'
import PropTypes from 'prop-types'

import { FetchesContext } from '../../context'

import RequestWrapper from './wrapper'

const Request = props => {
const { skip, children, uri, cache } = props
if (skip) {
return children({ data: null, error: null, loading: false })
}
return (
<FetchesContext.Consumer>
{({ client, setCache, getCache }) => (
<RequestWrapper client={client} getCache={getCache} setCache={setCache} {...props} />
)}
</FetchesContext.Consumer>
)
}

Request.propTypes = {
children: PropTypes.func.isRequired,
uri: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]),
method: PropTypes.oneOf(['get', 'post', 'patch', 'delete', 'put']),
multipleMethod: PropTypes.oneOf(['all', 'race']),
skip: PropTypes.bool,
config: PropTypes.object, // eslint-disable-line react/forbid-prop-types
data: PropTypes.object, // eslint-disable-line react/forbid-prop-types
delay: PropTypes.number,
pollInterval: PropTypes.number,
cache: PropTypes.bool,
}

Request.defaultProps = {
uri: '',
method: 'get',
multipleMethod: 'all',
skip: false,
config: {},
data: {},
delay: 0,
pollInterval: 0,
cache: false,
}
export default Request
152 changes: 152 additions & 0 deletions src/components/request/wrapper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
import React from 'react'
import PropTypes from 'prop-types'
import { Client, getHTTPMethods } from 'fetches'

const cacheable = setCache => response => {
setCache(response)
return Promise.resolve(response)
}

const getClient = (client, cache, setCache) => {
if (!cache) {
return client
}
return client.appendAfterMiddleware(cacheable(setCache))
}

class RequestWrapper extends React.Component {
controller = AbortController ? new AbortController() : {}

timeout = null

interval = null

unmounted = false

memoryAddress = null

state = {
loading: true,
error: null,
data: null,
}

constructor(props) {
super(props)
this.memoryAddress = JSON.stringify(props.uri)
}

componentDidMount() {
const { client, delay, pollInterval, setCache, cache } = this.props
const setCacheWithAddress = setCache.bind(null, this.memoryAddress)
const configuredClient = getClient(client, cache, setCacheWithAddress)
const http = getHTTPMethods(configuredClient)
if (pollInterval) {
this.delayRequest().then(() => {
this.interval = setInterval(() => this.resolvePromise(http), pollInterval)
})
return
}
if (delay) {
this.delayRequest().then(() => this.resolvePromise(http))
return
}
this.resolvePromise(http)
}

componentWillUnmount() {
this.unmounted = true
if (this.controller.abort) {
this.controller.abort()
}
clearTimeout(this.timeout)
clearInterval(this.interval)
}

getRequest = (http, uri, props) => {
const { method, data, config } = props
const { signal } = this.controller

return http[method.toLowerCase()](uri, data, Object.assign({}, config, { signal }))
}

getStateResponse = (error, data) => {
if (this.unmounted) {
return null
}
return this.setState({
error,
data,
loading: false,
})
}

delayRequest = () => {
const { delay } = this.props
return new Promise(resolve => {
this.timeout = setTimeout(() => {
resolve()
}, delay)
})
}

resolvePromise = http => {
this.handlePromise(http, this.props)
.then(data => {
this.getStateResponse(null, data)
})
.catch(error => {
this.getStateResponse(error, null)
})
}

handlePromise = (http, props) => {
const { uri, cache, getCache } = props

const cacheResult = getCache(this.memoryAddress)
if (cache && cacheResult) {
return Promise.resolve(cacheResult)
}

if (Array.isArray(uri)) {
return this.handleMultiplePromises(http, props)
}
return this.handleSinglePromise(http, props)
}

handleSinglePromise = (http, props) => {
const { uri } = props
return this.getRequest(http, uri, props)
}

handleMultiplePromises = (http, props) => {
const { multipleMethod, uri } = props
const promises = uri.map(item => this.getRequest(http, item, props))
return Promise[multipleMethod](promises)
}

render() {
const { children } = this.props
const { loading, error, data } = this.state
return children({
loading,
error,
data,
})
}
}

RequestWrapper.propTypes = {
client: PropTypes.instanceOf(Client).isRequired,
children: PropTypes.func.isRequired,
uri: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]).isRequired, // eslint-disable-line react/no-unused-prop-types
method: PropTypes.oneOf(['get', 'post', 'patch', 'delete', 'put']).isRequired, // eslint-disable-line react/no-unused-prop-types
multipleMethod: PropTypes.oneOf(['all', 'race']).isRequired, // eslint-disable-line react/no-unused-prop-types
config: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types,react/no-unused-prop-types
data: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types,react/no-unused-prop-types
delay: PropTypes.number.isRequired,
pollInterval: PropTypes.number.isRequired,
cache: PropTypes.bool.isRequired,
}

export default RequestWrapper
12 changes: 8 additions & 4 deletions src/connect.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,27 @@ const connect = (mapRequestsToProps, mapDispatchToProps) => WrappedComponent =>
...this.getDispatchAsProps(),
}
}

componentDidMount() {
if (!this.props.client) {
const { client } = this.props
if (!client) {
return
}
this.getResponseAsProps()
}

getDispatchAsProps() {
const { client } = this.props
if (mapDispatchToProps) {
return makeDispatches(this.props.client)(mapDispatchToProps)
return makeDispatches(client)(mapDispatchToProps)
}
return {}
}

getResponseAsProps() {
const { client } = this.props
if (mapRequestsToProps) {
makeRequests(this.props.client, props => {
makeRequests(client, props => {
const responses = makeResponses(props)

this.setState(() => ({
Expand All @@ -59,7 +63,7 @@ const connect = (mapRequestsToProps, mapDispatchToProps) => WrappedComponent =>

const FecthesComponent = props => (
<FetchesContext.Consumer>
{client => <Wrapper client={client} {...props} />}
{({ client }) => <Wrapper client={client} {...props} />}
</FetchesContext.Consumer>
)
return FecthesComponent
Expand Down
2 changes: 1 addition & 1 deletion src/context.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
import * as React from 'react'

export const FetchesContext = React.createContext(null)
export const FetchesContext = React.createContext({ client: null })
4 changes: 4 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
import Request from './components/request'

export * from './provider'
export * from './connect'

export { Request }
Loading