putting in check if there is activity in a chat which I haven't viewed

This commit is contained in:
Arjun Patel
2022-02-04 00:20:35 -08:00
parent 322df9211d
commit f749729212
4 changed files with 60 additions and 13 deletions
+1 -1
View File
@@ -6,7 +6,7 @@ export default class Conversation {
name: string; // engineering, general, arjun, jacob and rachel...
lastActivityDate?: Timestamp; // caching this for purpose of saving on listeners
lastActivityDate: Timestamp = Timestamp.now(); // caching this for purpose of saving on listeners
activeMembers: string[]; // userIds
membersInLiveRoom: string[] = [] as string[]; // all members in a live call right now for this convo
@@ -8,6 +8,11 @@ import {
FaCheck,
FaAngleRight,
} from "react-icons/fa";
import { useRecoilValue } from "recoil";
import {
allRelevantConversationsAtom,
checkIncomingMessageSelector,
} from "../../recoil/main";
import { MasterAvatarGroupWithUserFetch } from "../UserDetails/MasterAvatarGroup";
export default function ConversationFullRow(props: {
@@ -19,12 +24,19 @@ export default function ConversationFullRow(props: {
quickUpdateText = `${props.conversation.cachedAudioClips[0].senderUserId} spoke just now...`;
}
// check if I am outdate on a certain conversation
const isNewIncoming = useRecoilValue(
checkIncomingMessageSelector(props.conversation.id)
);
return (
<span
className="py-5 px-4 border-t border-t-slate-200 flex flex-row hover:bg-slate-50 transition-all
items-center"
className="py-5 px-4 border-t border-t-slate-200 flex flex-row
hover:bg-slate-50 transition-all items-center"
>
<FaCircle className="text-orange-500 mr-2 animate-pulse text-[0.75rem]" />
{isNewIncoming && (
<FaCircle className="text-orange-500 mr-2 animate-pulse text-[0.75rem]" />
)}
<span className="w-[15rem] flex flex-row items-center">
<MasterAvatarGroupWithUserFetch
@@ -107,14 +107,11 @@ export function MasterAvatarGroupWithUserFetch(props: {
const resultUsers: User[] = [] as User[];
console.log(listOfOtherUsers);
listOfOtherUsers.forEach((oUser) => {
if (relContactsMap.has(oUser)) {
resultUsers.push(relContactsMap.get(oUser)!);
}
});
console.log("fetched users for frontend: ", resultUsers);
return <MasterAvatarGroup listOfUsers={resultUsers} {...props} />;
}
+44 -6
View File
@@ -29,6 +29,8 @@ export enum RecoilActions {
LIVE_ROOMS = "LIVE_ROOMS",
RELATIVE_TIME_SECTIONS_CONVOS = "RELATIVE_TIME_SECTIONS_CONVOS",
CHECK_INCOMING_MESSAGE = "CHECK_INCOMING_MESSAGE",
ALL_RELEVANT_CONTACTS = "ALL_RELEVANT_CONTACTS",
RELEVANT_CONTACTS_SELECTOR_CACHE = "RELEVANT_CONTACTS_SELECTOR_CACHE",
@@ -62,12 +64,12 @@ export const allRelevantConversationsAtom = atom({
key: RecoilActions.ALL_RELEVANT_CONVERSATIONS,
default: new Map<string, Conversation>(),
effects: [
({ onSet }) => {
onSet((newMap) => {
//go through and make sure that our relevant user's cache is up to date
// const allUsersInConvos = newMap.values()
});
},
// ({ onSet }) => {
// onSet((newMap) => {
// //go through and make sure that our relevant user's cache is up to date
// // const allUsersInConvos = newMap.values()
// });
// },
],
});
@@ -196,6 +198,42 @@ export const RelativeTimeSeparatedConvosSelector = selector<
},
});
export const checkIncomingMessageSelector = selectorFamily({
key: RecoilActions.CHECK_INCOMING_MESSAGE,
get:
(convoId: string) =>
({ get }) => {
const currConvosMap: Map<string, Conversation> = get(
allRelevantConversationsAtom
);
const currUserConvoMembersMap = get(allUsersConversationsAtom);
// true if our last interaction date is < lastActivityDate
const currConvo = currConvosMap.get(convoId);
const currUserConvoAssoc = currUserConvoMembersMap.get(convoId);
if (!currConvo || !currUserConvoAssoc) {
return false;
}
if (!currUserConvoAssoc?.lastInteractionDate) {
return true;
}
if (
currConvo.lastActivityDate.toDate() >
currUserConvoAssoc.lastInteractionDate?.toDate()
) {
return true;
}
return false;
// todo: if it's incoming and it's in done/archive, then move it into the inbox by updating userConvoMember relationship
},
});
// map cache of all relevant users
// get all of the users in all of the conversations, once through a simple service call
export const allRelevantContactsAtom = atom<Map<string, NirvanaUser>>({