From dcb53760afb43241c64900ced7c61c8b109e3434 Mon Sep 17 00:00:00 2001 From: hwinkr Date: Sat, 6 Jan 2024 19:10:35 +0900 Subject: [PATCH 1/6] =?UTF-8?q?refactor(MajorState):=20=EC=A0=84=EA=B3=B5?= =?UTF-8?q?=20=EC=BB=A8=ED=85=8D=EC=8A=A4=ED=8A=B8=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 리액트 훅으로 관리하기 위해 사용했던 타입을 삭제 --- src/contexts/major.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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); From 0497d804e4c3b41732b3eb411b2825142d3f3afe Mon Sep 17 00:00:00 2001 From: hwinkr Date: Sat, 6 Jan 2024 19:12:16 +0900 Subject: [PATCH 2/6] =?UTF-8?q?refactor(MajorProvider):=20useState=20?= =?UTF-8?q?=ED=9B=85=EC=9C=BC=EB=A1=9C=20=EA=B4=80=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=83=81=ED=83=9C=EA=B0=80=20=EC=95=84=EB=8B=8C,?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=EC=9C=BC=EB=A1=9C=20=EC=A3=BC=EC=9E=85=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B2=83=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Providers/MajorProvider/index.tsx | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) 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} ); From 0073d674c518a7c561a5dd28a9a764091c8f1fa5 Mon Sep 17 00:00:00 2001 From: hwinkr Date: Sat, 6 Jan 2024 19:13:20 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat(MajorStorage):=20=EC=A0=84=EA=B3=B5?= =?UTF-8?q?=EC=9D=84=20=EA=B4=80=EB=A6=AC=ED=95=98=EB=8A=94=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - getMajor : 로컬 스토리지에서 사용자의 전공을 가져옴 - setMajor : 초기 전공을 설정하거나, 전공을 변경할 경우 로컬 스토리지에 새로운 전공을 저장 --- .../Providers/MajorProvider/major-storage.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/components/Providers/MajorProvider/major-storage.ts 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; From 6d80ba5791cdd7cb14cd363fb1d55b397dfaebe0 Mon Sep 17 00:00:00 2001 From: hwinkr Date: Sat, 6 Jan 2024 19:13:45 +0900 Subject: [PATCH 4/6] =?UTF-8?q?chore(delete=20unused=20file):=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Providers/OverlayProvider/index.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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'; From 4663f572b0a5ed3ef6ce80bccf6797c4934b9d50 Mon Sep 17 00:00:00 2001 From: hwinkr Date: Sat, 6 Jan 2024 19:15:34 +0900 Subject: [PATCH 5/6] =?UTF-8?q?refactor(useMajor):=20=EC=A3=BC=EC=9E=85?= =?UTF-8?q?=EB=B0=9B=EC=9D=80=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=B4=EC=84=9C=20=EC=A0=84=EA=B3=B5?= =?UTF-8?q?=EC=9D=84=20=EA=B4=80=EB=A6=AC=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useMajor.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) 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; From 9fa835762a785c9497a55f4a1321e0c35569d72c Mon Sep 17 00:00:00 2001 From: hwinkr Date: Sat, 6 Jan 2024 19:26:40 +0900 Subject: [PATCH 6/6] =?UTF-8?q?test(modify=20major=20logic):=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=EC=97=90=EC=84=9C=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD=EB=90=9C=20=EC=A0=84=EA=B3=B5?= =?UTF-8?q?=EC=9D=84=20=EA=B4=80=EB=A6=AC=ED=95=98=EB=8A=94=20=EB=B0=A9?= =?UTF-8?q?=EB=B2=95=EC=9D=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=EC=97=90=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Card/InformCard/index.test.tsx | 12 ++++-------- src/pages/MajorDecision/index.test.tsx | 3 ++- 2 files changed, 6 insertions(+), 9 deletions(-) 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/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('학과선택 페이지 로직 테스트', () => {