mirror of
https://github.com/Unleash/unleash.git
synced 2025-06-23 01:16:27 +02:00
**Upgrade to React v18 for Unleash v6. Here's why I think it's a good time to do it:** - Command Bar project: We've begun work on the command bar project, and there's a fantastic library we want to use. However, it requires React v18 support. - Straightforward Upgrade: I took a look at the upgrade guide https://react.dev/blog/2022/03/08/react-18-upgrade-guide and it seems fairly straightforward. In fact, I was able to get React v18 running with minimal changes in just 10 minutes! - Dropping IE Support: React v18 no longer supports Internet Explorer (IE), which is no longer supported by Microsoft as of June 15, 2022. Upgrading to v18 in v6 would be a good way to align with this change. TS updates: * FC children has to be explicit: https://stackoverflow.com/questions/71788254/react-18-typescript-children-fc * forcing version 18 types in resolutions: https://sentry.io/answers/type-is-not-assignable-to-type-reactnode/ Test updates: * fixing SWR issue that we have always had but it manifests more in new React (https://github.com/vercel/swr/issues/2373) --------- Co-authored-by: kwasniew <kwasniewski.mateusz@gmail.com>
62 lines
1.8 KiB
TypeScript
62 lines
1.8 KiB
TypeScript
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';
|
|
|
|
interface IProjectCardFooterProps {
|
|
id: string;
|
|
isFavorite?: boolean;
|
|
children?: React.ReactNode;
|
|
}
|
|
|
|
const StyledFooter = styled(Box)(({ theme }) => ({
|
|
display: 'grid',
|
|
gridTemplateColumns: 'auto 1fr auto',
|
|
alignItems: 'center',
|
|
padding: theme.spacing(1.5, 3, 2.5, 3),
|
|
background: theme.palette.envAccordion.expanded,
|
|
boxShadow: theme.boxShadows.accordionFooter,
|
|
}));
|
|
|
|
const StyledFavoriteIconButton = styled(FavoriteIconButton)(({ theme }) => ({
|
|
marginRight: theme.spacing(-1),
|
|
marginBottom: theme.spacing(-1),
|
|
}));
|
|
|
|
export const ProjectCardFooter: FC<IProjectCardFooterProps> = ({
|
|
children,
|
|
id,
|
|
isFavorite = false,
|
|
}) => {
|
|
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 (
|
|
<StyledFooter>
|
|
{children}
|
|
<StyledFavoriteIconButton
|
|
onClick={onFavorite}
|
|
isFavorite={isFavorite}
|
|
size='medium'
|
|
/>
|
|
</StyledFooter>
|
|
);
|
|
};
|