diff --git a/src/common/ui/SpacedList.tsx b/src/common/ui/SpacedList.tsx new file mode 100644 index 00000000..799af698 --- /dev/null +++ b/src/common/ui/SpacedList.tsx @@ -0,0 +1,24 @@ +import React from "react" +import { List, Box } from "@mui/material" + +const SpacedList = ({ + children, + itemSpacing +}: { + children: React.ReactNode + itemSpacing: number +}) => { + return ( + + {React.Children.map(children, (child, idx) => ( + + {child} + + ))} + + ) +} + +export default SpacedList diff --git a/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx b/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx index d96def6b..87ea22e9 100644 --- a/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx +++ b/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx @@ -1,34 +1,36 @@ import { useContext } from "react" -import { List, Box, Typography } from "@mui/material" +import { Box, Typography } from "@mui/material" import { ProjectsContainerContext } from "@/common" +import SpacedList from "@/common/ui/SpacedList" import { useProjectSelection } from "@/features/projects/data" -import ProjectListItem from "./ProjectListItem" -import ProjectListItemPlaceholder from "./ProjectListItemPlaceholder" +import ProjectListItem, { Skeleton as ProjectListItemSkeleton } from "./ProjectListItem" const ProjectList = () => { const { projects, isLoading } = useContext(ProjectsContainerContext) const projectSelection = useProjectSelection() - const loadingItemCount = 6 - if (isLoading || projects.length > 0) { + const itemSpacing = 1 + if (isLoading) { return ( - - {isLoading && - [...new Array(loadingItemCount)].map((_, index) => ( - + + { + [...new Array(6)].map((_, idx) => ( + )) } - {!isLoading && projects.map((project, idx) => ( - - - + + ) + } else if (projects.length > 0) { + return ( + + {projects.map(project => ( + projectSelection.selectProject(project)} + /> ))} - + ) } else { return ( diff --git a/src/features/sidebar/view/internal/sidebar/projects/ProjectListItem.tsx b/src/features/sidebar/view/internal/sidebar/projects/ProjectListItem.tsx index ab238004..3e8e8989 100644 --- a/src/features/sidebar/view/internal/sidebar/projects/ProjectListItem.tsx +++ b/src/features/sidebar/view/internal/sidebar/projects/ProjectListItem.tsx @@ -1,67 +1,145 @@ import { Box, ListItem, - ListItemButton, ListItemText, + ListItemButton, + Skeleton as MuiSkeleton, Stack, Typography } from "@mui/material" import MenuItemHover from "@/common/ui/MenuItemHover" import { Project } from "@/features/projects/domain" import ProjectAvatar from "./ProjectAvatar" +import ProjectAvatarSquircle from "./ProjectAvatarSquircle" + +const AVATAR_SIZE = { width: 40, height: 40 } const ProjectListItem = ({ project, - isSelected, - onSelectProject + selected, + onSelect }: { project: Project - isSelected: boolean - onSelectProject: (project: Project) => void + selected: boolean + onSelect: () => void +}) => { + return ( + + ) +} + +export default ProjectListItem + +export const Skeleton = () => { + return ( + + ) +} + +const Template = ({ + disabled, + selected, + onSelect, + avatar, + children +}: { + disabled?: boolean + selected?: boolean + onSelect?: () => void + avatar: React.ReactNode + children?: React.ReactNode }) => { return ( + {disabled && + + {children} + + } + {!disabled && onSelectProject(project)} - selected={isSelected} + disabled={disabled} + onClick={onSelect} + selected={selected} disableGutters sx={{ padding: 0 }} > - - - - - - - {project.displayName} - - } - /> - - + + {children} + + } ) } -export default ProjectListItem +const ButtonLabel = ({ + disabled, + avatar, + children +}: { + disabled?: boolean + avatar: React.ReactNode + children?: React.ReactNode +}) => { + return ( + + + + + {avatar} + + + {children} + + + ) +} diff --git a/src/features/sidebar/view/internal/sidebar/projects/ProjectListItemPlaceholder.tsx b/src/features/sidebar/view/internal/sidebar/projects/ProjectListItemPlaceholder.tsx deleted file mode 100644 index 77de983a..00000000 --- a/src/features/sidebar/view/internal/sidebar/projects/ProjectListItemPlaceholder.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { ListItem, ListItemText, Stack, Skeleton } from "@mui/material" -import MenuItemHover from "@/common/ui/MenuItemHover" -import ProjectAvatarSquircle from "./ProjectAvatarSquircle" - -const ProjectListItemPlaceholder = () => { - return ( - - - - - - - - } - /> - - - - ) -} - -export default ProjectListItemPlaceholder \ No newline at end of file