diff --git a/codorials/authentication-with-firebase/app-navigation.md b/codorials/authentication-with-firebase/app-navigation.md new file mode 100644 index 00000000..b46a611b --- /dev/null +++ b/codorials/authentication-with-firebase/app-navigation.md @@ -0,0 +1,103 @@ +# App Navigation + +React Navigation has gone through many cycles of navigation implementations and has been a pain point for developers for a good while. +A current "go to" navigation library is called [react-navigation](https://reactnavigation.org/). It's pure JavaScript implementation +which performs well and provides a solid foundation for navigation on both Android and iOS. + +Authentication typically requires 3 screens; Login, Register & Forgot Password. + +## Installation + +Simply install the dependency via NPM, no native installation is needed: + +```bash +npm install --save react-navigation +``` + +## Navigation Stacks + +Navigation on an app typically works in stacks, where a user can navigate to a new screen (pushing a new screen onto the stack), or backwards (popping +a screen off the stack). + +What's great about this concept is that we can create multiple instances of a stack, for example a stack for unauthenticated users and another for +authenticated ones. + +To create a new stack, we import the `StackNavigator` from `react-navigation`. In it's basic form, the first item of the `StackNavigator` object +acts as our initial screen on the stack. Lets create a new directory and component for our unauthenticated state: + +```js +// src/screens/unauthenticated/index.js + +import { StackNavigator } from 'react-navigation'; + +import Login from './Login'; +import Register from './Register'; + +export default StackNavigator({ + Login: { + screen: Login, + }, + Register: { + screen: Register, + } +}); +``` + +In both the `Login` & `Register` files, create a basic React component (change Login to Register where appropriate): + +```jsx +// src/screens/unauthenticated/Login.js +// src/screens/unauthenticated/Register.js + +import React, { Component } from 'react'; +import { View, Text } from 'react-native'; + +class Login extends Component { + render() { + return ( + + + Login + + + ); + } +} +``` + +## Using the stack + +StackNavigator returns a React component which can be rendered in our app. If we go back to our `src/App.js` component, we can now return +the stack: + +```jsx +// src/App.js + +import React, { Component } from 'react'; + +import UnauthenticatedStack from './screens/unauthenticated'; + +class App extends Component { + + render() { + return ; + } + +} + +export default App; +``` + +Our `UnauthenticatedStack` component will now show the `Login` component as it's the first item in the `StackNavigator`. Reload your app and you +should have your `Login` component rendering! + +TODO image + +## Styling the navigator + +As you can see, `react-navigation` provides a base view which is platform specific. + +.. + +## Pushing a new stack + diff --git a/codorials/authentication-with-firebase/config.json b/codorials/authentication-with-firebase/config.json index 6acbe6ca..1f3692c6 100644 --- a/codorials/authentication-with-firebase/config.json +++ b/codorials/authentication-with-firebase/config.json @@ -18,6 +18,10 @@ { "title": "Integrating Redux", "file": "integrating-redux" + }, + { + "title": "App Navigation", + "file": "app-navigation" } ] } diff --git a/codorials/authentication-with-firebase/integrating-redux.md b/codorials/authentication-with-firebase/integrating-redux.md index 77a37c78..04db370f 100644 --- a/codorials/authentication-with-firebase/integrating-redux.md +++ b/codorials/authentication-with-firebase/integrating-redux.md @@ -79,4 +79,4 @@ function bootstrap() { export default bootstrap; ``` -Our app now has access to the power of Redux! +Although noting will visually change, our app now has access to the power of Redux! diff --git a/codorials/authentication-with-firebase/project-structure.md b/codorials/authentication-with-firebase/project-structure.md index 793cf499..297d4f3f 100644 --- a/codorials/authentication-with-firebase/project-structure.md +++ b/codorials/authentication-with-firebase/project-structure.md @@ -70,7 +70,7 @@ consumes our entire application. Go ahead and boot up your app onto your emulator. You should simply be presented with a plain screen with the words "Bootstrapped!". -![Bootstrapped!](https://raw.githubusercontent.com/invertase/react-native-firebase/codorials/codorials/authentication-with-firebase/assets/app-bootstrapped.jpg =300x*) +![Bootstrapped!](assets/app-bootstrapped.jpg =300x*) Although a good starting point, we want to separate we'll our business logic out of the bootstrap file, keeping it purely for app initialization purposes. This can simply be done by creating a basic React component called `App.js`, which will also live in the `src` directory; diff --git a/codorials/authentication-with-firebase/understanding-firebase-auth.md b/codorials/authentication-with-firebase/understanding-firebase-auth.md index 26d58e96..64f25e37 100644 --- a/codorials/authentication-with-firebase/understanding-firebase-auth.md +++ b/codorials/authentication-with-firebase/understanding-firebase-auth.md @@ -16,14 +16,8 @@ Find the Authentication section and you'll be prompted with a number of options. You'll see we have a number of options here, however for purposes of this Codorial we'll be using "Email/Password" and "Facebook" as our providers. Go ahead and enable these: -![Enabled Providers](https://raw.githubusercontent.com/invertase/react-native-firebase/codorials/codorials/authentication-with-firebase/assets/auth-providers.jpg) - -![Enabled Providers](/assets/auth-providers.jpg) - ![Enabled Providers](assets/auth-providers.jpg) -![](assets/auth-providers.jpg) - > If you don't have a Facebook app, simply enter dummy values. We'll cover this later on. ## Listening to the users authentication state