import { Avatar, Badge } from "antd"; import { useRouter } from "next/router"; import { FaDotCircle, FaWalking, FaRocket, FaCheckDouble, FaCircle, FaUser, FaRegClock, FaCheck, FaAngleRight, FaGithub, FaAtlassian, } from "react-icons/fa"; import { Routes } from "@nirvana/common/helpers/routes"; import LiveRoom from "../Conversations/LiveRoom"; import Conversation from "@nirvana/common/models/conversation"; import { useRecoilValue } from "recoil"; import { countNavigationContentSelector, liveRoomsSelector, RelativeTimeConvosSections, RelativeTimeSeparatedConvosSelector, } from "../../recoil/main"; import ConversationFullRow from "../Conversations/ConversationFullRow"; import LiveRooms from "../LiveRooms/LiveRoomsHandler"; import LiveRoomsHandler from "../LiveRooms/LiveRoomsHandler"; import { ClientConfig, IAgoraRTC, IAgoraRTCClient, IMicrophoneAudioTrack, } from "agora-rtc-sdk-ng"; import { useEffect, useState } from "react"; import { config, appId } from "@nirvana/common/services/agoraService"; import toast from "react-hot-toast"; import { agoraService, conversationService } from "@nirvana/common/services"; import { useAuth } from "../../contexts/authContext"; export default function Conversations() { const router = useRouter(); const { currUser } = useAuth(); const liveRooms = useRecoilValue(liveRoomsSelector); const [agoraRtc, setAgoraRtc] = useState(); const [agoraRtcClient, setAgoraRtcClient] = useState(); const [localAudioTrack, setLocalAudioTrack] = useState(); // set up agora stuff useEffect(() => { (async function () { // dynamic import as the server side import doesn't work const AgoraRTC = (await import("agora-rtc-sdk-ng")).default; const agoraClient = AgoraRTC.createClient(config); setAgoraRtcClient(agoraClient); setAgoraRtc(AgoraRTC); })(); }, []); async function handleJoinChannel(channelName: string, agoraToken: string) { const localTrack: IMicrophoneAudioTrack = await agoraRtc!.createMicrophoneAudioTrack(); setLocalAudioTrack(localTrack); const init = async (chanName: string) => { agoraRtcClient!.on("user-published", async (user, mediaType) => { await agoraRtcClient!.subscribe(user, mediaType); console.log("subscribe success"); if (mediaType === "audio") { user.audioTrack?.play(); } }); agoraRtcClient!.on("user-unpublished", async (user, type) => { console.log("unpublished", user, type); if (type === "audio") { user.audioTrack?.stop(); } await agoraRtcClient!.unsubscribe(user); }); agoraRtcClient!.on("user-left", (user) => { console.log("user left", user); }); await agoraRtcClient!.join(appId, chanName, agoraToken, null); if (localTrack) await agoraRtcClient!.publish(localTrack); }; if (localTrack) { console.log("init ready"); init(channelName); } else { toast.error("Not ready for joining call"); return; } } async function handleLeaveChannel() { // destroy local track localAudioTrack?.close(); // leave all channels await agoraRtcClient!.leave(); } // click on join // add me to the active list of people in the call // update the conversation lastActivityDate as well const handleJoinLive = async (conversationId: string) => { const connectingToast = toast.loading("connecting"); try { // agora token from CF const agoraToken = await agoraService.getAgoraToken(conversationId); // agora join/init await handleJoinChannel(conversationId, agoraToken); await conversationService.joinLiveConversation( conversationId, currUser!.uid ); } catch { toast.error("problem in joining"); } toast.remove(connectingToast); toast.success("joined room"); }; const handleLeaveLive = async (conversationId: string) => { const leavingToast = toast.loading("leaving"); try { // agora leave channel await handleLeaveChannel(); await conversationService.leaveLiveConversation( conversationId, currUser!.uid ); } catch { toast.error("problem in joining"); } toast.remove(leavingToast); toast.success("left room"); }; // agora start the call stream // leave the call on before unload if in a call // update the database to remove my userId from the list of people in the room const relativeConvoSections = useRecoilValue( RelativeTimeSeparatedConvosSelector ); const todayConvos = relativeConvoSections.get( RelativeTimeConvosSections.today ); const last7DaysConvos = relativeConvoSections.get( RelativeTimeConvosSections.last7Days ); const earlierMonthConvos = relativeConvoSections.get( RelativeTimeConvosSections.earlierThisMonth ); const oldJunkConvos = relativeConvoSections.get( RelativeTimeConvosSections.oldJunk ); const navConvoCounts = useRecoilValue(countNavigationContentSelector); const isStaleState = navConvoCounts.liveCount == 0 && navConvoCounts.defaultCount == 0; if (isStaleState) { return (
{"Oh the sound of silence..."}
); } return ( <> {/* live rooms */} {liveRooms?.length > 0 && ( <> Live {/* row of live room cards */} {liveRooms.map((lRoom) => ( ))} )} {/* Today */} {todayConvos && todayConvos?.length > 0 && ( <> Today {todayConvos.map((tRoom) => ( ))} )} {/* last 7 days */} {last7DaysConvos && last7DaysConvos?.length > 0 && ( <> Last 7 Days {last7DaysConvos.map((tRoom) => ( ))} )} {/* earlier this month */} {earlierMonthConvos && earlierMonthConvos?.length > 0 && ( <> Earlier This Month {earlierMonthConvos.map((tRoom) => ( ))} )} {/* old junk */} {oldJunkConvos && oldJunkConvos?.length > 0 && ( <> Older Junk {oldJunkConvos.map((tRoom) => ( ))} )} {"That's all"} ); }