Tahap Persiapan
Hallo Penggemar Koding Indonesia. Berjumpa kembali ditutorial membuat aplikasi android menggunakan React Native. Pada tutorial kali ini kita akan membuat aplikasi android menggunakan React Native Expo yaitu Membuat Aplikasi Chat.Sebelum kita bergelut dengan React Native, tahap awal yang akan kita lakukan terlebih dahulu adalah mempersiapkan service Firebase.
-
Buat akun Firebase menggunakan akun Google kamu : https://firebase.google.com
-
Setelah itu kamu dapat meng-klik GET STARTED atau GO TO CONSOLE, dan kamu akan diarahkan ke dalam Firebase console, dimana kamu dapat membuat konfigurasi Firebase.

-
Klik Add Project untuk membuat service baru yang akan digunakan nantinya, kemudian masukkan informasi yang diminta pada form yang disediakan (Baca: isi project name dan Country or Region)
-
Setelah itu kamu akan diarahkan kedalam console dashboard yang tampak seperti berikut:

Membuat Real-time Database
Dalam artikel sebelumnya yang membahas tentang React Native Navigation, kita telah membuat sebuah screen untuk chatting dan kemudian kita akan melanjutkannya dengan menggunakan Firebase real-time database agar chat yang akan ditampilkan bersifat dinamis. Namun, sebelum kita berinteraksi dengan source code React Native, masih terdapat tahapan yang harus diselesaikan terlebih dahulu, yakni membuat database.Pada menu yang terdapat didalam console Firebase, pilih Database dan kemudian akan menampilkan halaman Realtime Database dengan database yang masih kosong. Karena Firebase real-time database menyimpan data kedalam JSON format, maka untuk mempermudah memasukkan data dummy berikut struktur yang akan digunakan, kita akan menggunakan file json. Buat data.json kemudian masukkan baris berikut:
{
"messages" : [ {
"incoming" : true,
"message" : "Halo Nuge"
}, {
"incoming" : false,
"message" : "Halo Juga"
}, {
"incoming" : true,
"message" : "Ngumpul yuk, udah lama nih nggak bareng"
}, {
"incoming" : false,
"message" : "Males ah, karena ngumpul itu hanya sebuah mitos yang akan angker pada waktunya"
} ]
}
Masih dalam halaman Real Time Database, klik icon titik tiga pada sudut kanan kemudian klik Import JSON lalu pilih file JSON yang telah dibuat.
Setelah proses Import selesai, maka halaman database dalam console Firebase akan tampak seperti berikut ini:

Karena kita belum memasuki pembelajaran tentang authentication, maka RULES akan kita set agar dapat diakses secara public tanpa melalui proses otentikasi dan untuk melakukannya, pilih tab RULES kemudian masukkan code berikut:
{
"rules": {
".read": "true",
".write": "true"
}
}
Kolaborasi React Native & Firebase
Tahap persiapan dan segala hal yang dibutuhkan untuk dikonfigurasi didalam Firebase telah selesai, maka tahap selanjutnya adalah membuat konfigurasi agar dapat menggunakan Firebase dengan React Native:-
Kembali ke Dashboard dengan meng-klik tombol Overview dan pilih Add Firebase to Your Web App

-
Setelah itu kamu akan mendapatkan code konfigurasi dari Firebase. Di dalam folder src, buat folder services yang didalam terdapat file firebase.js (path lengkapnya: src/services/firebase.js), kemudian masukkan code berikut:
Note: ganti code konfigurasi diatas (baca: mulai dari apiKey sampai messagingSenderId) dengan code konfigurasi yang kamu dapatkan dari Firebase console.import * as firebase from "firebase"; export const initialize = () => firebase.initializeApp({ apiKey: "AIzaSyAsq5_Bz7k0NvHwgkujU5rsFdltIiKx42s", authDomain: "dwauth-a7b5e.firebaseapp.com", databaseURL: "https://dwauth-a7b5e.firebaseio.com", projectId: "dwauth-a7b5e", storageBucket: "dwauth-a7b5e.appspot.com", messagingSenderId: "913864115277" });
-
Karena kita meng-import module firebase, maka install module tersebut dengan command:
npm install firebase --save -
Masih didalam folder services, buat file api.js kemudian masukkan code berikut yang berfungsi untuk meng-export function initialize dari Firebase dengan nama initApi.
import { initialize } from './firebase'; export const initApi = () => initialize(); -
Kemudian buka file App.js pada root directory kemudian lakukan perubahan pada file tersebut menjadi seperti ini:
Penjelasan: Karena function initialize telah di-export dengan nama initApi maka pada code diatas kita meng-import initApi dari src/service/api.js kemudian me-load-nya kedalam componentWillMount lifecycle hook yang akan dijalankan sebelum component di-load.import React from 'react'; import { StackNavigator } from 'react-navigation'; import routes from './src/config/routes'; import { initApi } from './src/services/api'; const AppNavigator = StackNavigator(routes); export default class extends React.Component { componentWillMount(){ initApi(); } render() { return ( <AppNavigator /> ); } }
-
Buka file firebase.js kemudian tambahkan code berikut:
Penjelasan: Function diatas akan melakukan dua hal, pertama, setelah mem-passing endpoint dan updaterFn sebagai argumen, kita akan mengakses data kedalam database menggunakanexport const setListener = (endpoint, updaterFn) => { firebase.database().ref(endpoint).on('value', updaterFn); return () => firebase.database().ref(endpoint).off(); }firebase.database().ref(endpoint). Kemudian denganfirebase.database().ref(endpoint).off()yang digunakan untuk menghapus attached listener.
-
Buka file api.js, kemudian kita akan membuat function
getMessagesdan menggunakansetListeneryang telah dibuat sebelumnya:
Note: Jangan lupa untuk memperbaharui bagian import dari Firebase mejadi:export const getMessages = (updaterFn) => setListener('messages', updaterFn);
import { setListener, initialize } from './firebase'; -
Kemudian import function
getMessagesdarisrc/services/apike dalamsrc/screens/ChatScreen.js:
Masih di dalamimport { getMessages } from '../services/api';ChatScreen.js, tambahkan code berikut:
Penjelasan: Kita menggunakancomponentDidMount() { this.unsubscribeGetMessages = getMessages((snapshot) => { this.setState({ messages: Object.values(snapshot.val()) }) }) } componentWillUnmount() { this.unsubscribeGetMessages(); }Object.valuesdalam Firebasesnapshot.val()karena FlatList menggunakan array dan Firebase menghasilkan object. KetikagetMessagesdipanggil makasetListenerakan me-return sebuah function untuk menghapus listener menggunakanfirebase.database().ref(endpoint).off(). Kemudian kita dapat menyimpan hasil darigetMessageske dalamthis.unsubscribeGetMessagesyang kemudian dapat digunakan kembali ke dalamcomponentWillUnmountlifecycle hook yang akan dijalankan kembali sebelum component unmounted dan destroyed.
-
Masih bekerja menggunakan file
ChatScreen.js, pada render method ubah menjadi seperti:
Penjelasan:render() { return ( <ImageBackground style={[ styles.container, styles.backgroundImage ]} source={require('../assets/img/background.png')}> <FlatList style={styles.container} data={this.state.messages} renderItem={Message} keyExtractor={(item, index) => (`message-${index}`)} /> <Compose submit={postMessage} /> </ImageBackground> ) }
Karena kita memanggil component ImageBackground & FlatList maka import terlebih dahulu:
Adapun style yang digunakan dari kedua component diatas harus didefinisikan juga, maka tambahkan code berikut:import { ImageBackground, StyleSheet, FlatList } from 'react-native';
Pada componentconst styles = StyleSheet.create({ container: { flex: 1, backgroundColor: 'transparent' }, listItem: { width: '70%', margin: 10, padding: 10, backgroundColor: 'white', borderColor: '#979797', borderStyle: 'solid', borderWidth: 1, borderRadius: 10 }, incomingMessage: { alignSelf: 'flex-end', backgroundColor: '#E1FFC7' } })ImageBackgroundkita menggunakan propssourceyang akan me-load gambar, maka gambarnya dapat kamu download disini : github. Component FlatList, pada propsdatamenggunakan state messages:this.state.messages, maka tambahkan code berikut diluar render method:
Sedangkan propsstate = { messages: [] }renderItemmengakses componentMessage, maka pada folder src buat folder components yang didalamnya terdapat file Message.js, lalu masukkan code berikut:
Tidak ada yang perlu dijelaskan dari code diatas karena hanya sebuah component biasa yang menerima propsimport React from 'react'; import { View, StyleSheet, Text } from 'react-native' const Message = ({ item }) => ( <View style={[ styles.message, item.incoming && styles.incomingMessage ]}> <Text>{item.message}</Text> </View> ) const styles = { message: { width: '70%', margin: 10, padding: 10, backgroundColor: 'white', borderColor: '#979797', borderStyle: 'solid', borderWidth: 1, borderRadius: 10 }, incomingMessage: { alignSelf: 'flex-end', backgroundColor: '#E1FFC7' } } export default Message;itemyang akan menampilkanmessagekedalam component Text.
-
Karena kita memanggil component Compose, maka buat file Compose.js didalam folder
src/components, kemudian masukkan code berikut:
Karena Message.js dan Compose.js telah dibuat, buka file ChatScreen.js kemudian import kedua file tersebut:import React from 'react'; import { View, StyleSheet, Keyboard, Button, TextInput } from 'react-native'; class Compose extends React.Component { constructor(props) { super(props); this.submit = this.submit.bind(this); } //Membuat state text state = { text: '' } //submit method yang berfungsi ketika tombol ditekan submit() { //mengirim nilai ke database berdasarkan state text yang diterima this.props.submit(this.state.text); //mengatur state text menjadi kosong this.setState({ text: '' }) //menutup keyboard Keyboard.dismiss(); } render(){ return ( <View style={styles.compose}> <TextInput style={styles.composeText} //value diatur berdasarkan nilai dari state text value={this.state.text} //ketika text berubah maka akan melakukan set text onChangeText={(text) => this.setState({text})} //Ketika user memasukkan text dan meng-klik return pada phone keyboard maka akan disubmit. onSubmitEditing={(event) => this.submit()} editable = {true} maxLength = {40} /> <Button //ketika tombol ditekan maka akan memanggil method submit onPress={this.submit} title="Send" /> </View> ) } } const styles = StyleSheet.create({ composeText: { width: '80%', paddingHorizontal: 10, height: 40, backgroundColor: 'white', borderColor: '#979797', borderStyle: 'solid', borderWidth: 1, }, compose: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', margin: 10 } }); export default Compose;
import Message from '../components/Message'; import Compose from '../components/Compose'; -
Pada step ke-4 bagian
<Compose submit={postMessage} />, kita mengirimkan props submit menggunakan function postMessage. Maka buka file api.js kemudian tambahkan code berikut:
Penjelasan: Jika ada data yang diterima maka kita akan akan mengirim nilai pushData dengan name messages yang berisi data incoming = false dan message itu sendiri. Karena kita menggunakan functionexport const postMessage = (message) => { if (Boolean(message)) { pushData('messages', { incoming: false, message }) } }pushData, maka perbaharui import from Firebase menjadi:
import { setListener, pushData, initialize } from './firebase'; -
Buka file firebase.js kemudian tambahkan code berikut untuk membuat function pushData:
Penjelasan: Code diatas berfungsi untuk melakukan push data ke dalam database Firebase dengan menerima value yang dikirimkan.export const pushData = (endpoint, data) => { return firebase.database().ref(endpoint).push(data); }
Baca Juga: Mengenal Component React Native
Sampai pada tahap ini, aplikasi chatting whatsapp clone telah berhasil dibuat dan dapat berjalan sebagaimana mestinya. Saat aplikasi di-load maka akan tampak seperti ini :
Kemudian klik Navigate ke ChatScreen, maka akan tampak seperti ini:

Kemudian saat mengisi text lalu tekan send maka data pada chatscreen akan diperbaharui

Sekian case sederhana tentang bagaimana cara berinteraksi dengan database secara real-time dimana pada case kali ini kita memanfaatkan service dari Firebase. Buat kamu yang masih kebingungan meyatukan potongan code diatas harap dibaca secara perlahan atau bisa dengan menyalin repository github. Semoga bermanfaat.
sumber:
https://daengweb.id/membuat-aplikasi-chatting-react-native
0 comments:
Post a Comment