Skip to content

Commit e18760e

Browse files
authored
Merge pull request #74 from 3rdflr/feat/TRI-83-pay
Feat: TRI-83 결제 서비스 구현
2 parents a36bcbe + d8de130 commit e18760e

File tree

9 files changed

+356
-28
lines changed

9 files changed

+356
-28
lines changed

package-lock.json

Lines changed: 128 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
"@tanstack/react-query": "^5.85.5",
4141
"@tanstack/react-query-devtools": "^5.85.5",
4242
"@tanstack/react-virtual": "^3.13.12",
43+
"@tosspayments/payment-widget-sdk": "^0.12.0",
44+
"@tosspayments/tosspayments-sdk": "^2.4.0",
4345
"axios": "^1.11.0",
4446
"class-variance-authority": "^0.7.1",
4547
"clsx": "^2.1.1",
@@ -50,6 +52,7 @@
5052
"lottie-react": "^2.4.1",
5153
"lucide-react": "^0.540.0",
5254
"motion": "^12.23.12",
55+
"nanoid": "^5.1.5",
5356
"next": "^14.2.32",
5457
"plaiceholder": "^3.0.0",
5558
"postcss": "^8.5.6",

src/components/pages/activities/EditDropDown.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ export function EditDropDown({ activityId, isOwner, open, setOpen }: EditDropDow
156156
'hover:bg-gray-100 focus:bg-gray-100 focus:outline-none',
157157
'disabled:text-gray-400 disabled:cursor-not-allowed disabled:hover:bg-transparent',
158158
)}
159-
whileHover={isOwner ? { backgroundColor: 'rgba(0, 0, 0, 0.05)' } : {}}
160159
whileTap={isOwner ? { scale: 0.98 } : {}}
161160
>
162161
수정하기
@@ -171,7 +170,6 @@ export function EditDropDown({ activityId, isOwner, open, setOpen }: EditDropDow
171170
'hover:bg-red-50 hover:text-red-600 focus:bg-red-50 focus:text-red-600 focus:outline-none',
172171
'disabled:text-gray-400 disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-gray-400',
173172
)}
174-
whileHover={isOwner ? { backgroundColor: 'rgba(239, 68, 68, 0.1)' } : {}}
175173
whileTap={isOwner ? { scale: 0.98 } : {}}
176174
>
177175
삭제하기

src/components/pages/activities/bookingCard/BookingConfirm.Modal.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,11 @@ const BookingConfirmModal = ({
4646
reservationData: ReservationRequest;
4747
}) => createReservation(activityId, reservationData),
4848

49-
onSuccess: (data) => {
49+
onSuccess: async (data) => {
5050
console.log('🎫 [BookingConfirmModal] 예약 성공:', data);
5151
onClose();
5252
successToast.run('예약이 완료되었습니다!');
53+
router.push('/mypage/reservation-list');
5354
},
5455
onError: (error: unknown) => {
5556
console.error('❗ [BookingConfirmModal] 예약 실패:', error);
@@ -80,13 +81,11 @@ const BookingConfirmModal = ({
8081
return;
8182
}
8283

83-
// 기타 에러인 경우 재시도 옵션 제공
84-
//@todo: 이미 예약한경우 구체적인 에러메시지 노출
8584
overlay.open(({ isOpen, close }) => (
8685
<ConfirmActionModal
8786
isOpen={isOpen}
8887
onClose={close}
89-
title='예약에 실패했습니다.'
88+
title={axiosError?.response?.data?.message ?? '예약에 실패했습니다.'}
9089
actionText='다시 시도'
9190
exitText='취소'
9291
onAction={() => {

src/components/pages/activities/bookingCard/BookingDateInput.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,11 @@ export function BookingDateInput({
3030
const [monthValue, setMonthValue] = useState('');
3131
const [dayValue, setDayValue] = useState('');
3232

33+
const today = new Date();
34+
3335
// selectedDate가 변경될 때 각 input value 업데이트
3436
useEffect(() => {
37+
console.log('📅 selectedDate 변경:', selectedDate);
3538
if (selectedDate) {
3639
setYearValue(format(selectedDate, 'yyyy'));
3740
setMonthValue(format(selectedDate, 'MM'));
@@ -176,7 +179,7 @@ export function BookingDateInput({
176179
type='number'
177180
value={yearValue}
178181
onChange={handleYearChange}
179-
placeholder='2025'
182+
placeholder={format(today, 'yyyy')}
180183
min='2025'
181184
max='2030'
182185
className={cn('w-16', baseInputStyles)}
@@ -190,7 +193,7 @@ export function BookingDateInput({
190193
type='number'
191194
value={monthValue}
192195
onChange={handleMonthChange}
193-
placeholder='09'
196+
placeholder={format(today, 'MM')}
194197
min='1'
195198
max='12'
196199
className={cn('w-12', baseInputStyles)}
@@ -204,7 +207,7 @@ export function BookingDateInput({
204207
type='number'
205208
value={dayValue}
206209
onChange={handleDayChange}
207-
placeholder='16'
210+
placeholder={format(today, 'dd')}
208211
min='1'
209212
max='31'
210213
className={cn('w-12', baseInputStyles)}

src/components/pages/activities/bookingCard/BookingTimeList.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ export default function BookingTimeList({
2626
{/* Time Slots */}
2727
<div className='font-bold flex items-center'>예약 가능한 시간</div>
2828

29-
{!selectedDate || !selectedSchedule ? (
29+
{!selectedSchedule || selectedSchedule.length === 0 ? (
3030
<div className='p-4 text-center text-gray-500 '>
31-
{!selectedDate ? '날짜를 선택해주세요' : '예약 가능한 시간이 없습니다'}
31+
{selectedDate ? '예약 가능한 시간이 없습니다' : '날짜를 선택해주세요'}
3232
</div>
3333
) : (
3434
<div className='flex flex-col gap-2 lg:gap-3 max-h-[150px] lg:max-h-[200px] overflow-y-auto'>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { Modal } from 'react-simplified-package';
2+
import { Button } from '@/components/ui/button';
3+
4+
interface PaymentsErrorProps {
5+
isOpen: boolean;
6+
onClose: () => void;
7+
}
8+
9+
export default function PaymentsError({ isOpen, onClose }: PaymentsErrorProps) {
10+
return (
11+
<Modal isOpen={isOpen} onClose={onClose} modalClassName='max-w-[400px] w-full'>
12+
<div className='flex flex-col items-center gap-4 p-6'>
13+
<div className='text-red-500 text-2xl'>⚠️</div>
14+
<div className='text-center'>
15+
<h3 className='font-medium text-gray-900 mb-1'>결제 오류</h3>
16+
<p className='text-sm text-gray-500'>결제 시스템에 문제가 발생했습니다</p>
17+
</div>
18+
<Button onClick={onClose} className='w-full'>
19+
닫기
20+
</Button>
21+
</div>
22+
</Modal>
23+
);
24+
}

0 commit comments

Comments
 (0)