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
Original file line number Diff line number Diff line change
Expand Up @@ -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<CampaignCollaboration[]>([]);
const [loading, setLoading] = useState(false);
const [loadingDetail, setLoadingDetail] = useState(false);
Expand All @@ -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 {
Expand All @@ -38,7 +42,7 @@ export default function CampaignListBottomSheet({ isOpen, onClose, onSelect }: P
};
fetchCampaigns();
}
}, [isOpen]);
}, [isOpen, brandId]);

const options = campaigns
.filter((c) => c.proposalId)
Expand All @@ -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
Expand Down
18 changes: 12 additions & 6 deletions app/routes/chat/resuggest/resuggest-content.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ export default function ReSuggestContent() {
setIsConfirmDialogOpen(true);
};

const handleConfirmSubmit = () => {
const handleConfirmSubmit = async () => {
const formData = formValues;
const userId = tokenStorage.getUserId();

Expand All @@ -166,6 +166,11 @@ export default function ReSuggestContent() {
return;
}

if (!proposalData?.proposalId) {
toast.error("제안 정보가 없습니다. 다시 시도해주세요.");
return;
}

const requestData = {
brandId: proposalData?.brandId || 1,
creatorId: Number(userId),
Expand All @@ -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 (
<div className="flex flex-col h-full bg-white">
Expand Down
8 changes: 2 additions & 6 deletions app/routes/room/components/Bubbles/AttachmentMessage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -101,20 +101,16 @@ export default function AttachmentMessage({
<div className="w-fit flex items-start gap-[10px] ">
{/* avatar */}
<div
className="shrink-0 rounded-[10px] bg-white overflow-hidden"
className="shrink-0 rounded-[10px] overflow-hidden"
style={{ width: 38, height: 38 }}
>
{avatarSrc ? (
{avatarSrc && (
<img
src={avatarSrc}
alt="avatar"
className="w-full h-full object-cover"
draggable={false}
/>
) : (
<div className="w-full h-full grid place-items-center text-[12px] text-[#5B5D6B]">
logo
</div>
)}
</div>

Expand Down
8 changes: 2 additions & 6 deletions app/routes/room/components/Bubbles/ProposalMessage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -282,20 +282,16 @@ export default function ProposalMessage(props: Props) {
<div className="w-fit flex items-start gap-[10px] max-w-full">
{/* avatar */}
<div
className="shrink-0 rounded-[10px] bg-white overflow-hidden"
className="shrink-0 rounded-[10px] overflow-hidden"
style={{ width: 38, height: 38 }}
>
{avatarSrc ? (
{avatarSrc && (
<img
src={avatarSrc}
alt="avatar"
className="w-full h-full object-cover"
draggable={false}
/>
) : (
<div className="w-full h-full grid place-items-center text-[12px] text-[#5B5D6B]">
logo
</div>
)}
</div>

Expand Down
8 changes: 2 additions & 6 deletions app/routes/room/components/Bubbles/TextMessage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,20 +55,16 @@ export default function TextMessage ({
<div className="flex items-start gap-[10px] max-w-[80%]">
{/* avatar */}
<div
className="shrink-0 rounded-[10px] bg-white overflow-hidden"
className="shrink-0 rounded-[10px] overflow-hidden"
style={{ width: 38, height: 38 }}
>
{avatarSrc ? (
{avatarSrc && (
<img
src={avatarSrc}
alt="avatar"
className="w-full h-full object-cover"
draggable={false}
/>
) : (
<div className="w-full h-full grid place-items-center text-[12px] text-[#5B5D6B]">
logo
</div>
)}
</div>

Expand Down
10 changes: 7 additions & 3 deletions app/routes/room/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down Expand Up @@ -178,6 +178,8 @@ export default function ChattingRoom({ roomId }: Props) {
>
<div className="w-full">
<div className="w-full space-y-2">

{/* 채팅마다 나오는 말풍선 (Bubble) */}
{messages.map((m, idx) => {
const isMe = m.senderType === "USER" && m.senderId === myUserId;
const { dateText, timeText } = formatKoreanDateTime(m.createdAt);
Expand Down Expand Up @@ -229,14 +231,16 @@ export default function ChattingRoom({ roomId }: Props) {
height={sheetHeight}
/>

<CampaignListBottomSheet
{/* 캠페인 재 제안하기 버튼 */}
<CampaignProposalBottomSheet
isOpen={isCampaignSheetOpen}
onClose={() => 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,
Expand Down