diff --git a/src/hooks/useRunModals.ts b/src/hooks/useRunModals.ts index d5e6b71..f27b0b3 100644 --- a/src/hooks/useRunModals.ts +++ b/src/hooks/useRunModals.ts @@ -54,12 +54,17 @@ export function useRunModals({ setModal('back'); }, [setModal]); - const handleConfirmBack = useCallback(() => { + // 공통 정리 및 뒤로가기 로직 + const cleanupAndGoBack = useCallback(() => { resetLocationTracking(); resetRunState(); + // courseId 파라미터 초기화 + navigation.setParams({ courseId: undefined }); navigation.goBack(); }, [resetLocationTracking, resetRunState, navigation]); + const handleConfirmBack = cleanupAndGoBack; + const handleCancelBack = useCallback(() => { setModal(null); }, [setModal]); @@ -71,9 +76,7 @@ export function useRunModals({ const handleConfirmExit = useCallback(async () => { if (!startTime || routeCoordinates.length === 0) { - resetLocationTracking(); - resetRunState(); - navigation.goBack(); + cleanupAndGoBack(); return; } @@ -135,9 +138,7 @@ export function useRunModals({ text2: '런닝 기록이 성공적으로 저장되었습니다.', }); - resetLocationTracking(); - resetRunState(); - navigation.goBack(); + cleanupAndGoBack(); } catch (error: unknown) { let errorMessage = '런닝 기록 저장에 실패했습니다.'; @@ -171,14 +172,12 @@ export function useRunModals({ stats, setUI, setError, - resetLocationTracking, - resetRunState, saveRunningRecord, - navigation, accessToken, captureMap, uploadImage, courseId, + cleanupAndGoBack, ]); const handleRetryExit = useCallback(() => { diff --git a/src/pages/Run/index.tsx b/src/pages/Run/index.tsx index f924197..28066d9 100644 --- a/src/pages/Run/index.tsx +++ b/src/pages/Run/index.tsx @@ -1,5 +1,5 @@ import { useRef, useCallback } from 'react'; -import { Text } from 'react-native'; +import { Text, BackHandler } from 'react-native'; import styled from '@emotion/native'; import { ArrowLeft, LocateFixed } from 'lucide-react-native'; import { useFocusEffect } from '@react-navigation/native'; @@ -28,14 +28,6 @@ export default function Run({ route, navigation }: Props) { useLocationTracking(); const { location, errorMsg, flyToCurrentUserLocation } = useLocationManager(); const cameraRef = useRef(null!); - - const locationPosition = location - ? ([location.coords.longitude, location.coords.latitude] as [ - number, - number, - ]) - : null; - const mapRef = useRef(null); const { @@ -50,16 +42,6 @@ export default function Run({ route, navigation }: Props) { useRunStats(routeCoordinates, isTracking); const { loadCourseTopology } = useCourseTopologyApi(courseId); - useFocusEffect( - useCallback(() => { - resetLocationTracking(); - resetRunState(); - if (courseId) { - loadCourseTopology(); - } - }, [resetLocationTracking, resetRunState, courseId, loadCourseTopology]), - ); - const { showExitModal, showBackModal, @@ -71,6 +53,33 @@ export default function Run({ route, navigation }: Props) { handleConfirmExit, } = useRunModals({ navigation, mapRef, cameraRef, courseId }); + useFocusEffect( + useCallback(() => { + resetLocationTracking(); + resetRunState(); + if (courseId) { + loadCourseTopology(); + } + }, [resetLocationTracking, resetRunState, courseId, loadCourseTopology]), + ); + + // 하드웨어 뒤로가기 버튼 제어 + useFocusEffect( + useCallback(() => { + const handleHardwareBackPress = () => { + handleBackPress(); + return true; // 기본 뒤로가기 동작을 막음 + }; + + const subscription = BackHandler.addEventListener( + 'hardwareBackPress', + handleHardwareBackPress, + ); + + return () => subscription.remove(); + }, [handleBackPress]), + ); + const handleCurrentLocationPress = () => { flyToCurrentUserLocation(cameraRef); };