diff --git a/src/renderer/AddNode/AddNodeRedesign.tsx b/src/renderer/AddNode/AddNodeRedesign.tsx index 5cdbb8aa6..7ef62d9a6 100644 --- a/src/renderer/AddNode/AddNodeRedesign.tsx +++ b/src/renderer/AddNode/AddNodeRedesign.tsx @@ -22,7 +22,7 @@ const AddNode = () => { -
+
{ const dispatch = useAppDispatch(); + const [isDarkTheme, setIsDarkTheme] = useState(false); // const isStartOnLogin = await electron.getStoreValue('isStartOnLogin'); // console.log('isStartOnLogin: ', isStartOnLogin); @@ -38,6 +41,8 @@ const MainScreen = () => { return (
{ flex: 1, }} > - + {/* */} +
{ />

-
+
{/* { {statusComponent}
- Node icon + Node icon
); diff --git a/src/renderer/Generics/redesign/SidebarNodeItem/SidebarNodeItem.tsx b/src/renderer/Generics/redesign/SidebarNodeItem/SidebarNodeItem.tsx index 52773c5f3..e2f30947b 100644 --- a/src/renderer/Generics/redesign/SidebarNodeItem/SidebarNodeItem.tsx +++ b/src/renderer/Generics/redesign/SidebarNodeItem/SidebarNodeItem.tsx @@ -28,7 +28,7 @@ export interface SidebarNodeItemProps { /** * Which icon? */ - iconId: NodeIconId; + iconId: NodeIconId | string; /** * What's the status? */ diff --git a/src/renderer/Generics/redesign/SidebarNodeItem/sideBarNodeItem.css.ts b/src/renderer/Generics/redesign/SidebarNodeItem/sideBarNodeItem.css.ts index 93d5e2bcc..575717477 100644 --- a/src/renderer/Generics/redesign/SidebarNodeItem/sideBarNodeItem.css.ts +++ b/src/renderer/Generics/redesign/SidebarNodeItem/sideBarNodeItem.css.ts @@ -29,7 +29,7 @@ export const textContainer = style({ alignItems: 'flex-start', padding: '0px', gap: '2px', - width: '172px', + // width: '172px', height: '32px', flex: 'none', order: '1', diff --git a/src/renderer/Generics/redesign/utils.ts b/src/renderer/Generics/redesign/utils.ts index 7fa75e5e1..b8f901900 100644 --- a/src/renderer/Generics/redesign/utils.ts +++ b/src/renderer/Generics/redesign/utils.ts @@ -3,7 +3,6 @@ import { ClientStatusProps, SYNC_STATUS } from './consts'; export const getSyncStatus = (status: ClientStatusProps) => { let syncStatus; switch (true) { - // TODO: revisit this.. feels off or unnecessary // find worst cases first case status.updating: syncStatus = SYNC_STATUS.UPDATING; diff --git a/src/renderer/Presentational/Sidebar/Sidebar.tsx b/src/renderer/Presentational/Sidebar/Sidebar.tsx index 1eedda492..977b50caa 100644 --- a/src/renderer/Presentational/Sidebar/Sidebar.tsx +++ b/src/renderer/Presentational/Sidebar/Sidebar.tsx @@ -1,3 +1,11 @@ +import { NodeId, NodeStatus } from 'common/node'; +import { useCallback, useEffect } from 'react'; +import { + selectSelectedNodeId, + selectUserNodes, + updateSelectedNodeId, +} from 'renderer/state/node'; +import { useAppDispatch, useAppSelector } from 'renderer/state/hooks'; import { Banner } from '../../Generics/redesign/Banner/Banner'; import { SidebarNodeItem, @@ -75,7 +83,63 @@ const itemListData: { iconId: IconId; label: string; count?: number }[] = [ }, ]; +const NODE_SIDEBAR_STATUS_MAP: Record = { + created: 'stopped', + initializing: 'sync', + [NodeStatus.checkingForUpdates]: 'sync', + downloading: 'sync', + downloaded: 'sync', + [NodeStatus.errorDownloading]: 'error', + extracting: 'sync', + [NodeStatus.readyToStart]: 'stopped', + starting: 'sync', + running: 'healthy', + stopping: 'healthy', + stopped: 'stopped', + [NodeStatus.errorRunning]: 'error', + [NodeStatus.errorStarting]: 'error', + [NodeStatus.errorStopping]: 'error', + unknown: 'error', +}; + const Sidebar = ({ offline }: SidebarProps) => { + const sSelectedNodeId = useAppSelector(selectSelectedNodeId); + const sUserNodes = useAppSelector(selectUserNodes); + const dispatch = useAppDispatch(); + + // Default selected node to be the first node + useEffect(() => { + if ( + !sSelectedNodeId && + sUserNodes && + Array.isArray(sUserNodes?.nodeIds) && + sUserNodes.nodeIds.length > 0 + ) { + dispatch(updateSelectedNodeId(sUserNodes.nodeIds[0])); + } + }, [sSelectedNodeId, sUserNodes, dispatch]); + + // const nodeListObject = { nodeService: [], validator: [], singleClients: [] }; + // sUserNodes?.nodeIds.forEach((nodeId: NodeId) => { + // const node = sUserNodes.nodes[nodeId]; + // // TODO: add validator logic here eventually + // if ( + // node.spec.category === 'L1/ExecutionClient' || + // node.spec.category === 'L1/ConsensusClient/BeaconNode' + // ) { + // nodeListObject.nodeService.push(node); + // } else { + // nodeListObject.singleClients.push(node); + // } + // }); + + const onClickLinkItem = useCallback((linkItemId) => { + console.log('sidebar link item clicked: ', linkItemId); + if (linkItemId === 'add') { + // open add node dialog + } + }, []); + return (
{offline && ( @@ -87,14 +151,31 @@ const Sidebar = ({ offline }: SidebarProps) => {
- {nodeListData.map((item) => { + {/* {nodeListObject.nodeService.length === 2 && ( + { + dispatch(updateSelectedNodeId(nodeListObject.nodeService[1].id)); + }} + /> + )} */} + {sUserNodes?.nodeIds.map((nodeId: NodeId) => { + const node = sUserNodes.nodes[nodeId]; + const { spec, status } = node; + const sidebarStatus = NODE_SIDEBAR_STATUS_MAP[status]; return ( dispatch(updateSelectedNodeId(node.id))} /> ); })} @@ -103,9 +184,11 @@ const Sidebar = ({ offline }: SidebarProps) => { {itemListData.map((item) => { return ( onClickLinkItem(item.iconId)} /> ); })} diff --git a/src/renderer/Presentational/Sidebar/sidebar.css.ts b/src/renderer/Presentational/Sidebar/sidebar.css.ts index 58487d609..3807245b8 100644 --- a/src/renderer/Presentational/Sidebar/sidebar.css.ts +++ b/src/renderer/Presentational/Sidebar/sidebar.css.ts @@ -30,7 +30,7 @@ export const titleItem = style({ }); export const nodeList = style({ - overflowY: 'scroll', + overflowY: 'auto', order: '2', alignSelf: 'stretch', flexGrow: '1',