diff --git a/src/components/Card/AnnounceCard/index.tsx b/src/components/Card/AnnounceCard/index.tsx index 42346fbd..2762352c 100644 --- a/src/components/Card/AnnounceCard/index.tsx +++ b/src/components/Card/AnnounceCard/index.tsx @@ -6,26 +6,36 @@ import openLink from '@utils/router/openLink'; interface AnnounceCardProps extends AnnounceItem { author?: string; + recruitment_period?: string; } const AnnounceCard = ({ title, link, uploadDate, + recruitment_period, author, }: AnnounceCardProps) => { const { major } = useMajor(); - uploadDate = uploadDate.slice(2); + const showDate = () => { + if (recruitment_period) return recruitment_period; + uploadDate = uploadDate.slice(2); + return `20${uploadDate}`; + }; return ( openLink(link)} data-testid="card"> {title} - 20{uploadDate} - - {author ? author : major} + {showDate()} + {!recruitment_period && ( + <> + + {author ? author : major} + + )} diff --git a/src/components/Card/InformCard/index.test.tsx b/src/components/Card/InformCard/index.test.tsx index 01dd8c0d..5a02292c 100644 --- a/src/components/Card/InformCard/index.test.tsx +++ b/src/components/Card/InformCard/index.test.tsx @@ -5,7 +5,6 @@ import MajorContext from '@contexts/major'; import useModals from '@hooks/useModals'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import Major from '@type/major'; import { IconKind } from '@type/styles/icon'; import { act } from 'react-dom/test-utils'; import { MemoryRouter } from 'react-router-dom'; @@ -38,18 +37,14 @@ const INFORM_CARD: INFORM_CARD_DATA = { }; const setMajorMock = (isRender: boolean) => { - const mockMajor: Major = isRender ? null : '컴퓨터인공지능학부'; + const mockGetMajor = jest.fn(); const mockSetMajor = jest.fn(); - jest.mock('react', () => ({ - ...jest.requireActual('react'), - useState: () => [mockMajor, mockSetMajor, graduationLink], - })); + mockGetMajor.mockReturnValue(isRender ? null : '컴퓨터인공지능학부'); return { - major: mockMajor, + getMajor: mockGetMajor, setMajor: mockSetMajor, - graduationLink, }; }; @@ -76,6 +71,7 @@ jest.mock('@hooks/useModals', () => { describe('InformCard 컴포넌트 테스트', () => { const oldWindowLocation = window.location; + beforeEach(() => { Object.defineProperty(window, 'location', { configurable: true, diff --git a/src/components/Providers/MajorProvider/index.tsx b/src/components/Providers/MajorProvider/index.tsx index ffe046be..bc51cfc6 100644 --- a/src/components/Providers/MajorProvider/index.tsx +++ b/src/components/Providers/MajorProvider/index.tsx @@ -1,22 +1,19 @@ import MajorContext from '@contexts/major'; -import React, { useEffect, useState } from 'react'; +import React from 'react'; + +import MajorStorage from './major-storage'; interface MajorProviderProps { children: React.ReactNode; } -const MajorProvider = ({ children }: MajorProviderProps) => { - const [major, setMajor] = useState(null); - - useEffect(() => { - const storedMajor = localStorage.getItem('major'); - if (!storedMajor) return; +const MAJOR_STORAGE_KEY = 'major' as string; - setMajor(storedMajor); - }, []); +const MajorProvider = ({ children }: MajorProviderProps) => { + const majorStorage = new MajorStorage(MAJOR_STORAGE_KEY); return ( - + {children} ); diff --git a/src/components/Providers/MajorProvider/major-storage.ts b/src/components/Providers/MajorProvider/major-storage.ts new file mode 100644 index 00000000..177a2bec --- /dev/null +++ b/src/components/Providers/MajorProvider/major-storage.ts @@ -0,0 +1,23 @@ +interface IMajorStorage { + getMajor: () => string | null; + setMajor: (major: string) => void; +} + +class MajorStorage implements IMajorStorage { + private TOKEN_KEY; + + constructor(key: string) { + this.TOKEN_KEY = key; + } + + getMajor() { + const major = localStorage.getItem(this.TOKEN_KEY); + return major; + } + + setMajor(major: string) { + localStorage.setItem(this.TOKEN_KEY, major); + } +} + +export default MajorStorage; diff --git a/src/components/Providers/OverlayProvider/index.tsx b/src/components/Providers/OverlayProvider/index.tsx index 58eea83c..8a1a2578 100644 --- a/src/components/Providers/OverlayProvider/index.tsx +++ b/src/components/Providers/OverlayProvider/index.tsx @@ -2,8 +2,7 @@ import Modal from '@components/Common/Modal'; import OverlayContext from '@contexts/overlays'; import useModals from '@hooks/useModals'; import useUserLocation from '@hooks/useUserLocation'; -import React, { useMemo } from 'react'; -import { Outlet } from 'react-router-dom'; +import React from 'react'; import CustomOverlay from './overlay'; diff --git a/src/contexts/major.ts b/src/contexts/major.ts index 750de426..6c108c47 100644 --- a/src/contexts/major.ts +++ b/src/contexts/major.ts @@ -2,8 +2,8 @@ import Major from '@type/major'; import { createContext } from 'react'; interface MajorState { - major: Major; - setMajor: React.Dispatch>; + getMajor: () => Major; + setMajor: (major: string) => void; } const MajorContext = createContext(null); diff --git a/src/hooks/useMajor.ts b/src/hooks/useMajor.ts index 4b873c98..99e880ec 100644 --- a/src/hooks/useMajor.ts +++ b/src/hooks/useMajor.ts @@ -2,13 +2,19 @@ import MajorContext from '@contexts/major'; import { useContext } from 'react'; const useMajor = () => { - const context = useContext(MajorContext); + const majorStorage = useContext(MajorContext); - if (!context) { + if (!majorStorage) { throw new Error('MajorContext does not exists.'); } - return context; + const major = majorStorage.getMajor(); + const setMajor = majorStorage.setMajor.bind(majorStorage); + + return { + major, + setMajor, + }; }; export default useMajor; diff --git a/src/pages/Announcement/index.tsx b/src/pages/Announcement/index.tsx index 1bc072b1..b9a8344b 100644 --- a/src/pages/Announcement/index.tsx +++ b/src/pages/Announcement/index.tsx @@ -44,6 +44,16 @@ const Announcement = () => { /> } /> + + } + /> ); }; diff --git a/src/pages/MajorDecision/index.test.tsx b/src/pages/MajorDecision/index.test.tsx index e85d85bd..91ee2d16 100644 --- a/src/pages/MajorDecision/index.test.tsx +++ b/src/pages/MajorDecision/index.test.tsx @@ -15,6 +15,7 @@ jest.mock('react-router-dom', () => ({ })); describe.skip('학과선택 페이지 로직 테스트', () => { + const mockGetMajor = jest.fn(); const mockSetMajor = jest.fn(); beforeEach(() => { @@ -33,7 +34,7 @@ describe.skip('학과선택 페이지 로직 테스트', () => {