diff --git a/app/routes/business/campaign/campaign-content.tsx b/app/routes/business/campaign/campaign-content.tsx
deleted file mode 100644
index 3e87775..0000000
--- a/app/routes/business/campaign/campaign-content.tsx
+++ /dev/null
@@ -1,159 +0,0 @@
-import { useState } from "react";
-//import { useCreateCampaignMutation } from "../../../hooks/queries/useCampaign";
-
-import RealmatchHeader from "../../../components/layout/RealmatchHeader";
-import CampaignBrandCard from "../components/CampaignBrandCard";
-import CampaignInfoGroup from "../components/CampaignInfoGroup";
-
-import editIcon from "../../../assets/icon-edit.svg";
-import dropdownIcon from "../../../assets/arrow-down.svg";
-import dropupIcon from "../../../assets/arrow-up.svg";
-import arrowRightIcon from "../../../assets/icon/arrow-right.svg";
-import calendarIcon from "../../../assets/icon-calender.svg";
-
-export default function CampaignContent() {
- const [isContentOpen, setIsContentOpen] = useState(false);
-
- const [campaignData, setCampaignData] = useState({
- brandId: 1,
- campaignId: null,
- campaignName: "비플레인 클렌징 및 세럼 리뷰 콘텐츠",
- description: "안녕하세요 크리에이터 비비 입니다! 비플레인의 가치가 제 채널에서 소개하는 뷰티 콘텐츠와 잘 맞닿아 있다고 생각되어 협찬을 제안드립니다.",
- rewardAmount: 200000,
- startDate: "2025-01-20",
- endDate: "2025-01-30",
- formats: [{ id: "32000000-0000-0000-0000-000000000000" }],
- categories: [{ id: "31310000-0000-0000-0000-000000000000", customValue: "성분 분석 리뷰" }],
- tones: [
- { id: "31360000-0000-0000-0000-000000000000" },
- { id: "31330000-0000-0000-0000-000000000000" }
- ],
- involvements: [{ id: "32320000-0000-0000-0000-000000000000" }],
- usageRanges: [{ id: "32350000-0000-0000-0000-000000000000" }],
- productId: 5
- });
-
- return (
- // 전체 컨테이너를 흰색 배경으로 설정
-
-
-
- {/* 기타 협의 사항까지만 회색 배경을 씌움 */}
-
-
-
-
- {/* 캠페인명 */}
-
}
- >
-
setCampaignData({ ...campaignData, campaignName: e.target.value })}
- className="w-full h-[36px] px-4 py-[10px] bg-[var(--color-bg-w)] border border-[var(--color-text-gray5)] rounded-[6px] text-callout1 text-[var(--color-text-gray1)] focus:outline-none focus:border-blue-400 box-border"
- />
-
-
- {/* 캠페인 내용 */}
-
setIsContentOpen((prev) => !prev)}>
-
-
- }
- >
-
-
-
- {isContentOpen && (
-
- )}
-
-
-
- {/* 협찬품 / 원고료 */}
-
-
-
-
글로우 크림 1개
-

-
-
-
-
-
- setCampaignData({ ...campaignData, rewardAmount: Number(e.target.value) })}
- className="w-full focus:outline-none bg-transparent"
- />
- 원
-
-
-
-
- {/* 제작 기간 */}
-
}
- >
-
-
- {campaignData.startDate}
-
-
~
-
- {campaignData.endDate}
-
-
-
-
- {/* 기타 협의 사항 */}
-
}
- >
-
-
-
-
-
-
- {/* 기타 협의 사항 밑으로 흰색 여백 영역 */}
-
-
- );
-}
-
-function ContentItem({ label, value }: { label: string; value: string }) {
- return (
-
-
{label}
-
-
- {value}
-
-

-
-
- );
-}
\ No newline at end of file
diff --git a/app/routes/business/campaign/route.tsx b/app/routes/business/campaign/route.tsx
deleted file mode 100644
index f29a7ae..0000000
--- a/app/routes/business/campaign/route.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import CampaignContent from "./campaign-content";
-
-export default function Campaign() {
- return ;
-}
diff --git a/app/routes/campaign-detail/campaign-detail.tsx b/app/routes/campaign-detail/campaign-detail.tsx
index 56754f1..040d60e 100644
--- a/app/routes/campaign-detail/campaign-detail.tsx
+++ b/app/routes/campaign-detail/campaign-detail.tsx
@@ -334,7 +334,7 @@ export default function CampaignDetailContent({
if (!campaign) return;
- const brandIdNum = Number(brandData.id);
+ const brandIdNum = Number(searchParams.get("brandId"));
if (!Number.isFinite(brandIdNum) || brandIdNum < 0) return;
const domainParam = searchParams.get("domain");
diff --git a/app/routes/chat/resuggest/resuggest-content.tsx b/app/routes/chat/resuggest/resuggest-content.tsx
index 1cc8663..21085ef 100644
--- a/app/routes/chat/resuggest/resuggest-content.tsx
+++ b/app/routes/chat/resuggest/resuggest-content.tsx
@@ -127,18 +127,19 @@ export default function ReSuggestContent() {
const usageScopeOptions = USAGE_RANGE_TAGS.map((t) => ({ value: String(t.id), label: t.name }));
const sponsorProductOptions = useMemo(() => {
- const baseOptions = proposalData?.product && proposalData.product !== "0"
- ? [{ value: proposalData.product, label: proposalData.product }]
- : (proposalData?.products ?? [])
- .filter((p) => p.id && p.name && String(p.id) !== "0")
- .map((p) => ({ value: String(p.id), label: p.name }));
+ const baseOptions = (proposalData?.products ?? [])
+ .filter((p) => p.id && p.name && String(p.id) !== "0" && p.name !== "0")
+ .map((p) => ({ value: String(p.id), label: p.name }));
+
+ if (proposalData?.product && proposalData.product !== "0" && !baseOptions.find(opt => opt.label === proposalData.product)) {
+ baseOptions.unshift({ value: proposalData.product, label: proposalData.product });
+ }
- // formValues.sponsorProduct 배열에 있는데 options에 없는 항목들 추가 (0 제외)
const missingOptions = (formValues.sponsorProduct || [])
.filter(sp => sp !== "0" && !baseOptions.find(opt => opt.value === sp))
.map(sp => ({ value: sp, label: sp }));
- return [...missingOptions, ...baseOptions];
+ return [...baseOptions, ...missingOptions];
}, [proposalData, formValues.sponsorProduct]);
// ID 배열로 label들 찾기 헬퍼 함수
@@ -171,8 +172,13 @@ export default function ReSuggestContent() {
return;
}
+ if (!proposalData?.brandId) {
+ toast.error("브랜드 정보가 없습니다. 다시 시도해주세요.");
+ return;
+ }
+
const requestData = {
- brandId: proposalData?.brandId || 1,
+ brandId: proposalData.brandId,
creatorId: Number(userId),
campaignId: proposalData?.campaignId || null,
campaignName: formData.campaignName || "",
diff --git a/app/routes/matching/suggest/create/create-campaign-content.tsx b/app/routes/matching/suggest/create/create-campaign-content.tsx
index f1e1915..5cca5ff 100644
--- a/app/routes/matching/suggest/create/create-campaign-content.tsx
+++ b/app/routes/matching/suggest/create/create-campaign-content.tsx
@@ -105,7 +105,6 @@ export default function CreateCampaignContent() {
}, []);
useEffect(() => {
- // 신규/기존 모두 폼 초기화 (기존 제안도 빈 폼으로 시작)
reset(defaultCampaignFormValues);
}, [type, reset]);
@@ -122,13 +121,21 @@ export default function CreateCampaignContent() {
const usageScopeOptions = toOptions(USAGE_RANGE_TAGS);
const sponsorProductOptions = useMemo(() => {
- // 사용자가 직접 입력한 협찬품 항목만 표시
- const customOptions = (formValues.sponsorProduct || [])
- .filter(sp => sp !== "0")
+ // 이전 페이지에서 받아온 협찬품 목록 표시
+ const baseOptions = (proposalData?.products ?? [])
+ .filter((p) => p.id && p.name && String(p.id) !== "0" && p.name !== "0")
+ .map((p) => ({ value: String(p.id), label: p.name }));
+
+ if (proposalData?.product && proposalData.product !== "0" && !baseOptions.find(opt => opt.label === proposalData.product)) {
+ baseOptions.unshift({ value: proposalData.product, label: proposalData.product });
+ }
+
+ const missingOptions = (formValues.sponsorProduct || [])
+ .filter(sp => sp !== "0" && !baseOptions.find(opt => opt.value === sp))
.map(sp => ({ value: sp, label: sp }));
- return customOptions;
- }, [formValues.sponsorProduct]);
+ return [...baseOptions, ...missingOptions];
+ }, [proposalData, formValues.sponsorProduct]);
// ID 배열로 label들 찾기 헬퍼 함수
const findLabels = (options: { value: string; label: string }[], values?: string[]) => {
@@ -161,7 +168,12 @@ export default function CreateCampaignContent() {
const brandId = brandIdParam
? Number(brandIdParam)
- : (type === "new" ? 0 : (proposalData?.brandId ?? 1));
+ : proposalData?.brandId ?? 0;
+
+ if (brandId == null) {
+ toast.error("브랜드 정보가 없습니다. 다시 시도해주세요.");
+ return;
+ }
const campaignId = type === "existing"
? (campaignIdParam ? Number(campaignIdParam) : (proposalData?.campaignId || null))
diff --git a/app/routes/matching/suggest/matching-suggest-content.tsx b/app/routes/matching/suggest/matching-suggest-content.tsx
index 75cce3b..20d11a9 100644
--- a/app/routes/matching/suggest/matching-suggest-content.tsx
+++ b/app/routes/matching/suggest/matching-suggest-content.tsx
@@ -30,7 +30,7 @@ export default function MatchingSuggestContent() {
useHideBottomTab(isSheetOpen);
const handleNewCampaign = () => {
- navigate("/matching/suggest/create?type=new");
+ navigate(`/matching/suggest/create?type=new&brandId=${proposalData?.brandId}&domain=${proposalData?.domain}`);
};
const handleExistingCampaign = async () => {