Skip to content

Commit af5f46e

Browse files
committed
feat: 밈퀴즈 결과화면에서 공유하기 브릿지 추가
1 parent bb90b55 commit af5f46e

File tree

3 files changed

+56
-1
lines changed

3 files changed

+56
-1
lines changed

apps/web/src/pages/MemeQuizPage/components/MemeQuizResult/index.tsx

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,31 @@ import {
2121
} from './MemeQuizResult.styles';
2222
import useInAppBrowserDetect from '@/hooks/useInAppBrowserDetect';
2323
import { useMemeQuizMutation } from '@meme_wiki/apis';
24+
import { nativeBridge } from '@/utils/bridge';
25+
import { BridgeCommand, COMMAND_TYPE, CommandType } from '@/types/bridge';
2426

2527
interface MemeQuizResultPageProps {
2628
rightCount: number;
2729
}
2830

31+
// 전역에서 함수 정의
32+
if (typeof window !== 'undefined') {
33+
window.onNativeEntered = (command: BridgeCommand<CommandType>) => {
34+
// MemeDetailPage 컴포넌트의 setIsWebview를 호출하기 위한 커스텀 이벤트
35+
window.dispatchEvent(
36+
new CustomEvent('webviewStateChange', {
37+
detail: command.type === COMMAND_TYPE.APP_ENTERED,
38+
}),
39+
);
40+
};
41+
}
42+
2943
const MemeQuizResult = ({ rightCount }: MemeQuizResultPageProps) => {
3044
const { moveToStore } = useInAppBrowserDetect();
3145
const [showToast, setShowToast] = useState(false);
3246
const { mutate: quizResult } = useMemeQuizMutation();
3347
const isFirstRender = useRef(true);
48+
const [isWebview, setIsWebview] = useState(false);
3449

3550
useEffect(() => {
3651
if (isFirstRender.current) {
@@ -39,6 +54,29 @@ const MemeQuizResult = ({ rightCount }: MemeQuizResultPageProps) => {
3954
}
4055
}, [rightCount, quizResult]);
4156

57+
useEffect(() => {
58+
// 웹뷰 상태 변경 이벤트 리스너
59+
const handleWebviewState = (event: CustomEvent<boolean>) => {
60+
setIsWebview(event.detail);
61+
};
62+
63+
// 이벤트 리스너 등록
64+
window.addEventListener(
65+
'webviewStateChange',
66+
handleWebviewState as EventListener,
67+
);
68+
69+
// 웹뷰 진입 알림
70+
nativeBridge.webEntered();
71+
72+
return () => {
73+
window.removeEventListener(
74+
'webviewStateChange',
75+
handleWebviewState as EventListener,
76+
);
77+
};
78+
}, []);
79+
4280
return (
4381
<Container>
4482
<ResultCard>
@@ -82,7 +120,17 @@ const MemeQuizResult = ({ rightCount }: MemeQuizResultPageProps) => {
82120
링크 복사하고 공유하기
83121
</ShareButton>
84122
</ToastContainer>
85-
<MoreButton onClick={moveToStore}>더 많은 밈 보러가기</MoreButton>
123+
<MoreButton
124+
onClick={() => {
125+
if (isWebview) {
126+
nativeBridge.showMoreMemes();
127+
} else {
128+
moveToStore();
129+
}
130+
}}
131+
>
132+
더 많은 밈 보러가기
133+
</MoreButton>
86134
</ButtonContainer>
87135
</Container>
88136
);

apps/web/src/types/bridge.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export const COMMAND_TYPE = {
33
CUSTOM_MEME: 'CUSTOM_MEME',
44
WEB_ENTERED: 'WEB_ENTERED',
55
APP_ENTERED: 'APP_ENTERED',
6+
SHOW_MORE_MEMES: 'SHOW_MORE_MEMES',
67
} as const;
78

89
export type CommandType = (typeof COMMAND_TYPE)[keyof typeof COMMAND_TYPE];
@@ -22,6 +23,7 @@ export type CommandDataMap = {
2223
[COMMAND_TYPE.CUSTOM_MEME]: CustomMemeData;
2324
[COMMAND_TYPE.WEB_ENTERED]: null;
2425
[COMMAND_TYPE.APP_ENTERED]: null;
26+
[COMMAND_TYPE.SHOW_MORE_MEMES]: null;
2527
};
2628

2729
export interface BridgeCommand<T extends CommandType> {

apps/web/src/utils/bridge.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ class NativeBridge {
7575
webEntered() {
7676
this.sendCommand(COMMAND_TYPE.WEB_ENTERED);
7777
}
78+
79+
// 더 많은 밈 보기
80+
showMoreMemes() {
81+
this.sendCommand(COMMAND_TYPE.SHOW_MORE_MEMES);
82+
}
7883
}
7984

8085
export const nativeBridge = NativeBridge.getInstance();

0 commit comments

Comments
 (0)