diff --git a/src/Screens/Chat/chat.js b/src/Screens/Chat/chat.js index 81eed54..464de6e 100644 --- a/src/Screens/Chat/chat.js +++ b/src/Screens/Chat/chat.js @@ -7,7 +7,6 @@ import { TranslatorConfiguration, TranslatorFactory } from "react-native-power-translator" - import firebase from "react-native-firebase" import ChatInput from "../../Components/Chat/chatInput" import ChatHeader from "../../Components/Chat/chatHeader" @@ -78,6 +77,11 @@ export default class Conversas extends Component { date: date.toDate(), source }) + this.ref.get().then(conversa => { + if (conversa.exists) { + this.ref.update({ unreadMsgs: false, numUnreadMsgs: 0 }) + } + }) }) this.setState({ messages }) }) @@ -85,6 +89,7 @@ export default class Conversas extends Component { componentWillUnmount() { BackHandler.removeEventListener("hardwareBackPress", this.handleBackPress) + this.unsubscribe() } handleBackPress = () => { @@ -97,65 +102,106 @@ export default class Conversas extends Component { this.setState({ messageText: text, isValueNull: false }) } - sendMessage = () => { - const { destUser, user, userData, messageText } = this.state - - this.ref.set({ - userKey: destUser.key, - contactName: destUser.contactName, - contactPhoto: destUser.contactPhoto - }) - this.refDest.set({ - userKey: user, - contactName: userData.phone, - contactPhoto: userData.profile_img_url - }) - - const newMessage = { - content: messageText, - date: firebase.database().getServerTime(), - source: "1" + proccessLastMsg = string => { + let strProcs = "" + if (string.length >= 25) { + strProcs = `${string.substr(0, 25)}...` + } else { + strProcs = string } + return strProcs + } - this.ref - .collection("messages") - .add({ - content: newMessage.content, - date: newMessage.date, - source: newMessage.source + sendMessage = () => { + const { destUser, user, messageText } = this.state + if (messageText === "") { + this.setState({ isValueNull: true }) + } else { + const newMessage = { + content: messageText, + date: firebase.database().getServerTime(), + source: "1" + } + + this.ref.get().then(doc => { + if (!doc.exists) { + this.ref.set({ + userKey: destUser.key, + unreadMsgs: false, + numUnreadMsgs: 0, + lastMessage: this.proccessLastMsg(newMessage.content), + dateLastMessage: newMessage.date, + contactName: destUser.contactName, + contactPhoto: destUser.contactPhoto + }) + } else { + this.ref.update({ + lastMessage: this.proccessLastMsg(newMessage.content), + dateLastMessage: newMessage.date + }) + } }) - .then(() => true) - .catch(error => error) - firebase - .firestore() - .collection("users") - .doc(destUser.key) - .get() - .then(doc => { - // eslint-disable-next-line camelcase - const { language_code } = doc.data() - TranslatorConfiguration.setConfig( - ProviderTypes.Google, - "AIzaSyC0j0BsAskqVIvaX2fcdvjsaw4fqGP5ut8", - language_code - ) - const translator = TranslatorFactory.createTranslator() - translator.translate(messageText, language_code).then(translated => { - this.refDest - .collection("messages") - .add({ - content: newMessage.content, - date: newMessage.date, - contentTranslated: translated, - source: "2" + this.ref + .collection("messages") + .add({ + content: newMessage.content, + date: newMessage.date, + source: newMessage.source + }) + .then(() => true) + .catch(error => error) + firebase + .firestore() + .collection("users") + .doc(destUser.key) + .get() + .then(doc => { + // eslint-disable-next-line camelcase + const { language_code } = doc.data() + TranslatorConfiguration.setConfig( + ProviderTypes.Google, + "AIzaSyC0j0BsAskqVIvaX2fcdvjsaw4fqGP5ut8", + language_code + ) + const translator = TranslatorFactory.createTranslator() + translator.translate(messageText, language_code).then(translated => { + this.refDest.get().then(conversa => { + if (!conversa.exists) { + this.refDest.set({ + userKey: user, + unreadMsgs: true, + numUnreadMsgs: 1, + lastMessage: this.proccessLastMsg(translated), + dateLastMessage: newMessage.date, + contactName: userData.phone, + contactPhoto: userData.profile_img_url + }) + } else { + const { numUnreadMsgs } = conversa.data() + this.refDest.update({ + numUnreadMsgs: numUnreadMsgs + 1, + unreadMsgs: true, + lastMessage: this.proccessLastMsg(translated), + dateLastMessage: newMessage.date + }) + } }) - .then(() => true) - .catch(error => error) + this.refDest + .collection("messages") + .add({ + content: newMessage.content, + date: newMessage.date, + contentTranslated: translated, + source: "2" + }) + .then(() => true) + .catch(error => error) + }) }) - }) - this.setState({ messageText: "", isValueNull: true }) + this.setState({ messageText: "", isValueNull: true }) + } } render() { diff --git a/src/Screens/Conversas/conversas.js b/src/Screens/Conversas/conversas.js index 9960a54..991d5c8 100644 --- a/src/Screens/Conversas/conversas.js +++ b/src/Screens/Conversas/conversas.js @@ -14,6 +14,7 @@ import { ListItem, Icon } from "react-native-elements" import LinearGradient from "react-native-linear-gradient" import firebase from "react-native-firebase" import AsyncStorage from "@react-native-community/async-storage" +import getTime from "~/functions/getTime" export default class Conversas extends Component { constructor() { @@ -23,7 +24,6 @@ export default class Conversas extends Component { myName: "", myPicture: null } - this.lastMessage = null this.ref = firebase .firestore() @@ -44,6 +44,7 @@ export default class Conversas extends Component { componentWillUnmount() { BackHandler.removeEventListener("hardwareBackPress", this.handleBackPress) + this.unsubscribe() } handleBackPress = () => { @@ -51,34 +52,48 @@ export default class Conversas extends Component { } getData = async () => { - this.ref.collection("conversas").onSnapshot(querySnapshot => { - AsyncStorage.getItem("@contacts").then(contactsResponse => { - const contacts = JSON.parse(contactsResponse) - const conversas = [] - querySnapshot.forEach(doc => { - let find = false - const { contactPhoto, contactName } = doc.data() - contacts.forEach(contact => { - if (contact.key === doc.id) { + this.unsubscribe = this.ref.collection("conversas").onSnapshot(querySnapshot => { + AsyncStorage.getItem("@contacts").then(contactsResponse => { + const contacts = JSON.parse(contactsResponse) + const conversas = [] + querySnapshot.forEach(doc => { + let find = false + contacts.forEach(contact => { + const { contactPhoto, contactName } = doc.data() + if (contact.key === doc.id) { + const { + numUnreadMsgs, + unreadMsgs, + lastMessage, + dateLastMessage + } = doc.data() + conversas.push({ + contact, + key: doc.id, + contactPhoto, + contactName: contact.contactName, + unreadMsgs, + numUnreadMsgs, + lastMessage, + dateLastMessage + }) + find = true + } + }) + if (find === false) { conversas.push({ - contact, key: doc.id, contactPhoto, - contactName: contact.contactName + contactName, + unreadMsgs, + numUnreadMsgs, + lastMessage, + dateLastMessage }) - find = true } }) - if (find === false) { - conversas.push({ - key: doc.id, - contactPhoto, - contactName - }) - } + this.setState({ conversas }) }) - this.setState({ conversas }) - }) }) } @@ -133,6 +148,24 @@ export default class Conversas extends Component { search = () => {} + parseTime = dateNanoScds => { + const date = dateNanoScds.toDate() + const atualDate = firebase.database().getServerTime() + let textDate = "" + if (atualDate.getDate() - date.getDate() === 0) { + textDate = getTime(date) + } else if (atualDate.getDate() - date.getDate() === 1) { + textDate = "Ontem" + } else if (atualDate.getDate() - date.getDate() >= 2) { + textDate = `${date + .getDate() + .toString()}/${date + .getMonth() + .toString()}/${date.getFullYear().toString()}` + } + return textDate + } + render() { const { conversas, myName, myPicture } = this.state return ( @@ -169,13 +202,19 @@ export default class Conversas extends Component { {item.contactName} {item.lastMessage} - {item.lastMessage} - - {item.unread} - + + {this.parseTime(item.dateLastMessage)} + + {item.unreadMsgs && ( + + + {item.numUnreadMsgs} + + + )} }