diff --git a/src/@types/styles/icon.ts b/src/@types/styles/icon.ts new file mode 100644 index 00000000..46552c3d --- /dev/null +++ b/src/@types/styles/icon.ts @@ -0,0 +1,8 @@ +export type IconKind = + | 'map' + | 'home' + | 'accountCircle' + | 'school' + | 'notification' + | 'menu' + | 'arrowBack'; diff --git a/src/components/Card/InformCard/index.test.tsx b/src/components/Card/InformCard/index.test.tsx new file mode 100644 index 00000000..8cb61704 --- /dev/null +++ b/src/components/Card/InformCard/index.test.tsx @@ -0,0 +1,51 @@ +import ThemeProvider from '@styles/ThemeProvider'; +import { render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { MemoryRouter } from 'react-router-dom'; + +import '@testing-library/jest-dom'; +import InformCard from './index'; + +describe('Card 클릭 시 페이지 이동이 잘 되는지에 대한 테스트', () => { + it('공지사항 클릭 테스트', () => { + const ICON = 'notification'; + const TITLE = '공지사항'; + const PATH = 'announcement'; + render( + + + , + { wrapper: MemoryRouter }, + ); + + const card = screen.getByTestId('card'); + + (async () => { + await userEvent.click(card); + waitFor(() => { + expect(window.location.pathname).toBe(`/${PATH}`); + }); + })(); + }); + + it('졸업요건 클릭 테스트', () => { + const ICON = 'school'; + const TITLE = '졸업요건'; + const PATH = 'graduation-requirements'; + render( + + + , + { wrapper: MemoryRouter }, + ); + + const card = screen.getByTestId('card'); + + (async () => { + await userEvent.click(card); + waitFor(() => { + expect(window.location.pathname).toBe(`/${PATH}`); + }); + })(); + }); +}); diff --git a/src/components/Card/InformCard/index.tsx b/src/components/Card/InformCard/index.tsx new file mode 100644 index 00000000..39edd091 --- /dev/null +++ b/src/components/Card/InformCard/index.tsx @@ -0,0 +1,67 @@ +import Icon from '@components/Icon'; +import { css } from '@emotion/react'; +import styled from '@emotion/styled'; +import { theme } from '@styles/ThemeProvider/theme'; +import { IconKind } from '@type/styles/icon'; +import { setSize } from '@utils/styles/size'; +import { useNavigate } from 'react-router-dom'; + +interface InformCardProps { + icon: IconKind & ('school' | 'notification'); + title: string; + path: string; +} + +// 1. Card1 을 호출할 때, 넘겨주는 2개의 아이콘 종류(notification, school) 에 따라서 아이콘의 색깔과, 배경화면 색이 달라진다 + +const InformCard = ({ icon, title, path }: InformCardProps) => { + const navigate = useNavigate(); + const onClick = () => navigate(path); + + return ( + + + + {title} + + + {title} 보러가기! + + + ); +}; + +export default InformCard; + +type CardProps = Pick; + +const Card = styled.div(({ icon, theme }) => { + return { + display: 'flex', + flexDirection: 'column', + padding: '15px', + + borderRadius: '15px', + + backgroundColor: icon === 'school' ? theme.background : theme.primary, + color: icon === 'school' ? theme.text.gray : theme.text.white, + + '& > svg': { + margin: '10px 0', + }, + ...setSize(200, 150), + }; +}); diff --git a/src/components/Icon/index.tsx b/src/components/Icon/index.tsx index a7c9b861..075cf4e2 100644 --- a/src/components/Icon/index.tsx +++ b/src/components/Icon/index.tsx @@ -1,3 +1,4 @@ +import { IconKind } from '@type/styles/icon'; import { IconType } from 'react-icons/lib'; import { MdMap, @@ -9,15 +10,6 @@ import { MdArrowBackIos, } from 'react-icons/md'; -type IconKind = - | 'map' - | 'home' - | 'accountCircle' - | 'school' - | 'notification' - | 'menu' - | 'arrowBack'; - const ICON: { [key in IconKind]: IconType } = { map: MdMap, home: MdHome, diff --git a/src/styles/ThemeProvider/theme.ts b/src/styles/ThemeProvider/theme.ts index bc7a0a6c..e0ba82a4 100644 --- a/src/styles/ThemeProvider/theme.ts +++ b/src/styles/ThemeProvider/theme.ts @@ -1 +1,20 @@ -export const theme = {}; +import { Theme } from '@emotion/react'; + +export const theme: Theme = { + background: '#EAEAEA', + + text: { + black: '#000000', + gray: '#808080', + white: '#FFFFFF', + }, + + primary: '#71BC5C', + + button: { + green: '#71BC5C', + gray: '#E7E7E7', + }, + + modalBackground: 'rgba(0, 0, 0, 0.6)', +}; diff --git a/src/styles/emotion.d.ts b/src/styles/emotion.d.ts new file mode 100644 index 00000000..e17a842a --- /dev/null +++ b/src/styles/emotion.d.ts @@ -0,0 +1,21 @@ +import '@emotion/react'; + +declare module '@emotion/react' { + export interface Theme { + background: string; // EAEAEA + text: { + black: string; + gray: string; + white: string; + }; + + primary: string; // 71BC5C + + button: { + green: string; + gray: string; + }; + + modalBackground: string; + } +}