From c76536e1420c8fe67ad6943ceabdcc810fcb7d11 Mon Sep 17 00:00:00 2001 From: seyun31 <2ne1jenna@naver.com> Date: Wed, 18 Feb 2026 23:15:36 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=B8=8C=EB=9E=9C=EB=93=9C/=EC=BA=A0?= =?UTF-8?q?=ED=8E=98=EC=9D=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 브랜드/캠페인 상세페이지 -> 진행 중인 다른 캠페인 ">" 클릭 시 매칭리스트 검색 창에 해당 브랜드 검색한 페이지로 이동 - 캠페인 검색창 버그 수정 --- .../brand-detail/brand-detail-content.tsx | 6 +++- .../campaign-detail/campaign-detail.tsx | 6 +++- app/routes/matching/brand/brand-content.tsx | 3 +- .../matching/campaign/campaign-content.tsx | 29 ++++++++++++------- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/app/routes/brand-detail/brand-detail-content.tsx b/app/routes/brand-detail/brand-detail-content.tsx index 5d8ac15..7b3277c 100644 --- a/app/routes/brand-detail/brand-detail-content.tsx +++ b/app/routes/brand-detail/brand-detail-content.tsx @@ -520,7 +520,11 @@ export default function BrandDetailContent({ data }: Props) { {}} + onMore={() => { + const domain = searchParams.get("domain"); + const categoryParam = domain === "fashion" ? "FASHION" : "BEAUTY"; + navigate(`/matching/brand?type=${categoryParam}&search=${encodeURIComponent(data.name)}`); + }} onCampaignClick={goOngoingCampaignDetail} onLikeToggle={handleOngoingLikeToggle} /> diff --git a/app/routes/campaign-detail/campaign-detail.tsx b/app/routes/campaign-detail/campaign-detail.tsx index 1cf5756..3b194bc 100644 --- a/app/routes/campaign-detail/campaign-detail.tsx +++ b/app/routes/campaign-detail/campaign-detail.tsx @@ -502,7 +502,11 @@ export default function CampaignDetailContent({ {}} + onMore={() => { + const domain = searchParams.get("domain"); + const categoryParam = domain === "fashion" ? "FASHION" : "BEAUTY"; + navigate(`/matching/campaign?type=${categoryParam}&search=${encodeURIComponent(brandData.name)}`); + }} onCampaignClick={goOngoingCampaignDetail} onLikeToggle={handleOngoingLikeToggle} /> diff --git a/app/routes/matching/brand/brand-content.tsx b/app/routes/matching/brand/brand-content.tsx index 2753a44..9d088c4 100644 --- a/app/routes/matching/brand/brand-content.tsx +++ b/app/routes/matching/brand/brand-content.tsx @@ -26,7 +26,7 @@ export default function BrandContent() { const [selectedTags, setSelectedTags] = useState([]); // 검색 상태 - const [searchKeyword, setSearchKeyword] = useState(""); + const [searchKeyword, setSearchKeyword] = useState(searchParams.get("search") || ""); const deferredKeyword = useDeferredValue(searchKeyword); // 정렬 옵션 매핑 @@ -126,7 +126,6 @@ export default function BrandContent() { return category === "BEAUTY" ? "뷰티 필터" : "패션 필터"; }; - // 로딩 중 if (isLoading) { return (
diff --git a/app/routes/matching/campaign/campaign-content.tsx b/app/routes/matching/campaign/campaign-content.tsx index 7542c28..25fd7c4 100644 --- a/app/routes/matching/campaign/campaign-content.tsx +++ b/app/routes/matching/campaign/campaign-content.tsx @@ -27,7 +27,7 @@ export default function CampaignContent() { const [selectedTags, setSelectedTags] = useState([]); // 검색 상태 - const [searchKeyword, setSearchKeyword] = useState(""); + const [searchKeyword, setSearchKeyword] = useState(searchParams.get("search") || ""); const deferredKeyword = useDeferredValue(searchKeyword); // 정렬 옵션 매핑 @@ -49,14 +49,14 @@ export default function CampaignContent() { hasNextPage, isFetchingNextPage } = useInfiniteQuery({ - queryKey: ["matching-campaigns", category, sortOption, selectedTags, deferredKeyword], + queryKey: ["matching-campaigns", category, sortOption, selectedTags], queryFn: async ({ pageParam = 0 }) => { const tagsToSend = selectedTags.length > 0 ? selectedTags : await getTagNamesByCategory(); const response = await getMatchingCampaigns( sortBy, category, tagsToSend, - deferredKeyword || undefined, + undefined, pageParam, 20 ); @@ -83,6 +83,17 @@ export default function CampaignContent() { return data?.pages.flatMap(page => page.campaigns) || []; }, [data]); + // 검색어 필터링 + const filteredCampaigns = useMemo(() => { + return campaigns.filter(campaign => { + const matchesSearch = deferredKeyword === "" || + campaign.brandName?.toLowerCase().includes(deferredKeyword.toLowerCase()) || + campaign.campaignName?.toLowerCase().includes(deferredKeyword.toLowerCase()) || + campaign.title?.toLowerCase().includes(deferredKeyword.toLowerCase()); + return matchesSearch; + }); + }, [campaigns, deferredKeyword]); + // 바텀탭 숨기기 useHideBottomTab(isFilterOpen); @@ -91,7 +102,7 @@ export default function CampaignContent() { }; const toggleLike = async (id: number) => { - const queryKey = ["matching-campaigns", category, sortOption, selectedTags, deferredKeyword]; + const queryKey = ["matching-campaigns", category, sortOption, selectedTags]; // 낙관적 업데이트 queryClient.setQueryData(queryKey, (oldData: { pages: { campaigns: MatchingCampaign[] }[] } | undefined) => { @@ -133,8 +144,6 @@ export default function CampaignContent() { setSortApplied(true); }; - - const getFilterButtonLabel = () => { if (selectedTags.length > 0) { return selectedTags.slice(0, 2).join(", ") + (selectedTags.length > 2 ? "..." : ""); @@ -142,7 +151,6 @@ export default function CampaignContent() { return "콘텐츠 필터"; }; - // 로딩 중 if (isLoading) { return (
@@ -151,8 +159,8 @@ export default function CampaignContent() { ); } - // 매칭 결과가 없거나 에러 - if (error || (campaigns.length === 0 && !isLoading)) { + // 매칭 검사를 안한 경우 + if (error || (campaigns.length === 0 && !isLoading && !deferredKeyword)) { if (error) console.error("Failed to fetch matching campaigns:", error); return } - // 매칭 결과가 있을 때 return (
{/* 뷰티/패션 필터 & 검색창 */} @@ -196,7 +203,7 @@ export default function CampaignContent() { {/* 캠페인 리스트 */}
- {campaigns.map((campaign) => ( + {filteredCampaigns.map((campaign) => (