organizing stuff better with taking out a layer of abstraction as we don't have many pages and just do everything in the provider

This commit is contained in:
talksik
2022-05-18 06:57:55 -05:00
parent bd7dbb525c
commit ed7d71f5d0
8 changed files with 35 additions and 45 deletions
@@ -21,9 +21,8 @@
import React, { useEffect, useContext, useState, useRef, useMemo, useCallback } from 'react'; import React, { useEffect, useContext, useState, useRef, useMemo, useCallback } from 'react';
import Peer from 'simple-peer'; import Peer from 'simple-peer';
import useRealTimeRooms from './RealTimeRoomProvider';
import useAuth from './AuthProvider'; import useAuth from './AuthProvider';
import { Updater, useImmer } from 'use-immer'; import { useImmer } from 'use-immer';
import useSockets from './SocketProvider'; import useSockets from './SocketProvider';
import { import {
RtcReceiveSignalResponse, RtcReceiveSignalResponse,
@@ -32,6 +31,7 @@ import {
ServerResponseChannels, ServerResponseChannels,
} from '@nirvana/core/sockets/channels'; } from '@nirvana/core/sockets/channels';
import toast from 'react-hot-toast'; import toast from 'react-hot-toast';
import useTerminalProvider from './TerminalProvider';
type PeerMap = { type PeerMap = {
[userId: string]: Peer; [userId: string]: Peer;
@@ -45,7 +45,7 @@ const StreamProviderContext = React.createContext<IStreamProvider>({
}); });
export function StreamProvider({ children }: { children: React.ReactChild }) { export function StreamProvider({ children }: { children: React.ReactChild }) {
const { roomsMap } = useRealTimeRooms(); const { roomsMap } = useTerminalProvider();
const { user } = useAuth(); const { user } = useAuth();
const { $ws } = useSockets(); const { $ws } = useSockets();
@@ -26,6 +26,9 @@ import { updateLineMemberState } from '../api/NirvanaApi';
import UpdateLineMemberState from '@nirvana/core/requests/updateLineMemberState.request'; import UpdateLineMemberState from '@nirvana/core/requests/updateLineMemberState.request';
import useAuth from './AuthProvider'; import useAuth from './AuthProvider';
import { User } from '@nirvana/core/models/user.model'; import { User } from '@nirvana/core/models/user.model';
import SidePanel from '../tree/protected/terminal/panels/SidePanel';
import MainPanel from '../tree/protected/terminal/panels/MainPanel';
import useElectron from './ElectronProvider';
type LineIdToMasterLine = { type LineIdToMasterLine = {
[lineId: string]: MasterLineData; [lineId: string]: MasterLineData;
@@ -113,6 +116,8 @@ export function RealTimeRoomProvider({ children }: { children: React.ReactChild
const { $ws } = useSockets(); const { $ws } = useSockets();
const [roomMap, updateRoomMap] = useImmer<LineIdToMasterLine>({}); const [roomMap, updateRoomMap] = useImmer<LineIdToMasterLine>({});
const { desktopMode } = useElectron();
const [selectedLineId, setSelectedLineId] = useState<string>(); const [selectedLineId, setSelectedLineId] = useState<string>();
const [moveLineState, moveLine] = useAsyncFn(updateLineMemberState); const [moveLineState, moveLine] = useAsyncFn(updateLineMemberState);
@@ -353,11 +358,19 @@ export function RealTimeRoomProvider({ children }: { children: React.ReactChild
handleShowNewChannelForm, handleShowNewChannelForm,
}} }}
> >
<div className="flex flex-col flex-1">
<div className="flex flex-row flex-1">
<SidePanel />
{desktopMode === 'mainApp' && <MainPanel />}
</div>
</div>
{children} {children}
</RealTimeRoomContext.Provider> </RealTimeRoomContext.Provider>
); );
} }
export default function useRealTimeRooms() { export default function useTerminalProvider() {
return useContext(RealTimeRoomContext); return useContext(RealTimeRoomContext);
} }
+6 -7
View File
@@ -1,12 +1,11 @@
import React from 'react'; import React from 'react';
import { Toaster } from 'react-hot-toast'; import { Toaster } from 'react-hot-toast';
import { RoomsProvider } from '../providers/RoomsProvider'; import { RoomsProvider } from '../providers/RoomsProvider';
import { RealTimeRoomProvider } from '../providers/RealTimeRoomProvider'; import { RealTimeRoomProvider } from '../providers/TerminalProvider';
import { AuthProvider } from '../providers/AuthProvider'; import { AuthProvider } from '../providers/AuthProvider';
import { ElectronProvider } from '../providers/ElectronProvider'; import { ElectronProvider } from '../providers/ElectronProvider';
import { SocketProvider } from '../providers/SocketProvider'; import { SocketProvider } from '../providers/SocketProvider';
import ProtectedRoute from './protected/ProtectedRoute'; import ProtectedRoute from './protected/ProtectedRoute';
import Terminal from './protected/terminal/Terminal';
import { StreamProvider } from '../providers/StreamProvider'; import { StreamProvider } from '../providers/StreamProvider';
export default function ElectronApp() { export default function ElectronApp() {
@@ -16,11 +15,11 @@ export default function ElectronApp() {
<ProtectedRoute> <ProtectedRoute>
<SocketProvider> <SocketProvider>
<RoomsProvider> <RoomsProvider>
<RealTimeRoomProvider> <StreamProvider>
<StreamProvider> <RealTimeRoomProvider>
<Terminal /> <></>
</StreamProvider> </RealTimeRoomProvider>
</RealTimeRoomProvider> </StreamProvider>
</RoomsProvider> </RoomsProvider>
</SocketProvider> </SocketProvider>
</ProtectedRoute> </ProtectedRoute>
@@ -1,26 +0,0 @@
import React, { useCallback, useState } from 'react';
import useRealTimeRooms from '../../../providers/RealTimeRoomProvider';
import useElectron from '../../../providers/ElectronProvider';
import useAuth from '../../../providers/AuthProvider';
import NavBar from './navbar/Navbar';
import MasterLineData from '@nirvana/core/models/masterLineData.model';
import useRooms from '../../../providers/RoomsProvider';
import toast from 'react-hot-toast';
import SidePanel from './panels/SidePanel';
import MainPanel from './panels/MainPanel';
export default function Terminal() {
const { roomsMap } = useRealTimeRooms();
const { desktopMode } = useElectron();
return (
<div className="flex flex-col flex-1">
<div className="flex flex-row flex-1">
<SidePanel />
{desktopMode === 'mainApp' && <MainPanel />}
</div>
</div>
);
}
@@ -1,6 +1,5 @@
import React, { useMemo, useEffect, useState, useCallback } from 'react'; import React, { useMemo, useEffect, useState, useCallback } from 'react';
import useAuth from '../../../../providers/AuthProvider'; import useAuth from '../../../../providers/AuthProvider';
import useRealTimeRooms from '../../../../providers/RealTimeRoomProvider';
import useStreams from '../../../../providers/StreamProvider'; import useStreams from '../../../../providers/StreamProvider';
import { LineMemberState } from '@nirvana/core/models/line.model'; import { LineMemberState } from '@nirvana/core/models/line.model';
@@ -19,11 +18,12 @@ import {
} from 'react-icons/fi'; } from 'react-icons/fi';
import { Avatar, Tooltip } from 'antd'; import { Avatar, Tooltip } from 'antd';
import { useKeyPressEvent } from 'react-use'; import { useKeyPressEvent } from 'react-use';
import useTerminalProvider from '../../../../providers/TerminalProvider';
export default function LineDetails() { export default function LineDetails() {
const { user } = useAuth(); const { user } = useAuth();
const { selectedLineId, roomsMap, handleUpdateLineMemberState } = useRealTimeRooms(); const { selectedLineId, roomsMap, handleUpdateLineMemberState } = useTerminalProvider();
const selectedLine = useMemo(() => roomsMap[selectedLineId], [selectedLineId, roomsMap]); const selectedLine = useMemo(() => roomsMap[selectedLineId], [selectedLineId, roomsMap]);
@@ -40,7 +40,11 @@ export default React.memo(function LineRow({
}, [handleSelectLine, line.lineDetails, index]); }, [handleSelectLine, line.lineDetails, index]);
const hotkeyActivateLine = useCallback(() => { const hotkeyActivateLine = useCallback(() => {
if (isUserToggleTuned) handleActivateLine(); // TODO: disable for higher numbers? ehh maybe hidden easter egg to select more?
// if (isUserToggleTuned) handleActivateLine();
handleActivateLine();
}, [isUserToggleTuned, handleActivateLine]); }, [isUserToggleTuned, handleActivateLine]);
useKeyPressEvent((index + 1).toString(), hotkeyActivateLine); useKeyPressEvent((index + 1).toString(), hotkeyActivateLine);
@@ -1,6 +1,5 @@
import React, { useMemo, useEffect, useRef, useState } from 'react'; import React, { useMemo, useEffect, useRef, useState } from 'react';
import useAuth from '../../../../providers/AuthProvider'; import useAuth from '../../../../providers/AuthProvider';
import useRealTimeRooms from '../../../../providers/RealTimeRoomProvider';
import { LineMemberState } from '@nirvana/core/models/line.model'; import { LineMemberState } from '@nirvana/core/models/line.model';
import LineIcon from '../../../../components/lineIcon'; import LineIcon from '../../../../components/lineIcon';
@@ -20,11 +19,12 @@ import useStreams from '../../../../providers/StreamProvider';
import Peer from 'simple-peer'; import Peer from 'simple-peer';
import NewChannelForm from '../compose/NewChannelForm'; import NewChannelForm from '../compose/NewChannelForm';
import LineDetails from '../line/LineDetails'; import LineDetails from '../line/LineDetails';
import useTerminalProvider from '../../../../providers/TerminalProvider';
export default function MainPanel() { export default function MainPanel() {
const { user } = useAuth(); const { user } = useAuth();
const { selectedLineId, showNewChannelForm, handleShowNewChannelForm } = useRealTimeRooms(); const { selectedLineId, showNewChannelForm, handleShowNewChannelForm } = useTerminalProvider();
// already won't see stuff for overlay only mode as per parent configuration // already won't see stuff for overlay only mode as per parent configuration
@@ -2,18 +2,18 @@ import { LineMemberState } from '@nirvana/core/models/line.model';
import { Skeleton, Tooltip } from 'antd'; import { Skeleton, Tooltip } from 'antd';
import React, { useCallback, useMemo, useState } from 'react'; import React, { useCallback, useMemo, useState } from 'react';
import { FiActivity, FiPlus, FiSearch } from 'react-icons/fi'; import { FiActivity, FiPlus, FiSearch } from 'react-icons/fi';
import useRealTimeRooms from '../../../../providers/RealTimeRoomProvider';
import useRooms from '../../../../providers/RoomsProvider'; import useRooms from '../../../../providers/RoomsProvider';
import NavBar from '../navbar/Navbar'; import NavBar from '../navbar/Navbar';
import NoTextLogo from '@nirvana/components/logo/NoTextLogo'; import NoTextLogo from '@nirvana/components/logo/NoTextLogo';
import LineRow from '../line/LineRow'; import LineRow from '../line/LineRow';
import useTerminalProvider from '../../../../providers/TerminalProvider';
export default function SidePanel() { export default function SidePanel() {
// using merely for loading state...better to add to realtimeroom context? // using merely for loading state...better to add to realtimeroom context?
const { rooms: initialRoomsFetch } = useRooms(); const { rooms: initialRoomsFetch } = useRooms();
const { roomsMap, handleSelectLine, selectedLineId, handleShowNewChannelForm } = const { roomsMap, handleSelectLine, selectedLineId, handleShowNewChannelForm } =
useRealTimeRooms(); useTerminalProvider();
// todo: sort // todo: sort
const allChannels = useMemo(() => { const allChannels = useMemo(() => {
@@ -75,7 +75,7 @@ export default function SidePanel() {
</div> </div>
{/* tuned in header + general controls */} {/* tuned in header + general controls */}
<div className="flex flex-col shadow-xl bg-gray-100"> <div className="flex flex-col shadow-xl bg-gray-100 pb-2">
<Tooltip placement="right" title={'These are your active rooms...'}> <Tooltip placement="right" title={'These are your active rooms...'}>
<div className="flex flex-row items-center py-3 px-4 pb-0"> <div className="flex flex-row items-center py-3 px-4 pb-0">
<span className="flex flex-row gap-2 items-center justify-start text-gray-400 animate-pulse"> <span className="flex flex-row gap-2 items-center justify-start text-gray-400 animate-pulse">