Skip to content

Commit 7454240

Browse files
committed
feat: 매칭 메시지 UI 구현
1 parent 647d3ea commit 7454240

2 files changed

Lines changed: 8 additions & 126 deletions

File tree

src/pages/Chats/MatchingRoom/Card/index.tsx

Lines changed: 2 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,27 @@
1-
import { useState } from 'react';
21
import { useNavigate } from 'react-router-dom';
32

4-
import { useRecoilState } from 'recoil';
53
import { Pagination } from 'swiper/modules';
64
import { Swiper, SwiperSlide } from 'swiper/react';
75
import 'swiper/css';
86
import 'swiper/css/pagination';
97

108
import theme from '@styles/theme';
119

12-
import { modifyMatchingStatusApi } from '@apis/matching';
13-
import { handleError } from '@apis/util/handleError';
14-
import { OtherUserAtom } from '@recoil/util/OtherUser';
15-
16-
import acceptButton from '@assets/default/accept.svg';
1710
import defaultProfile from '@assets/default/defaultProfile.svg';
18-
import rejectButton from '@assets/default/reject.svg';
1911

20-
import Modal from '@components/Modal';
2112
import { StyledText } from '@components/Text/StyledText';
2213

23-
import type { ModalProps } from '@components/Modal/dto';
24-
2514
import type { CardProps } from './dto';
2615

27-
import {
28-
ArrowButton,
29-
Btn,
30-
CardLayout,
31-
OOTDImgBackground,
32-
OOTDImgBox,
33-
ProfileContainer,
34-
ProfileImgBox,
35-
ProfileInfo,
36-
Reaction,
37-
SeeMore,
38-
} from './styles';
16+
import { CardLayout, OOTDImgBackground, OOTDImgBox, ProfileContainer, ProfileImgBox, ProfileInfo } from './styles';
3917

40-
const Card: React.FC<CardProps> = ({ id, chatRoomId, requester }) => {
41-
const [isStatusModalOpen, setIsStatusModalOpen] = useState(false);
42-
const [modalContent, setModalContent] = useState('알 수 없는 오류가 발생했습니다.\n관리자에게 문의해 주세요.');
43-
const [, setOtherUser] = useRecoilState(OtherUserAtom);
18+
const Card: React.FC<CardProps> = ({ requester }) => {
4419
const nav = useNavigate();
4520

4621
const handleUserClick = () => {
4722
nav(`/profile/${requester.id}`);
4823
};
4924

50-
const handleRejectButtonClick = () => {
51-
modifyMatchingStatus('reject');
52-
};
53-
54-
const handleAcceptButtonClick = () => {
55-
modifyMatchingStatus('accept');
56-
};
57-
58-
// 매칭 거절 및 수락 api
59-
const modifyMatchingStatus = async (status: 'accept' | 'reject') => {
60-
try {
61-
const response = await modifyMatchingStatusApi(id, { requestStatus: status });
62-
63-
if (response.isSuccess) {
64-
if (status === 'accept') {
65-
setOtherUser({
66-
id: requester.id,
67-
nickname: requester.nickname,
68-
profilePictureUrl: requester.profilePictureUrl,
69-
});
70-
nav(`/chats/${chatRoomId}`);
71-
}
72-
}
73-
} catch (error) {
74-
const errorMessage = handleError(error);
75-
setModalContent(errorMessage);
76-
setIsStatusModalOpen(true);
77-
}
78-
};
79-
80-
const statusModalProps: ModalProps = {
81-
content: modalContent,
82-
onClose: () => {
83-
setIsStatusModalOpen(false);
84-
},
85-
};
86-
8725
return (
8826
<CardLayout>
8927
<ProfileContainer>
@@ -113,12 +51,6 @@ const Card: React.FC<CardProps> = ({ id, chatRoomId, requester }) => {
11351
))}
11452
</div>
11553
</ProfileInfo>
116-
<SeeMore onClick={() => nav(`/profile/${requester.id}`)}>
117-
<StyledText $textTheme={{ style: 'caption2-regular' }} color={theme.colors.text.caption}>
118-
OOTD 더 보기
119-
</StyledText>
120-
<ArrowButton />
121-
</SeeMore>
12254
</ProfileContainer>
12355
<OOTDImgBox>
12456
<Swiper
@@ -139,16 +71,7 @@ const Card: React.FC<CardProps> = ({ id, chatRoomId, requester }) => {
13971
</SwiperSlide>
14072
))}
14173
</Swiper>
142-
<Reaction>
143-
<Btn onClick={handleRejectButtonClick}>
144-
<img src={rejectButton} alt="reject" />
145-
</Btn>
146-
<Btn onClick={handleAcceptButtonClick}>
147-
<img src={acceptButton} alt="accept" />
148-
</Btn>
149-
</Reaction>
15074
</OOTDImgBox>
151-
{isStatusModalOpen && <Modal {...statusModalProps} />}
15275
</CardLayout>
15376
);
15477
};

src/pages/Chats/MatchingRoom/Card/styles.tsx

Lines changed: 6 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,20 @@
11
import { styled } from 'styled-components';
22

3-
import ArrowIcon from '@assets/arrow/min-right.svg';
4-
53
export const CardLayout = styled.div`
6-
background-color: ${({ theme }) => theme.colors.background.divider};
74
border-radius: 0.5rem;
85
position: relative;
9-
height: 100%;
106
`;
117

128
export const ProfileContainer = styled.div`
139
display: grid;
1410
grid-template-columns: auto 1fr auto;
1511
align-items: center;
16-
padding: 1rem 0.5rem;
12+
padding: 0.5rem 0;
1713
`;
1814

1915
export const ProfileImgBox = styled.div`
20-
width: 3.25rem;
21-
height: 3.25rem;
16+
width: 2.25rem;
17+
height: 2.25rem;
2218
margin-right: 0.5rem;
2319
border-radius: 50%;
2420
cursor: pointer;
@@ -45,35 +41,19 @@ export const ProfileInfo = styled.div`
4541
}
4642
`;
4743

48-
export const SeeMore = styled.div`
49-
cursor: pointer;
50-
display: flex;
51-
align-items: center;
52-
margin-bottom: 2.13rem;
53-
`;
54-
55-
export const ArrowButton = styled.button`
56-
width: 1.125rem;
57-
height: 1.125rem;
58-
background-image: url(${ArrowIcon});
59-
background-repeat: no-repeat;
60-
background-position: center;
61-
`;
62-
6344
export const OOTDImgBox = styled.div`
6445
position: relative;
6546
width: 100%;
66-
height: 100%;
67-
border-radius: 0 0 0.5rem 0.5rem;
47+
height: fit-content;
48+
margin-bottom: 0.5rem;
49+
border-radius: 0.5rem;
6850
overflow: hidden;
6951
display: flex;
7052
justify-content: center;
7153
align-items: center;
72-
aspect-ratio: 1/1;
7354
7455
.slide-image-small {
7556
width: 100%;
76-
max-width: 640px;
7757
height: 100%;
7858
object-fit: contain;
7959
}
@@ -136,24 +116,3 @@ export const OOTDImgBackground = styled.div<{ $src: string }>`
136116
background-repeat: no-repeat;
137117
background-size: cover;
138118
`;
139-
140-
export const Reaction = styled.div`
141-
position: absolute;
142-
bottom: 0;
143-
padding: 1rem 0rem;
144-
display: flex;
145-
align-items: center;
146-
gap: 0.9375rem;
147-
z-index: 100;
148-
`;
149-
150-
export const Btn = styled.button`
151-
cursor: pointer;
152-
width: 3.5rem;
153-
height: 3.5rem;
154-
background-color: transparent;
155-
156-
display: flex;
157-
justify-content: center;
158-
align-items: center;
159-
`;

0 commit comments

Comments
 (0)