0

Trying to implement a protectedRoute utils for react-native project, which basicly looks for JWT. First it shows loading indicator, and if there is no JWT present it would redirect to /login.

const LoadingComponent = () => (
  <View>
    <ActivityIndicator/>
  </View>
)

class PrivateRoute extends React.Component {
  state = {
    loading: true,
    jwt: null,
  }
  componentDidMount() {
    storage.retrieve('JWT').then(jwt => this.setState({ loading: false, jwt }))
  }
  render() {
    const { children } = this.props;
    const { jwt, loading } = this.state;
    if (loading) {
      return <Route {...children} component={LoadingComponent}/>
    }
    if (!jwt) {
      return <Redirect to="/signup" />;
    }
    return <Route {...children} />
  }
}

export default PrivateRoute;

this.props.children has all the required information to make a Route in the application. The original idea is that in case of loading we would just overwrite this.props.children.component with custom loading screen.

BUT the solution which does not give me error is (only warning):

    if (loading) {
      return LoadingComponent
    }

I have tried also to manually inline component as

component={() => <View>{...}</View>

render={() => ...}

However it also ends up as the same error. Invariant Violation: Element type is invalid: expected a string ..... but got: undefined

  • Might be related to how you import PrivateRoute . (if it is exported as default , no need for {} when importing) – Eran Feb 03 '19 at 10:20
  • Hi. I tried that scenario and it doesnt. If I add `````` under the loading condition, it will work as expected. – kondricz Feb 03 '19 at 10:28

0 Answers0