diff --git a/app/matching-list/_components/dummyData.ts b/app/matching-list/_components/dummyData.ts
deleted file mode 100644
index d44eae2..0000000
--- a/app/matching-list/_components/dummyData.ts
+++ /dev/null
@@ -1,312 +0,0 @@
-import { MatchingHistoryItem } from "@/hooks/useMatchingHistory";
-
-export const DUMMY_MATCHING_HISTORY: MatchingHistoryItem[] = [
- {
- historyId: 1,
- partner: {
- memberId: 1,
- email: "user1@test.com",
- nickname: "봄날의햇살",
- gender: "FEMALE",
- birthDate: "2002-03-15",
- mbti: "ENFP",
- intro: "안녕하세요! 맛집 탐방을 좋아하는 대학생입니다 😊",
- profileImageUrl: null,
- profileImageKey: null,
- socialType: "INSTAGRAM",
- socialAccountId: "spring_sunshine_",
- university: "한국대학교",
- major: "경영학과",
- contactFrequency: "FREQUENT",
- hobbies: [
- { category: "CULTURE", name: "카페투어" },
- { category: "TRAVEL", name: "여행" },
- { category: "SPORTS", name: "필라테스" },
- ],
- tags: [{ tag: "친절함" }, { tag: "활발함" }],
- song: "IU - Love Wins All",
- intros: [
- { question: "제 키는", answer: "163cm" },
- { question: "제 음주 습관은", answer: "가끔" },
- ],
- },
- favorite: true,
- matchedAt: "2026-04-20T10:30:00.000000",
- },
- {
- historyId: 2,
- partner: {
- memberId: 2,
- email: "user2@test.com",
- nickname: "겨울바다",
- gender: "FEMALE",
- birthDate: "2001-11-22",
- mbti: "INFJ",
- intro: "조용하지만 깊은 대화를 좋아해요.",
- profileImageUrl: null,
- profileImageKey: null,
- socialType: "INSTAGRAM",
- socialAccountId: "winter_sea22",
- university: "서울대학교",
- major: "심리학과",
- contactFrequency: "NORMAL",
- hobbies: [
- { category: "CULTURE", name: "독서" },
- { category: "MUSIC", name: "피아노" },
- ],
- tags: [{ tag: "조용함" }, { tag: "진중함" }],
- song: "백예린 - 산책",
- intros: [
- { question: "제 직업은", answer: "대학원생" },
- { question: "제 키는", answer: "158cm" },
- ],
- },
- favorite: false,
- matchedAt: "2026-04-19T14:20:00.000000",
- },
- {
- historyId: 3,
- partner: {
- memberId: 3,
- email: "user3@test.com",
- nickname: "달빛소녀",
- gender: "FEMALE",
- birthDate: "2003-07-01",
- mbti: "ENTP",
- intro: "토론하는 거 좋아합니다! 같이 이야기해요~",
- profileImageUrl: null,
- profileImageKey: null,
- socialType: "KAKAO",
- socialAccountId: "moonlight_girl",
- university: "연세대학교",
- major: "컴퓨터공학과",
- contactFrequency: "FREQUENT",
- hobbies: [
- { category: "GAME", name: "보드게임" },
- { category: "DAILY", name: "코딩" },
- { category: "SPORTS", name: "배드민턴" },
- { category: "CULTURE", name: "영화감상" },
- ],
- tags: [{ tag: "재치있음" }, { tag: "논리적" }],
- song: "NewJeans - Ditto",
- intros: [
- { question: "제 직업은", answer: "개발자" },
- { question: "저는 흡연을", answer: "비흡연" },
- ],
- },
- favorite: true,
- matchedAt: "2026-04-18T09:15:00.000000",
- },
- {
- historyId: 4,
- partner: {
- memberId: 4,
- email: "user4@test.com",
- nickname: "여름향기",
- gender: "FEMALE",
- birthDate: "2000-08-10",
- mbti: "ISFP",
- intro: "그림 그리는 걸 좋아해요 🎨",
- profileImageUrl: null,
- profileImageKey: null,
- socialType: "INSTAGRAM",
- socialAccountId: "summer_scent__",
- university: "고려대학교",
- major: "미술학과",
- contactFrequency: "RARE",
- hobbies: [
- { category: "MUSIC", name: "그림" },
- { category: "TRAVEL", name: "사진촬영" },
- ],
- tags: [{ tag: "예술적" }, { tag: "차분함" }],
- song: "10CM - 그라데이션",
- intros: [
- { question: "제 키는", answer: "165cm" },
- { question: "제가 좋아하는 음식은", answer: "파스타" },
- ],
- },
- favorite: false,
- matchedAt: "2026-04-17T16:45:00.000000",
- },
- {
- historyId: 5,
- partner: {
- memberId: 5,
- email: "user5@test.com",
- nickname: "별빛나래",
- gender: "FEMALE",
- birthDate: "2002-01-28",
- mbti: "ESTJ",
- intro: "운동 좋아하고 활발한 성격이에요!",
- profileImageUrl: null,
- profileImageKey: null,
- socialType: "INSTAGRAM",
- socialAccountId: "star_narae",
- university: "한양대학교",
- major: "체육학과",
- contactFrequency: "FREQUENT",
- hobbies: [
- { category: "SPORTS", name: "헬스" },
- { category: "SPORTS", name: "러닝" },
- { category: "DAILY", name: "요리" },
- ],
- tags: [{ tag: "에너지넘침" }, { tag: "건강함" }],
- song: "LE SSERAFIM - UNFORGIVEN",
- intros: [
- { question: "제 음주 습관은", answer: "즐기는 편" },
- { question: "제 키는", answer: "170cm" },
- ],
- },
- favorite: false,
- matchedAt: "2026-04-16T11:00:00.000000",
- },
- {
- historyId: 6,
- partner: {
- memberId: 6,
- email: "user6@test.com",
- nickname: "꽃잎사이로",
- gender: "FEMALE",
- birthDate: "2001-04-05",
- mbti: "INFP",
- intro: "감성적인 대화를 좋아해요 💐",
- profileImageUrl: null,
- profileImageKey: null,
- socialType: "INSTAGRAM",
- socialAccountId: "flower_between",
- university: "이화여자대학교",
- major: "국문학과",
- contactFrequency: "NORMAL",
- hobbies: [
- { category: "CULTURE", name: "시 쓰기" },
- { category: "CULTURE", name: "전시회" },
- ],
- tags: [{ tag: "섬세함" }, { tag: "감성적" }],
- song: "성시경 - 거리에서",
- intros: [
- { question: "제가 좋아하는 음식은", answer: "한식" },
- { question: "저는 흡연을", answer: "비흡연" },
- ],
- },
- favorite: true,
- matchedAt: "2026-04-15T08:30:00.000000",
- },
- {
- historyId: 7,
- partner: {
- memberId: 7,
- email: "user7@test.com",
- nickname: "하늘구름",
- gender: "FEMALE",
- birthDate: "2003-09-12",
- mbti: "ESFJ",
- intro: null,
- profileImageUrl: null,
- profileImageKey: null,
- socialType: null,
- socialAccountId: null,
- university: "성균관대학교",
- major: "의상학과",
- contactFrequency: "FREQUENT",
- hobbies: [
- { category: "DAILY", name: "쇼핑" },
- { category: "CULTURE", name: "뮤지컬" },
- ],
- tags: null,
- song: null,
- intros: [{ question: "제 키는", answer: "162cm" }],
- },
- favorite: false,
- matchedAt: "2026-04-14T13:20:00.000000",
- },
- {
- historyId: 8,
- partner: {
- memberId: 8,
- email: "user8@test.com",
- nickname: "파도소리",
- gender: "FEMALE",
- birthDate: "2000-12-25",
- mbti: "INTJ",
- intro: "효율적인 만남을 선호합니다.",
- profileImageUrl: null,
- profileImageKey: null,
- socialType: "INSTAGRAM",
- socialAccountId: "wave_sound25",
- university: "KAIST",
- major: "전산학부",
- contactFrequency: "RARE",
- hobbies: [
- { category: "GAME", name: "체스" },
- { category: "DAILY", name: "독서" },
- { category: "DAILY", name: "자기계발" },
- ],
- tags: [{ tag: "공부하는" }, { tag: "계획적" }],
- song: "Day6 - 한 페이지가 될 수 있게",
- intros: [
- { question: "제 직업은", answer: "연구원" },
- { question: "제 음주 습관은", answer: "전혀 안 함" },
- ],
- },
- favorite: false,
- matchedAt: "2026-04-13T17:50:00.000000",
- },
- {
- historyId: 9,
- partner: {
- memberId: 9,
- email: "withdrawn_9@deleted.com",
- nickname: "탈퇴한 사용자",
- gender: "FEMALE",
- birthDate: null,
- mbti: "ENFP",
- intro: null,
- profileImageUrl: null,
- profileImageKey: null,
- socialType: null,
- socialAccountId: null,
- university: "한국대학교",
- major: "(알 수 없음)",
- contactFrequency: "NORMAL",
- hobbies: [{ category: "SPORTS", name: "헬스" }],
- tags: null,
- song: null,
- intros: [],
- },
- favorite: false,
- matchedAt: "2026-04-12T10:10:00.000000",
- },
- {
- historyId: 10,
- partner: {
- memberId: 10,
- email: "user10@test.com",
- nickname: "새벽이슬",
- gender: "FEMALE",
- birthDate: "2002-06-18",
- mbti: "ISTP",
- intro: "자전거 타고 한강 달리는 거 좋아해요 🚴",
- profileImageUrl: null,
- profileImageKey: null,
- socialType: "INSTAGRAM",
- socialAccountId: "dawn_dew_18",
- university: "중앙대학교",
- major: "기계공학과",
- contactFrequency: "NORMAL",
- hobbies: [
- { category: "SPORTS", name: "자전거" },
- { category: "TRAVEL", name: "캠핑" },
- { category: "DAILY", name: "요리" },
- ],
- tags: [{ tag: "쿨함" }, { tag: "독립적" }],
- song: "ZICO - Any Song",
- intros: [
- { question: "제 키는", answer: "167cm" },
- { question: "제가 좋아하는 음식은", answer: "일식" },
- { question: "저는 흡연을", answer: "비흡연" },
- ],
- },
- favorite: true,
- matchedAt: "2026-04-11T19:00:00.000000",
- },
-];
diff --git a/app/matching-result/_components/ScreenMatchingResult.tsx b/app/matching-result/_components/ScreenMatchingResult.tsx
index 5484509..2ae2c3d 100644
--- a/app/matching-result/_components/ScreenMatchingResult.tsx
+++ b/app/matching-result/_components/ScreenMatchingResult.tsx
@@ -20,6 +20,16 @@ const ScreenMatchingResult = () => {
const lastPayload = useMatchingStore((s) => s.lastPayload);
const router = useRouter();
+ // DEBUG: 매칭 결과 데이터 로그 출력
+ useEffect(() => {
+ if (result) {
+ console.log("✅ [Matching Result Data]:", result);
+ }
+ if (lastPayload) {
+ console.log("📝 [Matching Last Payload]:", lastPayload);
+ }
+ }, [result, lastPayload]);
+
useEffect(() => {
if (isMatching) {
// eslint-disable-next-line react-hooks/set-state-in-effect
diff --git a/app/matching/_components/AgeRangeDrawer.tsx b/app/matching/_components/AgeRangeDrawer.tsx
index ad3f37c..1e8400c 100644
--- a/app/matching/_components/AgeRangeDrawer.tsx
+++ b/app/matching/_components/AgeRangeDrawer.tsx
@@ -12,6 +12,7 @@ import {
} from "@/components/ui/drawer";
import { cn } from "@/lib/utils";
import Button from "@/components/ui/Button";
+import { MATCHING_AGE_LIMITS } from "@/lib/constants/matching";
interface AgeRangeDrawerProps {
trigger: React.ReactNode;
@@ -20,8 +21,8 @@ interface AgeRangeDrawerProps {
onConfirm: (minAge: number, maxAge: number) => void;
}
-const MIN_AGE = 20;
-const MAX_AGE = 29;
+const MIN_AGE = MATCHING_AGE_LIMITS.MIN;
+const MAX_AGE = MATCHING_AGE_LIMITS.MAX;
const ALL_AGES = Array.from(
{ length: MAX_AGE - MIN_AGE + 1 },
(_, i) => MIN_AGE + i,
diff --git a/app/matching/_components/MatchingAgeOption.tsx b/app/matching/_components/MatchingAgeOption.tsx
index b08bcd1..85d6ed9 100644
--- a/app/matching/_components/MatchingAgeOption.tsx
+++ b/app/matching/_components/MatchingAgeOption.tsx
@@ -5,6 +5,7 @@ import Image from "next/image";
import { Check, Delete } from "lucide-react";
import { cn } from "@/lib/utils";
import AgeRangeDrawer from "./AgeRangeDrawer";
+import { MATCHING_AGE_LIMITS } from "@/lib/constants/matching";
interface MatchingAgeOptionProps {
onAgeRangeSelect: (minAge: number, maxAge: number) => void;
@@ -13,8 +14,8 @@ interface MatchingAgeOptionProps {
maxAge?: number;
}
-const DEFAULT_MIN = 20;
-const DEFAULT_MAX = 29;
+const DEFAULT_MIN = MATCHING_AGE_LIMITS.MIN;
+const DEFAULT_MAX = MATCHING_AGE_LIMITS.MAX;
export default function MatchingAgeOption({
onAgeRangeSelect,
diff --git a/app/matching/_components/ScreenMatching.tsx b/app/matching/_components/ScreenMatching.tsx
index 2123eb3..091dce9 100644
--- a/app/matching/_components/ScreenMatching.tsx
+++ b/app/matching/_components/ScreenMatching.tsx
@@ -40,9 +40,11 @@ const frequencyMapping: Record
= {
import { useItems } from "@/hooks/useItems";
import { useMatching } from "@/hooks/useMatching";
+import { useMyProfile } from "@/hooks/useProfile";
const ScreenMatching = () => {
const { data: itemData, isLoading: isItemsLoading } = useItems();
+ const { data: myProfile } = useMyProfile();
const { mutate: match, isPending } = useMatching();
const [selectedMBTI, setSelectedMBTI] = useState("");
const [selectedAgeGroup, setSelectedAgeGroup] = useState("");
@@ -57,6 +59,18 @@ const ScreenMatching = () => {
useState(null);
const [resetKey, setResetKey] = useState(0);
+ // 현재 사용자 나이 계산 (한국식 나이: 현재연도 - 태어난연도 + 1)
+ const userAge = React.useMemo(() => {
+ if (!myProfile?.data.birthDate) return 0;
+ try {
+ const birthYear = new Date(myProfile.data.birthDate).getFullYear();
+ const currentYear = new Date().getFullYear();
+ return currentYear - birthYear + 1;
+ } catch {
+ return 0;
+ }
+ }, [myProfile]);
+
const matchingTicketCount = itemData?.data.matchingTicketCount ?? 0;
const isAgeRangeActive = minAge !== undefined && maxAge !== undefined;
const extraOptionCount =
@@ -100,13 +114,16 @@ const ScreenMatching = () => {
const bubbleTextColor =
matchingTicketCount === 0 ? "text-color-gray-600" : "text-black";
+ const handleAgeGroupSelect = (group: string) => {
+ setSelectedAgeGroup(group);
+ // 나이 그룹 선택 시 나이 구간(슬라이더) 설정 초기화
+ setMinAge(undefined);
+ setMaxAge(undefined);
+ };
+
const handleAgeRangeSelect = (min: number, max: number) => {
- if (selectedAgeGroup) {
- alert(
- "나이 구간 옵션을 사용하면 기존에 선택한 나이 옵션(연하/동갑/연상)이 해제됩니다.",
- );
- setSelectedAgeGroup("");
- }
+ // 나이 구간 설정 시 나이 그룹(연하/동갑/연상) 초기화
+ setSelectedAgeGroup("");
setMinAge(min);
setMaxAge(max);
};
@@ -138,12 +155,23 @@ const ScreenMatching = () => {
const ageInfo = calculateAgeOffsets(selectedAgeGroup);
+ // 실제 서버로 보낼 절대 나이 계산
+ let finalMinAge: number | null = null;
+ let finalMaxAge: number | null = null;
+
+ if (isAgeRangeActive) {
+ finalMinAge = minAge ?? null;
+ finalMaxAge = maxAge ?? null;
+ } else if (ageInfo.min !== null && ageInfo.max !== null) {
+ finalMinAge = userAge + ageInfo.min;
+ finalMaxAge = userAge + ageInfo.max;
+ }
+
const payload: MatchingRequest = {
- // 1. 슬라이더 사용 시: ageOption은 null, 오프셋은 값
- // 2. 버튼 사용 시: ageOption은 값, 오프셋은 null
+ // 이제 오프셋이 아닌 실제 나이를 보냅니다. (필드명은 규격상 Offset 유지)
ageOption: isAgeRangeActive ? null : ageInfo.option || null,
- minAgeOffset: isAgeRangeActive ? (minAge ?? null) : null,
- maxAgeOffset: isAgeRangeActive ? (maxAge ?? null) : null,
+ minAgeOffset: finalMinAge,
+ maxAgeOffset: finalMaxAge,
mbtiOption: selectedMBTI || undefined,
hobbyOption: selectedHobbyCategory
@@ -180,9 +208,8 @@ const ScreenMatching = () => {
/>
{
const birthYear = initialProfile.birthDate
? initialProfile.birthDate.split("-")[0]
: undefined;
- const currentYear = new Date().getFullYear();
- const age = birthYear ? currentYear - Number(birthYear) + 1 : undefined;
const { mutateAsync: uploadImage } = useImageUpload();
@@ -343,6 +340,21 @@ const ScreenMyPage = ({ initialProfile }: ScreenMyPageProps) => {
return;
}
+ // 나이(출생연도) 검증 (2000년생~2007년생)
+ if (!editableBirthYear) {
+ alert("출생연도를 입력해 주세요.");
+ return;
+ }
+ const birthYearNum = parseInt(editableBirthYear, 10);
+ if (
+ Number.isNaN(birthYearNum) ||
+ birthYearNum < 2000 ||
+ birthYearNum > 2007
+ ) {
+ alert("2000년생부터 2007년생까지만 가입 가능합니다.");
+ return;
+ }
+
// 닉네임이 변경된 경우에만 중복 검사
if (trimmedNickname !== (initialProfile.nickname || "")) {
try {
@@ -564,7 +576,7 @@ const ScreenMyPage = ({ initialProfile }: ScreenMyPageProps) => {
{/* 닉네임 */}
닉네임
-
diff --git a/app/profile-builder/_components/ScreenProfileBuilder.tsx b/app/profile-builder/_components/ScreenProfileBuilder.tsx
index dd3042a..996f346 100644
--- a/app/profile-builder/_components/ScreenProfileBuilder.tsx
+++ b/app/profile-builder/_components/ScreenProfileBuilder.tsx
@@ -147,6 +147,21 @@ export const ScreenProfileBuilder = () => {
};
const handleComplete = () => {
+ // 나이(출생연도) 검증 (2000년생~2007년생)
+ if (!selectedBirthYear) {
+ alert("출생연도를 선택해 주세요.");
+ return;
+ }
+ const birthYearNum = parseInt(selectedBirthYear, 10);
+ if (
+ Number.isNaN(birthYearNum) ||
+ birthYearNum < 2000 ||
+ birthYearNum > 2007
+ ) {
+ alert("2000년생부터 2007년생까지만 가입 가능합니다.");
+ return;
+ }
+
const normalizedMBTI = selectedMBTI.toUpperCase();
const profileData: Partial
= {
diff --git a/app/profile-builder/_lib/options.ts b/app/profile-builder/_lib/options.ts
index 0776dbc..88f372b 100644
--- a/app/profile-builder/_lib/options.ts
+++ b/app/profile-builder/_lib/options.ts
@@ -12,7 +12,7 @@ type MajorCategory = {
};
export const getYearOptions = (): Option[] =>
- Array.from({ length: 11 }, (_, index) => ({
+ Array.from({ length: 8 }, (_, index) => ({
value: String(2000 + index),
label: `${2000 + index}년`,
}));
diff --git a/components/common/ChatSocketInitializer.tsx b/components/common/ChatSocketInitializer.tsx
new file mode 100644
index 0000000..a9b7885
--- /dev/null
+++ b/components/common/ChatSocketInitializer.tsx
@@ -0,0 +1,20 @@
+"use client";
+
+import { useEffect } from "react";
+import { useChatSocketStore } from "@/stores/chat-socket-store";
+
+export default function ChatSocketInitializer() {
+ const connect = useChatSocketStore((state) => state.connect);
+ const disconnect = useChatSocketStore((state) => state.disconnect);
+
+ useEffect(() => {
+ connect();
+ return () => {
+ // 앱이 종료되거나 새로고침될 때 연결 해제
+ // 사실 Root Layout에 두면 탭을 닫기 전까지는 유지됨
+ disconnect();
+ };
+ }, [connect, disconnect]);
+
+ return null;
+}
diff --git a/components/common/charge-confirm/ConfirmChargeDrawer.tsx b/components/common/charge-confirm/ConfirmChargeDrawer.tsx
index 9b32294..902e670 100644
--- a/components/common/charge-confirm/ConfirmChargeDrawer.tsx
+++ b/components/common/charge-confirm/ConfirmChargeDrawer.tsx
@@ -3,7 +3,7 @@
import React from "react";
import { AxiosError } from "axios";
import { cn } from "@/lib/utils";
-import { X, PencilLine, Check } from "lucide-react";
+import { X, Check } from "lucide-react";
import {
Drawer,
DrawerClose,
@@ -16,6 +16,9 @@ import {
import { useQueryClient } from "@tanstack/react-query";
import Button from "@/components/ui/Button";
import { BANK_INFO } from "@/lib/constants/charge";
+import { usePurchaseProduct } from "@/hooks/usePurchaseProduct";
+import { useRealName } from "@/hooks/useRealName";
+import { ChargeDrawerContext } from "@/components/common/ChargeDrawer";
/* ── Props ── */
interface ConfirmChargeDrawerProps {
@@ -28,31 +31,29 @@ interface ConfirmChargeDrawerProps {
depositorName?: string;
}
-/* ────────────────────────────────────── */
-
-import { usePurchaseProduct } from "@/hooks/usePurchaseProduct";
-import { ChargeDrawerContext } from "@/components/common/ChargeDrawer";
-
export default function ConfirmChargeDrawer({
trigger,
productId,
amount,
- depositorName = "천승환",
+ depositorName,
}: ConfirmChargeDrawerProps) {
const queryClient = useQueryClient();
const drawerContext = React.useContext(ChargeDrawerContext);
const { mutate: purchase, isPending } = usePurchaseProduct();
+ const { data: realNameData } = useRealName();
const [open, setOpen] = React.useState(false);
const [agreed, setAgreed] = React.useState(false);
- const [name, setName] = React.useState(depositorName);
- const [isEditingName, setIsEditingName] = React.useState(false);
- const inputRef = React.useRef(null);
+ const [name, setName] = React.useState(
+ depositorName || realNameData?.data?.realName || "",
+ );
- /* 입금자명 수정 시 input focus */
+ // 실명이 로드되면 이름 업데이트
React.useEffect(() => {
- if (isEditingName) inputRef.current?.focus();
- }, [isEditingName]);
+ if (realNameData?.data?.realName && !depositorName && !name) {
+ setName(realNameData.data.realName);
+ }
+ }, [realNameData, depositorName, name]);
/* 계좌번호 복사 */
const handleCopy = async () => {
@@ -74,10 +75,7 @@ export default function ConfirmChargeDrawer({
const tossDeepLink = `supertoss://send?accountNo=${accountNo}&bankCode=${bankCode}&amount=${amount}&message=${encodeURIComponent(message)}`;
if (/Android|iPhone|iPad/i.test(navigator.userAgent)) {
- // 토스 이동 상태 기록 (기존 코드 참고)
localStorage.setItem("tossPaymentInProgress", "1");
-
- // 딥링크 이동
const a = document.createElement("a");
a.href = tossDeepLink;
a.style.display = "none";
@@ -93,8 +91,14 @@ export default function ConfirmChargeDrawer({
const handleConfirm = () => {
purchase(productId, {
onSuccess: () => {
- alert("충전 요청이 완료되었습니다!");
+ alert(
+ "충전 요청이 완료되었습니다! 토스가 설치되어 있다면 토스로 바로 이동합니다.",
+ );
setOpen(false);
+ queryClient.invalidateQueries({ queryKey: ["myProfile"] });
+
+ // 토스 송금 앱으로 즉시 자동 연동
+ handleTossTransfer();
},
onError: (error: AxiosError<{ code?: string; message?: string }>) => {
const errorData = error.response?.data;
@@ -104,7 +108,6 @@ export default function ConfirmChargeDrawer({
} else if (errorData?.code === "PAY-004") {
alert("먼저 입금자명을 설정해 주세요.");
setOpen(false);
- // 실명 설정 탭으로 이동 (TABS[2]가 입금자명 설정)
drawerContext?.setActiveTab(2);
} else {
alert(
@@ -129,10 +132,10 @@ export default function ConfirmChargeDrawer({
className="rounded-t-[24px] bg-white outline-none"
showHandle={false}
>
-
-
+
+
{/* ── Header ── */}
-
+
계좌이체
@@ -161,16 +164,13 @@ export default function ConfirmChargeDrawer({
{/* 계좌 정보 박스 */}
-
+
{BANK_INFO.bank}
-
+
{BANK_INFO.account}
-
- 예금주 : {BANK_INFO.holder}
-
@@ -179,33 +179,11 @@ export default function ConfirmChargeDrawer({
입금자명
- {isEditingName ? (
-
- setName(e.target.value)}
- onBlur={() => setIsEditingName(false)}
- onKeyDown={(e) => {
- if (e.key === "Enter") setIsEditingName(false);
- }}
- className="typo-16-700 text-color-gray-900 h-[24px] w-[90px] bg-transparent text-center outline-none"
- maxLength={6}
- />
-
- ) : (
-
- )}
+
+
+ {name || "미지정"}
+
+
{/* 입금액 */}
@@ -251,7 +229,6 @@ export default function ConfirmChargeDrawer({
{isPending ? "요청 중..." : "충전 요청 보내기"}
- {/* Toss 링크 */}