From 08e21089675dc15d6cd8d9d9a3ebe1f5c92ee241 Mon Sep 17 00:00:00 2001 From: Dahyeon Date: Mon, 5 Jan 2026 22:56:38 +0900 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=ED=99=94?= =?UTF-8?q?=EB=A9=B4=EC=97=90=EC=84=9C=20=EC=9D=B8=EC=95=B1=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20=EC=95=88=EB=9C=A8=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/InAppNotificationProvider.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/components/InAppNotificationProvider.tsx b/components/InAppNotificationProvider.tsx index e11a5612..bf372c9b 100644 --- a/components/InAppNotificationProvider.tsx +++ b/components/InAppNotificationProvider.tsx @@ -14,7 +14,7 @@ import Animated, { useAnimatedStyle, runOnJS, } from 'react-native-reanimated'; -import { router, type Href } from 'expo-router'; +import { router, usePathname, type Href } from 'expo-router'; import colors from '@/theme/color'; import { LeenkIcon, LogoNotify } from '@/assets'; import styled from 'styled-components/native'; @@ -47,6 +47,11 @@ const ROUTES = { feed: '/feed/[id]' as const, }; +const BLOCKED_PATHS = ['/', '/signup']; + +export const isBlockedRoute = (pathname: string) => + BLOCKED_PATHS.some((blocked) => blocked === pathname); + // FCM data → 앱 내 라우팅 function navigateFromData(raw?: Record) { const d = raw ?? {}; @@ -74,6 +79,9 @@ export function InAppNotificationProvider({ const [payload, setPayload] = useState(null); const [visible, setVisible] = useState(false); const hideTimerRef = useRef(null); + const pathname = usePathname(); + + const blocked = isBlockedRoute(pathname); // 애니메이션: 위에서 아래로 슬라이드 인/아웃 const ty = useSharedValue(-200); @@ -128,7 +136,7 @@ export function InAppNotificationProvider({ {children} - {visible && ( + {visible && !blocked && ( From 21865a8a8e6ed01a554d7b2062bd4b9d04c334bd Mon Sep 17 00:00:00 2001 From: Dahyeon Date: Thu, 8 Jan 2026 00:47:00 +0900 Subject: [PATCH 2/4] =?UTF-8?q?refactor:=20=EB=AA=A8=EB=8B=AC=20fade=20?= =?UTF-8?q?=ED=9B=85=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EC=95=A0=EB=8B=88?= =?UTF-8?q?=EB=A9=94=EC=9D=B4=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/login/apple.api.ts | 5 ++ components/Modal/TextInputModal.tsx | 44 +++++++++++----- components/Modal/UserListModal.tsx | 47 +++-------------- hooks/useFadeSlideAnimation.ts | 81 +++++++++++++++++++++++++++++ ios/Leenk.xcodeproj/project.pbxproj | 24 ++++----- 5 files changed, 132 insertions(+), 69 deletions(-) create mode 100644 hooks/useFadeSlideAnimation.ts diff --git a/api/login/apple.api.ts b/api/login/apple.api.ts index 73f35767..528a20f5 100644 --- a/api/login/apple.api.ts +++ b/api/login/apple.api.ts @@ -15,6 +15,11 @@ export const appleLogin = async (idToken: string) => { const { code, message, data } = response.data; return { code, message, data }; } catch (error: any) { + console.log('APPLE LOGIN ERROR', error); + console.log('message', error?.message); + console.log('response', error?.response); + console.log('response data', error?.response?.data); + if (error.response?.data) { const { code, message } = error.response.data; return { code, message }; diff --git a/components/Modal/TextInputModal.tsx b/components/Modal/TextInputModal.tsx index ff519270..c08222b0 100644 --- a/components/Modal/TextInputModal.tsx +++ b/components/Modal/TextInputModal.tsx @@ -17,6 +17,8 @@ import { useToastStore } from '@/stores/toastStore'; import { reportFeed } from '@/api/feed/feed.api'; import { reportLeenk } from '@/api/leenk/leenk.post.api'; import { postBirthdayLetter } from '@/api/extra/birthday/birthday.post.api'; +import { useFadeSlideAnimation } from '@/hooks/useFadeSlideAnimation'; +import { Animated } from 'react-native'; interface TextInputModalProps { type: 'feed' | 'leenk' | 'birthday'; @@ -38,6 +40,12 @@ export default function TextInputModal({ (type === 'leenk' && modalType === 'leenkReport') || (type === 'birthday' && modalType === 'birthdayLetter'); + const { backdropStyle, sheetStyle } = useFadeSlideAnimation({ + visible: isOpen, + initialOffset: 400, + preset: 'soft', + }); + const targetId = type === 'feed' ? feedId : leenkId; const modalConfig = { @@ -104,23 +112,27 @@ export default function TextInputModal({ - - + + {/* Backdrop */} + + + + {/* Sheet */} - + {title} {subtitle} -