From a7981496c252245bda73773847b4f4fa31ce707a Mon Sep 17 00:00:00 2001 From: jim Date: Thu, 1 Feb 2018 11:56:44 +0800 Subject: [PATCH] bug fix#862 determine if the target is instantiated --- src/components/Authorized/Authorized.js | 6 +---- src/components/Authorized/AuthorizedRoute.js | 20 +++++++++++++---- src/components/Authorized/CheckPermissions.js | 6 ++++- src/components/Authorized/PromiseRender.js | 22 ++++++++++++++----- src/components/Authorized/Secured.js | 6 +---- 5 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/components/Authorized/Authorized.js b/src/components/Authorized/Authorized.js index d9a2a781..8e7aacb2 100644 --- a/src/components/Authorized/Authorized.js +++ b/src/components/Authorized/Authorized.js @@ -5,11 +5,7 @@ class Authorized extends React.Component { render() { const { children, authority, noMatch = null } = this.props; const childrenRender = typeof children === 'undefined' ? null : children; - return CheckPermissions( - authority, - childrenRender, - noMatch - ); + return CheckPermissions(authority, childrenRender, noMatch); } } diff --git a/src/components/Authorized/AuthorizedRoute.js b/src/components/Authorized/AuthorizedRoute.js index 3d03226a..f7cd679d 100644 --- a/src/components/Authorized/AuthorizedRoute.js +++ b/src/components/Authorized/AuthorizedRoute.js @@ -4,16 +4,28 @@ import Authorized from './Authorized'; class AuthorizedRoute extends React.Component { render() { - const { component: Component, render, authority, - redirectPath, ...rest } = this.props; + const { + component: Component, + render, + authority, + redirectPath, + ...rest + } = this.props; return ( } />} + noMatch={ + } + /> + } > (Component ? : render(props))} + render={props => + (Component ? : render(props)) + } /> ); diff --git a/src/components/Authorized/CheckPermissions.js b/src/components/Authorized/CheckPermissions.js index 7a8239c2..d51e9833 100644 --- a/src/components/Authorized/CheckPermissions.js +++ b/src/components/Authorized/CheckPermissions.js @@ -3,7 +3,11 @@ import PromiseRender from './PromiseRender'; import { CURRENT } from './index'; function isPromise(obj) { - return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function'; + return ( + !!obj && + (typeof obj === 'object' || typeof obj === 'function') && + typeof obj.then === 'function' + ); } /** diff --git a/src/components/Authorized/PromiseRender.js b/src/components/Authorized/PromiseRender.js index 06975f8a..22f1fcb7 100644 --- a/src/components/Authorized/PromiseRender.js +++ b/src/components/Authorized/PromiseRender.js @@ -6,22 +6,34 @@ export default class PromiseRender extends React.PureComponent { component: null, }; componentDidMount() { + const ok = this.checkIsInstantiation(this.props.ok); + const error = this.checkIsInstantiation(this.props.error); this.props.promise .then(() => { this.setState({ - component: this.props.ok, + component: ok, }); }) .catch(() => { this.setState({ - component: () => this.props.error, + component: error, }); }); } + // Determine whether the incoming component has been instantiated + // AuthorizedRoute is already instantiated + // Authorized render is already instantiated, children is no instantiated + // Secured is not instantiated + checkIsInstantiation = (target) => { + if (!React.isValidElement(target)) { + return target; + } + return () => target; + }; render() { - const C = this.state.component; - return C ? ( - + const Component = this.state.component; + return Component ? ( + ) : (
{ throw new Error('authority is required'); } return function decideAuthority(targer) { - return () => CheckPermissions( - authority, - targer, - classError || Exception403 - ); + return () => CheckPermissions(authority, targer, classError || Exception403); }; }; -- GitLab