import { $desktopMode, $selectedLineId } from "../../controller/recoil"; import { GlobalHotKeys, KeyMap } from "react-hotkeys"; import { Skeleton, Tooltip } from "antd"; import { useCallback, useEffect, useMemo, useState } from "react"; import { useGetUserDetails, useUserLines } from "../../controller/index"; import { useRecoilState, useSetRecoilState } from "recoil"; import { FaPlus } from "react-icons/fa"; import { FiActivity } from "react-icons/fi"; import IconButton from "../../components/Button/IconButton/index"; import LineDetailsTerminal from "./details"; import { LineMemberState } from "@nirvana/core/models/line.model"; import LineRow from "../../components/lines/lineRow.tsx/index"; import MasterLineData from "@nirvana/core/models/masterLineData.model"; import NewLineModal from "./newLine"; import { useLineDataProvider } from "../../controller/lineDataProvider"; export default function NirvanaTerminal() { const [isModalVisible, setIsModalVisible] = useState(false); const { data: userDetails } = useGetUserDetails(); const [selectedLineId, setSelectedLineId] = useRecoilState($selectedLineId); const [desktopMode, setDesktopMode] = useRecoilState($desktopMode); // simply using this query for specific data on loading // todo: add these properties in context provider value although more work down the line for control const { isLoading: isLoadingInitialLines } = useUserLines(); const { linesMap, handleTuneToLine } = useLineDataProvider(); useEffect(() => { console.log("change/update in lines map"); console.log(linesMap); }, [linesMap]); const allLines: MasterLineData[] = useMemo(() => { const masterLines: MasterLineData[] = Object.values(linesMap); return masterLines.filter( (masterLine) => masterLine.currentUserMember.state === LineMemberState.INBOX ); }, [linesMap]); const toggleTunedLines = useMemo(() => { const masterLines: MasterLineData[] = Object.values(linesMap); return masterLines.filter( (masterLine) => masterLine.currentUserMember.state === LineMemberState.TUNED ); }, [linesMap]); // todo: sort/order based on activity and activity date and currently broadcasting/live const handleEscape = useCallback(() => { console.log("deselecting line"); setSelectedLineId(null); }, [setSelectedLineId]); const handleStartBroadcast = useCallback( (lineId: string) => () => { console.log(`starting broadcast for ${lineId}!!!`); // todo: enable stream in this tuned in channel // if (lineId) handleUserBroadcast(lineId, true); }, [] ); const handleStopBroadcast = useCallback( (lineId: string) => () => { console.log(`stopping broadcast for ${lineId}!!!`); // todo: disable stream in this tuned in channel // if (lineId) handleUserBroadcast(lineId, false); }, [] ); const keyMap: KeyMap = useMemo( () => ({ DESELECT_LINE: "esc", START_BROADCAST: { sequence: "`", action: "keydown", }, STOP_BROADCAST: { sequence: "`", action: "keyup", }, }), [] ); const handlers = useMemo( () => ({ DESELECT_LINE: handleEscape, START_BROADCAST: handleStartBroadcast(selectedLineId), STOP_BROADCAST: handleStopBroadcast(selectedLineId), }), [selectedLineId] ); const selectedLine: MasterLineData | undefined = useMemo(() => { if (!selectedLineId) return undefined; // find the line from the data provider if (linesMap[selectedLineId]) { const foundSelectedLine = linesMap[selectedLineId]; // on mount of this, we want to temporarily tune into the line if we are not already tuned in...which would happen if we toggle tuned in if ( !foundSelectedLine.tunedInMemberIds?.includes( userDetails?.user?._id.toString() ) ) { handleTuneToLine(selectedLineId, false); } return foundSelectedLine; } return undefined; }, [selectedLineId, linesMap, userDetails]); const [listRenderTest, setListRenderTest] = useState(false); useEffect(() => { setInterval(() => { setListRenderTest(true); }, 2000); }, [setListRenderTest]); return ( <>
{/* modal for creating new line */} setIsModalVisible(false)} /> {/* tuned in lines block */}
{/* tuned in header + general controls */}

Tuned In

0/5

setIsModalVisible(true)} className="ml-auto shadow-xl" >
{/* list of toggle tuned lines */}
{toggleTunedLines.map((masterLineData) => ( ))}
{/* rest of the lines */}
{isLoadingInitialLines ? ( ) : ( <> {!allLines.length && ( You have no lines!
Create one to connect to your team instantly.
)} {allLines.map((masterLineData) => ( ))} )}
{desktopMode === "terminalDetails" && selectedLine && ( )} {listRenderTest && }
); } function RenderTest() { useEffect(() => { console.error("YOOOO FROM THE RENDER TEST COMPONENT"); }, []); return <>this is the render test; }