import Conversation from "@nirvana/common/models/conversation"; import { Avatar, Tooltip } from "antd"; import moment from "moment"; import { FaCircle, FaUser, FaRocket, FaRegClock, FaCheck, FaAngleRight, FaStream, FaDotCircle, } from "react-icons/fa"; import { useRecoilValue } from "recoil"; import { allRelevantConversationsAtom, allUsersConversationsAtom, checkIncomingMessageSelector, } from "../../recoil/main"; import { MasterAvatarGroupWithUserFetch } from "../UserDetails/MasterAvatarGroup"; import { FaPlay } from "react-icons/fa"; import { ConversationMemberState } from "../../../common/models/conversation"; import { conversationService } from "@nirvana/common/services"; import { useAuth } from "../../contexts/authContext"; import toast from "react-hot-toast"; import { useRouter } from "next/router"; import { Routes } from "@nirvana/common/helpers/routes"; export default function ConversationFullRow(props: { conversation: Conversation; handleJoinLive?: (conversationId: string) => Promise; handleLeaveLive?: (conversationId: string) => Promise; }) { const { currUser } = useAuth(); const usersConvosMap = useRecoilValue(allUsersConversationsAtom); // check if I am outdate on a certain conversation const isNewIncoming = useRecoilValue( checkIncomingMessageSelector(props.conversation.id) ); const handleOrganizeConversation = async ( toState: ConversationMemberState ) => { try { // use service to make change in database which will change local data await conversationService.updateUserConvoRelationship( currUser!.uid, props.conversation.id, toState ); toast.success("Moved conversation to " + toState); } catch (error) { console.error(error); toast.error("Problem in moving conversation"); } }; const router = useRouter(); const handleViewConversationDetails = (e) => { router.push({ pathname: Routes.home, query: { convoId: props.conversation.id }, }); }; const playLastClip = () => { if (!props.conversation.cachedAudioClip) { toast.error("Nothing to play"); return; } // todo: add to queue instead of playing here const audio = new Audio(props.conversation.cachedAudioClip.audioDataUrl); audio.play(); }; /** * show actions based on which state it is currently in for this user */ const currUserAssoc = usersConvosMap.get(props.conversation.id); let currConvoMemberState: ConversationMemberState = ConversationMemberState.default; if (currUserAssoc) { if (currUserAssoc.state == ConversationMemberState.later) { currConvoMemberState = ConversationMemberState.later; } else if (currUserAssoc.state == ConversationMemberState.done) { currConvoMemberState = ConversationMemberState.done; } else if (currUserAssoc.state == ConversationMemberState.priority) { currConvoMemberState = ConversationMemberState.priority; } } return ( {props.conversation.name} {props.handleJoinLive && ( { e.stopPropagation(); if (props.handleJoinLive) { props.handleJoinLive(props.conversation.id); } }} className="p-2 rounded-full hover:cursor-pointer hover:bg-slate-200" > )} { e.stopPropagation(); playLastClip(); }} className="p-2 rounded-full hover:cursor-pointer hover:bg-slate-200" > {props.conversation.tldr} {moment(props.conversation.lastActivityDate?.toDate()).fromNow()} {/* actions */} {currConvoMemberState != ConversationMemberState.default && ( { e.stopPropagation(); handleOrganizeConversation(ConversationMemberState.default); }} className="p-2 rounded-full hover:cursor-pointer hover:bg-slate-200" > )} {currConvoMemberState != ConversationMemberState.later && ( { e.stopPropagation(); handleOrganizeConversation(ConversationMemberState.later); }} className="p-2 rounded-full hover:cursor-pointer hover:bg-slate-200" > )} {currConvoMemberState != ConversationMemberState.priority && ( { e.stopPropagation(); handleOrganizeConversation(ConversationMemberState.priority); }} className="p-2 rounded-full hover:cursor-pointer hover:bg-slate-200" > )} {currConvoMemberState != ConversationMemberState.done && ( { e.stopPropagation(); handleOrganizeConversation(ConversationMemberState.done); }} className="p-2 rounded-full hover:cursor-pointer hover:bg-slate-200" > )} ); }