From f034b5dd51a23f3d05d33760674ec62f38c5fa83 Mon Sep 17 00:00:00 2001 From: seyun31 <2ne1jenna@naver.com> Date: Sun, 1 Feb 2026 00:34:16 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=A6=B0=ED=8A=B8=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/routes/business/campaign/detail.tsx | 82 +++++++++---------- app/routes/matching/brand/brand-content.tsx | 13 ++- .../matching/campaign/campaign-content.tsx | 17 +++- eslint.config.js | 3 + 4 files changed, 71 insertions(+), 44 deletions(-) diff --git a/app/routes/business/campaign/detail.tsx b/app/routes/business/campaign/detail.tsx index 83c3823..666e71d 100644 --- a/app/routes/business/campaign/detail.tsx +++ b/app/routes/business/campaign/detail.tsx @@ -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"; @@ -18,55 +18,53 @@ export default function CampaignContent() { const [isContentOpen, setIsContentOpen] = useState(false); const [data, setData] = useState(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
로딩 중...
; - if (!data) return
데이터를 찾을 수 없습니다.
; + // 데이터 로딩 전 + if (!data) return
로딩 중...
; // 태그들을 예쁘게 합쳐주는 함수 (예: ["릴스", "숏폼"] -> "릴스, 숏폼") const formatTags = (tags: { name: string }[]) => tags.map(t => t.name).join(", "); diff --git a/app/routes/matching/brand/brand-content.tsx b/app/routes/matching/brand/brand-content.tsx index c02c9ad..46f388e 100644 --- a/app/routes/matching/brand/brand-content.tsx +++ b/app/routes/matching/brand/brand-content.tsx @@ -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([]); + const [brands, setBrands] = useState([]); const [isFilterOpen, setIsFilterOpen] = useState(false); const [sortOption, setSortOption] = useState("정렬 필터"); const [selectedTags, setSelectedTags] = useState([]); diff --git a/app/routes/matching/campaign/campaign-content.tsx b/app/routes/matching/campaign/campaign-content.tsx index c5fdfaa..18626b7 100644 --- a/app/routes/matching/campaign/campaign-content.tsx +++ b/app/routes/matching/campaign/campaign-content.tsx @@ -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([]); + const [campaigns, setCampaigns] = useState([]); const [isFilterOpen, setIsFilterOpen] = useState(false); const [sortOption, setSortOption] = useState("정렬 필터"); const [selectedTags, setSelectedTags] = useState([]); diff --git a/eslint.config.js b/eslint.config.js index 3cc5259..68955fa 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -19,5 +19,8 @@ export default defineConfig([ ecmaVersion: 2020, globals: globals.browser, }, + rules: { + '@typescript-eslint/no-explicit-any': 'error', + }, }, ])