@@ -27,7 +27,7 @@ export default function CampaignContent() {
2727 const [ selectedTags , setSelectedTags ] = useState < string [ ] > ( [ ] ) ;
2828
2929 // 검색 상태
30- const [ searchKeyword , setSearchKeyword ] = useState ( "" ) ;
30+ const [ searchKeyword , setSearchKeyword ] = useState ( searchParams . get ( "search" ) || "" ) ;
3131 const deferredKeyword = useDeferredValue ( searchKeyword ) ;
3232
3333 // 정렬 옵션 매핑
@@ -49,14 +49,14 @@ export default function CampaignContent() {
4949 hasNextPage,
5050 isFetchingNextPage
5151 } = useInfiniteQuery ( {
52- queryKey : [ "matching-campaigns" , category , sortOption , selectedTags , deferredKeyword ] ,
52+ queryKey : [ "matching-campaigns" , category , sortOption , selectedTags ] ,
5353 queryFn : async ( { pageParam = 0 } ) => {
5454 const tagsToSend = selectedTags . length > 0 ? selectedTags : await getTagNamesByCategory ( ) ;
5555 const response = await getMatchingCampaigns (
5656 sortBy ,
5757 category ,
5858 tagsToSend ,
59- deferredKeyword || undefined ,
59+ undefined ,
6060 pageParam ,
6161 20
6262 ) ;
@@ -83,6 +83,17 @@ export default function CampaignContent() {
8383 return data ?. pages . flatMap ( page => page . campaigns ) || [ ] ;
8484 } , [ data ] ) ;
8585
86+ // 검색어 필터링
87+ const filteredCampaigns = useMemo ( ( ) => {
88+ return campaigns . filter ( campaign => {
89+ const matchesSearch = deferredKeyword === "" ||
90+ campaign . brandName ?. toLowerCase ( ) . includes ( deferredKeyword . toLowerCase ( ) ) ||
91+ campaign . campaignName ?. toLowerCase ( ) . includes ( deferredKeyword . toLowerCase ( ) ) ||
92+ campaign . title ?. toLowerCase ( ) . includes ( deferredKeyword . toLowerCase ( ) ) ;
93+ return matchesSearch ;
94+ } ) ;
95+ } , [ campaigns , deferredKeyword ] ) ;
96+
8697 // 바텀탭 숨기기
8798 useHideBottomTab ( isFilterOpen ) ;
8899
@@ -91,7 +102,7 @@ export default function CampaignContent() {
91102 } ;
92103
93104 const toggleLike = async ( id : number ) => {
94- const queryKey = [ "matching-campaigns" , category , sortOption , selectedTags , deferredKeyword ] ;
105+ const queryKey = [ "matching-campaigns" , category , sortOption , selectedTags ] ;
95106
96107 // 낙관적 업데이트
97108 queryClient . setQueryData ( queryKey , ( oldData : { pages : { campaigns : MatchingCampaign [ ] } [ ] } | undefined ) => {
@@ -133,16 +144,13 @@ export default function CampaignContent() {
133144 setSortApplied ( true ) ;
134145 } ;
135146
136-
137-
138147 const getFilterButtonLabel = ( ) => {
139148 if ( selectedTags . length > 0 ) {
140149 return selectedTags . slice ( 0 , 2 ) . join ( ", " ) + ( selectedTags . length > 2 ? "..." : "" ) ;
141150 }
142151 return "콘텐츠 필터" ;
143152 } ;
144153
145- // 로딩 중
146154 if ( isLoading ) {
147155 return (
148156 < div className = "flex items-center justify-center h-full" style = { { background : "linear-gradient(180deg, #F6F6FF 0%, #F3F3FA 48.08%, #E8E8FB 100%)" } } >
@@ -151,8 +159,8 @@ export default function CampaignContent() {
151159 ) ;
152160 }
153161
154- // 매칭 결과가 없거나 에러
155- if ( error || ( campaigns . length === 0 && ! isLoading ) ) {
162+ // 매칭 검사를 안한 경우
163+ if ( error || ( campaigns . length === 0 && ! isLoading && ! deferredKeyword ) ) {
156164 if ( error ) console . error ( "Failed to fetch matching campaigns:" , error ) ;
157165
158166 return < EmptyMatchState
@@ -163,7 +171,6 @@ export default function CampaignContent() {
163171 />
164172 }
165173
166- // 매칭 결과가 있을 때
167174 return (
168175 < div className = "flex flex-col h-full" style = { { background : "linear-gradient(180deg, #F6F6FF 0%, #F3F3FA 48.08%, #E8E8FB 100%)" } } >
169176 { /* 뷰티/패션 필터 & 검색창 */ }
@@ -196,7 +203,7 @@ export default function CampaignContent() {
196203
197204 { /* 캠페인 리스트 */ }
198205 < div className = "space-y-3 pb-20" >
199- { campaigns . map ( ( campaign ) => (
206+ { filteredCampaigns . map ( ( campaign ) => (
200207 < CampaignCard
201208 key = { campaign . id }
202209 brandName = { campaign . brandName }
0 commit comments