From ccb29a5acfd878d0f60bf3ef670c491a6778d21e Mon Sep 17 00:00:00 2001
From: Tymoteusz Czech <2625371+Tymek@users.noreply.github.com>
Date: Tue, 13 Aug 2024 15:19:13 +0200
Subject: [PATCH] refactor: project archive card (#7859)
- Refactored "favorites" action, and fixed issue with "favorite" prop
- Refactored "owners" - simplified footer
---
.../project/NewProjectCard/NewProjectCard.tsx | 10 ++--
.../NewProjectCard/ProjectArchiveCard.tsx | 10 +++-
.../FavoriteAction/FavoriteAction.tsx | 40 +++++++++++++
.../ProjectCardFooter/ProjectCardFooter.tsx | 58 +++----------------
.../ProjectOwners/ProjectOwners.tsx | 12 +++-
5 files changed, 69 insertions(+), 61 deletions(-)
create mode 100644 frontend/src/component/project/NewProjectCard/ProjectCardFooter/FavoriteAction/FavoriteAction.tsx
diff --git a/frontend/src/component/project/NewProjectCard/NewProjectCard.tsx b/frontend/src/component/project/NewProjectCard/NewProjectCard.tsx
index f4ba5ce84c..43c19f8818 100644
--- a/frontend/src/component/project/NewProjectCard/NewProjectCard.tsx
+++ b/frontend/src/component/project/NewProjectCard/NewProjectCard.tsx
@@ -12,9 +12,9 @@ import {
} from './NewProjectCard.styles';
import { ProjectCardFooter } from './ProjectCardFooter/ProjectCardFooter';
import { ProjectModeBadge } from './ProjectModeBadge/ProjectModeBadge';
-import { ProjectOwners } from './ProjectOwners/ProjectOwners';
import type { ProjectSchemaOwners } from 'openapi';
import { ProjectIcon } from 'component/common/ProjectIcon/ProjectIcon';
+import { FavoriteAction } from './ProjectCardFooter/FavoriteAction/FavoriteAction';
interface IProjectCardProps {
name: string;
@@ -23,7 +23,7 @@ interface IProjectCardProps {
memberCount?: number;
id: string;
onHover: () => void;
- isFavorite?: boolean;
+ favorite?: boolean;
mode: string;
owners?: ProjectSchemaOwners;
}
@@ -36,7 +36,7 @@ export const ProjectCard = ({
onHover,
id,
mode,
- isFavorite = false,
+ favorite = false,
owners,
}: IProjectCardProps) => (
@@ -78,8 +78,8 @@ export const ProjectCard = ({
-
-
+
+
);
diff --git a/frontend/src/component/project/NewProjectCard/ProjectArchiveCard.tsx b/frontend/src/component/project/NewProjectCard/ProjectArchiveCard.tsx
index b00862630a..8a7a342158 100644
--- a/frontend/src/component/project/NewProjectCard/ProjectArchiveCard.tsx
+++ b/frontend/src/component/project/NewProjectCard/ProjectArchiveCard.tsx
@@ -12,7 +12,6 @@ import {
} from './NewProjectCard.styles';
import { ProjectCardFooter } from './ProjectCardFooter/ProjectCardFooter';
import { ProjectModeBadge } from './ProjectModeBadge/ProjectModeBadge';
-import { ProjectOwners } from './ProjectOwners/ProjectOwners';
import type { ProjectSchemaOwners } from 'openapi';
import { ProjectIcon } from 'component/common/ProjectIcon/ProjectIcon';
import { formatDateYMDHM } from 'utils/formatDate';
@@ -132,8 +131,13 @@ export const ProjectArchiveCard: FC = ({
/>
-
-
+
+
);
diff --git a/frontend/src/component/project/NewProjectCard/ProjectCardFooter/FavoriteAction/FavoriteAction.tsx b/frontend/src/component/project/NewProjectCard/ProjectCardFooter/FavoriteAction/FavoriteAction.tsx
new file mode 100644
index 0000000000..938c0575d4
--- /dev/null
+++ b/frontend/src/component/project/NewProjectCard/ProjectCardFooter/FavoriteAction/FavoriteAction.tsx
@@ -0,0 +1,40 @@
+import type { FC } from 'react';
+import useToast from 'hooks/useToast';
+import { useFavoriteProjectsApi } from 'hooks/api/actions/useFavoriteProjectsApi/useFavoriteProjectsApi';
+import useProjects from 'hooks/api/getters/useProjects/useProjects';
+import { styled } from '@mui/material';
+import { FavoriteIconButton } from 'component/common/FavoriteIconButton/FavoriteIconButton';
+
+type FavoriteActionProps = { id: string; isFavorite?: boolean };
+
+const StyledFavoriteIconButton = styled(FavoriteIconButton)(({ theme }) => ({
+ margin: theme.spacing(1, 2, 0, 0),
+}));
+
+export const FavoriteAction: FC = ({ id, isFavorite }) => {
+ const { setToastApiError } = useToast();
+ const { favorite, unfavorite } = useFavoriteProjectsApi();
+ const { refetch } = useProjects();
+
+ const onFavorite = async (e: React.SyntheticEvent) => {
+ e.preventDefault();
+ try {
+ if (isFavorite) {
+ await unfavorite(id);
+ } else {
+ await favorite(id);
+ }
+ refetch();
+ } catch (error) {
+ setToastApiError('Something went wrong, could not update favorite');
+ }
+ };
+
+ return (
+
+ );
+};
diff --git a/frontend/src/component/project/NewProjectCard/ProjectCardFooter/ProjectCardFooter.tsx b/frontend/src/component/project/NewProjectCard/ProjectCardFooter/ProjectCardFooter.tsx
index b64c60ce97..002339b17a 100644
--- a/frontend/src/component/project/NewProjectCard/ProjectCardFooter/ProjectCardFooter.tsx
+++ b/frontend/src/component/project/NewProjectCard/ProjectCardFooter/ProjectCardFooter.tsx
@@ -1,10 +1,10 @@
import type React from 'react';
import type { FC } from 'react';
import { Box, styled } from '@mui/material';
-import { FavoriteIconButton } from 'component/common/FavoriteIconButton/FavoriteIconButton';
-import useToast from 'hooks/useToast';
-import { useFavoriteProjectsApi } from 'hooks/api/actions/useFavoriteProjectsApi/useFavoriteProjectsApi';
-import useProjects from 'hooks/api/getters/useProjects/useProjects';
+import {
+ type IProjectOwnersProps,
+ ProjectOwners,
+} from '../ProjectOwners/ProjectOwners';
interface IProjectCardFooterProps {
id: string;
@@ -12,6 +12,7 @@ interface IProjectCardFooterProps {
children?: React.ReactNode;
Actions?: FC<{ id: string; isFavorite?: boolean }>;
disabled?: boolean;
+ owners: IProjectOwnersProps['owners'];
}
const StyledFooter = styled(Box)<{ disabled: boolean }>(
@@ -27,58 +28,15 @@ const StyledFooter = styled(Box)<{ disabled: boolean }>(
}),
);
-const StyledContainer = styled(Box)(({ theme }) => ({
- padding: theme.spacing(1.5, 0, 2.5, 3),
- display: 'flex',
- alignItems: 'center',
-}));
-
-const StyledFavoriteIconButton = styled(FavoriteIconButton)(({ theme }) => ({
- margin: theme.spacing(1, 2, 0, 0),
-}));
-
-const FavoriteAction: FC<{ id: string; isFavorite?: boolean }> = ({
- id,
- isFavorite,
-}) => {
- const { setToastApiError } = useToast();
- const { favorite, unfavorite } = useFavoriteProjectsApi();
- const { refetch } = useProjects();
-
- const onFavorite = async (e: React.SyntheticEvent) => {
- e.preventDefault();
- try {
- if (isFavorite) {
- await unfavorite(id);
- } else {
- await favorite(id);
- }
- refetch();
- } catch (error) {
- setToastApiError('Something went wrong, could not update favorite');
- }
- };
-
- return (
-
- );
-};
-
export const ProjectCardFooter: FC = ({
children,
- id,
- isFavorite = false,
- Actions = FavoriteAction,
+ owners,
disabled = false,
}) => {
return (
- {children}
-
+
+ {children}
);
};
diff --git a/frontend/src/component/project/NewProjectCard/ProjectOwners/ProjectOwners.tsx b/frontend/src/component/project/NewProjectCard/ProjectOwners/ProjectOwners.tsx
index b96b01c87a..4082de18fb 100644
--- a/frontend/src/component/project/NewProjectCard/ProjectOwners/ProjectOwners.tsx
+++ b/frontend/src/component/project/NewProjectCard/ProjectOwners/ProjectOwners.tsx
@@ -5,7 +5,7 @@ import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { AvatarGroup } from 'component/common/AvatarGroup/AvatarGroup';
-interface IProjectOwnersProps {
+export interface IProjectOwnersProps {
owners?: ProjectSchema['owners'];
}
@@ -59,12 +59,18 @@ const StyledHeader = styled('h3')(({ theme }) => ({
fontWeight: theme.typography.fontWeightRegular,
}));
+const StyledWrapper = styled('div')(({ theme }) => ({
+ padding: theme.spacing(1.5, 0, 2.5, 3),
+ display: 'flex',
+ alignItems: 'center',
+}));
+
export const ProjectOwners: FC = ({ owners = [] }) => {
const ownersMap = useOwnersMap();
const users = owners.map(ownersMap);
return (
- <>
+
{owners.length === 1 ? 'Owner' : 'Owners'}
@@ -76,6 +82,6 @@ export const ProjectOwners: FC = ({ owners = [] }) => {
show={{users[0]?.name}}
elseShow={}
/>
- >
+
);
};