Skip to content

Commit 3e5306e

Browse files
committed
[feat]필터링 뒤로가기 스크롤 저장
1 parent 6945950 commit 3e5306e

File tree

7 files changed

+126
-262
lines changed

7 files changed

+126
-262
lines changed

src/domains/recipe/components/details/BackBtn.tsx

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
'use client';
22

3-
import { useRouter } from 'next/navigation';
43
import Back from '@/shared/assets/icons/back_36.svg';
4+
import { useSaveScroll } from '../../hook/useSaveScroll';
55

66
function BackButton() {
7-
const router = useRouter();
7+
8+
const { restoreAndGoBack } = useSaveScroll({
9+
storageKey: 'cocktail_list_scroll',
10+
});
811

9-
10-
const handleClick = () => {
11-
const url = sessionStorage.getItem('saveUrl');
12-
if (!url) return;
13-
router.replace(url,{scroll:false});
14-
};
12+
const handleBack = () => {
13+
console.log('뒤로가기 클릭');
14+
console.log('저장된 스크롤:', sessionStorage.getItem('cocktail_list_scroll'));
15+
console.log('저장된 URL:', sessionStorage.getItem('cocktail_list_scroll_url'));
16+
console.log('복원 플래그:', sessionStorage.getItem('cocktail_list_scroll_restore'));
17+
restoreAndGoBack()
18+
}
19+
1520

1621
return (
17-
<button type="button" className="z-1" aria-label="뒤로가기" onClick={handleClick}>
22+
<button type="button" className="z-1" aria-label="뒤로가기" onClick={handleBack}>
1823
<Back />
1924
</button>
2025
);

src/domains/recipe/components/main/Accordion.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ function Accordion({ setAlcoholBaseTypes, setCocktailTypes, setAlcoholStrengths
149149
title={title}
150150
id={id}
151151
groupKey="filter"
152-
value={currentValue} // 현재 선택된 값 전달
152+
value={currentValue}
153153
onChange={(value) => handleSelect(id, value)}
154154
/>
155155
</li>

src/domains/recipe/components/main/CocktailList.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,23 @@
33
import Link from 'next/link';
44
import { Cocktail } from '../../types/types';
55
import CocktailCard from '@/domains/shared/components/cocktail-card/CocktailCard';
6+
import { useSaveScroll } from '../../hook/useSaveScroll';
67

78
interface Props {
89
cocktails: Cocktail[];
910
}
1011

1112
function CocktailList({cocktails}: Props) {
1213

13-
const handleClick = () => {
14-
sessionStorage.setItem('saveUrl',location.href)
15-
}
14+
const { saveAndNavigate } = useSaveScroll({
15+
storageKey: 'cocktail_list_scroll',
16+
});
17+
18+
const handleClick = (cocktailId: number) => (e: React.MouseEvent<HTMLAnchorElement>) => {
19+
e.preventDefault();
20+
21+
saveAndNavigate(`/recipe/${cocktailId}`);
22+
};
1623

1724
return (
1825
<ul
@@ -34,7 +41,7 @@ function CocktailList({cocktails}: Props) {
3441
isKeep,
3542
},i) => (
3643
<li key={`${cocktailId} - ${i}` } className="w-full">
37-
<Link href={`/recipe/${cocktailId}`} onClick={handleClick}>
44+
<Link href={`/recipe/${cocktailId}`} onClick={handleClick(cocktailId)}>
3845
<CocktailCard
3946
favor={isKeep}
4047
id={cocktailId}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import { useRouter } from 'next/navigation';
2+
import { useEffect, useRef } from 'react';
3+
4+
interface Scroll {
5+
storageKey?: string;
6+
enabled?: boolean;
7+
// 이 페이지가 리스트 페이지인지 상세 페이지인지 구분
8+
pageType?: 'list' | 'detail';
9+
}
10+
11+
export const useSaveScroll = (opt: Scroll = {}) => {
12+
const {
13+
storageKey = 'cocktail_scroll',
14+
enabled = true,
15+
pageType = 'list', // 기본값은 리스트
16+
} = opt;
17+
const router = useRouter();
18+
const hasRestore = useRef(false);
19+
20+
useEffect(() => {
21+
console.log('=== useEffect 실행 ===');
22+
console.log('pageType:', pageType);
23+
24+
// 상세 페이지에서는 스크롤 복원 로직 실행 안함
25+
if (pageType === 'detail') {
26+
console.log('상세 페이지 - 복원 스킵');
27+
return;
28+
}
29+
30+
if (!enabled || hasRestore.current) {
31+
console.log('조건 불만족');
32+
return;
33+
}
34+
35+
const savedPosition = sessionStorage.getItem(storageKey);
36+
const shouldRestore = sessionStorage.getItem(`${storageKey}_should_restore`);
37+
38+
console.log('savedPosition:', savedPosition);
39+
console.log('shouldRestore:', shouldRestore);
40+
41+
// 리스트 페이지이고, 복원 플래그가 있을 때만 복원
42+
if (savedPosition && shouldRestore === 'true') {
43+
const position = parseInt(savedPosition, 10);
44+
45+
console.log('스크롤 복원 시도:', position);
46+
47+
const restoreScroll = () => {
48+
console.log('restoreScroll 함수 실행');
49+
window.scrollTo(0, position);
50+
console.log('현재 스크롤 위치:', window.scrollY);
51+
hasRestore.current = true;
52+
};
53+
54+
// 여러 타이밍에 시도
55+
requestAnimationFrame(restoreScroll);
56+
setTimeout(restoreScroll, 0);
57+
setTimeout(restoreScroll, 100);
58+
59+
// 복원 플래그 제거
60+
sessionStorage.removeItem(`${storageKey}_should_restore`);
61+
} else {
62+
console.log('복원 조건 불만족');
63+
}
64+
}, [storageKey, enabled, pageType]);
65+
66+
const saveScroll = () => {
67+
if (!enabled) return;
68+
const currentScroll = window.scrollY;
69+
sessionStorage.setItem(storageKey, currentScroll.toString());
70+
console.log('스크롤 저장:', currentScroll);
71+
};
72+
73+
// 상세 페이지로 이동 (스크롤 위치만 저장, 복원 플래그는 설정 안함)
74+
const saveAndNavigate = (href: string) => {
75+
saveScroll();
76+
sessionStorage.setItem(`${storageKey}_url`, location.href);
77+
console.log('상세 페이지로 이동 - 스크롤만 저장');
78+
router.push(href);
79+
};
80+
81+
// 뒤로가기 (복원 플래그 설정)
82+
const restoreAndGoBack = () => {
83+
const saveUrl = sessionStorage.getItem(`${storageKey}_url`);
84+
console.log('뒤로가기 - saveUrl:', saveUrl);
85+
86+
if (!saveUrl) return;
87+
88+
// 뒤로가기할 때만 복원 플래그 설정
89+
sessionStorage.setItem(`${storageKey}_should_restore`, 'true');
90+
console.log('복원 플래그 설정 완료');
91+
92+
router.replace(saveUrl, { scroll: false });
93+
};
94+
95+
return {
96+
saveScroll,
97+
saveAndNavigate,
98+
restoreAndGoBack,
99+
};
100+
};

src/domains/recipe/hook/useSearchControl.tsx

Lines changed: 0 additions & 67 deletions
This file was deleted.

src/domains/shared/hook/useIntersectionObserver.ts

Lines changed: 0 additions & 25 deletions
This file was deleted.

0 commit comments

Comments
 (0)