sexy flow with data

This commit is contained in:
talksik
2022-05-06 08:48:18 -05:00
parent 191b86756f
commit faa36ad8a3
6 changed files with 144 additions and 40 deletions
@@ -5,6 +5,7 @@ import { $selectedLineId } from "../../../controller/recoil";
import { Avatar } from "antd"; import { Avatar } from "antd";
import { FiSun } from "react-icons/fi"; import { FiSun } from "react-icons/fi";
import LineIcon from "../lineIcon"; import LineIcon from "../lineIcon";
import { LineMemberState } from "@nirvana/core/models/line.model";
import MasterLineData from "@nirvana/core/models/masterLineData.model"; import MasterLineData from "@nirvana/core/models/masterLineData.model";
import { useGetUserDetails } from "../../../controller/index"; import { useGetUserDetails } from "../../../controller/index";
@@ -1,39 +1,50 @@
import React, { useContext } from "react"; import React, { useContext } from "react";
import { Socket, io } from "socket.io-client";
import { useCallback, useEffect, useState } from "react";
import { $jwtToken } from "./recoil"; import { $jwtToken } from "./recoil";
import MasterLineData from "@nirvana/core/models/masterLineData.model"; import MasterLineData from "@nirvana/core/models/masterLineData.model";
import SocketChannels from "@nirvana/core/sockets/channels"; import SocketChannels from "@nirvana/core/sockets/channels";
import { User } from "@nirvana/core/models"; import { User } from "@nirvana/core/models";
import { io } from "socket.io-client";
import { queryClient } from "../pages/nirvanaApp"; import { queryClient } from "../pages/nirvanaApp";
import toast from "react-hot-toast"; import toast from "react-hot-toast";
import { useEffect } from "react";
import { useRecoilValue } from "recoil"; import { useRecoilValue } from "recoil";
import { useUserLines } from "./index"; import { useUserLines } from "./index";
type LineIdToMasterLine = {
[lineId: string]: MasterLineData;
};
interface ILineDataContext { interface ILineDataContext {
// represents the modified and up to date lines data with availability from session // represents the modified and up to date lines data with availability from session
lines: MasterLineData[]; linesMap: LineIdToMasterLine;
relevantUsers: User[]; relevantUsers: User[];
} }
const LineDataContext = React.createContext<ILineDataContext>({ const LineDataContext = React.createContext<ILineDataContext>({
lines: [], linesMap: {},
relevantUsers: [], relevantUsers: [],
}); });
let $ws; let $ws: Socket;
export function LineDataProvider({ children }) { export function LineDataProvider({ children }) {
// TODO: have internal loading to prevent showing even router and all if something is not ready
// or have it within each property within the context value
// persistent store of lines // persistent store of lines
// ?just do simple synchronous axios/fetch in useEffect and manage isLoading ourselves?
const { data: basicUserLinesData } = useUserLines(); const { data: basicUserLinesData } = useUserLines();
const jwtToken = useRecoilValue($jwtToken); const jwtToken = useRecoilValue($jwtToken);
const [linesMap, setLinesMap] = useState<LineIdToMasterLine>({});
useEffect(() => { useEffect(() => {
$ws = io("http://localhost:5000", { $ws = io("http://localhost:5000", {
query: { token: jwtToken }, query: { token: jwtToken },
}); });
$ws.on("connection", () => toast.success("you are connected"));
// client-side errors // client-side errors
$ws.on("connect_error", (err) => { $ws.on("connect_error", (err) => {
console.error(err.message); // prints the message associated with the error console.error(err.message); // prints the message associated with the error
@@ -55,12 +66,46 @@ export function LineDataProvider({ children }) {
// $ws.on(SocketChannels.CONNECT, console.log()); // $ws.on(SocketChannels.CONNECT, console.log());
$ws.on("test", () => console.log("test")); $ws.on("test", () => console.log("test"));
if (basicUserLinesData?.data?.masterLines.length > 0) {
setLinesMap((prevMappings) => {
// go through the lines from the persistent store
// get all of the id's and map assign to the main object
// ?prolly have no previous at this point...but I'm okay with override since this
// ?useeffect is triggered on the refetching of the persistent store so we
// ?are prolly looking to do a full app refresh and connection refresh
const newMap = { ...prevMappings };
basicUserLinesData.data.masterLines.map((masterLine) => {
newMap[masterLine.lineDetails._id.toString()] = masterLine;
});
return newMap;
});
}
}, [basicUserLinesData]); }, [basicUserLinesData]);
// get updated associations with certain lines /**
* get more audio blocks for a certain line
*/
const handleFetchMoreAudioBlocks = useCallback(
(lineId: string) => {
// simple axios fetch for this specific block
// update the specific line in lines map
// set the state to trigger the re-renders in the tree
},
[setLinesMap]
);
const value: ILineDataContext = {
linesMap, // TODO send the updated map instead of this array
relevantUsers: [],
};
return ( return (
<LineDataContext.Provider value={{} as ILineDataContext}> <LineDataContext.Provider value={value}>
{children} {children}
</LineDataContext.Provider> </LineDataContext.Provider>
); );
-2
View File
@@ -47,8 +47,6 @@ const createWindow = (): void => {
// backgroundColor: "#00000000", // backgroundColor: "#00000000",
alwaysOnTop: true, // testing purposes
frame: false, frame: false,
roundedCorners: false, roundedCorners: false,
}); });
@@ -5,11 +5,33 @@ import { useCallback, useMemo } from "react";
import { $selectedLineId } from "../../controller/recoil"; import { $selectedLineId } from "../../controller/recoil";
import { ILineDetails } from "../router"; import { ILineDetails } from "../router";
import LineIcon from "../../components/lines/lineIcon/index"; import LineIcon from "../../components/lines/lineIcon/index";
import { LineMemberState } from "@nirvana/core/models/line.model";
import MasterLineData from "@nirvana/core/models/masterLineData.model";
import { Tooltip } from "antd";
import { useLineDataProvider } from "../../controller/lineDataProvider";
import { useRecoilState } from "recoil"; import { useRecoilState } from "recoil";
export default function LineDetailsTerminal() { export default function LineDetailsTerminal() {
const [selectedLineId, setSelectedLineId] = useRecoilState($selectedLineId); const [selectedLineId, setSelectedLineId] = useRecoilState($selectedLineId);
const { linesMap } = useLineDataProvider();
const selectedLine: MasterLineData | undefined = useMemo(() => {
if (!selectedLineId) return undefined;
// find the line from the data provider
if (linesMap[selectedLineId]) {
return linesMap[selectedLineId];
}
return undefined;
}, [selectedLineId, linesMap]);
const isUserToggleTuned = useMemo(
() => selectedLine.currentUserMember.state === LineMemberState.TUNED,
[selectedLine]
);
const handleEscape = useCallback(() => { const handleEscape = useCallback(() => {
console.log("deselecting line"); console.log("deselecting line");
@@ -59,16 +81,33 @@ export default function LineDetailsTerminal() {
className="absolute bottom-0 p-4 shadow-2xl className="absolute bottom-0 p-4 shadow-2xl
flex flex-row items-center gap-2 justify-end w-full" flex flex-row items-center gap-2 justify-end w-full"
> >
<button className="p-3 flex justify-center items-center hover:bg-gray-300 transition-all"> <button
className={`p-3 flex justify-center items-center hover:bg-gray-300
transition-all hover:scale-105`}
>
<FiSettings className="text-gray-400 text-md" /> <FiSettings className="text-gray-400 text-md" />
</button> </button>
<button className="bg-gray-800 p-3 flex justify-center items-center shadow-lg"> <Tooltip
<FiActivity className="text-white text-lg" /> title={`${
</button> isUserToggleTuned ? "toggle tuned" : "temporarily tuned"
}`}
>
<button
className={`p-3 flex justify-center items-center shadow-lg
hover:scale-105 transition-all animate-pulse ${
isUserToggleTuned ? "bg-gray-800 text-white" : "text-black"
}`}
>
<FiActivity className="text-lg" />
</button>
</Tooltip>
{/* TODO: change to border and inset color for when inactive button */} {/* TODO: change to border and inset color for when inactive button */}
<button className="bg-teal-800 p-3 flex justify-center items-center shadow-lg"> <button
className={`bg-teal-800 p-3 flex justify-center items-center shadow-lg
hover:scale-105 transition-all `}
>
<FiSun className="text-white text-lg" /> <FiSun className="text-white text-lg" />
</button> </button>
</div> </div>
+10 -6
View File
@@ -12,12 +12,16 @@ import Channels, {
TERMINAL_PRESET, TERMINAL_PRESET,
} from "../../electron/constants"; } from "../../electron/constants";
import { GlobalHotKeys, KeyMap } from "react-hotkeys"; import { GlobalHotKeys, KeyMap } from "react-hotkeys";
import {
LineDataProvider,
useLineDataProvider,
} from "../../controller/lineDataProvider";
import React, { useState } from "react"; import React, { useState } from "react";
import { useCallback, useEffect, useMemo } from "react"; import { useCallback, useEffect, useMemo } from "react";
import { useRecoilState, useRecoilValue } from "recoil"; import { useRecoilState, useRecoilValue } from "recoil";
import { LineDataProvider } from "../../controller/lineDataProvider";
import LineDetailsTerminal from "../lineDetailsTerminal"; import LineDetailsTerminal from "../lineDetailsTerminal";
import MasterLineData from "@nirvana/core/models/masterLineData.model";
import NirvanaHeader from "../../components/header/index"; import NirvanaHeader from "../../components/header/index";
import NirvanaTerminal from "../terminal"; import NirvanaTerminal from "../terminal";
import Overlay from "../overlay"; import Overlay from "../overlay";
@@ -269,7 +273,7 @@ export default function NirvanaRouter() {
// send the final dimensions to main process // send the final dimensions to main process
window.electronAPI.window.resizeWindow({ window.electronAPI.window.resizeWindow({
setAlwaysOnTop, setAlwaysOnTop: true, // TODO: remove, just this for testing
dimensions: { dimensions: {
height: finalDimensions.height, height: finalDimensions.height,
width: finalDimensions.width, width: finalDimensions.width,
@@ -318,11 +322,11 @@ export default function NirvanaRouter() {
<div className="flex flex-row flex-1"> <div className="flex flex-row flex-1">
{(desktopMode === "terminal" || {(desktopMode === "terminal" ||
desktopMode === "terminalDetails") && ( desktopMode === "terminalDetails") && <NirvanaTerminal />}
<NirvanaTerminal allLines={testLines} />
)}
{desktopMode === "terminalDetails" && <LineDetailsTerminal />} {desktopMode === "terminalDetails" && selectedLineId && (
<LineDetailsTerminal />
)}
{desktopMode === "overlayOnly" && <Overlay />} {desktopMode === "overlayOnly" && <Overlay />}
</div> </div>
+37 -20
View File
@@ -6,35 +6,45 @@ import { FaPlus } from "react-icons/fa";
import { FiActivity } from "react-icons/fi"; import { FiActivity } from "react-icons/fi";
import { ILineDetails } from "../router"; import { ILineDetails } from "../router";
import IconButton from "../../components/Button/IconButton/index"; import IconButton from "../../components/Button/IconButton/index";
import { LineMemberState } from "@nirvana/core/models/line.model";
import LineRow from "../../components/lines/lineRow.tsx/index"; import LineRow from "../../components/lines/lineRow.tsx/index";
import MasterLineData from "@nirvana/core/models/masterLineData.model";
import NewLineModal from "./newLine"; import NewLineModal from "./newLine";
import { useLineDataProvider } from "../../controller/lineDataProvider";
import { useSetRecoilState } from "recoil"; import { useSetRecoilState } from "recoil";
import { useUserLines } from "../../controller/index"; import { useUserLines } from "../../controller/index";
export default function NirvanaTerminal({ export default function NirvanaTerminal() {
allLines,
}: {
allLines: ILineDetails[];
}) {
const [isModalVisible, setIsModalVisible] = useState<boolean>(false); const [isModalVisible, setIsModalVisible] = useState<boolean>(false);
const setSelectedLineId = useSetRecoilState($selectedLineId); const setSelectedLineId = useSetRecoilState($selectedLineId);
const setDesktopMode = useSetRecoilState($desktopMode); const setDesktopMode = useSetRecoilState($desktopMode);
const { data: userLinesRes, isLoading } = useUserLines(); // 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 } = useLineDataProvider();
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 // todo: sort/order based on activity and activity date and currently broadcasting/live
const toggleTunedLines = useMemo(
() => allLines.filter((line) => line.isUserToggleTunedIn),
[]
);
const restLines = useMemo(
() => allLines.filter((line) => !line.isUserToggleTunedIn),
[]
);
return ( return (
<div className="flex flex-col bg-white w-[400px]"> <div className="flex flex-col bg-white w-[400px]">
{/* modal for creating new line */} {/* modal for creating new line */}
@@ -68,22 +78,29 @@ export default function NirvanaTerminal({
</div> </div>
{/* list of toggle tuned lines */} {/* list of toggle tuned lines */}
<div className="flex flex-col mt-2"></div> <div className="flex flex-col mt-2">
{toggleTunedLines.map((masterLineData) => (
<LineRow
key={`terminalListLines-${masterLineData.lineDetails._id.toString()}`}
masterLineData={masterLineData}
/>
))}
</div>
</div> </div>
{/* rest of the lines */} {/* rest of the lines */}
<div className={"flex flex-col"}> <div className={"flex flex-col"}>
{isLoading ? ( {isLoadingInitialLines ? (
<Skeleton /> <Skeleton />
) : ( ) : (
<> <>
{!userLinesRes?.data?.masterLines?.length && ( {!allLines.length && (
<span className="text-gray-300 text-sm my-5 text-center"> <span className="text-gray-300 text-sm my-5 text-center">
You have no lines! <br /> Create one to connect to your team You have no lines! <br /> Create one to connect to your team
instantly. instantly.
</span> </span>
)} )}
{userLinesRes?.data?.masterLines?.map((masterLineData) => ( {allLines.map((masterLineData) => (
<LineRow <LineRow
key={`terminalListLines-${masterLineData.lineDetails._id.toString()}`} key={`terminalListLines-${masterLineData.lineDetails._id.toString()}`}
masterLineData={masterLineData} masterLineData={masterLineData}