diff --git a/app/routes/chat/components/CampaignListBottomSheet.tsx b/app/routes/chat/components/CampaignProposalBottomSheet.tsx similarity index 89% rename from app/routes/chat/components/CampaignListBottomSheet.tsx rename to app/routes/chat/components/CampaignProposalBottomSheet.tsx index 48c8551..4da7ccf 100644 --- a/app/routes/chat/components/CampaignListBottomSheet.tsx +++ b/app/routes/chat/components/CampaignProposalBottomSheet.tsx @@ -11,9 +11,10 @@ interface Props { isOpen: boolean; onClose: () => void; onSelect: (detail: ProposalDetail) => void; + brandId?: number; } -export default function CampaignListBottomSheet({ isOpen, onClose, onSelect }: Props) { +export default function CampaignProposalBottomSheet({ isOpen, onClose, onSelect, brandId }: Props) { const [campaigns, setCampaigns] = useState([]); const [loading, setLoading] = useState(false); const [loadingDetail, setLoadingDetail] = useState(false); @@ -29,7 +30,10 @@ export default function CampaignListBottomSheet({ isOpen, onClose, onSelect }: P status: "REVIEWING", endDate: today, }); - setCampaigns(data || []); + const filtered = brandId + ? (data || []).filter((c) => c.brandId === brandId) + : (data || []); + setCampaigns(filtered); } catch (error) { console.error("Failed to fetch campaigns:", error); } finally { @@ -38,7 +42,7 @@ export default function CampaignListBottomSheet({ isOpen, onClose, onSelect }: P }; fetchCampaigns(); } - }, [isOpen]); + }, [isOpen, brandId]); const options = campaigns .filter((c) => c.proposalId) @@ -56,10 +60,8 @@ export default function CampaignListBottomSheet({ isOpen, onClose, onSelect }: P setLoadingDetail(true); try { - // Revert back to using proposal API const detail = await getProposalDetail(proposalId); - // Pass campaignId from collaboration list const result: ProposalDetail = { ...detail, campaignId: originalCampaign.campaignId diff --git a/app/routes/chat/resuggest/resuggest-content.tsx b/app/routes/chat/resuggest/resuggest-content.tsx index 7cd10ba..1cc8663 100644 --- a/app/routes/chat/resuggest/resuggest-content.tsx +++ b/app/routes/chat/resuggest/resuggest-content.tsx @@ -157,7 +157,7 @@ export default function ReSuggestContent() { setIsConfirmDialogOpen(true); }; - const handleConfirmSubmit = () => { + const handleConfirmSubmit = async () => { const formData = formValues; const userId = tokenStorage.getUserId(); @@ -166,6 +166,11 @@ export default function ReSuggestContent() { return; } + if (!proposalData?.proposalId) { + toast.error("제안 정보가 없습니다. 다시 시도해주세요."); + return; + } + const requestData = { brandId: proposalData?.brandId || 1, creatorId: Number(userId), @@ -183,13 +188,14 @@ export default function ReSuggestContent() { endDate: formData.endDate || "", }; - setIsConfirmDialogOpen(false); - setIsSuccessModalOpen(true); - - reRequestCampaignProposal(proposalData!.proposalId!, requestData).catch((error: unknown) => { + try { + await reRequestCampaignProposal(proposalData.proposalId, requestData); + setIsConfirmDialogOpen(false); + setIsSuccessModalOpen(true); + } catch (error: unknown) { console.error("캠페인 재제안 실패:", error); toast.error("캠페인 재제안에 실패했습니다. 다시 시도해주세요."); - }); + } }; return (
diff --git a/app/routes/room/components/Bubbles/AttachmentMessage.tsx b/app/routes/room/components/Bubbles/AttachmentMessage.tsx index 4a1ecad..bff7ac3 100644 --- a/app/routes/room/components/Bubbles/AttachmentMessage.tsx +++ b/app/routes/room/components/Bubbles/AttachmentMessage.tsx @@ -101,20 +101,16 @@ export default function AttachmentMessage({
{/* avatar */}
- {avatarSrc ? ( + {avatarSrc && ( avatar - ) : ( -
- logo -
)}
diff --git a/app/routes/room/components/Bubbles/ProposalMessage.tsx b/app/routes/room/components/Bubbles/ProposalMessage.tsx index 1149cc6..61c40c9 100644 --- a/app/routes/room/components/Bubbles/ProposalMessage.tsx +++ b/app/routes/room/components/Bubbles/ProposalMessage.tsx @@ -282,20 +282,16 @@ export default function ProposalMessage(props: Props) {
{/* avatar */}
- {avatarSrc ? ( + {avatarSrc && ( avatar - ) : ( -
- logo -
)}
diff --git a/app/routes/room/components/Bubbles/TextMessage.tsx b/app/routes/room/components/Bubbles/TextMessage.tsx index 428f256..dee244e 100644 --- a/app/routes/room/components/Bubbles/TextMessage.tsx +++ b/app/routes/room/components/Bubbles/TextMessage.tsx @@ -55,20 +55,16 @@ export default function TextMessage ({
{/* avatar */}
- {avatarSrc ? ( + {avatarSrc && ( avatar - ) : ( -
- logo -
)}
diff --git a/app/routes/room/page.tsx b/app/routes/room/page.tsx index 6bde332..39c7cab 100644 --- a/app/routes/room/page.tsx +++ b/app/routes/room/page.tsx @@ -17,7 +17,7 @@ import useChatLayout from "./hooks/useChatLayout"; import useChatStomp from "./hooks/useChatStomp"; import useChatActions from "./hooks/useChatActions"; import { useCampaignProposalStore } from "../../stores/campaign-proposal"; -import CampaignListBottomSheet from "../chat/components/CampaignListBottomSheet"; +import CampaignProposalBottomSheet from "../chat/components/CampaignProposalBottomSheet"; import { getMyCollaborations } from "../business/calendar/api/calendar"; type Props = { @@ -178,6 +178,8 @@ export default function ChattingRoom({ roomId }: Props) { >
+ + {/* 채팅마다 나오는 말풍선 (Bubble) */} {messages.map((m, idx) => { const isMe = m.senderType === "USER" && m.senderId === myUserId; const { dateText, timeText } = formatKoreanDateTime(m.createdAt); @@ -229,14 +231,16 @@ export default function ChattingRoom({ roomId }: Props) { height={sheetHeight} /> - setIsCampaignSheetOpen(false)} + brandId={detail?.brandId} onSelect={(campaign) => { setProposalData({ proposalId: campaign.proposalId, campaignId: campaign.campaignId, - brandId: campaign.brandId, + brandId: detail?.brandId || campaign.brandId, campaignTitle: campaign.title, campaignDescription: campaign.description, rewardAmount: campaign.rewardAmount,