Setting up a sample application
Firebase setup
This tutorial assumes that you have integrated Firebase by following these instructions.
Application setup
Using components and functions
Sign up, login, logout using firebase
import auth from "@react-native-firebase/auth";
import database from "@react-native-firebase/database";
async function register(name, email, password) {
try {
let result = await auth().createUserWithEmailAndPassword(email, password);
if (result) {
//save result
} else {
console.log("error", result);
}
} catch (e) {
console.log(e);
}
}
async function login(email, password) {
try {
let result = await auth().signInWithEmailAndPassword(email, password);
if (result) {
//save result
} else {
console.log("error", result);
}
} catch (e) {
console.log(e);
}
}
async function logout() {
try {
let keyFromAsync = await loadKey();
const reference = database().ref(`/online/${keyFromAsync}`);
reference.set(true).then(() => console.log("Online presence set"));
// Remove the node whenever the client disconnects
reference
.onDisconnect()
.remove()
.then(() => console.log("On disconnect function configured."));
await database()
.ref("Users")
.child(keyFromAsync)
.update({ online: false });
await database()
.ref("Users")
.child(keyFromAsync)
.update({ lastSeen: Date.now() });
onSignOut().then(async () => {
await auth().signOut();
dispatch({ type: "SIGN_OUT" });
});
//clear values in onSignOut function and switch the stack
} catch (e) {
console.error(e);
}
}
List all threads
import UsersList from "@armiasystems/react-native-armia-chat-sdk/src/chatComponents/usersList";
{}}
ref={listRef}
deleteConversations={item => {}}
listEmptyComponent={<>>}
/>;
To use single contact list item
import Contact from "@armiasystems/react-native-armia-chat-sdk/src/components/contact";
startConversation(item.key).then(val => {
navigation.navigate("ChatView", {
conversationKey: val,
currentUserKey: key,
title: item.name,
imageURL: item.avatarSource,
unreadCount: 0,
userkey_unreadCount: item.userkey_unreadCount,
lastseen: item.lastSeen,
isOnline: item.online
});
})
}
reRenderFlatList={(index, unreadvalue) => {}}
To use chat details page
import ChatDetails from "@armiasystems/react-native-armia-chat-sdk/src/chatComponents/chatDetails";
const snapshot = await database()
.ref('Users')
.once('value');
let contacts = []
snapshot.forEach(item => {
if (item.val().name) {
if (
item
.val()
.name.toLowerCase()
.includes(text.toLowerCase())
) {
const contact = {
key: item.key,
lastTime: '',
lastMessage: ''
...item.val(),
};
if (item.key !== key) {
contacts.push(contact);
}
}
}
});
Searching users
import database from '@react-native-firebase/database';
{
this.props.navigation.goBack();
}}
unreadCount={unreadCount}
lastseen={lastseen}
isOnline={isOnline}
type={type} //group or single
userName={userName}
goToProfile={() => {}}
/>;
Creating a group
import database from '@react-native-firebase/database';
async function handleCreateGroup() {
let keyFromAsync = await loadKey();
const imgData = await imageUpload();
var participantsId = [];
addedList.forEach(element => {
participantsId.push(element.key);
});
const group = {
groupName: groupName,
groupSource: imgData.groupSource,
groupRef: imgData.groupRef,
participants: participantsId
};
const groupKey = await database()
.ref("Groups")
.push(group).key;
addToConversations(keyFromAsync, participantsId, groupKey)
.then(key => {
updateConversation(key, keyFromAsync);
})
.catch(error => console.log("error->", error));
}
async function addToConversations(keyFromAsync, participantsId, groupKey) {
try {
let key = null;
let Users = {};
Users[keyFromAsync] = true;
Users.onlineUsers = {
[keyFromAsync]: { status: true }
};
participantsId.forEach(element => {
Users[element] = true;
Users.onlineUsers[element] = { status: false };
});
const snapshot = await database()
.ref("Conversations")
.orderByChild(keyFromAsync)
.equalTo(true)
.once("value");
snapshot.forEach(item => {
item.forEach(subItem => {
participantsId.forEach(element => {
if (subItem.key === element) {
key = item.key;
return;
}
});
});
});
key = await database()
.ref("Conversations")
.push(Users).key;
await database()
.ref("Conversations")
.child(key)
.update({
type: "group",
group_key: group_key,
conversation_key: key,
userkey: keyFromAsync
});
Image Upload
import storage from "@react-native-firebase/storage";
async function imageUpload() {
let url = "",
ref = "";
let data = {
groupSource: groupImage,
groupRef: groupImage
};
if (fileName !== "") {
const rImage = await storage()
.ref("/groupPics/" + getFileName(fileName))
.putFile(groupImage);
url = await storage()
.ref(rImage.metadata.fullPath)
.getDownloadURL();
ref = rImage.metadata.fullPath;
data = {
groupSource: url,
groupRef: ref
};
}
return data;
}
function getFileName(originalName) {
const re = /(?:\.([^.]+))?$/;
return "IMG-" + getFormattedTime() + "." + re.exec(originalName)[1];
}
function getFormattedTime() {
var today = new Date();
var y = today.getFullYear();
var m = today.getMonth() + 1;
var d = today.getDate();
var h = today.getHours();
var mi = today.getMinutes();
var s = today.getSeconds();
return y + "-" + m + "-" + d + "-" + h + "-" + mi + "-" + s;
}
Profile view
getCurrentUser = async () => {
let key;
let keyFromAsync = await loadKey();
let emailFromAsync = await loadEmail();
this.setState({
key: keyFromAsync
});
if (keyFromAsync) {
key = keyFromAsync;
} else {
const snapshot = await database()
.ref("Email")
.once("value");
if (snapshot.val() !== null) {
key = snapshot.val()[emailFromAsync];
if (key === undefined) {
return;
}
}
}
const userSnapshot = await database()
.ref("Users")
.child(key)
.once("value");
const _user = userSnapshot.val();
if (_user) {
this.setState({
userDetails: _user,
profileImage: _user.avatarSource !== undefined ? _user.avatarSource : "",
name: _user.name
});
}
};
Next
Folder Structure