Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 40 additions & 42 deletions app/routes/business/campaign/detail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import RealmatchHeader from "../../../components/common/RealmatchHeader";
import CampaignBrandCard from "../components/CampaignBrandCard";
import CampaignInfoGroup from "../components/CampaignInfoGroup";

import { getProposalDetail, type ProposalDetail } from "../../../data/campaign";
import { type ProposalDetail } from "../../../data/campaign";

import editIcon from "../../../assets/icon-edit.svg";
import dropdownIcon from "../../../assets/arrow-down.svg";
Expand All @@ -18,55 +18,53 @@ export default function CampaignContent() {
const [isContentOpen, setIsContentOpen] = useState(false);

const [data, setData] = useState<ProposalDetail | null>(null);
const [isLoading, setIsLoading] = useState(true);

useEffect(() => {
console.log("1. 현재 주소창에서 가져온 ID:", campaignId);
if (campaignId) {
setIsLoading(true);

// --- 여기부터 가짜 데이터 ---
const mockData: ProposalDetail = {
proposalId: campaignId,
brandId: 1,
creatorId: 100,
title: "비플레인 클렌징 및 세럼 리뷰 콘텐츠", // 화면에 나올 제목
description: "비플레인의 가치가 제 채널과 잘 맞아서 제안드립니다.",
rewardAmount: 200000,
productId: 10,
startDate: "2025-01-20",
endDate: "2025-01-30",
status: "검토 중",
createdAt: "2025-01-15T10:00:00Z",
contentTags: {
formats: [{ id: "1", name: "인스타그램 릴스" }],
categories: [{ id: "2", name: "뷰티" }],
tones: [{ id: "3", name: "일상적인" }],
involvements: [{ id: "4", name: "가이드 제공" }],
usageRanges: [{ id: "5", name: "크리에이터 1차 활용" }],
if (!campaignId) return;

// 비동기 데이터 로딩
const loadData = async () => {
// --- 여기부터 가짜 데이터 ---
const mockData: ProposalDetail = {
proposalId: campaignId,
brandId: 1,
creatorId: 100,
title: "비플레인 클렌징 및 세럼 리뷰 콘텐츠", // 화면에 나올 제목
description: "비플레인의 가치가 제 채널과 잘 맞아서 제안드립니다.",
rewardAmount: 200000,
productId: 10,
startDate: "2025-01-20",
endDate: "2025-01-30",
status: "검토 중",
createdAt: "2025-01-15T10:00:00Z",
contentTags: {
formats: [{ id: "1", name: "인스타그램 릴스" }],
categories: [{ id: "2", name: "뷰티" }],
tones: [{ id: "3", name: "일상적인" }],
involvements: [{ id: "4", name: "가이드 제공" }],
usageRanges: [{ id: "5", name: "크리에이터 1차 활용" }],
}
};

setData(mockData);

/*
try {
const res = await getProposalDetail(campaignId);
console.log("2. 서버에서 받은 진짜 데이터:", res);
setData(res);
} catch (err) {
console.error("3. API 호출 중 발생한 에러:", err);
}
*/
};

setData(mockData);
setIsLoading(false);

/*if (campaignId) {
getProposalDetail(campaignId)
.then((res) => {
console.log("2. 서버에서 받은 진짜 데이터:", res);
setData(res);
setIsLoading(false);
})
.catch((err) => {
console.error("3. API 호출 중 발생한 에러:", err);
setIsLoading(false);
});*/
}
loadData();
}, [campaignId]);

// 3. 로딩 중일 때 보여줄 화면
if (isLoading) return <div className="p-10 text-center">로딩 중...</div>;
if (!data) return <div className="p-10 text-center">데이터를 찾을 수 없습니다.</div>;
// 데이터 로딩 전
if (!data) return <div className="p-10 text-center">로딩 중...</div>;

// 태그들을 예쁘게 합쳐주는 함수 (예: ["릴스", "숏폼"] -> "릴스, 숏폼")
const formatTags = (tags: { name: string }[]) => tags.map(t => t.name).join(", ");
Expand Down
13 changes: 12 additions & 1 deletion app/routes/matching/brand/brand-content.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,22 @@ import MiniLogo from "../../../assets/logo/mini-logo.svg";
import Button from "../../../components/common/Button";


interface MatchingBrand {
id: number;
name: string;
category: string;
matchingRatio: number;
matchRate: number;
tags: string[];
isLiked: boolean;
logoUrl?: string;
}

export default function BrandContent() {
const [searchParams] = useSearchParams();
const category = (searchParams.get("type") || "BEAUTY") as BrandCategory;
const navigate = useNavigate();
const [brands, setBrands] = useState<any[]>([]);
const [brands, setBrands] = useState<MatchingBrand[]>([]);
const [isFilterOpen, setIsFilterOpen] = useState(false);
const [sortOption, setSortOption] = useState("정렬 필터");
const [selectedTags, setSelectedTags] = useState<string[]>([]);
Expand Down
17 changes: 16 additions & 1 deletion app/routes/matching/campaign/campaign-content.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,26 @@ import MiniLogo from "../../../assets/logo/mini-logo.svg";
import Button from "../../../components/common/Button";


interface MatchingCampaign {
id: number;
brandName: string;
name?: string;
title?: string;
category: string;
manuscriptFee?: number;
reward?: number;
matchingRatio?: number;
matchRate?: number;
applicants: number;
isLiked: boolean;
logoUrl?: string;
}

export default function CampaignContent() {
const [searchParams] = useSearchParams();
const category = (searchParams.get("type") || "BEAUTY") as CampaignCategory;
const navigate = useNavigate();
const [campaigns, setCampaigns] = useState<any[]>([]);
const [campaigns, setCampaigns] = useState<MatchingCampaign[]>([]);
const [isFilterOpen, setIsFilterOpen] = useState(false);
const [sortOption, setSortOption] = useState("정렬 필터");
const [selectedTags, setSelectedTags] = useState<string[]>([]);
Expand Down
3 changes: 3 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,8 @@ export default defineConfig([
ecmaVersion: 2020,
globals: globals.browser,
},
rules: {
'@typescript-eslint/no-explicit-any': 'error',
},
},
])