Skip to content

Commit a4e1aa6

Browse files
committed
feat: MemeDetailPage에서 웹뷰 상태 관리 로직 개선
- 전역에서 웹뷰 상태 변경을 처리하는 커스텀 이벤트를 정의하여 코드의 일관성을 높임 - useEffect 훅을 사용하여 웹뷰 상태 변경 이벤트 리스너를 등록하고 해제하는 로직을 추가함 - 웹뷰 진입 시 알림을 유지하여 사용자 경험을 향상시킴
1 parent efb7575 commit a4e1aa6

File tree

1 file changed

+26
-7
lines changed

1 file changed

+26
-7
lines changed

apps/web/src/pages/MemeDetailPage/index.tsx

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@ import { useMemeDetailQuery } from '@meme_wiki/apis';
1313
import { useEffect, useState } from 'react';
1414
import { BridgeCommand, COMMAND_TYPE, CommandType } from '@/types/bridge';
1515

16+
// 전역에서 함수 정의
17+
if (typeof window !== 'undefined') {
18+
window.onNativeEntered = (command: BridgeCommand<CommandType>) => {
19+
// MemeDetailPage 컴포넌트의 setIsWebview를 호출하기 위한 커스텀 이벤트
20+
window.dispatchEvent(
21+
new CustomEvent('webviewStateChange', {
22+
detail: command.type === COMMAND_TYPE.APP_ENTERED,
23+
}),
24+
);
25+
};
26+
}
27+
1628
const MemeDetailPage = () => {
1729
const [isWebview, setIsWebview] = useState(false);
1830
const { memeId } = useParams();
@@ -21,18 +33,25 @@ const MemeDetailPage = () => {
2133
const theme = useTheme();
2234

2335
useEffect(() => {
24-
window.onNativeEntered = (command: BridgeCommand<CommandType>) => {
25-
if (command.type === COMMAND_TYPE.APP_ENTERED) {
26-
setIsWebview(true);
27-
} else {
28-
setIsWebview(false);
29-
}
36+
// 웹뷰 상태 변경 이벤트 리스너
37+
const handleWebviewState = (event: CustomEvent<boolean>) => {
38+
setIsWebview(event.detail);
3039
};
3140

41+
// 이벤트 리스너 등록
42+
window.addEventListener(
43+
'webviewStateChange',
44+
handleWebviewState as EventListener,
45+
);
46+
47+
// 웹뷰 진입 알림
3248
nativeBridge.webEntered();
3349

3450
return () => {
35-
window.onNativeEntered = undefined;
51+
window.removeEventListener(
52+
'webviewStateChange',
53+
handleWebviewState as EventListener,
54+
);
3655
};
3756
}, []);
3857

0 commit comments

Comments
 (0)