From f5f18ed2749190001075bbd79830f505429a55e3 Mon Sep 17 00:00:00 2001 From: durumi99 Date: Sun, 25 Jan 2026 22:30:46 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=EC=95=8C=EB=A6=BC=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EC=9A=94=EC=B2=AD=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EA=B4=80=EB=A0=A8=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/webview.ts | 1 + src/layout/SearchHeader/SearchHeader.tsx | 24 +++++++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/config/webview.ts b/src/config/webview.ts index 389f709..0f9f680 100644 --- a/src/config/webview.ts +++ b/src/config/webview.ts @@ -5,6 +5,7 @@ export const MESSAGE_TYPES = { AUTH_ERROR: 'AUTH_ERROR', TOKEN: 'TOKEN', NEED_REGISTER: 'NEED_REGISTER', + REQUEST_NOTIFICATION_PERMISSION: 'REQUEST_NOTIFICATION_PERMISSION', } as const; export type MessageType = (typeof MESSAGE_TYPES)[keyof typeof MESSAGE_TYPES]; diff --git a/src/layout/SearchHeader/SearchHeader.tsx b/src/layout/SearchHeader/SearchHeader.tsx index 2fcae56..73f20cc 100644 --- a/src/layout/SearchHeader/SearchHeader.tsx +++ b/src/layout/SearchHeader/SearchHeader.tsx @@ -1,5 +1,7 @@ +import { MESSAGE_TYPES } from '@config/webview'; import { useNavigate } from 'react-router-dom'; import useAuthInfo from '@hooks/useAuthInfo'; +import useLocalStorageState from '@hooks/useLocalStorageState'; import useToast from '@hooks/useToast'; import ConfirmModal from '@components/Modal/Confirm/ConfirmModal'; import Toast from '@components/Toast/Toast'; @@ -29,16 +31,31 @@ const SearchHeader = ({ stockInfo }: { stockInfo: StockDetailInfo }) => { const { mutate: toggleNotification } = useToggleNotificationMutation(); const isBookmark = stockPreference?.isBookmarked ?? false; const isNotification = stockPreference?.isNotificationEnabled ?? false; + const [accessToken] = useLocalStorageState('access_token'); - const onHeartClick = () => { - if (!stockInfo) return; + const checkAndRequestNotificationPermission = async () => { + const isWebView = !!(window as any).ReactNativeWebView; + if (isWebView) { + (window as any).ReactNativeWebView.postMessage( + JSON.stringify({ + type: MESSAGE_TYPES.REQUEST_NOTIFICATION_PERMISSION, + token: accessToken, + }), + ); + } + }; + const onHeartClick = async () => { + if (!stockInfo) return; if (!isLogin) { openLoginModal(); return; } if (!isBookmark) { + // 관심 등록 시 알림 권한 체크 및 요청 + await checkAndRequestNotificationPermission(); + showToast( <> @@ -51,7 +68,7 @@ const SearchHeader = ({ stockInfo }: { stockInfo: StockDetailInfo }) => { } }; - const onBellClick = () => { + const onBellClick = async () => { if (!stockInfo) return; if (!isLogin) { @@ -67,6 +84,7 @@ const SearchHeader = ({ stockInfo }: { stockInfo: StockDetailInfo }) => { , ); } else { + await checkAndRequestNotificationPermission(); showToast( <> From f5bb430a48ef904488cb0bf431709d4ea448927d Mon Sep 17 00:00:00 2001 From: durumi99 Date: Sun, 25 Jan 2026 22:36:19 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=EA=B2=BD=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20-=20webview=20=EC=84=A4=EC=A0=95=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EC=9D=98=20import=20=EA=B2=BD=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/layout/SearchHeader/SearchHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layout/SearchHeader/SearchHeader.tsx b/src/layout/SearchHeader/SearchHeader.tsx index 73f20cc..36de67c 100644 --- a/src/layout/SearchHeader/SearchHeader.tsx +++ b/src/layout/SearchHeader/SearchHeader.tsx @@ -1,4 +1,4 @@ -import { MESSAGE_TYPES } from '@config/webview'; +import { MESSAGE_TYPES } from '../../config/webview'; import { useNavigate } from 'react-router-dom'; import useAuthInfo from '@hooks/useAuthInfo'; import useLocalStorageState from '@hooks/useLocalStorageState';