+ All Categories
Transcript
Page 1: React Native Firebase

Kobkrit Viriyayudhakorn, Ph.D. [email protected]

http://www.kobkrit.com

Making Chat Room App

Page 2: React Native Firebase

Important Links• Source Codes

https://github.com/kobkrit/learn-react-native

• Course Materials http://www.kobkrit.com/category/programming/react-native/

• Score Announcementhttp://bit.ly/its484quizscore

• Facebook Grouphttps://web.facebook.com/groups/ReactNativeThai/

Page 3: React Native Firebase

React Native’s Component Lifecycle

constructor(props)

render() -> React Element

That we have known so far…

It is not completed. Here is the completed one…

Page 4: React Native Firebase

Advanced React Native Component Mounting Lifecycle

constructor(props)

componentWillMount()

render() -> React Element

componentDidMount()

Page 5: React Native Firebase

React Native ComponentMounting Lifecycle

• constructor(object props)• The component class is instantiated. • The parameters to the constructor are the element's

initial props, as specified by the parent element. • You can optionally specify an initial state for the

element by assigning an object to this.state. • At this point, no native UI has been rendered yet for

this element.

Page 6: React Native Firebase

React Native ComponentMounting Lifecycle

• componentWillMount()• This method is invoked only once, before rendering

occurs for the first time. • At this point, there is still no native UI rendered for this

element.

• render() -> React Element• The render method must return a React Element to

render (or null, to render nothing).

Page 7: React Native Firebase

React Native ComponentMounting Lifecycle

• componentDidMount()• This method is invoked only once, after rendering

occurs for the first time. • At this point, the native UI for this element has finished

rendering, and may be accessed through this.refs for direct manipulation.

• If you need to make async API calls or execute delayed code with setTimeout, that should generally be done in this method.

Page 8: React Native Firebase

Updating Lifecycle

componentWillReceiveProps(nextProps)

shouldComponentUpdate(nextProps, nextState)

render() -> React Element

componentDidUpdate(prevProp, prevState)

componentWillUpdate(nextProps, nextState)

Page 9: React Native Firebase

React Native ComponentUpdating Lifecycle

• componentWillReceiveProps(object nextProps)• The parent of this component has passed a new set of

props. • This component will re-render. • You may optionally call this.setState() to update this

component's internal state before the render method is called.

Page 10: React Native Firebase

React Native ComponentUpdating Lifecycle

• shouldComponentUpdate(object nextProps, object nextState) -> boolean• Based on the next set of props and state, a

component may decide to re-render or not to re-render.

• The base class's implementation of this method always returns true (the component should re-render).

• For optimization, override this method and check if either props or state have been modified, e.g. run an equality test of each key/value in these objects.

• Returning false will prevent the render method from being called.

Page 11: React Native Firebase

React Native ComponentUpdating Lifecycle

• componentWillUpdate(object nextProps, object nextState)• This method is invoked, after the decision has been

made to re-render. • You may not call this.setState() here, since an update

is already in progress.

• render() -> React Element• This method is called, assuming

shouldComponentUpdate returned true. • The render method must return a React Element to

render (or null, to render nothing).

Page 12: React Native Firebase

React Native ComponentUpdating Lifecycle

• componentDidUpdate(object prevProps, object prevState)• This method is invoked after re-rendering occurs. At

this point, the native UI for this component has been updated to reflect the React Element returned from the render() method.

Page 13: React Native Firebase

Mounting (Opening the App)l12_firebase/bmi.js

Page 14: React Native Firebase

Changing Height to 5l12_firebase/bmi.js

Page 15: React Native Firebase

Changing Weight to 5l12_firebase/bmi.js

Page 16: React Native Firebase

Why??? Because…

l12_firebase/bmi.js

Page 17: React Native Firebase

• Firebase is a mobile platform that helps you quickly develop high-quality apps, grow your user base, and earn more money.

• The tools and infrastructure you need to build better apps and grow successful businesses

• Firebase is made up of complementary features that you can mix-and-match to fit your needs.

• It was acquired by Google since 2014.

Page 18: React Native Firebase
Page 19: React Native Firebase

Key Features• Authentication (User Sign-In, User Registration, Login

by Google, Login by Facebook)

• Realtime Database (Store and sync app data in realtime)

• Cloud Messaging (Send Notification to User’s Mobile)

• Crash Reporting (Sending crash report to us)

• Analytics (Knowing how much people using our app right now)

Page 20: React Native Firebase

Firebase span over 2 weeks• Lecture 12

• Real-Time Database Part I

• Lecture 13

• Real-Time Database Part II

• Authentication

• Cloud Messaging / Notification

Page 21: React Native Firebase

Getting Start With Firebase1. Create Firebase Project in the Firebase console.

https://console.firebase.google.com/ (We need a Google account for this).

2. Retrieve apiKey, authDomain, databaseURL, and storageBucket from Firebase console.

3. Create a new react-native project.

4. Install Firebase from npm.

5. Add it into a react-native project.

Page 22: React Native Firebase

Create a Project @ Firebase• Enter https://console.firebase.google.com/

• Login with your Google account

• Press “Create New Project” button

Page 23: React Native Firebase

1. Adding Project Name (Any name is fine)

2. Select Country to Thailand

3. Press Create Project button

Page 24: React Native Firebase

• Click at “Add Firebase to your web app” (The pink one)

Page 25: React Native Firebase

• Press Copy button to copy the apiKey, authDomain, databaseURL, storageBucket, and messagingSenderId and paste into the code.

Page 26: React Native Firebase

Create New Project and Install Firebase

• We will install Firebase version 3.6.0

• Open Terminal and change to a working directory

• $|> react-native init l12_firebase

• $|> cd l12_firebase

• $|> npm install firebase --save

• $|> atom index.ios.js

Page 27: React Native Firebase

1.js

Page 28: React Native Firebase

Realtime Database

• Store and sync data with our NoSQL cloud database. Data is synced across all clients in realtime, and remains available when your app goes offline.

Page 29: React Native Firebase

Key Differences with Realm

• Realm allows you implement your own database server. Firebase can’t. You need to use Google Cloud server (which is not free if it is a high traffic).

• Realms DB is the reactive programming concept (Lazy loading). Firebase’s Realtime DB isn’t.

• Realms DB needs to specify database schema, while Firebase isn’t. Firebase will save what ever it got.

Page 30: React Native Firebase

Realtime Database Structure

• All Firebase Realtime Database data is stored as JSON objects, e.g.,

Page 31: React Native Firebase

Basic Writing Operation• Get a database reference

• Writing something

Save the {text: ‘Hello Text!’} as key ‘notes/1’ into Firebase database

Page 32: React Native Firebase

1.js

Page 33: React Native Firebase

1.js

Page 34: React Native Firebase

What happen?

• As the default, user who can write the realtime database must be authenticated.

• Since our user is not yet authenticated, so the permission error is occurred.

• For development, We can change this behavior by re-configure the Database permission.

Page 35: React Native Firebase

Realtime Database Permission Rules

1

2

https://console.firebase.google.com/

Page 36: React Native Firebase

Sample Realtime DB Rules• Default (Require Authentication)

• Public / Development (Open to everyone)

Page 37: React Native Firebase

Sample Realtime DB Rules• Private User Database (Which means only owners

can access their information in database)

Page 38: React Native Firebase

Sample Realtime DB Rules• Private (No one can access the database, except

admin can access via Firebase console)

Page 39: React Native Firebase

Change Realtime DB permission to Public

• Change the rule to Public permission

• Press “Publish” button

Page 40: React Native Firebase

Reload the App again

• At Simulator, Cmd + R or R,R for reload

• Now there is no warning sign.

• Realtime database save successfully.

Page 41: React Native Firebase

Viewing Saved database• We can view the saved information in Firebase’s

Realtime database at Firebase console.

• https://console.firebase.google.com/project/{your-project-name}/database/data

Page 42: React Native Firebase
Page 43: React Native Firebase

Chat Room App• Simple one chat room.

• Showing number of online users.

• Showing conversations publicly.

• Send the chat message.

• Setting the username

2.js

Page 44: React Native Firebase

Making Chat Room App UI2.js

Page 45: React Native Firebase

User online / offline• Conditions

• Online, when the app is active on the screen.

• Offline, when the app is inactive or in background on the screen.

• We need helps from a React Native’s library called “AppState”

Page 46: React Native Firebase

AppState• Can tell us whether the app is in foreground (active) on

the screen, or in background (inactive).

• active - The app is running in the foreground

• background - The app is running in the background. The user is either in another app or on the home screen

• inactive - This is a state that occurs when transitioning between foreground & background, and during periods of inactivity such as entering the Multitasking view or in the event of an incoming call

Page 47: React Native Firebase

Obtaining State• Accessing AppState.currentState (it was kept up-

to-date by React Native)

• E.g., If app in the foreground (active) state.

• AppState.currentState == “active”

• If app in the background state.

• AppState.currentState == “background”

Page 48: React Native Firebase

Listening for State changes2.js

Page 49: React Native Firebase

Key Logics for Online User Counting

• Enter the app

• Read the current onlineUser from Firebase

• Add by 1

• Push it back to the Firebase.

• Leave the app.

• Read the current onlineUser from Firebase

• Remove by 1

• Push it back to the Firebase.

Page 50: React Native Firebase

Want do some operation in background?

• When user leave the app, the app become into the background state.

• All JavaScript code is halted and unloaded from the memory.

• All timers (setTimeout) are unable to execute, because their don’t found the codes to run in the memory.

• We need an external library for running operation in background.

Page 51: React Native Firebase

react-native-background-timer

• Installation

• $|> npm install react-native-background-timer -- save

• $|> react-native link

• Usage

Page 52: React Native Firebase

Handling # of Online User2.js

Page 53: React Native Firebase

2.js

Page 54: React Native Firebase

On vs Once• firebaseRef.on(‘value’, callback)

• Listening for data change forever.

• When the data has changed, the call back is called.

• firebaseRef.once(‘value’, callback)

• Listening for data change only one time. Once it is changed, it called only one time and become inactive.

Page 55: React Native Firebase

Opening the App

Page 56: React Native Firebase

Leaving the App

Page 57: React Native Firebase

Enter the App Again..

Page 58: React Native Firebase

Modifying DB value in Firebase console

Page 59: React Native Firebase

Realtime DB Transaction• Problem occurs!

• When two users open the app at the same time, when will be happen?

• Both users read the amount of user as the same value, both users update the database by increasing by 1. Instead of adding by 2.

• Number of online user and real online user is mismatched.

Page 60: React Native Firebase

Realtime DB Transaction3.js

Page 61: React Native Firebase

Realtime DB Transaction3.js

Page 62: React Native Firebase

Realtime DB Transaction• All transaction requests will be queued at the Firebase

server and will be processed one-by-one.

• Transaction guarantees that no other operations can write into database during the reading and writing operations in a transaction block.

• This behavior, we called it atomic write operations.

• Problems of mismatch number of online users when two or more users enter the app at the same time, solved!

Page 63: React Native Firebase

Q/A


Top Related