Skip to content

Commit fa5b51a

Browse files
authored
[공통] Storage 접근 제한 환경에서 클라이언트 예외 발생 (#1260)
1 parent c060862 commit fa5b51a

29 files changed

Lines changed: 225 additions & 131 deletions

File tree

src/components/Course/hooks/useSelectedCourses.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,15 @@
11
import { useMemo, useState } from 'react';
22
import { PreCourse } from 'api/course/entity';
3+
import { isomorphicSessionStorage } from 'utils/ts/env';
34

45
const SELECTED_COURSES_KEY = 'selected-courses';
56

67
const getStoredCourses = (): PreCourse[] => {
7-
try {
8-
const stored = sessionStorage.getItem(SELECTED_COURSES_KEY);
9-
return stored ? JSON.parse(stored) : [];
10-
} catch {
11-
return [];
12-
}
8+
return isomorphicSessionStorage.getJSONItem<PreCourse[]>(SELECTED_COURSES_KEY, []);
139
};
1410

1511
const storeCourses = (courses: PreCourse[]) => {
16-
try {
17-
sessionStorage.setItem(SELECTED_COURSES_KEY, JSON.stringify(courses));
18-
} catch {
19-
// sessionStorage 용량 초과 등 무시
20-
}
12+
isomorphicSessionStorage.setJSONItem(SELECTED_COURSES_KEY, courses);
2113
};
2214

2315
export const getCourseKey = (course: PreCourse) => {

src/components/IndexComponents/IndexCafeteria/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ function IndexCafeteria() {
4545
};
4646

4747
const handleTooltipContentButtonClick = () => {
48-
localStorage.setItem('cafeteria-tooltip', 'used');
48+
isomorphicLocalStorage.setItem('cafeteria-tooltip', 'used');
4949
handleMoreClick();
5050
};
5151

5252
const handleTooltipCloseButtonClick = () => {
53-
localStorage.setItem('cafeteria-tooltip', 'used');
53+
isomorphicLocalStorage.setItem('cafeteria-tooltip', 'used');
5454
closeTooltip();
5555
};
5656

src/components/Store/StoreDetailPage/components/Review/components/ReviewButton/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import useStoreDetail from 'components/Store/StoreDetailPage/hooks/useStoreDetai
44
import useLogger from 'utils/hooks/analytics/useLogger';
55
import useModalPortal from 'utils/hooks/layout/useModalPortal';
66
import { useUser } from 'utils/hooks/state/useUser';
7+
import { isomorphicSessionStorage } from 'utils/ts/env';
78
import styles from './index.module.scss';
89

910
export const REVEIW_LOGIN = ['리뷰를 작성하기 ', '리뷰 작성은 회원만 사용 가능합니다.'];
@@ -46,7 +47,7 @@ export default function ReviewButton({ id, goReviewPage }: { id: string; goRevie
4647
event_label: 'shop_detail_view_review_write',
4748
value: storeDetail.name,
4849
});
49-
sessionStorage.setItem('enterReview', new Date().getTime().toString());
50+
isomorphicSessionStorage.setItem('enterReview', new Date().getTime().toString());
5051
};
5152

5253
return (

src/components/Store/StoreDetailPage/components/Review/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Suspense, useEffect } from 'react';
22
import { useRouter } from 'next/router';
33
import { DropdownProvider } from 'components/Store/StoreDetailPage/hooks/useDropdown';
44
import ROUTES from 'static/routes';
5+
import { isomorphicSessionStorage } from 'utils/ts/env';
56
import AverageRating from './components/AverageRating/AverageRating';
67
import ReviewButton from './components/ReviewButton';
78
import ReviewList from './components/ReviewList/ReviewList';
@@ -12,7 +13,7 @@ export default function ReviewPage({ id }: { id: string }) {
1213

1314
useEffect(() => {
1415
// 리뷰 페이지 진입 시간 기록
15-
sessionStorage.setItem('enterReviewPage', new Date().getTime().toString());
16+
isomorphicSessionStorage.setItem('enterReviewPage', new Date().getTime().toString());
1617
}, []);
1718

1819
return (

src/components/Store/StoreReviewPage/ReviewForm/ReviewForm.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import ROUTES from 'static/routes';
1111
import useLogger from 'utils/hooks/analytics/useLogger';
1212
import useImageUpload from 'utils/hooks/ui/useImageUpload';
1313
import useScrollToTop from 'utils/hooks/ui/useScrollToTop';
14+
import { isomorphicSessionStorage } from 'utils/ts/env';
1415
import uuidv4 from 'utils/ts/uuidGenerater';
1516
import styles from './ReviewForm.module.scss';
1617

@@ -65,7 +66,8 @@ function ReviewForm({ storeDetail, mutate, initialData = {} }: Props) {
6566
};
6667

6768
const reviewSuccessLogging = () => {
68-
const getReviewDurationTime = (new Date().getTime() - Number(sessionStorage.getItem('enterReview'))) / 1000;
69+
const getReviewDurationTime =
70+
(new Date().getTime() - Number(isomorphicSessionStorage.getItem('enterReview'))) / 1000;
6971
logger.actionEventClick({
7072
team: 'BUSINESS',
7173
event_label: 'shop_detail_view_review_write_done',

src/components/Store/utils/durationTime.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
1+
import { isomorphicSessionStorage } from 'utils/ts/env';
2+
13
const MAIN_ENTRY_TIME = 'main-entry-time';
24
const CATEGORY_ENTRY_TIME = 'category-entry-time';
35

46
const initializeTime = (key: string) => {
57
const currentTime = new Date().getTime();
6-
sessionStorage.setItem(key, currentTime.toString());
8+
isomorphicSessionStorage.setItem(key, currentTime.toString());
79
};
810

911
export const initializeMainEntryTime = () => initializeTime(MAIN_ENTRY_TIME);
1012
export const initializeCategoryEntryTime = () => initializeTime(CATEGORY_ENTRY_TIME);
1113

1214
const getTime = (key: string) => {
1315
const currentTime = new Date().getTime();
14-
const mainEntryTime = Number(sessionStorage.getItem(key)) || currentTime;
16+
const mainEntryTime = Number(isomorphicSessionStorage.getItem(key)) || currentTime;
1517
return (currentTime - mainEntryTime) / 1000;
1618
};
1719

src/components/TimetablePage/MainTimetablePage/DefaultPage/index.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import MainTimetable from 'components/TimetablePage/components/MainTimetable';
77
import TimetableList from 'components/TimetablePage/components/TimetableList';
88
import ROUTES from 'static/routes';
99
import useLogger from 'utils/hooks/analytics/useLogger';
10+
import { isomorphicSessionStorage } from 'utils/ts/env';
1011
import styles from './DefaultPage.module.scss';
1112

1213
interface DefaultPageProps {
@@ -19,14 +20,14 @@ export default function DefaultPage({ timetableFrameId, setCurrentFrameId }: Def
1920
const logger = useLogger();
2021
const handlePopState = React.useCallback(() => {
2122
// swipe로 뒤로가기 시
22-
if (sessionStorage.getItem('swipeToBack') === 'true') {
23+
if (isomorphicSessionStorage.getItem('swipeToBack') === 'true') {
2324
logger.actionEventSwipe({
2425
team: 'USER',
2526
event_label: 'timetable_back',
2627
value: 'OS스와이프',
2728
previous_page: '시간표',
2829
current_page: '메인',
29-
duration_time: (new Date().getTime() - Number(sessionStorage.getItem('enterTimetablePage'))) / 1000,
30+
duration_time: (new Date().getTime() - Number(isomorphicSessionStorage.getItem('enterTimetablePage'))) / 1000,
3031
});
3132
history.back();
3233
return;
@@ -38,7 +39,7 @@ export default function DefaultPage({ timetableFrameId, setCurrentFrameId }: Def
3839
value: '뒤로가기버튼',
3940
previous_page: '시간표',
4041
current_page: '메인',
41-
duration_time: (new Date().getTime() - Number(sessionStorage.getItem('enterTimetablePage'))) / 1000,
42+
duration_time: (new Date().getTime() - Number(isomorphicSessionStorage.getItem('enterTimetablePage'))) / 1000,
4243
});
4344
}, [logger]);
4445

@@ -51,11 +52,11 @@ export default function DefaultPage({ timetableFrameId, setCurrentFrameId }: Def
5152
}, []);
5253

5354
React.useEffect(() => {
54-
sessionStorage.setItem('swipeToBack', 'false');
55+
isomorphicSessionStorage.setItem('swipeToBack', 'false');
5556
const handleWheel = (e: WheelEvent) => {
5657
// 한 번에 최소 100px만큼 스크롤(드래그) 시 swipe했다고 간주
5758
if (e.deltaX < -100) {
58-
sessionStorage.setItem('swipeToBack', 'true');
59+
isomorphicSessionStorage.setItem('swipeToBack', 'true');
5960
}
6061
};
6162
window.addEventListener('wheel', handleWheel);

src/components/TimetablePage/components/MainTimetable/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import ROUTES from 'static/routes';
1919
import useLogger from 'utils/hooks/analytics/useLogger';
2020
import useBooleanState from 'utils/hooks/state/useBooleanState';
2121
import useTokenState from 'utils/hooks/state/useTokenState';
22+
import { isomorphicSessionStorage } from 'utils/ts/env';
2223
import { useSemester } from 'utils/zustand/semester';
2324
import DownloadTimetableModal from './DownloadTimetableModal';
2425
import styles from './MyLectureTimetable.module.scss';
@@ -143,7 +144,7 @@ function ValidMainTimetable({ timetableFrameId }: { readonly timetableFrameId: n
143144
team: 'USER',
144145
event_label: 'timetable',
145146
value: '이미지저장',
146-
duration_time: (new Date().getTime() - Number(sessionStorage.getItem('enterTimetablePage'))) / 1000,
147+
duration_time: (new Date().getTime() - Number(isomorphicSessionStorage.getItem('enterTimetablePage'))) / 1000,
147148
});
148149
openModal();
149150
}

src/components/TimetablePage/hooks/useTimetableMutation.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
} from 'api/timetable/entity';
1010
import useToast from 'components/feedback/Toast/useToast';
1111
import useTokenState from 'utils/hooks/state/useTokenState';
12+
import { isomorphicSessionStorage } from 'utils/ts/env';
1213
import showToast from 'utils/ts/showToast';
1314
import { useLecturesAction } from 'utils/zustand/myLectures';
1415
import { useSemester } from 'utils/zustand/semester';
@@ -67,7 +68,9 @@ export default function useTimetableMutation(timetableFrameId: number) {
6768

6869
// 강의 복원
6970
const restoreLecture = (id: number[]) => {
70-
const restoredLecture = JSON.parse(sessionStorage.getItem('restoreLecture')!);
71+
const restoredLecture = isomorphicSessionStorage.getJSONItem<Lecture | MyLectureInfo | null>('restoreLecture', null);
72+
if (!restoredLecture || typeof restoredLecture !== 'object') return;
73+
7174
if ('name' in restoredLecture) {
7275
addLectureFromLocalStorage(restoredLecture, `${semester?.year}${semester?.term}`);
7376
} else {
@@ -107,7 +110,7 @@ export default function useTimetableMutation(timetableFrameId: number) {
107110

108111
const removeMyLecture = useMutation({
109112
mutationFn: async ({ clickedLecture, id }: RemoveMyLectureProps & { disableRecoverButton?: boolean }) => {
110-
sessionStorage.setItem('restoreLecture', JSON.stringify(clickedLecture));
113+
isomorphicSessionStorage.setJSONItem('restoreLecture', clickedLecture);
111114
if (clickedLecture && 'name' in clickedLecture) {
112115
return Promise.resolve(removeLectureFromLocalStorage(clickedLecture, `${semester?.year}${semester?.term}`));
113116
}

src/components/layout/Header/MobileHeader/Panel/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import useTokenState from 'utils/hooks/state/useTokenState';
1313
import { useUser } from 'utils/hooks/state/useUser';
1414
import { useBodyScrollLock } from 'utils/hooks/ui/useBodyScrollLock';
1515
import { useEscapeKeyDown } from 'utils/hooks/ui/useEscapeKeyDown';
16+
import { isomorphicSessionStorage } from 'utils/ts/env';
1617
import { useMobileSidebar } from 'utils/zustand/mobileSidebar';
1718
import type { Portal } from 'components/modal/Modal/PortalProvider';
1819
import styles from './Panel.module.scss';
@@ -62,7 +63,7 @@ export default function Panel({ openModal }: PanelProps) {
6263
value: '햄버거',
6364
previous_page: '시간표',
6465
current_page: title,
65-
duration_time: (new Date().getTime() - Number(sessionStorage.getItem('enterTimetablePage'))) / 1000,
66+
duration_time: (new Date().getTime() - Number(isomorphicSessionStorage.getItem('enterTimetablePage'))) / 1000,
6667
});
6768
}
6869
};

0 commit comments

Comments
 (0)