Merge pull request #13 from kylecorbelli/add-require-signin-wrapper-component

Add require signin wrapper component
This commit is contained in:
Kyle Corbelli 2017-09-18 15:36:56 -07:00 committed by GitHub
commit 51b24e7c22
15 changed files with 277 additions and 18 deletions

50
dist/generate-require-signin-wrapper.js vendored Normal file
View File

@ -0,0 +1,50 @@
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
var React = require("react");
var react_redux_1 = require("react-redux");
var generateRequireSignInWrapper = function (_a) {
var redirectPathIfNotSignedIn = _a.redirectPathIfNotSignedIn;
var requireSignInWrapper = function (PageComponent) {
var GatedPage = /** @class */ (function (_super) {
__extends(GatedPage, _super);
function GatedPage() {
return _super !== null && _super.apply(this, arguments) || this;
}
GatedPage.prototype.componentWillMount = function () {
var _a = this.props, history = _a.history, isSignedIn = _a.isSignedIn;
if (!isSignedIn) {
history.replace(redirectPathIfNotSignedIn);
}
};
GatedPage.prototype.render = function () {
return React.createElement(PageComponent, __assign({}, this.props));
};
return GatedPage;
}(React.Component));
var mapStateToProps = function (state) { return ({
isSignedIn: state.reduxTokenAuth.currentUser.isSignedIn
}); };
return react_redux_1.connect(mapStateToProps)(GatedPage);
};
return requireSignInWrapper;
};
exports.default = generateRequireSignInWrapper;
//# sourceMappingURL=generate-require-signin-wrapper.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"generate-require-signin-wrapper.js","sourceRoot":"","sources":["../src/generate-require-signin-wrapper.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,6BAA8B;AAE9B,2CAAqC;AAOrC,IAAM,4BAA4B,GAAG,UACnC,EAAiE;QAA/D,wDAAyB;IAE3B,IAAM,oBAAoB,GAAG,UAAC,aAA6B;QAQzD;YAAwB,6BAA6B;YAArD;;YAcA,CAAC;YAbQ,sCAAkB,GAAzB;gBACQ,IAAA,eAGQ,EAFZ,oBAAO,EACP,0BAAU,CACE;gBACd,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;oBAChB,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAA;gBAC5C,CAAC;YACH,CAAC;YAEM,0BAAM,GAAb;gBACE,MAAM,CAAC,oBAAC,aAAa,eAAK,IAAI,CAAC,KAAK,EAAI,CAAA;YAC1C,CAAC;YACH,gBAAC;QAAD,CAAC,AAdD,CAAwB,KAAK,CAAC,SAAS,GActC;QAED,IAAM,eAAe,GAAG,UAAC,KAAiB,IAAK,OAAA,CAAC;YAC9C,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,UAAU;SACxD,CAAC,EAF6C,CAE7C,CAAA;QAEF,MAAM,CAAC,qBAAO,CACZ,eAAe,CAChB,CAAC,SAAS,CAAC,CAAA;IACd,CAAC,CAAA;IAED,MAAM,CAAC,oBAAoB,CAAA;AAC7B,CAAC,CAAA;AAED,kBAAe,4BAA4B,CAAA"}

2
dist/index.js vendored
View File

@ -4,4 +4,6 @@ var actions_1 = require("./actions");
exports.generateAuthActions = actions_1.default;
var reducers_1 = require("./reducers");
exports.reduxTokenAuthReducer = reducers_1.default;
var generate_require_signin_wrapper_1 = require("./generate-require-signin-wrapper");
exports.generateRequireSignInWrapper = generate_require_signin_wrapper_1.default;
//# sourceMappingURL=index.js.map

2
dist/index.js.map vendored
View File

@ -1 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,qCAA2C;AAIzC,8BAJK,iBAAmB,CAIL;AAHrB,uCAA8C;AAI5C,gCAJK,kBAAqB,CAIL"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,qCAA2C;AAKzC,8BALK,iBAAmB,CAKL;AAJrB,uCAA8C;AAM5C,gCANK,kBAAqB,CAML;AALvB,qFAA4E;AAI1E,uCAJK,yCAA4B,CAIL"}

View File

@ -8,4 +8,4 @@ var initialState = {
},
};
exports.default = initialState;
//# sourceMappingURL=initial-state.js.map
//# sourceMappingURL=initial-state.js.map

View File

@ -1 +1 @@
{"version":3,"file":"initial-state.js","sourceRoot":"","sources":["../src/initial-state.ts"],"names":[],"mappings":";;AAIA,IAAM,YAAY,GAAe;IAC/B,WAAW,EAAE;QACX,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,EAAE;KACf;CACF,CAAA;AAED,kBAAe,YAAY,CAAA"}
{"version":3,"file":"initial-state.js","sourceRoot":"","sources":["../src/initial-state.ts"],"names":[],"mappings":";;AAIA,IAAM,YAAY,GAAwB;IACxC,WAAW,EAAE;QACX,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,EAAE;KACf;CACF,CAAA;AAED,kBAAe,YAAY,CAAA"}

View File

@ -42,4 +42,4 @@ var currentUser = function (state, action) {
}
};
exports.default = currentUser;
//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map

2
dist/types.js.map vendored
View File

@ -1 +1 @@
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;AAyCa,QAAA,yBAAyB,GAA8B,4CAA4C,CAAA;AAGnG,QAAA,8BAA8B,GAAmC,iDAAiD,CAAA;AAGlH,QAAA,2BAA2B,GAAgC,8CAA8C,CAAA;AAGzG,QAAA,yBAAyB,GAA8B,4CAA4C,CAAA;AAGnG,QAAA,8BAA8B,GAAmC,iDAAiD,CAAA;AAGlH,QAAA,2BAA2B,GAAgC,8CAA8C,CAAA;AAGzG,QAAA,mBAAmB,GAAwB,sCAAsC,CAAA;AAGjF,QAAA,wBAAwB,GAA6B,2CAA2C,CAAA;AAGhG,QAAA,qBAAqB,GAA0B,wCAAwC,CAAA;AAGvF,QAAA,oBAAoB,GAAyB,uCAAuC,CAAA;AAGpF,QAAA,yBAAyB,GAA8B,4CAA4C,CAAA;AAGnG,QAAA,sBAAsB,GAA2B,yCAAyC,CAAA"}
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;AA8Ca,QAAA,yBAAyB,GAA8B,4CAA4C,CAAA;AAGnG,QAAA,8BAA8B,GAAmC,iDAAiD,CAAA;AAGlH,QAAA,2BAA2B,GAAgC,8CAA8C,CAAA;AAGzG,QAAA,yBAAyB,GAA8B,4CAA4C,CAAA;AAGnG,QAAA,8BAA8B,GAAmC,iDAAiD,CAAA;AAGlH,QAAA,2BAA2B,GAAgC,8CAA8C,CAAA;AAGzG,QAAA,mBAAmB,GAAwB,sCAAsC,CAAA;AAGjF,QAAA,wBAAwB,GAA6B,2CAA2C,CAAA;AAGhG,QAAA,qBAAqB,GAA0B,wCAAwC,CAAA;AAGvF,QAAA,oBAAoB,GAAyB,uCAAuC,CAAA;AAGpF,QAAA,yBAAyB,GAA8B,4CAA4C,CAAA;AAGnG,QAAA,sBAAsB,GAA2B,yCAAyC,CAAA"}

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.16.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

@ -1,6 +1,6 @@
{
"name": "redux-token-auth",
"version": "0.15.0",
"version": "0.18.0",
"description": "Redux actions and reducers to integrate with Devise Token Auth",
"main": "dist/index.js",
"types": "index.d.ts",
@ -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