From d5b43ff905faa4ae90ff6a3eb0e3adf6a0d8f46e Mon Sep 17 00:00:00 2001 From: Jio Date: Thu, 12 Feb 2026 20:56:11 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=EB=B3=B4=EB=82=B8=20=EC=A0=9C?= =?UTF-8?q?=EC=95=88=20-=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0,=20=EB=B8=8C=EB=9E=9C=EB=93=9C=EB=AA=85=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/components/CampaignBrandCard.tsx | 8 ++-- .../proposal/sent-proposal-content.tsx | 45 ++++++++++--------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/app/routes/business/components/CampaignBrandCard.tsx b/app/routes/business/components/CampaignBrandCard.tsx index 74046a25..9905414b 100644 --- a/app/routes/business/components/CampaignBrandCard.tsx +++ b/app/routes/business/components/CampaignBrandCard.tsx @@ -28,14 +28,14 @@ export default function CampaignBrandCard({ {brandName} -
+
-

+

{brandName || "브랜드명"}

arrow
-

+

{brandTags && brandTags.length > 0 ? brandTags.map(tag => `#${tag}`).join(" ") : "#태그정보없음"} @@ -43,7 +43,7 @@ export default function CampaignBrandCard({

-
+
매칭률 {matchingRate || 0}% diff --git a/app/routes/business/proposal/sent-proposal-content.tsx b/app/routes/business/proposal/sent-proposal-content.tsx index 33309e19..03bf173a 100644 --- a/app/routes/business/proposal/sent-proposal-content.tsx +++ b/app/routes/business/proposal/sent-proposal-content.tsx @@ -1,6 +1,6 @@ import { useState, useEffect } from "react"; import { useSearchParams, useNavigate } from "react-router-dom"; -import { getProposalDetail, type ProposalDetail} from "./api/proposal"; +import { getProposalDetail, type ProposalDetail } from "./api/proposal"; import { getBrandSummary, type BrandSummary } from "./api/brand"; import { getProfileCard, type ProfileCard } from "./api/user"; import { cancelCampaignProposal } from "./api/proposal"; @@ -30,9 +30,9 @@ export default function ProposalContent() { useEffect(() => { if (!proposalId) { - setIsLoading(false); - return; - } + setIsLoading(false); + return; + } const fetchData = async () => { console.log("실제 넘길 ID:", proposalId); @@ -46,7 +46,7 @@ export default function ProposalContent() { setBrand(brandResult); } - const profileResult = await getProfileCard(); + const profileResult = await getProfileCard(); setProfileCard(profileResult); @@ -66,21 +66,21 @@ export default function ProposalContent() { const handleCancel = async () => { if (!proposalId) return; - + if (!window.confirm("제안을 취소하시겠습니까?")) return; try { const response = await cancelCampaignProposal(proposalId); - + if (response.isSuccess) { alert("캠페인 제안을 취소했습니다."); - navigate(-1); + navigate(-1); } } catch (error: unknown) { console.error("제안 취소 실패:", error); - + let errorMessage = "취소 중 오류가 발생했습니다."; - + if (error instanceof Error) { errorMessage = error.message; } else if (typeof error === "string") { @@ -113,7 +113,10 @@ export default function ProposalContent() {

제안 프로필

-
+
navigate("/mypage/profileCard")} + className="w-full p-4 bg-bluegray-2 rounded-2xl flex justify-between items-center border border-core-70 cursor-pointer active:scale-[0.98] transition-all" + >
profile @@ -204,16 +207,16 @@ export default function ProposalContent() {
- {/* 상태가 REVIEWING일 때만 취소 버튼 */} - {data.status === "REVIEWING" && ( - - )} -
+ {/* 상태가 REVIEWING일 때만 취소 버튼 */} + {data.status === "REVIEWING" && ( + + )} +
); From e21eb3fa138519f64d229c5595ffaf00c7bde537 Mon Sep 17 00:00:00 2001 From: Jio Date: Thu, 12 Feb 2026 21:14:47 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat=20:=20=EB=B3=B4=EB=82=B8=20=EC=A0=9C?= =?UTF-8?q?=EC=95=88=20-=20=EB=B8=8C=EB=9E=9C=EB=93=9C=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0,=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/components/CampaignBrandCard.tsx | 25 +++++++++++++++++-- .../proposal/sent-proposal-content.tsx | 2 ++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/app/routes/business/components/CampaignBrandCard.tsx b/app/routes/business/components/CampaignBrandCard.tsx index 9905414b..d7096722 100644 --- a/app/routes/business/components/CampaignBrandCard.tsx +++ b/app/routes/business/components/CampaignBrandCard.tsx @@ -1,3 +1,4 @@ +import { useNavigate } from "react-router-dom"; import chatIcon from "../../../assets/chat-icon.svg"; import arrowRightIcon from "../../../assets/icon/arrow-right.svg"; @@ -8,6 +9,8 @@ interface CampaignBrandCardProps { brandTags?: string[]; brandImageUrl?: string; matchingRate?: number; + brandId?: number | string; + category?: string; } export default function CampaignBrandCard({ @@ -16,8 +19,19 @@ export default function CampaignBrandCard({ brandName, brandTags, brandImageUrl, - matchingRate // Props + matchingRate, + brandId, + category }: CampaignBrandCardProps) { + const navigate = useNavigate(); + const handleBrandClick = (e: React.MouseEvent) => { + e.stopPropagation(); + if (brandId && category) { + navigate(`/brand?brandId=${brandId}&domain=${category}`); + } else { + console.warn("brandId 또는 category 정보가 부족합니다."); + } + }; return (
{/* 상단 브랜드 정보 */} @@ -33,7 +47,14 @@ export default function CampaignBrandCard({

{brandName || "브랜드명"}

- arrow +

{brandTags && brandTags.length > 0 diff --git a/app/routes/business/proposal/sent-proposal-content.tsx b/app/routes/business/proposal/sent-proposal-content.tsx index 03bf173a..78143f93 100644 --- a/app/routes/business/proposal/sent-proposal-content.tsx +++ b/app/routes/business/proposal/sent-proposal-content.tsx @@ -105,6 +105,8 @@ export default function ProposalContent() { brandTags={brand?.brandTags || []} brandImageUrl={brand?.brandImageUrl} matchingRate={brand?.matchingRate} + brandId={brand?.brandId || data.brandId} + category={data.contentTags.categories[0]?.name || "beauty"} />

From efa51b446e125728a69b2a3ba82a37c3d01b1340 Mon Sep 17 00:00:00 2001 From: Jio Date: Thu, 12 Feb 2026 21:30:05 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=EC=A0=9C=EC=95=88=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20-=20status=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/proposal/received-proposal-content.tsx | 13 +++++++++++-- .../business/proposal/sent-proposal-content.tsx | 9 ++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/routes/business/proposal/received-proposal-content.tsx b/app/routes/business/proposal/received-proposal-content.tsx index b637df6c..ad02f40d 100644 --- a/app/routes/business/proposal/received-proposal-content.tsx +++ b/app/routes/business/proposal/received-proposal-content.tsx @@ -81,7 +81,7 @@ export default function ReceivedProposalContent() { }; const closeModal = () => { setModalType("none"); - setRejectReason(""); + setRejectReason(""); }; const handleRejectClick = () => setModalType("reject"); @@ -113,6 +113,13 @@ export default function ReceivedProposalContent() { const formatDate = (dateStr: string) => (dateStr || "").replace(/-/g, ". "); + const STATUS_TEXT_MAP: Record = { + REVIEWING: "검토 중", + MATCHED: "매칭 완료", + REJECTED: "거절됨", + CANCELED: "취소됨", + }; + if (isLoading) return ; if (!proposal) return
데이터를 찾을 수 없습니다.
; @@ -126,11 +133,13 @@ export default function ReceivedProposalContent() {

{proposal.title}

diff --git a/app/routes/business/proposal/sent-proposal-content.tsx b/app/routes/business/proposal/sent-proposal-content.tsx index 78143f93..e81e08a6 100644 --- a/app/routes/business/proposal/sent-proposal-content.tsx +++ b/app/routes/business/proposal/sent-proposal-content.tsx @@ -28,6 +28,13 @@ export default function ProposalContent() { const proposalId = searchParams.get("proposalId"); + const STATUS_TEXT_MAP: Record = { + REVIEWING: "검토 중", + MATCHED: "매칭 완료", + REJECTED: "거절됨", + CANCELED: "취소됨", + }; + useEffect(() => { if (!proposalId) { setIsLoading(false); @@ -100,7 +107,7 @@ export default function ProposalContent() {
Date: Thu, 12 Feb 2026 21:45:43 +0900 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20=EC=BA=A0=ED=8E=98=EC=9D=B8=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EB=B8=8C=EB=9E=9C=EB=93=9C=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/routes/business/calendar/api/calendar.ts | 1 + .../business/calendar/calendar-content.tsx | 2 ++ app/routes/business/components/CampaignCard.tsx | 17 ++++++++++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/app/routes/business/calendar/api/calendar.ts b/app/routes/business/calendar/api/calendar.ts index 4df2c995..44b48e43 100644 --- a/app/routes/business/calendar/api/calendar.ts +++ b/app/routes/business/calendar/api/calendar.ts @@ -13,6 +13,7 @@ export interface CampaignCollaboration { endDate: string; keyword?: string; type: "APPLIED" | "SENT" | "RECEIVED"; + category?: string; } interface CollaborationResponse { diff --git a/app/routes/business/calendar/calendar-content.tsx b/app/routes/business/calendar/calendar-content.tsx index ee411bb8..22950b91 100644 --- a/app/routes/business/calendar/calendar-content.tsx +++ b/app/routes/business/calendar/calendar-content.tsx @@ -205,6 +205,8 @@ export default function CalendarContent() { key={`${cp.campaignId}-${cp.proposalId}-${cp.status}`} campaignId={cp.campaignId} proposalId={cp.proposalId ?? undefined} + brandId={cp.brandId} + category={cp.category || "beauty"} type={cp.type} brand={cp.brandName} title={cp.title} diff --git a/app/routes/business/components/CampaignCard.tsx b/app/routes/business/components/CampaignCard.tsx index 27824f94..604392e8 100644 --- a/app/routes/business/components/CampaignCard.tsx +++ b/app/routes/business/components/CampaignCard.tsx @@ -6,6 +6,8 @@ import Card from "../../../components/common/Card"; interface CampaignCardProps { brand: string; + brandId?: string | number; + category?: string; title: string; startDate: string; endDate: string; @@ -18,6 +20,8 @@ interface CampaignCardProps { export default function CampaignCard({ brand, + brandId, + category = "beauty", title, startDate, endDate, @@ -30,6 +34,14 @@ export default function CampaignCard({ const navigate = useNavigate(); + const handleBrandClick = (e: React.MouseEvent) => { + e.stopPropagation(); + if (brandId) { + // 2. 알려주신 경로 규칙 적용 (Query Parameter 방식) + navigate(`/brand?brandId=${brandId}&domain=${category}`); + } + }; + const handleDetailClick = () => { // 사용자가 제공한 라우팅 규칙에 따른 분기 로직 const id = proposalId || campaignId; @@ -62,7 +74,10 @@ export default function CampaignCard({
{/* 브랜드명 */} -
+
{brand}