From 34c11613c5e61a4d237603b94c38534be94ba59d Mon Sep 17 00:00:00 2001 From: Shineast Date: Wed, 18 Feb 2026 21:07:12 +0900 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=20=EB=92=A4=EB=A1=9C=EA=B0=80?= =?UTF-8?q?=EA=B8=B0=20=EC=BA=90=EC=8B=9C=20=EB=AC=B4=ED=9A=A8=ED=99=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=9E=91=EC=84=B1=20-=20=EC=86=8C?= =?UTF-8?q?=EC=86=8C=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(=EC=9E=90=EA=B0=84=20=EC=88=98=EC=A0=95,=20=EC=A2=85=EC=84=B1?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20"=EC=9D=B4/=EA=B0=80"=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=EB=B6=80=20=EB=A0=8C=EB=8D=94=EB=A7=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/result/[id]/page.tsx | 92 +++++++++++++++++++----------- components/map/kakaoMapLine.tsx | 3 +- components/modal/transferModal.tsx | 44 ++++++-------- 3 files changed, 77 insertions(+), 62 deletions(-) diff --git a/app/result/[id]/page.tsx b/app/result/[id]/page.tsx index cf34641..414a739 100644 --- a/app/result/[id]/page.tsx +++ b/app/result/[id]/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useState, useMemo } from 'react'; +import { useState, useMemo, useEffect, useCallback } from 'react'; import Image from 'next/image'; import { useOpenModal } from '@/hooks/useOpenModal'; import { useParams, useRouter } from 'next/navigation'; @@ -44,10 +44,13 @@ export default function Page() { const myRoute = routesWithColor.find((route) => route.nickname === myNickname); const travelTime = myRoute?.travelTime || 0; - - - const totalTravelTime = routesWithColor.reduce((sum, route) => sum + (route.travelTime || 0), 0); - const averageTravelTime = routesWithColor.length > 0 ? Math.round(totalTravelTime / routesWithColor.length) : 0; + + const totalTravelTime = routesWithColor.reduce( + (sum, route) => sum + (route.travelTime || 0), + 0 + ); + const averageTravelTime = + routesWithColor.length > 0 ? Math.round(totalTravelTime / routesWithColor.length) : 0; const extractLineNumber = (linenumber: string): string => { if (!linenumber) return ''; @@ -107,21 +110,40 @@ export default function Page() { }; }); }, [midpointData, myNickname, id]); - + // 카테고리 텍스트 생성 함수 const getCategoryText = (category: string | undefined): string => { if (!category) return '밍글링 추천 1위'; - return `${category}이 많은 장소`; + + // 카테고리 종성에 따라 "이/가"를 다르게 렌더링 + const lastChar = category.charCodeAt(category.length - 1); + const hasJongseong = (lastChar - 0xac00) % 28 !== 0; + return `${category}${hasJongseong ? '이' : '가'} 많은 장소`; }; const [selectedResultId, setSelectedResultId] = useState(1); - const handleModifyStart = () => { + // 뒤로 가기 클릭 시 캐시 데이터 무효화 + const clearRelatedCache = useCallback(() => { queryClient.removeQueries({ queryKey: ['midpoint', id] }); queryClient.removeQueries({ queryKey: ['recommend', id] }); - router.back(); + + queryClient.invalidateQueries({ queryKey: ['midpoint', id] }); + }, [id, queryClient]); + + const handleModifyStart = () => { + clearRelatedCache(); + router.replace(`/meeting/${id}`); }; + useEffect(() => { + clearRelatedCache(); + + return () => { + clearRelatedCache(); + }; + }, [clearRelatedCache]); + const getLineColor = (fullLineName: string) => { const cleaned = fullLineName.replace('호선', '').trim(); if (/^\d+$/.test(cleaned)) { @@ -196,7 +218,7 @@ export default function Page() {
) : ( locationResults.map((result) => { - const category = meetingData?.data?.purposes?.[meetingData.data.purposes.length - 1]; + const category = + meetingData?.data?.purposes?.[meetingData.data.purposes.length - 1]; const categoryText = getCategoryText(category); - + const handleRecommendClick = (e: React.MouseEvent) => { e.stopPropagation(); if (!id || !result.endStation) return; - + let meetingType = ''; let categoryParam = ''; - + if (typeof window !== 'undefined') { meetingType = localStorage.getItem(`meeting_${id}_meetingType`) || ''; categoryParam = localStorage.getItem(`meeting_${id}_category`) || ''; } - - if (!meetingType && meetingData?.data?.purposes && meetingData.data.purposes.length > 0) { + + if ( + !meetingType && + meetingData?.data?.purposes && + meetingData.data.purposes.length > 0 + ) { meetingType = meetingData.data.purposes[0]; } if (!categoryParam && category) { categoryParam = category; } - + const params = new URLSearchParams({ meetingId: id, midPlace: result.endStation, lat: result.latitude.toString(), lng: result.longitude.toString(), }); - + if (meetingType) params.append('meetingType', meetingType); if (categoryParam) params.append('category', categoryParam); - + router.push(`/recommend?${params.toString()}`); }; - + return (
-
- stars - {categoryText} + stars + + {categoryText} +
- - +
{result.endStation}역 -
- +
+ 평균 이동시간{' '} {result.averageTravelTime}분 -
- - +