Add requireSignInWrapper generator

This commit is contained in:
Kyle Corbelli 2017-09-18 12:43:09 -07:00
parent c7828ba00a
commit 3332f78e95
7 changed files with 218 additions and 12 deletions

8
index.d.ts vendored
View File

@ -1,6 +1,12 @@
import { Reducer } from 'redux'
import { ActionsGeneratorExport } from './src/types'
import {
ActionsGeneratorExport,
GenerateRequireSignInWrapperConfig,
RequireSignInWrapper,
} from './src/types'
export const reduxTokenAuthReducer: Reducer<{}>
export const generateAuthActions: ActionsGeneratorExport
export const generateRequireSignInWrapper: (config: GenerateRequireSignInWrapperConfig) => RequireSignInWrapper

150
package-lock.json generated
View File

@ -1,6 +1,6 @@
{
"name": "redux-token-auth",
"version": "0.10.0",
"version": "0.15.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -10,6 +10,20 @@
"integrity": "sha512-+vFMPCwOffrTy685X9Kj+Iz83I56Q8j0JK6xvsm6TA5qxbtPUJZcXtJY05WMGlhCKp/9qbpRCwyOp6GkMuyuLg==",
"dev": true
},
"@types/react": {
"version": "16.0.5",
"resolved": "https://registry.npmjs.org/@types/react/-/react-16.0.5.tgz",
"integrity": "sha512-Wo/JT6Cpl7XuLA1Ov2M2Rso4Tep7rX6h1csbqhNDaSxqeY8nxUbrDkT6vJrKVu+7tw7vmJP9libZSReV9GsG9A=="
},
"@types/react-redux": {
"version": "5.0.9",
"resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-5.0.9.tgz",
"integrity": "sha512-at3+d71RHz6NOqmv2a9p82sjkwQl81n8glTk/LTcD/oB2xSFrfH4K2ThZjwuVcP7ZyD1MlPEkNq+Z5CckYJgNw==",
"requires": {
"@types/react": "16.0.5",
"redux": "3.7.2"
}
},
"abab": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz",
@ -143,6 +157,11 @@
"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
"dev": true
},
"asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
},
"asn1": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
@ -626,6 +645,16 @@
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true
},
"create-react-class": {
"version": "15.6.0",
"resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.0.tgz",
"integrity": "sha1-q0SEl8JlZuHilBPogyB9V8/nvtQ=",
"requires": {
"fbjs": "0.8.15",
"loose-envify": "1.3.1",
"object-assign": "4.1.1"
}
},
"cross-spawn": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
@ -738,6 +767,14 @@
"jsbn": "0.1.1"
}
},
"encoding": {
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
"integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
"requires": {
"iconv-lite": "0.4.13"
}
},
"errno": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz",
@ -986,6 +1023,27 @@
"bser": "2.0.0"
}
},
"fbjs": {
"version": "0.8.15",
"resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.15.tgz",
"integrity": "sha1-TwaV/fzBbDfAsH+s7Iy0xAkWhbk=",
"requires": {
"core-js": "1.2.7",
"isomorphic-fetch": "2.2.1",
"loose-envify": "1.3.1",
"object-assign": "4.1.1",
"promise": "7.3.1",
"setimmediate": "1.0.5",
"ua-parser-js": "0.7.14"
},
"dependencies": {
"core-js": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
"integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
}
}
},
"filename-regex": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
@ -2138,6 +2196,11 @@
"integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
"dev": true
},
"hoist-non-react-statics": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz",
"integrity": "sha1-ND24TGAYxlB3iJgkATWhQg7iLOA="
},
"home-or-tmp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
@ -2177,8 +2240,7 @@
"iconv-lite": {
"version": "0.4.13",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz",
"integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=",
"dev": true
"integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI="
},
"imurmurhash": {
"version": "0.1.4",
@ -2206,7 +2268,6 @@
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
"integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
"dev": true,
"requires": {
"loose-envify": "1.3.1"
}
@ -2324,8 +2385,7 @@
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
"dev": true
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
},
"is-typedarray": {
"version": "1.0.0",
@ -2360,6 +2420,15 @@
"isarray": "1.0.0"
}
},
"isomorphic-fetch": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
"integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
"requires": {
"node-fetch": "1.7.3",
"whatwg-fetch": "2.0.3"
}
},
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@ -3452,6 +3521,15 @@
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true
},
"node-fetch": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
"integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
"requires": {
"encoding": "0.1.12",
"is-stream": "1.1.0"
}
},
"node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@ -3521,8 +3599,7 @@
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
"object.omit": {
"version": "2.0.1",
@ -3768,6 +3845,23 @@
"integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=",
"dev": true
},
"promise": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
"requires": {
"asap": "2.0.6"
}
},
"prop-types": {
"version": "15.5.10",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz",
"integrity": "sha1-J5ffwxJhguOpXj37suiT3ddFYVQ=",
"requires": {
"fbjs": "0.8.15",
"loose-envify": "1.3.1"
}
},
"prr": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz",
@ -3833,6 +3927,31 @@
}
}
},
"react": {
"version": "15.6.1",
"resolved": "https://registry.npmjs.org/react/-/react-15.6.1.tgz",
"integrity": "sha1-uqhDTsZ4C96ZfNw4C3nNM7ljk98=",
"requires": {
"create-react-class": "15.6.0",
"fbjs": "0.8.15",
"loose-envify": "1.3.1",
"object-assign": "4.1.1",
"prop-types": "15.5.10"
}
},
"react-redux": {
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.6.tgz",
"integrity": "sha512-8taaaGu+J7PMJQDJrk/xiWEYQmdo3mkXw6wPr3K3LxvXis3Fymiq7c13S+Tpls/AyNUAsoONkU81AP0RA6y6Vw==",
"requires": {
"hoist-non-react-statics": "2.3.1",
"invariant": "2.2.2",
"lodash": "4.17.4",
"lodash-es": "4.17.4",
"loose-envify": "1.3.1",
"prop-types": "15.5.10"
}
},
"read-pkg": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
@ -4037,6 +4156,11 @@
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true
},
"setimmediate": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
"integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
},
"shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
@ -4705,6 +4829,11 @@
"integrity": "sha1-A4qV99m7tCCxvzW6MdTFwd0//jQ=",
"dev": true
},
"ua-parser-js": {
"version": "0.7.14",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.14.tgz",
"integrity": "sha1-EQ1T+kw/MmwSEpK76skE0uAzh8o="
},
"uglify-js": {
"version": "2.8.29",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
@ -4816,6 +4945,11 @@
"iconv-lite": "0.4.13"
}
},
"whatwg-fetch": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz",
"integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ="
},
"whatwg-url": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz",

View File

@ -45,7 +45,11 @@
"typescript": "^2.5.2"
},
"dependencies": {
"@types/react": "^16.0.5",
"@types/react-redux": "^5.0.9",
"axios": "^0.16.2",
"react": "^15.6.1",
"react-redux": "^5.0.6",
"redux": "^3.7.2"
}
}

View File

@ -0,0 +1,49 @@
import * as React from 'react'
import { ComponentClass } from 'react'
import { connect } from 'react-redux'
import {
GenerateRequireSignInWrapperConfig,
ReduxState,
RequireSignInWrapper,
} from './types'
const generateRequireSignInWrapper = (
{ redirectPathIfNotSignedIn }: GenerateRequireSignInWrapperConfig
): RequireSignInWrapper => {
const requireSignInWrapper = (PageComponent: ComponentClass): ComponentClass => {
interface WrapperProps {
readonly isSignedIn: boolean
readonly history: {
readonly replace: (path: string) => void
}
}
class GatedPage extends React.Component<WrapperProps> {
public componentWillMount (): void {
const {
history,
isSignedIn,
} = this.props
if (!isSignedIn) {
history.replace(redirectPathIfNotSignedIn)
}
}
public render (): JSX.Element {
return <PageComponent {...this.props} />
}
}
const mapStateToProps = (state: ReduxState) => ({
isSignedIn: state.reduxTokenAuth.currentUser.isSignedIn
})
return connect(
mapStateToProps,
)(GatedPage)
}
return requireSignInWrapper
}
export default generateRequireSignInWrapper

View File

@ -1,7 +1,9 @@
import generateAuthActions from './actions'
import reduxTokenAuthReducer from './reducers'
import generateRequireSignInWrapper from './generate-require-signin-wrapper'
export {
generateAuthActions,
generateRequireSignInWrapper,
reduxTokenAuthReducer,
}

View File

@ -1,8 +1,8 @@
import {
ReduxState
ReduxTokenAuthState
} from './types'
const initialState: ReduxState = {
const initialState: ReduxTokenAuthState = {
currentUser: {
isSignedIn: false,
isLoading: false,

View File

@ -1,3 +1,4 @@
import { ComponentClass } from 'react'
import {
Dispatch,
Store,
@ -13,10 +14,14 @@ export interface User {
readonly attributes: UserAttributes
}
export interface ReduxState {
export interface ReduxTokenAuthState {
readonly currentUser: User
}
export interface ReduxState {
readonly reduxTokenAuth: ReduxTokenAuthState
}
export interface AuthHeaders {
readonly 'access-token': string
readonly 'token-type': string
@ -179,3 +184,9 @@ export type ActionsGeneratorExport = (config: { [key: string]: any }) => Actions
export interface SingleLayerStringMap {
[key: string]: string
}
export interface GenerateRequireSignInWrapperConfig {
readonly redirectPathIfNotSignedIn: string
}
export type RequireSignInWrapper = (PageComponent: ComponentClass) => ComponentClass