@@ -296,6 +296,11 @@ function parseSearchParamsFromUrl(
296296 }
297297 }
298298
299+ const exactMatch = urlSearchParams . get ( "exact_match" ) ;
300+ if ( exactMatch === "true" ) {
301+ parsed . isExactItemName = true ;
302+ }
303+
299304 urlSearchParams . forEach ( ( value , key ) => {
300305 if (
301306 [
@@ -313,6 +318,7 @@ function parseSearchParamsFromUrl(
313318 "subCategory" ,
314319 "itemSubCategory" ,
315320 "category" ,
321+ "exact_match" ,
316322 ] . includes ( key )
317323 ) {
318324 return ;
@@ -363,6 +369,10 @@ function serializeSearchParams(params: AuctionHistorySearchParams): string {
363369 queryParams . set ( "item_name" , normalized . itemName ) ;
364370 queryParams . delete ( "itemName" ) ;
365371 }
372+ if ( normalized . isExactItemName ) {
373+ queryParams . set ( "exact_match" , "true" ) ;
374+ }
375+ queryParams . delete ( "isExactItemName" ) ;
366376 if ( normalized . itemTopCategory ) {
367377 queryParams . set ( "top_category" , normalized . itemTopCategory ) ;
368378 queryParams . delete ( "itemTopCategory" ) ;
@@ -514,6 +524,14 @@ export default function Page() {
514524 setMobileDateTo ( parsed . dateAuctionBuyRequest ?. dateAuctionBuyTo ?? "" ) ;
515525 } , [ urlSearchParams ] ) ;
516526
527+ const handleExactItemNameChange = useCallback ( ( value : boolean ) => {
528+ setSearchParams ( ( prev ) => ( {
529+ ...prev ,
530+ isExactItemName : value || undefined ,
531+ page : 1 ,
532+ } ) ) ;
533+ } , [ ] ) ;
534+
517535 // state -> URL 동기화
518536 useEffect ( ( ) => {
519537 const nextQuery = serializeSearchParams ( searchParams ) ;
@@ -599,6 +617,7 @@ export default function Page() {
599617
600618 return normalizeCategorySelection ( next ) ;
601619 } ) ;
620+ // isExactItemName은 SearchFilterCard에서 직접 onExactItemNameChange로 관리
602621
603622 setMobilePriceMin ( filters . priceSearchRequest ?. priceFrom ?. toString ( ) ?? "" ) ;
604623 setMobilePriceMax ( filters . priceSearchRequest ?. priceTo ?. toString ( ) ?? "" ) ;
@@ -780,11 +799,13 @@ export default function Page() {
780799 < div className = "mb-4" >
781800 < MobileFilterChips
782801 activeFilters = { {
802+ hasExactItemName : ! ! searchParams . isExactItemName ,
783803 hasCategory : selectedCategory !== "all" ,
784804 hasPrice : ! ! ( mobilePriceMin || mobilePriceMax ) ,
785805 hasDate : ! ! ( mobileDateFrom || mobileDateTo ) ,
786806 hasOptions : mobileActiveFilters . length > 0 ,
787807 } }
808+ onExactItemNameToggle = { ( ) => handleExactItemNameChange ( ! searchParams . isExactItemName ) }
788809 onCategoryClick = { ( ) => setMobileFilterType ( "category" ) }
789810 onPriceClick = { ( ) => setMobileFilterType ( "price" ) }
790811 onDateClick = { ( ) => setMobileFilterType ( "date" ) }
@@ -916,6 +937,8 @@ export default function Page() {
916937 isModal = { isFilterModalOpen }
917938 onClose = { ( ) => setIsFilterModalOpen ( false ) }
918939 layoutMode = { layoutMode }
940+ isExactItemName = { ! ! searchParams . isExactItemName }
941+ onExactItemNameChange = { handleExactItemNameChange }
919942 />
920943 ) }
921944
0 commit comments