diff --git a/.gitignore b/.gitignore index 2f89402e..b2c2a181 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,9 @@ yarn-error.log* .DS_Store *.pem +# OMC +.omc/ + # Expo apps/mobile/ios/ apps/mobile/android/ diff --git a/apps/mobile/app/index.tsx b/apps/mobile/app/index.tsx index fd890b12..e4fa7ecb 100644 --- a/apps/mobile/app/index.tsx +++ b/apps/mobile/app/index.tsx @@ -28,6 +28,7 @@ export default function App() { const [isAuthReady, setIsAuthReady] = useState(false) const webviewUrl = process.env.EXPO_PUBLIC_LOCAL_URL + // const webviewUrl = process.env.EXPO_PUBLIC_WEB_VIEW_URL if (!webviewUrl) throw new Error('Webview URL is not set') useEffect(() => { diff --git a/apps/react/index.html b/apps/react/index.html index fe536a0c..f86b7645 100644 --- a/apps/react/index.html +++ b/apps/react/index.html @@ -7,6 +7,7 @@ content="width=device-width, viewport-fit=cover, initial-scale=1, maximum-scale=1, user-scalable=0" /> React + diff --git a/apps/react/src/app/attachment-test/page.tsx b/apps/react/src/app/attachment-test/page.tsx index 7770fe35..137b925c 100644 --- a/apps/react/src/app/attachment-test/page.tsx +++ b/apps/react/src/app/attachment-test/page.tsx @@ -14,6 +14,8 @@ import { DetailHeaderBar } from '@/shared/ui/header-bar' const searchSchema = z.object({ from: z.string().optional(), + flow: z.enum(['my-personality', 'partner-personality', 'full-flow']).optional(), + chatId: z.number().optional(), }) export const Route = createFileRoute('/attachment-test/')({ @@ -25,7 +27,7 @@ function AttachmentTestPage() { const navigate = useNavigate() const goBack = useGoBack() const { setStatusColor } = useTheme() - const { from } = useSearch({ from: Route.id }) + const { from, flow, chatId } = useSearch({ from: Route.id }) const { userInfo } = useAuth() const nickname = userInfo.nickname || '사용자' @@ -38,7 +40,7 @@ function AttachmentTestPage() { }, []) const handleStartTest = wrapWithTracking(BUTTON_NAMES.START_TEST, CATEGORIES.ATTACHMENT, () => - navigate({ to: '/attachment-test/question', search: { from }, replace: true }) + navigate({ to: '/attachment-test/question', search: { from, flow, chatId }, replace: true }) ) return ( diff --git a/apps/react/src/app/attachment-test/question/page.tsx b/apps/react/src/app/attachment-test/question/page.tsx index fd445991..da812937 100644 --- a/apps/react/src/app/attachment-test/question/page.tsx +++ b/apps/react/src/app/attachment-test/question/page.tsx @@ -1,4 +1,4 @@ -import { createFileRoute, useSearch } from '@tanstack/react-router' +import { createFileRoute } from '@tanstack/react-router' import { useState } from 'react' import z from 'zod' @@ -11,6 +11,7 @@ import { QUESTION_CONFIG, } from '@/features/attachment' import { useAuth } from '@/features/auth' +import { usePersonalityFlow } from '@/features/profile/lib/personality-flow' import { wrapWithTracking } from '@/shared/analytics' import { BUTTON_NAMES, CATEGORIES } from '@/shared/analytics/constants' import { Screen } from '@/shared/layout/screen' @@ -19,6 +20,8 @@ import { DetailHeaderBar } from '@/shared/ui/header-bar' const searchSchema = z.object({ from: z.string().optional(), + flow: z.enum(['my-personality', 'partner-personality', 'full-flow']).optional(), + chatId: z.number().optional(), }) export const Route = createFileRoute('/attachment-test/question/')({ @@ -28,8 +31,9 @@ export const Route = createFileRoute('/attachment-test/question/')({ function AttachmentTestQuestionPage() { const [isGuideOpen, setIsGuideOpen] = useState(true) - const { from } = useSearch({ from: Route.id }) const { userInfo } = useAuth() + const { from, flow, next } = usePersonalityFlow() + const { loading, error, @@ -43,7 +47,7 @@ function AttachmentTestQuestionPage() { handleNext, handleSelectAnswer, setQuestionRef, - } = useAttachmentQuestions({ from }) + } = useAttachmentQuestions({ from, onComplete: flow ? () => next() : undefined }) // 트래킹이 적용된 핸들러들 const handleGoBackWithTracking = wrapWithTracking(BUTTON_NAMES.BACK_TEST, CATEGORIES.ATTACHMENT, handleGoBack) @@ -56,7 +60,6 @@ function AttachmentTestQuestionPage() { const handleSelectAnswerWithTracking = wrapWithTracking( (_questionId: number, score: number) => { - // 선택한 옵션 번호에 따른 버튼 이름 결정 (1-5) const buttonNameMap = { 1: BUTTON_NAMES.SELECT_OPTION_1, 2: BUTTON_NAMES.SELECT_OPTION_2, @@ -75,7 +78,6 @@ function AttachmentTestQuestionPage() { setIsGuideOpen(false) ) - // 로딩 페이지 렌더링 if (isSubmitting) { return } diff --git a/apps/react/src/app/attachment-test/result/my/page.tsx b/apps/react/src/app/attachment-test/result/my/page.tsx index 1c229ddf..53fe4543 100644 --- a/apps/react/src/app/attachment-test/result/my/page.tsx +++ b/apps/react/src/app/attachment-test/result/my/page.tsx @@ -1,14 +1,16 @@ import { createFileRoute, redirect } from '@tanstack/react-router' -import z from 'zod' +import { z } from 'zod' import { AttachmentResultContent } from '@/features/attachment/ui/result/attachment-result-content' import { useAuth } from '@/features/auth' const searchSchema = z.object({ from: z.string().optional(), + flow: z.enum(['my-personality', 'partner-personality', 'full-flow']).optional(), }) export const Route = createFileRoute('/attachment-test/result/my/')({ + validateSearch: searchSchema, beforeLoad: async ({ context }) => { // 인증되지 않은 경우 로그인 페이지로 리다이렉트 if (!context.auth?.authenticated) { @@ -18,13 +20,12 @@ export const Route = createFileRoute('/attachment-test/result/my/')({ } }, component: MyAttachmentResultPage, - validateSearch: searchSchema, }) function MyAttachmentResultPage() { const { userInfo } = useAuth() const { from } = Route.useSearch() - const isFromChat = from === '/chat' + const fromProp = from === 'my-result-preview' ? 'my-result-preview' : from === 'my-page' ? 'my-page' : 'home' - return + return } diff --git a/apps/react/src/app/attachment-test/result/partner/page.tsx b/apps/react/src/app/attachment-test/result/partner/page.tsx index 21b4c222..e81be9bc 100644 --- a/apps/react/src/app/attachment-test/result/partner/page.tsx +++ b/apps/react/src/app/attachment-test/result/partner/page.tsx @@ -1,9 +1,15 @@ import { createFileRoute, redirect } from '@tanstack/react-router' +import { z } from 'zod' import { AttachmentResultContent } from '@/features/attachment/ui/result/attachment-result-content' -import { usePartnerInfo } from '@/features/member' +import { useAuth } from '@/features/auth' + +const searchSchema = z.object({ + from: z.string().optional(), +}) export const Route = createFileRoute('/attachment-test/result/partner/')({ + validateSearch: searchSchema, beforeLoad: async ({ context }) => { // 인증되지 않은 경우 로그인 페이지로 리다이렉트 if (!context.auth?.authenticated) { @@ -16,7 +22,15 @@ export const Route = createFileRoute('/attachment-test/result/partner/')({ }) function PartnerAttachmentResultPage() { - const { data: partnerInfo } = usePartnerInfo() + const { userInfo } = useAuth() + const { from } = Route.useSearch() + const fromProp = + from === 'partner-result-preview' ? 'partner-result-preview' : from === 'my-page' ? 'my-page' : undefined + + const partnerData = { + loveTypeCategory: userInfo.partnerLoveTypeCategory, + personalityType: userInfo.otherPersonalityType, + } - return + return } diff --git a/apps/react/src/app/chat/result/page.tsx b/apps/react/src/app/chat/result/page.tsx index b9d81a95..5ca4f2d0 100644 --- a/apps/react/src/app/chat/result/page.tsx +++ b/apps/react/src/app/chat/result/page.tsx @@ -35,7 +35,6 @@ function RouteComponent() { const navigate = useNavigate() const goBack = useGoBack() const queryClient = useQueryClient() - useEffect(() => { setStatusColor('#FDEDF0') diff --git a/apps/react/src/app/mbti/page.tsx b/apps/react/src/app/mbti/page.tsx index ea45957b..94eb08cb 100644 --- a/apps/react/src/app/mbti/page.tsx +++ b/apps/react/src/app/mbti/page.tsx @@ -1,9 +1,9 @@ -import { createFileRoute, useNavigate, useSearch } from '@tanstack/react-router' +import { createFileRoute } from '@tanstack/react-router' import { useAuth } from '@/features/auth' import { MbtiForm } from '@/features/onboarding/ui/mbti-form' import { useMemberUpdateMutation } from '@/features/profile' -import { personalityFlowSearchSchema } from '@/features/profile/lib/personality-flow' +import { personalityFlowSearchSchema, usePersonalityFlow } from '@/features/profile/lib/personality-flow' import { wrapWithTracking } from '@/shared/analytics' import { BUTTON_NAMES, CATEGORIES } from '@/shared/analytics/constants' import { useGoBack } from '@/shared/navigation/use-go-back' @@ -17,25 +17,18 @@ export const Route = createFileRoute('/mbti/')({ }) function MbtiEditPage() { - const navigate = useNavigate() const goBack = useGoBack() const { userInfo } = useAuth() - const { flow, chatId } = useSearch({ from: Route.id }) + const { flow, next } = usePersonalityFlow() const updateMutation = useMemberUpdateMutation({ onSuccess: () => { - if (flow === 'my-personality') { - navigate({ to: '/my-attachment-select', search: { flow } }) + if (!flow) { + toast.success('내 성향이 변경되었어요!') + goBack() return } - - if (flow === 'chat-entry') { - navigate({ to: '/my-attachment-select', search: { flow, chatId } }) - return - } - - toast.success('내 성향이 변경되었어요!') - goBack() + next() }, errorMessage: '내 성향 변경 중 오류가 발생했습니다', }) @@ -53,7 +46,7 @@ function MbtiEditPage() { return ( diff --git a/apps/react/src/app/my-attachment-select/page.tsx b/apps/react/src/app/my-attachment-select/page.tsx new file mode 100644 index 00000000..7b478de7 --- /dev/null +++ b/apps/react/src/app/my-attachment-select/page.tsx @@ -0,0 +1,94 @@ +import { createFileRoute, useNavigate } from '@tanstack/react-router' +import { useState } from 'react' + +import { ATTACHMENT_OPTIONS } from '@/features/attachment' +import { useAuth } from '@/features/auth' +import { TitleSection } from '@/features/onboarding/ui/title-section' +import { useMemberUpdateMutation } from '@/features/profile' +import { personalityFlowSearchSchema, usePersonalityFlow } from '@/features/profile/lib/personality-flow' +import { Screen } from '@/shared/layout/screen' +import { Button } from '@/shared/ui' +import { FixedBottom } from '@/shared/ui/fixed-bottom' +import { getChatEntryProgressBar } from '@/shared/ui/flow-progress-bar' +import { getPersonalityStepDots } from '@/shared/ui/flow-step-dots' +import { DetailHeaderBar } from '@/shared/ui/header-bar' +import { KeyMessageBanner } from '@/shared/ui/key-message-banner' +import { SelectableButton } from '@/shared/ui/selectable-button' +import { toast } from '@/shared/ui/toast' + +import type { MemberDataLoveTypeCategoryEnum } from '@data/user-api-axios/api' + +export const Route = createFileRoute('/my-attachment-select/')({ + validateSearch: personalityFlowSearchSchema, + component: MyAttachmentSelectPage, +}) + +function MyAttachmentSelectPage() { + const navigate = useNavigate() + const { userInfo } = useAuth() + const { flow, from, next } = usePersonalityFlow() + const [selectedType, setSelectedType] = useState( + userInfo?.loveTypeCategory ?? null + ) + + const updateMutation = useMemberUpdateMutation({ + onSuccess: () => { + if (from === 'profile') toast.success('내 성향이 변경되었어요!') + next() + }, + errorMessage: '저장 중 오류가 발생했습니다', + }) + + const handleConfirm = () => { + if (!selectedType || updateMutation.isPending) return + updateMutation.mutate({ loveTypeCategory: selectedType }) + } + + const handleDontKnow = () => { + navigate({ to: '/attachment-test', search: { flow, from } }) + } + + return ( + + + + + + + {getPersonalityStepDots(flow === 'my-personality', 2)} + + 나의 애착유형을 +
+ 선택해주세요 + + } + /> +
+ +
+ +
+
+ {ATTACHMENT_OPTIONS.map((option) => ( + setSelectedType(option.value)} + disabled={updateMutation.isPending} + className="w-full text-left" + > + {option.label} + + ))} +
+
+ + + diff --git a/apps/react/src/app/my-result-preview/page.tsx b/apps/react/src/app/my-result-preview/page.tsx new file mode 100644 index 00000000..b9e0ff7c --- /dev/null +++ b/apps/react/src/app/my-result-preview/page.tsx @@ -0,0 +1,70 @@ +import { createFileRoute, useNavigate } from '@tanstack/react-router' +import { LucideCheck, LucideChevronRight } from 'lucide-react' + +import { getAttachmentType } from '@/features/attachment' +import { useAuth } from '@/features/auth' +import { personalityFlowSearchSchema, usePersonalityFlow } from '@/features/profile/lib/personality-flow' +import { Screen } from '@/shared/layout/screen' +import { Button } from '@/shared/ui' +import { FixedBottom } from '@/shared/ui/fixed-bottom' +import { FlowProgressBar } from '@/shared/ui/flow-progress-bar' +import { DetailHeaderBar } from '@/shared/ui/header-bar' + +export const Route = createFileRoute('/my-result-preview/')({ + validateSearch: personalityFlowSearchSchema, + component: MyResultPreviewPage, +}) + +function MyResultPreviewPage() { + const navigate = useNavigate() + const { userInfo } = useAuth() + const { flow, next } = usePersonalityFlow() + + const attachmentData = getAttachmentType(userInfo.loveTypeCategory) + + const handleViewResult = () => { + navigate({ to: '/attachment-test/result/my', search: { from: 'my-result-preview', flow }, replace: true }) + } + + return ( + + + } /> + + + +
+ {/* Checkmark circle */} +
+ +
+ +

내 성향 프로필을 완성했어요!

+

연인의 프로필도 완성하러 가볼까요?

+ + {/* Result card */} + {attachmentData && ( +
+

{userInfo.nickname}님은

+

+ {userInfo.personalityType} {attachmentData.subtype} +

+

{attachmentData.previewDescription}

+ +
+ )} +
+ + + + + )} + + + + - } - /> - - - -
- {/* 캐릭터 이미지 */} - {attachmentData.character} + + - {/* 애착유형 텍스트 */} -
-

- {isMyResult - ? `${userInfo.nickname || '사용자'}님의 애착유형은` - : `${userInfo.nickname || '연인'}님의 애착유형은`} -

-

- {attachmentData.character} -

-
-
+
+
+
- {/* 결과 정보 섹션 */} -
- {/* 점수 박스 */} - +
+ {`${loveTypeCatalogItem.subtype} +
+
- {/* 상세 정보 박스 */} - -
+
+

+ {isMyResult ? `${displayName}님은` : '상대는'} +

+

{titleText}

+

+ {summary} +

+
+
+
- {/* 결과 태도 섹션 */} -
- {/* 관계에 대한 태도 */} - +
+ + +
+
- {/* 갈등해결 태도 */} - + + } + headerStyle={{ background: 'linear-gradient(to top, #E5E7EB 0%, #FFFFFF 100%)' }} + items={patterns} + fixedEmojis={BEHAVIOR_PATTERN_EMOJIS} /> - {/* 정서적인 표현 */} - + } + items={loveTypeFeatures} + fixedEmojis={typeFeatureFixedEmojis} + headerStyle={typeFeatureHeaderStyle} />
- {/* 바텀 버튼 */} -
+ + + + +
diff --git a/apps/react/src/features/attachment/ui/result/attachment-result-sections.tsx b/apps/react/src/features/attachment/ui/result/attachment-result-sections.tsx new file mode 100644 index 00000000..b288a005 --- /dev/null +++ b/apps/react/src/features/attachment/ui/result/attachment-result-sections.tsx @@ -0,0 +1,373 @@ +import { Check } from 'lucide-react' +import { useState } from 'react' + +import HeartIcon from '@/assets/icons/heart.svg' +import { toAttachmentResultEmoji, toAttachmentResultLabel } from '@/features/attachment/models/result-label-map' +import { cn } from '@/shared/lib/cn' + +import type { LoveTypePersonalityTypeBlockData, LoveTypeTextBlockData } from '@data/user-api-axios/api' +import type { CSSProperties, ReactNode } from 'react' + +export interface ResultTabItem { + label: string + title: string + description: string +} + +export interface AccentPalette { + accentTextClass: string + accentSoftBgClass: string + accentMutedBg: string +} + +const FEATURE_POINT_EMOJIS = ['🤩', '😀', '😮', '😥'] as const +const FEATURE_BAR_HEIGHTS = [120, 100, 72, 20] as const +const FEATURE_CHART_GRADIENTS = [ + 'linear-gradient(180deg, #FFC9D3 0%, #FFE6EB 100%)', + 'linear-gradient(180deg, #FFE2BB 0%, #FFF0DB 100%)', + 'linear-gradient(180deg, #E1D7FF 0%, #F0EBFF 100%)', + 'linear-gradient(180deg, #B0B6BF 0%, #C8CBD0 100%)', +] as const +const FEATURE_BAR_TOP_COLORS = ['#EC4665', '#FF8400', '#7C59EA', '#3F3F46'] as const +const FEATURE_LABEL_BG_CLASSES = [ + 'bg-malmo-rasberry-500', + 'bg-malmo-orange-500', + 'bg-malmo-purple-500', + 'bg-gray-iron-700', +] as const +const BEST_MATCH_CARD_BG = '#FDEDF0' +const WORST_MATCH_CARD_BG = '#F3F4F6' +const SECOND_GUIDE_CHECK_GRADIENT = 'linear-gradient(180deg, #9DA4AE 0%, #C8CFD8 100%)' + +function pickByIndex(values: readonly T[], index: number): T { + return values[Math.min(index, values.length - 1)] as T +} + +export function toFeatureTabs( + strengths: LoveTypeTextBlockData[] | undefined, + weaknesses: LoveTypeTextBlockData[] | undefined +): ResultTabItem[] { + const strengthItems = (strengths ?? []).slice(0, 3).map((item, index) => ({ + label: `강점 ${index + 1}`, + title: item.title ?? '', + description: item.description ?? '', + })) + + const weakness = weaknesses?.[0] + if (!weakness) return strengthItems + + return [ + ...strengthItems, + { + label: '약점', + title: weakness.title ?? '', + description: weakness.description ?? '', + }, + ] +} + +export function ResultKeywordSection({ keywords }: { keywords: string[] }) { + return ( +
+

나의 키워드

+ +
+ {keywords.map((keyword, index) => { + const label = toAttachmentResultLabel(keyword) + + return ( +
+ {label} + + {toAttachmentResultEmoji(keyword)} + +
+ ) + })} +
+
+ ) +} + +export function ResultFeatureSection({ title, tabs }: { title: string; tabs: ResultTabItem[] }) { + if (!tabs.length) return null + + const [selectedIndex, setSelectedIndex] = useState(0) + const activeTab = tabs[selectedIndex] + + return ( +
+

{title}

+ +
+
+ {tabs.map((tab, index) => { + const isSelected = index === selectedIndex + + return ( + + ) + })} +
+
+ +
+
+ {tabs.map((tab, index) => { + const isSelected = index === selectedIndex + const selectedGradient = pickByIndex(FEATURE_CHART_GRADIENTS, index) + const selectedTopColor = pickByIndex(FEATURE_BAR_TOP_COLORS, index) + + return ( + + ) + })} +
+ +
+ +
+ {tabs.map((tab, index) => { + const isSelected = index === selectedIndex + const selectedLabelBgClass = pickByIndex(FEATURE_LABEL_BG_CLASSES, index) + + return ( + + ) + })} +
+
+ + {activeTab && ( +
+

+ {toAttachmentResultLabel(activeTab.description)} +

+
+ )} +
+ ) +} + +export function ResultTextBlockSection({ + title, + accentPalette, + decoration, + items, + fixedEmojis, + headerStyle, +}: { + title: string + accentPalette: AccentPalette + decoration: ReactNode + items: LoveTypeTextBlockData[] + fixedEmojis: readonly string[] + headerStyle?: CSSProperties +}) { + if (!items.length) return null + + return ( +
+
+

{title}

+ + {decoration} + +
+ +
+
+ {items.map((item, index) => ( +
+
+ + {fixedEmojis[index % fixedEmojis.length]} + +

{toAttachmentResultLabel(item.title)}

+
+

+ {toAttachmentResultLabel(item.description)} +

+
+ ))} +
+
+
+ ) +} + +export function ResultGuideSection({ + accentPalette, + isWarmType, + guides, +}: { + accentPalette: AccentPalette + isWarmType: boolean + guides: LoveTypeTextBlockData[] +}) { + if (!guides.length) return null + + const guideCheckGradient = isWarmType + ? 'linear-gradient(180deg, #FF8400 0%, #FFC17F 100%)' + : 'linear-gradient(180deg, #EC4665 0%, #F78EA2 100%)' + + return ( +
+

건강한 연애를 위한 가이드

+ +
+ {guides.slice(0, 3).map((guide, index) => { + const title = toAttachmentResultLabel(guide.title) + const description = toAttachmentResultLabel(guide.description) + + return ( +
+
+ +
+ +
+

{title}

+

{description}

+
+
+ ) + })} +
+
+ ) +} + +function MatchCard({ item, tone }: { item: LoveTypePersonalityTypeBlockData; tone: 'best' | 'worst' }) { + const matchCardBackground = tone === 'best' ? BEST_MATCH_CARD_BG : WORST_MATCH_CARD_BG + + return ( +
+ +

+ {toAttachmentResultLabel(item.personalityType)} +

+

+ {toAttachmentResultLabel(item.description)} +

+
+ ) +} + +export function ResultMatchSection({ + title, + bestMatches, + worstMatches, +}: { + title: string + bestMatches: LoveTypePersonalityTypeBlockData[] + worstMatches: LoveTypePersonalityTypeBlockData[] +}) { + if (!bestMatches.length && !worstMatches.length) return null + + return ( +
+

{title}

+ + {bestMatches.length > 0 && ( + <> +
+
+ BEST +
+
+ +
+ {bestMatches.slice(0, 2).map((item, index) => ( + + ))} +
+ + )} + + {worstMatches.length > 0 && ( + <> +
+
+ WORST +
+
+ +
+ {worstMatches.slice(0, 2).map((item, index) => ( + + ))} +
+ + )} +
+ ) +} diff --git a/apps/react/src/features/attachment/ui/result/result-detail-box.tsx b/apps/react/src/features/attachment/ui/result/result-detail-box.tsx deleted file mode 100644 index 68ac094e..00000000 --- a/apps/react/src/features/attachment/ui/result/result-detail-box.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import type { AttachmentTypeData } from '../../models/types' - -interface ResultDetailBoxProps { - attachmentData: AttachmentTypeData -} - -export function ResultDetailBox({ attachmentData }: ResultDetailBoxProps) { - return ( -
- {/* 애착유형 태그 */} -
-
- - {attachmentData.character} - {attachmentData.subtype} - -
-
- - {/* 점수 설명 */} -
- - 불안 점수 {attachmentData.anxietyThreshold} / 회피 점수 {attachmentData.avoidanceThreshold} - -
- - {/* 설명 텍스트 */} -
-

{attachmentData.description}

-
-
- ) -} diff --git a/apps/react/src/features/auth/hooks/use-auth.tsx b/apps/react/src/features/auth/hooks/use-auth.tsx index 5a78f749..995a0031 100644 --- a/apps/react/src/features/auth/hooks/use-auth.tsx +++ b/apps/react/src/features/auth/hooks/use-auth.tsx @@ -2,6 +2,7 @@ import { SocialLoginType } from '@bridge/types' import { MemberDataMemberStateEnum, MemberDataLoveTypeCategoryEnum, + MemberDataPartnerLoveTypeCategoryEnum, MemberDataProviderEnum, MemberDataRelationshipStatusEnum, } from '@data/user-api-axios/api' @@ -21,6 +22,7 @@ export type UserInfo = { provider?: MemberDataProviderEnum nickname?: string loveTypeCategory?: MemberDataLoveTypeCategoryEnum + partnerLoveTypeCategory?: MemberDataPartnerLoveTypeCategoryEnum relationshipStatus?: MemberDataRelationshipStatusEnum personalityType?: string otherPersonalityType?: string @@ -52,6 +54,7 @@ const initialUserInfo: UserInfo = { provider: undefined, nickname: undefined, loveTypeCategory: undefined, + partnerLoveTypeCategory: undefined, relationshipStatus: undefined, personalityType: undefined, otherPersonalityType: undefined, @@ -81,6 +84,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { provider: memberInfo.data.data.provider || undefined, nickname: memberInfo.data.data.nickname, loveTypeCategory: memberInfo.data.data.loveTypeCategory || undefined, + partnerLoveTypeCategory: memberInfo.data.data.partnerLoveTypeCategory || undefined, relationshipStatus: memberInfo.data.data.relationshipStatus || undefined, personalityType: memberInfo.data.data.personalityType || undefined, otherPersonalityType: memberInfo.data.data.otherPersonalityType || undefined, diff --git a/apps/react/src/features/chat/ui/chat-entry-card.tsx b/apps/react/src/features/chat/ui/chat-entry-card.tsx index 7f2713f2..4155a01a 100644 --- a/apps/react/src/features/chat/ui/chat-entry-card.tsx +++ b/apps/react/src/features/chat/ui/chat-entry-card.tsx @@ -2,6 +2,8 @@ import { useMutation, useQueryClient } from '@tanstack/react-query' import { useNavigate } from '@tanstack/react-router' import momoIdle from '@/assets/images/momo-home-idle.png' +import { useAuth } from '@/features/auth' +import { getMissingPersonalityFlow } from '@/features/profile/lib/personality-flow' import { wrapWithTracking } from '@/shared/analytics' import { BUTTON_NAMES, CATEGORIES } from '@/shared/analytics/constants' import chatService from '@/shared/services/chat.service' @@ -9,11 +11,20 @@ import chatService from '@/shared/services/chat.service' export function ChatEntryCard() { const navigate = useNavigate() const queryClient = useQueryClient() + const { userInfo } = useAuth() const { mutateAsync: createChatRoom, isPending } = useMutation(chatService.createChatRoomMutation()) const handleChatClick = wrapWithTracking(BUTTON_NAMES.START_NEW_CHAT, CATEGORIES.MAIN, async () => { if (isPending) return + const hasUserPersonality = !!userInfo.personalityType && !!userInfo.loveTypeCategory + const hasPartnerPersonality = !!userInfo.otherPersonalityType && !!userInfo.partnerLoveTypeCategory + + if (!hasUserPersonality || !hasPartnerPersonality) { + navigate({ to: '/personality-flow-loading', search: { flow: getMissingPersonalityFlow(userInfo) } }) + return + } + const created = await createChatRoom() const createdId = created?.chatRoomId if (!createdId) { @@ -26,7 +37,7 @@ export function ChatEntryCard() { createdAt: new Date().toISOString(), }) - navigate({ to: '/mbti', search: { flow: 'chat-entry', chatId: createdId } }) + navigate({ to: '/chat' }) }) return ( @@ -35,7 +46,7 @@ export function ChatEntryCard() {

연애 고민 상담

{/* 연애고민상담 박스 */} -
+
{/* 상단 컨텐츠 */}
diff --git a/apps/react/src/features/chat/ui/chat-message-list.tsx b/apps/react/src/features/chat/ui/chat-message-list.tsx index 2cc5e9c3..13c01fa7 100644 --- a/apps/react/src/features/chat/ui/chat-message-list.tsx +++ b/apps/react/src/features/chat/ui/chat-message-list.tsx @@ -55,9 +55,7 @@ export function ChatMessageList({
-

- 연동 후에도 대화 내용은 상대에게 공유되지 않으니 안심하세요! -

+

대화 내용은 암호화 되어 안전하게 저장하고 있어요!

{isLoading && ( diff --git a/apps/react/src/features/couple/index.ts b/apps/react/src/features/couple/index.ts deleted file mode 100644 index 82aafe23..00000000 --- a/apps/react/src/features/couple/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ui/couple-code-form' diff --git a/apps/react/src/features/couple/ui/couple-code-form.tsx b/apps/react/src/features/couple/ui/couple-code-form.tsx deleted file mode 100644 index b65ceee9..00000000 --- a/apps/react/src/features/couple/ui/couple-code-form.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { TitleSection } from '@/features/onboarding/ui/title-section' -import { useKeyboardSheetMotion } from '@/shared/hooks/use-keyboard-motion' -import { Screen } from '@/shared/layout/screen' -import { Input, Button } from '@/shared/ui' -import { DetailHeaderBar } from '@/shared/ui/header-bar' - -interface PartnerCodeFormProps { - partnerCode: string - onPartnerCodeChange: (code: string) => void - onBack: () => void - onSubmit: () => void - isSubmitting: boolean -} - -export function PartnerCodeForm({ - partnerCode, - onPartnerCodeChange, - onBack, - onSubmit, - isSubmitting, -}: PartnerCodeFormProps) { - const { keyboardBottom } = useKeyboardSheetMotion() - - return ( - - - - - - - - 연인의 커플 코드를 -
- 입력해 주세요 - - } - /> - -
- onPartnerCodeChange(e.target.value)} - placeholder="코드를 입력해 주세요" - maxLength={7} - /> -
- -
-
-
-
- ) -} diff --git a/apps/react/src/features/onboarding/contexts/onboarding-context.tsx b/apps/react/src/features/onboarding/contexts/onboarding-context.tsx index 01f85a13..7caf73ac 100644 --- a/apps/react/src/features/onboarding/contexts/onboarding-context.tsx +++ b/apps/react/src/features/onboarding/contexts/onboarding-context.tsx @@ -1,12 +1,10 @@ import { useMutation } from '@tanstack/react-query' -import React, { createContext, useContext, useState, ReactNode } from 'react' +import { createContext, useContext, useState, ReactNode } from 'react' import signUpService from '@/shared/services/sign-up.service' import type { SignUpRequestDto } from '@data/user-api-axios/api' -// import { useAuth } from '@/features/auth' - // 연애 상태 타입 정의 export type RelationshipStatus = NonNullable @@ -108,6 +106,7 @@ export function OnboardingProvider({ children }: { children: ReactNode }) { // 회원가입 API 호출 await signUpMutation.mutateAsync(requestBody) + setIsOnboardingCompleted(true) return true diff --git a/apps/react/src/features/onboarding/ui/mbti-form.tsx b/apps/react/src/features/onboarding/ui/mbti-form.tsx index 7f01e904..74c0af6d 100644 --- a/apps/react/src/features/onboarding/ui/mbti-form.tsx +++ b/apps/react/src/features/onboarding/ui/mbti-form.tsx @@ -2,9 +2,9 @@ import { ReactNode, useState } from 'react' import { TitleSection } from '@/features/onboarding/ui/title-section' import { Screen } from '@/shared/layout/screen' -import { cn } from '@/shared/lib/cn' import { Button } from '@/shared/ui' import { DetailHeaderBar } from '@/shared/ui/header-bar' +import { SelectableButton } from '@/shared/ui/selectable-button' // MBTI 차원 타입 type EnergyType = 'E' | 'I' @@ -64,6 +64,8 @@ interface MbtiFormProps { title: ReactNode description?: ReactNode headerTitle?: string + navCenter?: ReactNode + contentTopSlot?: ReactNode initialValue?: string | null submitText: string requireChangeForSubmit?: boolean @@ -76,6 +78,8 @@ export function MbtiForm({ title, description, headerTitle, + navCenter, + contentTopSlot, initialValue = null, submitText, requireChangeForSubmit = false, @@ -134,10 +138,11 @@ export function MbtiForm({ return ( - + + {contentTopSlot}
@@ -146,27 +151,14 @@ export function MbtiForm({

{dimension.title}

{dimension.options.map((option) => ( - + {option.label} + ))}
diff --git a/apps/react/src/features/onboarding/ui/relationship-status-form.tsx b/apps/react/src/features/onboarding/ui/relationship-status-form.tsx index 93552e37..2db951ea 100644 --- a/apps/react/src/features/onboarding/ui/relationship-status-form.tsx +++ b/apps/react/src/features/onboarding/ui/relationship-status-form.tsx @@ -2,9 +2,9 @@ import { ReactNode, useState } from 'react' import { TitleSection } from '@/features/onboarding/ui/title-section' import { Screen } from '@/shared/layout/screen' -import { cn } from '@/shared/lib/cn' import { Button } from '@/shared/ui' import { DetailHeaderBar } from '@/shared/ui/header-bar' +import { SelectableButton } from '@/shared/ui/selectable-button' interface RelationshipStatusOption { value: string @@ -54,7 +54,11 @@ export function RelationshipStatusForm({ return ( - + @@ -62,23 +66,14 @@ export function RelationshipStatusForm({
{options.map((option) => ( - + {option.label} + ))}
diff --git a/apps/react/src/features/profile/hooks/use-member-update-mutation.ts b/apps/react/src/features/profile/hooks/use-member-update-mutation.ts new file mode 100644 index 00000000..8db42f58 --- /dev/null +++ b/apps/react/src/features/profile/hooks/use-member-update-mutation.ts @@ -0,0 +1,31 @@ +import { useMutation } from '@tanstack/react-query' + +import { useAuth } from '@/features/auth' +import memberService from '@/shared/services/member.service' +import { toast } from '@/shared/ui/toast' + +import type { UpdateMemberRequestDto } from '@data/user-api-axios/api' + +interface UseMemberUpdateMutationOptions { + onSuccess: () => void | Promise + errorMessage?: string +} + +/** 회원 정보 업데이트 후 userInfo를 갱신하는 공통 뮤테이션 훅 */ +export function useMemberUpdateMutation({ onSuccess, errorMessage }: UseMemberUpdateMutationOptions) { + const { refreshUserInfo } = useAuth() + + return useMutation({ + mutationFn: async (body: UpdateMemberRequestDto) => { + const { data } = await memberService.updateMember({ updateMemberRequestDto: body }) + return data + }, + onSuccess: async () => { + await refreshUserInfo() + await onSuccess() + }, + onError: () => { + toast.error(errorMessage ?? '저장 중 오류가 발생했습니다') + }, + }) +} diff --git a/apps/react/src/features/profile/hooks/use-update-partner-profile-mutation.ts b/apps/react/src/features/profile/hooks/use-update-partner-profile-mutation.ts new file mode 100644 index 00000000..573f7bb0 --- /dev/null +++ b/apps/react/src/features/profile/hooks/use-update-partner-profile-mutation.ts @@ -0,0 +1,36 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query' + +import { useAuth } from '@/features/auth' +import memberService from '@/shared/services/member.service' +import { queryKeys } from '@/shared/services/query-keys' +import { toast } from '@/shared/ui/toast' + +import type { UpdatePartnerProfileRequestDto } from '@data/user-api-axios/api' + +interface Options { + onSuccess?: () => void | Promise + errorMessage?: string +} + +/** 파트너 프로필 PATCH 전용 뮤테이션 훅 */ +export function useUpdatePartnerProfileMutation({ onSuccess, errorMessage }: Options) { + const { refreshUserInfo } = useAuth() + const queryClient = useQueryClient() + + return useMutation({ + mutationFn: async (body: UpdatePartnerProfileRequestDto) => { + const { data } = await memberService.updatePartnerProfile({ updatePartnerProfileRequestDto: body }) + return data + }, + onSuccess: async () => { + await Promise.all([ + refreshUserInfo(), + queryClient.invalidateQueries({ queryKey: queryKeys.member.partnerInfo() }), + ]) + if (onSuccess) await onSuccess() + }, + onError: () => { + toast.error(errorMessage ?? '상대 프로필 수정 중 오류가 발생했습니다') + }, + }) +} diff --git a/apps/react/src/features/profile/hooks/use-upsert-partner-profile-mutation.ts b/apps/react/src/features/profile/hooks/use-upsert-partner-profile-mutation.ts new file mode 100644 index 00000000..d3211e5c --- /dev/null +++ b/apps/react/src/features/profile/hooks/use-upsert-partner-profile-mutation.ts @@ -0,0 +1,47 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query' + +import { useAuth } from '@/features/auth' +import memberService from '@/shared/services/member.service' +import { queryKeys } from '@/shared/services/query-keys' +import { toast } from '@/shared/ui/toast' + +import type { CreatePartnerProfileRequestDto } from '@data/user-api-axios/api' + +interface Options { + onSuccess: () => void | Promise + errorMessage?: string +} + +/** 파트너 프로필 POST 시도 → 40017(already exists)이면 PATCH로 fallback */ +export function useUpsertPartnerProfileMutation({ onSuccess, errorMessage }: Options) { + const { refreshUserInfo } = useAuth() + const queryClient = useQueryClient() + + return useMutation({ + mutationFn: async (body: CreatePartnerProfileRequestDto) => { + try { + const { data } = await memberService.createPartnerProfile({ createPartnerProfileRequestDto: body }) + return data + } catch (error: unknown) { + const code = (error as { response?: { data?: { code?: number } } })?.response?.data?.code + if (code === 40017) { + const { data } = await memberService.updatePartnerProfile({ + updatePartnerProfileRequestDto: body, + }) + return data + } + throw error + } + }, + onSuccess: async () => { + await Promise.all([ + refreshUserInfo(), + queryClient.invalidateQueries({ queryKey: queryKeys.member.partnerInfo() }), + ]) + await onSuccess() + }, + onError: () => { + toast.error(errorMessage ?? '상대 프로필 저장 중 오류가 발생했습니다') + }, + }) +} diff --git a/apps/react/src/features/profile/index.ts b/apps/react/src/features/profile/index.ts index d28a51ab..5733f5cf 100644 --- a/apps/react/src/features/profile/index.ts +++ b/apps/react/src/features/profile/index.ts @@ -8,6 +8,8 @@ export { useProfileEdit } from './hooks/use-profile-edit' export { useNicknameInput, NICKNAME_MAX_LENGTH } from './hooks/use-nickname-input' export { useProfileModal } from './hooks/use-profile-modal' export { useMemberUpdateMutation } from './hooks/use-member-update-mutation' +export { useUpsertPartnerProfileMutation } from './hooks/use-upsert-partner-profile-mutation' +export { useUpdatePartnerProfileMutation } from './hooks/use-update-partner-profile-mutation' // UI 컴포넌트 export { ProfileSection } from './ui/profile-section' diff --git a/apps/react/src/features/profile/lib/personality-flow.ts b/apps/react/src/features/profile/lib/personality-flow.ts new file mode 100644 index 00000000..5d2114a4 --- /dev/null +++ b/apps/react/src/features/profile/lib/personality-flow.ts @@ -0,0 +1,133 @@ +import { useLocation, useNavigate, useRouter, useSearch } from '@tanstack/react-router' +import { z } from 'zod' + +export type PersonalityFlow = 'my-personality' | 'partner-personality' | 'full-flow' + +export const personalityFlowSearchSchema = z.object({ + flow: z.enum(['my-personality', 'partner-personality', 'full-flow']).optional(), + from: z.enum(['profile', 'profile-result']).optional(), +}) + +export type PersonalityFlowSearch = z.infer + +type NavigateFn = ReturnType +type RouterLike = { history: { back: () => void; go: (index: number) => void } } + +interface FlowParams { + flow: PersonalityFlow | undefined + from: 'profile' | 'profile-result' | 'my-page' | 'my-result-preview' | 'partner-result-preview' | undefined +} + +function navigateNext(navigate: NavigateFn, router: RouterLike, pathname: string, { flow, from }: FlowParams) { + if (pathname.startsWith('/mbti')) { + if (flow === 'full-flow') { + navigate({ to: '/my-attachment-select', search: { flow } }) + } else if (flow === 'my-personality') { + navigate({ + to: '/my-attachment-select', + search: { flow, ...((from === 'profile' || from === 'profile-result') && { from }) }, + }) + } + return + } + + if (pathname.startsWith('/my-attachment-select')) { + if (flow === 'full-flow') { + navigate({ to: '/my-result-preview', search: { flow } }) + } else if (from === 'profile-result') { + navigate({ to: '/attachment-test/result/my', search: { from: 'my-page' }, replace: true }) + } else if (from === 'profile') { + router.history.go(-2) + } else { + navigate({ to: '/attachment-test/result/my', replace: true }) + } + return + } + + if (pathname.startsWith('/my-result-preview')) { + if (flow === 'full-flow') { + navigate({ to: '/partner-mbti', search: { flow } }) + } + return + } + + if (pathname.startsWith('/partner-mbti')) { + if (flow === 'full-flow') { + navigate({ to: '/partner-attachment-select', search: { flow } }) + } else if (flow === 'partner-personality') { + navigate({ to: '/partner-attachment-select', search: { flow, ...(from === 'profile' && { from }) } }) + } + return + } + + if (pathname.startsWith('/partner-attachment-select')) { + if (flow === 'full-flow') { + navigate({ to: '/partner-result-preview', search: { flow } }) + } else if (from === 'profile-result') { + navigate({ to: '/attachment-test/result/partner', search: { from: 'my-page' }, replace: true }) + } else if (from === 'profile') { + router.history.go(-2) + } else { + navigate({ to: '/attachment-test/result/partner', replace: true }) + } + return + } + + if (pathname.startsWith('/partner-result-preview')) { + navigate({ to: '/', replace: true }) + return + } + + if (pathname.startsWith('/attachment-test/question')) { + if (flow === 'my-personality') { + navigate({ + to: '/attachment-test/result/my', + search: { from: from === 'profile' || from === 'profile-result' ? 'my-page' : undefined }, + replace: true, + }) + } else if (flow === 'full-flow') { + navigate({ to: '/attachment-test/result/my', search: { from: 'my-result-preview', flow }, replace: true }) + } + return + } +} + +function navigateExit(navigate: NavigateFn, router: RouterLike, { from, flow }: Pick) { + if (from === 'profile' || from === 'profile-result') { + router.history.back() + } else if (from === 'my-page') { + router.history.go(-2) + } else if (from === 'my-result-preview') { + navigate({ to: '/my-result-preview', search: { ...(flow && { flow }) }, replace: true }) + } else if (from === 'partner-result-preview') { + navigate({ to: '/partner-result-preview', replace: true }) + } else { + navigate({ to: '/', replace: true }) + } +} + +export function getMissingPersonalityFlow(userInfo: { + loveTypeCategory?: string | null + partnerLoveTypeCategory?: string | null +}): PersonalityFlow { + const myMissing = !userInfo.loveTypeCategory + const partnerMissing = !userInfo.partnerLoveTypeCategory + return myMissing && partnerMissing ? 'full-flow' : myMissing ? 'my-personality' : 'partner-personality' +} + +export function usePersonalityFlow() { + const navigate = useNavigate() + const router = useRouter() + const location = useLocation() + const search = useSearch({ strict: false }) as FlowParams + + const next = () => { + navigateNext(navigate, router, location.pathname, search) + } + + const exit = () => { + navigateExit(navigate, router, { from: search.from, flow: search.flow }) + } + + return { flow: search.flow, from: search.from, next, exit } +} diff --git a/apps/react/src/routeTree.gen.ts b/apps/react/src/routeTree.gen.ts index 67068ee4..2a4316c5 100644 --- a/apps/react/src/routeTree.gen.ts +++ b/apps/react/src/routeTree.gen.ts @@ -16,6 +16,7 @@ import { Route as ChatLayoutImport } from './app/chat/layout' import { Route as PageImport } from './app/page' import { Route as TutorialPageImport } from './app/tutorial/page' import { Route as RelationshipStatusPageImport } from './app/relationship-status/page' +import { Route as PersonalityFlowLoadingPageImport } from './app/personality-flow-loading/page' import { Route as PartnerStatusPageImport } from './app/partner-status/page' import { Route as PartnerResultPreviewPageImport } from './app/partner-result-preview/page' import { Route as PartnerMbtiPageImport } from './app/partner-mbti/page' @@ -32,10 +33,7 @@ import { Route as AttachmentTestPageImport } from './app/attachment-test/page' import { Route as TermsPrivacyPolicyPageImport } from './app/terms/privacy-policy/page' import { Route as OnboardingTermsPageImport } from './app/onboarding/terms/page' import { Route as OnboardingRelationshipStatusPageImport } from './app/onboarding/relationship-status/page' -import { Route as OnboardingPartnerMbtiPageImport } from './app/onboarding/partner-mbti/page' import { Route as OnboardingNicknamePageImport } from './app/onboarding/nickname/page' -import { Route as OnboardingMbtiPageImport } from './app/onboarding/mbti/page' -import { Route as OnboardingCompletePageImport } from './app/onboarding/complete/page' import { Route as MyPageProfilePageImport } from './app/my-page/profile/page' import { Route as MyPageAccountSettingsPageImport } from './app/my-page/account-settings/page' import { Route as HistoryDeletePageImport } from './app/history/delete/page' @@ -77,6 +75,12 @@ const RelationshipStatusPageRoute = RelationshipStatusPageImport.update({ getParentRoute: () => rootRoute, } as any) +const PersonalityFlowLoadingPageRoute = PersonalityFlowLoadingPageImport.update({ + id: '/personality-flow-loading/', + path: '/personality-flow-loading/', + getParentRoute: () => rootRoute, +} as any) + const PartnerStatusPageRoute = PartnerStatusPageImport.update({ id: '/partner-status/', path: '/partner-status/', @@ -173,30 +177,12 @@ const OnboardingRelationshipStatusPageRoute = OnboardingRelationshipStatusPageIm getParentRoute: () => OnboardingLayoutRoute, } as any) -const OnboardingPartnerMbtiPageRoute = OnboardingPartnerMbtiPageImport.update({ - id: '/partner-mbti/', - path: '/partner-mbti/', - getParentRoute: () => OnboardingLayoutRoute, -} as any) - const OnboardingNicknamePageRoute = OnboardingNicknamePageImport.update({ id: '/nickname/', path: '/nickname/', getParentRoute: () => OnboardingLayoutRoute, } as any) -const OnboardingMbtiPageRoute = OnboardingMbtiPageImport.update({ - id: '/mbti/', - path: '/mbti/', - getParentRoute: () => OnboardingLayoutRoute, -} as any) - -const OnboardingCompletePageRoute = OnboardingCompletePageImport.update({ - id: '/complete/', - path: '/complete/', - getParentRoute: () => OnboardingLayoutRoute, -} as any) - const MyPageProfilePageRoute = MyPageProfilePageImport.update({ id: '/my-page/profile/', path: '/my-page/profile/', @@ -361,6 +347,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof PartnerStatusPageImport parentRoute: typeof rootRoute } + '/personality-flow-loading/': { + id: '/personality-flow-loading/' + path: '/personality-flow-loading' + fullPath: '/personality-flow-loading' + preLoaderRoute: typeof PersonalityFlowLoadingPageImport + parentRoute: typeof rootRoute + } '/relationship-status/': { id: '/relationship-status/' path: '/relationship-status' @@ -417,20 +410,6 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof MyPageProfilePageImport parentRoute: typeof rootRoute } - '/onboarding/complete/': { - id: '/onboarding/complete/' - path: '/complete' - fullPath: '/onboarding/complete' - preLoaderRoute: typeof OnboardingCompletePageImport - parentRoute: typeof OnboardingLayoutImport - } - '/onboarding/mbti/': { - id: '/onboarding/mbti/' - path: '/mbti' - fullPath: '/onboarding/mbti' - preLoaderRoute: typeof OnboardingMbtiPageImport - parentRoute: typeof OnboardingLayoutImport - } '/onboarding/nickname/': { id: '/onboarding/nickname/' path: '/nickname' @@ -438,13 +417,6 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof OnboardingNicknamePageImport parentRoute: typeof OnboardingLayoutImport } - '/onboarding/partner-mbti/': { - id: '/onboarding/partner-mbti/' - path: '/partner-mbti' - fullPath: '/onboarding/partner-mbti' - preLoaderRoute: typeof OnboardingPartnerMbtiPageImport - parentRoute: typeof OnboardingLayoutImport - } '/onboarding/relationship-status/': { id: '/onboarding/relationship-status/' path: '/relationship-status' @@ -500,19 +472,13 @@ const ChatLayoutRouteChildren: ChatLayoutRouteChildren = { const ChatLayoutRouteWithChildren = ChatLayoutRoute._addFileChildren(ChatLayoutRouteChildren) interface OnboardingLayoutRouteChildren { - OnboardingCompletePageRoute: typeof OnboardingCompletePageRoute - OnboardingMbtiPageRoute: typeof OnboardingMbtiPageRoute OnboardingNicknamePageRoute: typeof OnboardingNicknamePageRoute - OnboardingPartnerMbtiPageRoute: typeof OnboardingPartnerMbtiPageRoute OnboardingRelationshipStatusPageRoute: typeof OnboardingRelationshipStatusPageRoute OnboardingTermsPageRoute: typeof OnboardingTermsPageRoute } const OnboardingLayoutRouteChildren: OnboardingLayoutRouteChildren = { - OnboardingCompletePageRoute: OnboardingCompletePageRoute, - OnboardingMbtiPageRoute: OnboardingMbtiPageRoute, OnboardingNicknamePageRoute: OnboardingNicknamePageRoute, - OnboardingPartnerMbtiPageRoute: OnboardingPartnerMbtiPageRoute, OnboardingRelationshipStatusPageRoute: OnboardingRelationshipStatusPageRoute, OnboardingTermsPageRoute: OnboardingTermsPageRoute, } @@ -536,6 +502,7 @@ export interface FileRoutesByFullPath { '/partner-mbti': typeof PartnerMbtiPageRoute '/partner-result-preview': typeof PartnerResultPreviewPageRoute '/partner-status': typeof PartnerStatusPageRoute + '/personality-flow-loading': typeof PersonalityFlowLoadingPageRoute '/relationship-status': typeof RelationshipStatusPageRoute '/tutorial': typeof TutorialPageRoute '/attachment-test/question': typeof AttachmentTestQuestionPageRoute @@ -544,10 +511,7 @@ export interface FileRoutesByFullPath { '/history/delete': typeof HistoryDeletePageRoute '/my-page/account-settings': typeof MyPageAccountSettingsPageRoute '/my-page/profile': typeof MyPageProfilePageRoute - '/onboarding/complete': typeof OnboardingCompletePageRoute - '/onboarding/mbti': typeof OnboardingMbtiPageRoute '/onboarding/nickname': typeof OnboardingNicknamePageRoute - '/onboarding/partner-mbti': typeof OnboardingPartnerMbtiPageRoute '/onboarding/relationship-status': typeof OnboardingRelationshipStatusPageRoute '/onboarding/terms': typeof OnboardingTermsPageRoute '/terms/privacy-policy': typeof TermsPrivacyPolicyPageRoute @@ -571,6 +535,7 @@ export interface FileRoutesByTo { '/partner-mbti': typeof PartnerMbtiPageRoute '/partner-result-preview': typeof PartnerResultPreviewPageRoute '/partner-status': typeof PartnerStatusPageRoute + '/personality-flow-loading': typeof PersonalityFlowLoadingPageRoute '/relationship-status': typeof RelationshipStatusPageRoute '/tutorial': typeof TutorialPageRoute '/attachment-test/question': typeof AttachmentTestQuestionPageRoute @@ -579,10 +544,7 @@ export interface FileRoutesByTo { '/history/delete': typeof HistoryDeletePageRoute '/my-page/account-settings': typeof MyPageAccountSettingsPageRoute '/my-page/profile': typeof MyPageProfilePageRoute - '/onboarding/complete': typeof OnboardingCompletePageRoute - '/onboarding/mbti': typeof OnboardingMbtiPageRoute '/onboarding/nickname': typeof OnboardingNicknamePageRoute - '/onboarding/partner-mbti': typeof OnboardingPartnerMbtiPageRoute '/onboarding/relationship-status': typeof OnboardingRelationshipStatusPageRoute '/onboarding/terms': typeof OnboardingTermsPageRoute '/terms/privacy-policy': typeof TermsPrivacyPolicyPageRoute @@ -608,6 +570,7 @@ export interface FileRoutesById { '/partner-mbti/': typeof PartnerMbtiPageRoute '/partner-result-preview/': typeof PartnerResultPreviewPageRoute '/partner-status/': typeof PartnerStatusPageRoute + '/personality-flow-loading/': typeof PersonalityFlowLoadingPageRoute '/relationship-status/': typeof RelationshipStatusPageRoute '/tutorial/': typeof TutorialPageRoute '/attachment-test/question/': typeof AttachmentTestQuestionPageRoute @@ -616,10 +579,7 @@ export interface FileRoutesById { '/history/delete/': typeof HistoryDeletePageRoute '/my-page/account-settings/': typeof MyPageAccountSettingsPageRoute '/my-page/profile/': typeof MyPageProfilePageRoute - '/onboarding/complete/': typeof OnboardingCompletePageRoute - '/onboarding/mbti/': typeof OnboardingMbtiPageRoute '/onboarding/nickname/': typeof OnboardingNicknamePageRoute - '/onboarding/partner-mbti/': typeof OnboardingPartnerMbtiPageRoute '/onboarding/relationship-status/': typeof OnboardingRelationshipStatusPageRoute '/onboarding/terms/': typeof OnboardingTermsPageRoute '/terms/privacy-policy/': typeof TermsPrivacyPolicyPageRoute @@ -646,6 +606,7 @@ export interface FileRouteTypes { | '/partner-mbti' | '/partner-result-preview' | '/partner-status' + | '/personality-flow-loading' | '/relationship-status' | '/tutorial' | '/attachment-test/question' @@ -654,10 +615,7 @@ export interface FileRouteTypes { | '/history/delete' | '/my-page/account-settings' | '/my-page/profile' - | '/onboarding/complete' - | '/onboarding/mbti' | '/onboarding/nickname' - | '/onboarding/partner-mbti' | '/onboarding/relationship-status' | '/onboarding/terms' | '/terms/privacy-policy' @@ -680,6 +638,7 @@ export interface FileRouteTypes { | '/partner-mbti' | '/partner-result-preview' | '/partner-status' + | '/personality-flow-loading' | '/relationship-status' | '/tutorial' | '/attachment-test/question' @@ -688,10 +647,7 @@ export interface FileRouteTypes { | '/history/delete' | '/my-page/account-settings' | '/my-page/profile' - | '/onboarding/complete' - | '/onboarding/mbti' | '/onboarding/nickname' - | '/onboarding/partner-mbti' | '/onboarding/relationship-status' | '/onboarding/terms' | '/terms/privacy-policy' @@ -715,6 +671,7 @@ export interface FileRouteTypes { | '/partner-mbti/' | '/partner-result-preview/' | '/partner-status/' + | '/personality-flow-loading/' | '/relationship-status/' | '/tutorial/' | '/attachment-test/question/' @@ -723,10 +680,7 @@ export interface FileRouteTypes { | '/history/delete/' | '/my-page/account-settings/' | '/my-page/profile/' - | '/onboarding/complete/' - | '/onboarding/mbti/' | '/onboarding/nickname/' - | '/onboarding/partner-mbti/' | '/onboarding/relationship-status/' | '/onboarding/terms/' | '/terms/privacy-policy/' @@ -751,6 +705,7 @@ export interface RootRouteChildren { PartnerMbtiPageRoute: typeof PartnerMbtiPageRoute PartnerResultPreviewPageRoute: typeof PartnerResultPreviewPageRoute PartnerStatusPageRoute: typeof PartnerStatusPageRoute + PersonalityFlowLoadingPageRoute: typeof PersonalityFlowLoadingPageRoute RelationshipStatusPageRoute: typeof RelationshipStatusPageRoute TutorialPageRoute: typeof TutorialPageRoute AttachmentTestQuestionPageRoute: typeof AttachmentTestQuestionPageRoute @@ -778,6 +733,7 @@ const rootRouteChildren: RootRouteChildren = { PartnerMbtiPageRoute: PartnerMbtiPageRoute, PartnerResultPreviewPageRoute: PartnerResultPreviewPageRoute, PartnerStatusPageRoute: PartnerStatusPageRoute, + PersonalityFlowLoadingPageRoute: PersonalityFlowLoadingPageRoute, RelationshipStatusPageRoute: RelationshipStatusPageRoute, TutorialPageRoute: TutorialPageRoute, AttachmentTestQuestionPageRoute: AttachmentTestQuestionPageRoute, @@ -812,6 +768,7 @@ export const routeTree = rootRoute._addFileChildren(rootRouteChildren)._addFileT "/partner-mbti/", "/partner-result-preview/", "/partner-status/", + "/personality-flow-loading/", "/relationship-status/", "/tutorial/", "/attachment-test/question/", @@ -837,10 +794,7 @@ export const routeTree = rootRoute._addFileChildren(rootRouteChildren)._addFileT "/onboarding": { "filePath": "onboarding/layout.tsx", "children": [ - "/onboarding/complete/", - "/onboarding/mbti/", "/onboarding/nickname/", - "/onboarding/partner-mbti/", "/onboarding/relationship-status/", "/onboarding/terms/" ] @@ -885,6 +839,9 @@ export const routeTree = rootRoute._addFileChildren(rootRouteChildren)._addFileT "/partner-status/": { "filePath": "partner-status/page.tsx" }, + "/personality-flow-loading/": { + "filePath": "personality-flow-loading/page.tsx" + }, "/relationship-status/": { "filePath": "relationship-status/page.tsx" }, @@ -911,22 +868,10 @@ export const routeTree = rootRoute._addFileChildren(rootRouteChildren)._addFileT "/my-page/profile/": { "filePath": "my-page/profile/page.tsx" }, - "/onboarding/complete/": { - "filePath": "onboarding/complete/page.tsx", - "parent": "/onboarding" - }, - "/onboarding/mbti/": { - "filePath": "onboarding/mbti/page.tsx", - "parent": "/onboarding" - }, "/onboarding/nickname/": { "filePath": "onboarding/nickname/page.tsx", "parent": "/onboarding" }, - "/onboarding/partner-mbti/": { - "filePath": "onboarding/partner-mbti/page.tsx", - "parent": "/onboarding" - }, "/onboarding/relationship-status/": { "filePath": "onboarding/relationship-status/page.tsx", "parent": "/onboarding" diff --git a/apps/react/src/router.tsx b/apps/react/src/router.tsx index e7841eac..382cd242 100644 --- a/apps/react/src/router.tsx +++ b/apps/react/src/router.tsx @@ -30,7 +30,7 @@ export function createRouter() { defaultStructuralSharing: true, defaultNotFoundComponent: () => , defaultErrorComponent: ({ error }) => ( -
+
diff --git a/apps/react/src/shared/lib/api.ts b/apps/react/src/shared/lib/api.ts index dacf80af..ede59ea6 100644 --- a/apps/react/src/shared/lib/api.ts +++ b/apps/react/src/shared/lib/api.ts @@ -106,7 +106,9 @@ export function initApi(): AxiosInstance { const { response } = error // API 에러 추적 - if (response) { + // 40017: "이미 상대 프로필이 등록되어 있습니다" - POST→PATCH upsert 시 예상되는 응답이므로 에러 추적 제외 + const isExpectedBusinessError = response?.data?.code === 40017 + if (response && !isExpectedBusinessError) { const severity = response.status >= 500 ? 'critical' diff --git a/apps/react/src/shared/services/love-type.service.ts b/apps/react/src/shared/services/love-type.service.ts index ae3c9f01..175bf75b 100644 --- a/apps/react/src/shared/services/love-type.service.ts +++ b/apps/react/src/shared/services/love-type.service.ts @@ -10,6 +10,16 @@ class LoveTypeService extends LoveTypesApi { } // === Query Options === + detailQuery(personalityType: string, lovetype: string) { + return { + queryKey: queryKeys.loveType.detail(personalityType, lovetype), + queryFn: async () => { + const response = await this.getLoveTypePersonalityTypeResult({ personalityType, lovetype }) + return response.data + }, + } + } + questionsQuery() { return { queryKey: queryKeys.loveType.questions(), diff --git a/apps/react/src/shared/services/member.service.ts b/apps/react/src/shared/services/member.service.ts index 3e2304a1..3be18b42 100644 --- a/apps/react/src/shared/services/member.service.ts +++ b/apps/react/src/shared/services/member.service.ts @@ -5,6 +5,8 @@ import { UpdateMemberTermsRequestDto, UpdateStartLoveDateRequestDto, LoveTypeTestResult, + CreatePartnerProfileRequestDto, + UpdatePartnerProfileRequestDto, } from '@data/user-api-axios/api' import { queryKeys } from './query-keys' @@ -40,8 +42,10 @@ class MemberService extends MembersApi { }, throwOnError: (error: any) => { // axios 에러와 일반 에러 구조 모두 고려 + const status = error?.response?.status const errorCode = error?.response?.data?.code - return errorCode !== 40301 + // 40301: 파트너 없음 (403), 400: 온보딩 직후 파트너 미연결 상태 + return errorCode !== 40301 && status !== 400 }, } } @@ -103,6 +107,30 @@ class MemberService extends MembersApi { } } + createPartnerProfileMutation() { + return { + mutationFn: async (body: CreatePartnerProfileRequestDto) => { + const { data } = await this.createPartnerProfile({ createPartnerProfileRequestDto: body }) + return data + }, + onError: () => { + toast.error('상대 프로필 등록 중 오류가 발생했습니다') + }, + } + } + + updatePartnerProfileMutation() { + return { + mutationFn: async (body: UpdatePartnerProfileRequestDto) => { + const { data } = await this.updatePartnerProfile({ updatePartnerProfileRequestDto: body }) + return data + }, + onError: () => { + toast.error('상대 프로필 수정 중 오류가 발생했습니다') + }, + } + } + submitLoveTypeTestMutation() { return { mutationFn: async (results: LoveTypeTestResult[]) => { diff --git a/apps/react/src/shared/services/query-keys.ts b/apps/react/src/shared/services/query-keys.ts index cbcdbc93..be555d72 100644 --- a/apps/react/src/shared/services/query-keys.ts +++ b/apps/react/src/shared/services/query-keys.ts @@ -46,6 +46,8 @@ export const queryKeys = { loveType: { all: ['loveType'] as const, questions: () => [...queryKeys.loveType.all, 'questions'] as const, + detail: (personalityType: string, loveTypeCategory: string) => + [...queryKeys.loveType.all, 'detail', personalityType, loveTypeCategory] as const, }, // === Login 관련 === diff --git a/apps/react/src/shared/ui/button.tsx b/apps/react/src/shared/ui/button.tsx index 6ac9745b..f37c339d 100644 --- a/apps/react/src/shared/ui/button.tsx +++ b/apps/react/src/shared/ui/button.tsx @@ -5,7 +5,7 @@ interface ButtonProps { disabled?: boolean onClick: () => void className?: string - type?: 'primary' | 'secondary' + type?: 'primary' | 'secondary' | 'ghost' } export function Button({ text, disabled = false, onClick, className = '', type = 'primary' }: ButtonProps) { @@ -18,6 +18,9 @@ export function Button({ text, disabled = false, onClick, className = '', type = { 'bg-gray-100 text-gray-iron-700': type === 'secondary', }, + { + 'bg-transparent text-gray-iron-400': type === 'ghost', + }, { 'cursor-not-allowed bg-gray-neutral-300': disabled, }, diff --git a/apps/react/src/shared/ui/fixed-bottom.tsx b/apps/react/src/shared/ui/fixed-bottom.tsx new file mode 100644 index 00000000..f551224e --- /dev/null +++ b/apps/react/src/shared/ui/fixed-bottom.tsx @@ -0,0 +1,10 @@ +import { cn } from '@/shared/lib/cn' + +interface FixedBottomProps { + children: React.ReactNode + className?: string +} + +export function FixedBottom({ children, className }: FixedBottomProps) { + return
{children}
+} diff --git a/apps/react/src/shared/ui/flow-progress-bar.tsx b/apps/react/src/shared/ui/flow-progress-bar.tsx new file mode 100644 index 00000000..06c6c53f --- /dev/null +++ b/apps/react/src/shared/ui/flow-progress-bar.tsx @@ -0,0 +1,61 @@ +import { Fragment } from 'react' + +import { cn } from '@/shared/lib/cn' + +interface FlowProgressBarProps { + step: number + total: number + highlightSteps?: number[] +} + +export function FlowProgressBar({ step, total, highlightSteps }: FlowProgressBarProps) { + return ( +
+
+ {Array.from({ length: total }, (_, i) => { + const isActive = i < step + const isHighlighted = highlightSteps?.includes(i + 1) + + return ( + + {i > 0 && ( +
+ )} + {isHighlighted ? ( +
+
+
+
+ ) : ( +
+ )} + + ) + })} +
+ + {step} / {total} + +
+ ) +} + +/** chat-entry flow에서 공통으로 사용하는 진행 바를 반환합니다. */ +export function getChatEntryProgressBar(isChatEntry: boolean, step: number) { + return isChatEntry ? : undefined +} diff --git a/apps/react/src/shared/ui/flow-step-dots.tsx b/apps/react/src/shared/ui/flow-step-dots.tsx new file mode 100644 index 00000000..03524899 --- /dev/null +++ b/apps/react/src/shared/ui/flow-step-dots.tsx @@ -0,0 +1,28 @@ +import StepsIcon from '@/assets/icons/steps.svg' +import { cn } from '@/shared/lib/cn' + +interface FlowStepDotsProps { + step: number + total: number +} + +export function FlowStepDots({ step, total }: FlowStepDotsProps) { + return ( +
+ {Array.from({ length: total }, (_, i) => ( + + ))} + {step}단계 +
+ ) +} + +/** my-personality / partner-personality flow에서 공통으로 사용하는 단계 dots를 반환합니다. */ +export function getPersonalityStepDots(isCurrentFlow: boolean, step: number) { + return isCurrentFlow ? : undefined +} diff --git a/apps/react/src/shared/ui/header-bar.tsx b/apps/react/src/shared/ui/header-bar.tsx index b2e118f9..60ee2c6f 100644 --- a/apps/react/src/shared/ui/header-bar.tsx +++ b/apps/react/src/shared/ui/header-bar.tsx @@ -7,6 +7,7 @@ import type { ReactNode } from 'react' interface DetailHeaderBarProps { title?: string + center?: ReactNode right?: ReactNode left?: ReactNode showBackButton?: boolean @@ -16,6 +17,7 @@ interface DetailHeaderBarProps { export function DetailHeaderBar({ title, + center, right, left, onBackClick, @@ -39,7 +41,7 @@ export function DetailHeaderBar({ className )} > -
+
{showBackButton && !left && (
- {/* Title Area */} - {title &&

{title}

} + {/* Center Area (takes priority over title) */} + {center ? ( +
{center}
+ ) : ( + title && ( +

+ {title} +

+ ) + )} {/* Right Area */}
{right}
diff --git a/apps/react/src/shared/ui/key-message-banner.tsx b/apps/react/src/shared/ui/key-message-banner.tsx new file mode 100644 index 00000000..07490995 --- /dev/null +++ b/apps/react/src/shared/ui/key-message-banner.tsx @@ -0,0 +1,40 @@ +import { ChevronRight } from 'lucide-react' + +import BellSvg from '@/assets/icons/bell.svg' + +interface KeyMessageBannerProps { + icon?: React.ReactNode + subtitle?: React.ReactNode + title: string + onClick: () => void +} + +export function KeyMessageBanner({ icon, subtitle, title, onClick }: KeyMessageBannerProps) { + return ( +
+ {icon &&
{icon}
} + +
+ {subtitle && {subtitle}} + {title} +
+ +
+ +
+
+ ) +} + +export function BellNotificationIcon() { + return ( +
+ +
+ ) +} diff --git a/apps/react/src/shared/ui/selectable-button.tsx b/apps/react/src/shared/ui/selectable-button.tsx new file mode 100644 index 00000000..afd47e27 --- /dev/null +++ b/apps/react/src/shared/ui/selectable-button.tsx @@ -0,0 +1,25 @@ +import { cn } from '@/shared/lib/cn' + +interface SelectableButtonProps { + selected: boolean + onClick: () => void + children: React.ReactNode + className?: string + disabled?: boolean +} + +export function SelectableButton({ selected, onClick, children, className, disabled }: SelectableButtonProps) { + return ( + + ) +} diff --git a/apps/react/src/styles/components.css b/apps/react/src/styles/components.css index a0726dcf..6097f3d7 100644 --- a/apps/react/src/styles/components.css +++ b/apps/react/src/styles/components.css @@ -16,6 +16,12 @@ .has-bottom-nav { padding-bottom: calc(var(--bottom-nav-h) + var(--safe-bottom)); } + + .emoji-toss { + font-family: var(--font-emoji-toss); + line-height: 1; + } + /* Title 1 - 28px/38px */ .title1-bold { font-family: var(--font-pretendard); diff --git a/apps/react/src/styles/globals.css b/apps/react/src/styles/globals.css index 4d72f071..31b64196 100644 --- a/apps/react/src/styles/globals.css +++ b/apps/react/src/styles/globals.css @@ -87,6 +87,7 @@ --font-pretendard: 'Pretendard', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + --font-emoji-toss: 'Tossface'; /* Font Weight */ --font-weight-regular: 400; --font-weight-medium: 500; diff --git a/packages/data/user-api-axios/api/.openapi-generator/FILES b/packages/data/user-api-axios/api/.openapi-generator/FILES index 74ba3044..82470d81 100644 --- a/packages/data/user-api-axios/api/.openapi-generator/FILES +++ b/packages/data/user-api-axios/api/.openapi-generator/FILES @@ -52,6 +52,7 @@ models/create-bookmark-request-dto.ts models/create-bookmark-response.ts models/create-chat-room-data.ts models/create-chat-room-response.ts +models/create-partner-profile-request-dto.ts models/delete-bookmarks-request-dto.ts models/delete-chat-room-request-dto.ts models/delete-member-success-response.ts @@ -67,17 +68,23 @@ models/kakao-login-request-dto.ts models/login-data.ts models/login-success-response.ts models/logout-success-response.ts +models/love-type-personality-type-block-data.ts +models/love-type-personality-type-result-data.ts +models/love-type-personality-type-result-success-response.ts models/love-type-question-calculate-success-response.ts models/love-type-question-calculation-data.ts models/love-type-question-data.ts models/love-type-question-success-response.ts models/love-type-test-result.ts +models/love-type-text-block-data.ts models/member-data.ts models/member-info-success-response.ts models/message-dto.ts models/pageable.ts models/partner-member-data.ts models/partner-member-info-success-response.ts +models/partner-profile-data.ts +models/partner-profile-success-response.ts models/past-answer-data.ts models/past-answer-success-response.ts models/past-question-data.ts @@ -109,6 +116,7 @@ models/update-member-request-dto.ts models/update-member-success-response.ts models/update-member-terms-request-dto.ts models/update-member-terms-success-response.ts +models/update-partner-profile-request-dto.ts models/update-start-love-date-data.ts models/update-start-love-date-request-dto.ts models/update-start-love-date-success-response.ts diff --git a/packages/data/user-api-axios/api/apis/couples-api.ts b/packages/data/user-api-axios/api/apis/couples-api.ts index 376bf4eb..de0463d2 100644 --- a/packages/data/user-api-axios/api/apis/couples-api.ts +++ b/packages/data/user-api-axios/api/apis/couples-api.ts @@ -45,10 +45,11 @@ import type { SwaggerErrorResponse } from '../models' export const CouplesApiAxiosParamCreator = function (configuration?: Configuration) { return { /** - * 커플 초대코드를 사용하여 커플을 연결합니다. JWT 토큰이 필요합니다. + * [Deprecated] 커플 초대코드를 사용하여 커플을 연결합니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. JWT 토큰이 필요합니다. * @summary 커플 연결 * @param {CoupleLinkRequestDto} coupleLinkRequestDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ linkCouple: async ( @@ -86,9 +87,10 @@ export const CouplesApiAxiosParamCreator = function (configuration?: Configurati } }, /** - * 연결된 커플을 끊습니다. JWT 토큰이 필요합니다. + * [Deprecated] 연결된 커플을 끊습니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. JWT 토큰이 필요합니다. * @summary 커플 연결 끊기 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ unlinkCouple: async (options: RawAxiosRequestConfig = {}): Promise => { @@ -127,10 +129,11 @@ export const CouplesApiFp = function (configuration?: Configuration) { const localVarAxiosParamCreator = CouplesApiAxiosParamCreator(configuration) return { /** - * 커플 초대코드를 사용하여 커플을 연결합니다. JWT 토큰이 필요합니다. + * [Deprecated] 커플 초대코드를 사용하여 커플을 연결합니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. JWT 토큰이 필요합니다. * @summary 커플 연결 * @param {CoupleLinkRequestDto} coupleLinkRequestDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ async linkCouple( @@ -150,9 +153,10 @@ export const CouplesApiFp = function (configuration?: Configuration) { )(axios, localVarOperationServerBasePath || basePath) }, /** - * 연결된 커플을 끊습니다. JWT 토큰이 필요합니다. + * [Deprecated] 연결된 커플을 끊습니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. JWT 토큰이 필요합니다. * @summary 커플 연결 끊기 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ async unlinkCouple( @@ -180,10 +184,11 @@ export const CouplesApiFactory = function (configuration?: Configuration, basePa const localVarFp = CouplesApiFp(configuration) return { /** - * 커플 초대코드를 사용하여 커플을 연결합니다. JWT 토큰이 필요합니다. + * [Deprecated] 커플 초대코드를 사용하여 커플을 연결합니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. JWT 토큰이 필요합니다. * @summary 커플 연결 * @param {CouplesApiLinkCoupleRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ linkCouple( @@ -195,9 +200,10 @@ export const CouplesApiFactory = function (configuration?: Configuration, basePa .then((request) => request(axios, basePath)) }, /** - * 연결된 커플을 끊습니다. JWT 토큰이 필요합니다. + * [Deprecated] 연결된 커플을 끊습니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. JWT 토큰이 필요합니다. * @summary 커플 연결 끊기 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ unlinkCouple(options?: RawAxiosRequestConfig): AxiosPromise { @@ -218,10 +224,11 @@ export interface CouplesApiLinkCoupleRequest { */ export class CouplesApi extends BaseAPI { /** - * 커플 초대코드를 사용하여 커플을 연결합니다. JWT 토큰이 필요합니다. + * [Deprecated] 커플 초대코드를 사용하여 커플을 연결합니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. JWT 토큰이 필요합니다. * @summary 커플 연결 * @param {CouplesApiLinkCoupleRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ public linkCouple(requestParameters: CouplesApiLinkCoupleRequest, options?: RawAxiosRequestConfig) { @@ -231,9 +238,10 @@ export class CouplesApi extends BaseAPI { } /** - * 연결된 커플을 끊습니다. JWT 토큰이 필요합니다. + * [Deprecated] 연결된 커플을 끊습니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. JWT 토큰이 필요합니다. * @summary 커플 연결 끊기 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ public unlinkCouple(options?: RawAxiosRequestConfig) { diff --git a/packages/data/user-api-axios/api/apis/love-types-api.ts b/packages/data/user-api-axios/api/apis/love-types-api.ts index c3b14058..8e7f8ef6 100644 --- a/packages/data/user-api-axios/api/apis/love-types-api.ts +++ b/packages/data/user-api-axios/api/apis/love-types-api.ts @@ -32,6 +32,8 @@ import { // @ts-ignore import { BASE_PATH, COLLECTION_FORMATS, type RequestArgs, BaseAPI, RequiredError, operationServerMap } from '../base' // @ts-ignore +import type { LoveTypePersonalityTypeResultSuccessResponse } from '../models' +// @ts-ignore import type { LoveTypeQuestionCalculateSuccessResponse } from '../models' // @ts-ignore import type { LoveTypeQuestionSuccessResponse } from '../models' @@ -44,6 +46,56 @@ import type { SwaggerErrorResponse } from '../models' */ export const LoveTypesApiAxiosParamCreator = function (configuration?: Configuration) { return { + /** + * MBTI와 애착 유형 조합에 해당하는 상세 결과를 조회합니다. + * @summary MBTI + 애착 유형 상세 결과 조회 + * @param {string} personalityType + * @param {string} lovetype + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getLoveTypePersonalityTypeResult: async ( + personalityType: string, + lovetype: string, + options: RawAxiosRequestConfig = {} + ): Promise => { + // verify required parameter 'personalityType' is not null or undefined + assertParamExists('getLoveTypePersonalityTypeResult', 'personalityType', personalityType) + // verify required parameter 'lovetype' is not null or undefined + assertParamExists('getLoveTypePersonalityTypeResult', 'lovetype', lovetype) + const localVarPath = `/love-types/result` + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL) + let baseOptions + if (configuration) { + baseOptions = configuration.baseOptions + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options } + const localVarHeaderParameter = {} as any + const localVarQueryParameter = {} as any + + // authentication Bearer Authentication required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + if (personalityType !== undefined) { + localVarQueryParameter['personalityType'] = personalityType + } + + if (lovetype !== undefined) { + localVarQueryParameter['lovetype'] = lovetype + } + + setSearchParams(localVarUrlObj, localVarQueryParameter) + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {} + localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers } + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + } + }, /** * 애착 유형 검사의 질문을 조회합니다. * @summary 애착 유형 검사 질문 조회 @@ -168,6 +220,37 @@ export const LoveTypesApiAxiosParamCreator = function (configuration?: Configura export const LoveTypesApiFp = function (configuration?: Configuration) { const localVarAxiosParamCreator = LoveTypesApiAxiosParamCreator(configuration) return { + /** + * MBTI와 애착 유형 조합에 해당하는 상세 결과를 조회합니다. + * @summary MBTI + 애착 유형 상세 결과 조회 + * @param {string} personalityType + * @param {string} lovetype + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getLoveTypePersonalityTypeResult( + personalityType: string, + lovetype: string, + options?: RawAxiosRequestConfig + ): Promise< + (axios?: AxiosInstance, basePath?: string) => AxiosPromise + > { + const localVarAxiosArgs = await localVarAxiosParamCreator.getLoveTypePersonalityTypeResult( + personalityType, + lovetype, + options + ) + const localVarOperationServerIndex = configuration?.serverIndex ?? 0 + const localVarOperationServerBasePath = + operationServerMap['LoveTypesApi.getLoveTypePersonalityTypeResult']?.[localVarOperationServerIndex]?.url + return (axios, basePath) => + createRequestFunction( + localVarAxiosArgs, + globalAxios, + BASE_PATH, + configuration + )(axios, localVarOperationServerBasePath || basePath) + }, /** * 애착 유형 검사의 질문을 조회합니다. * @summary 애착 유형 검사 질문 조회 @@ -244,6 +327,21 @@ export const LoveTypesApiFp = function (configuration?: Configuration) { export const LoveTypesApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { const localVarFp = LoveTypesApiFp(configuration) return { + /** + * MBTI와 애착 유형 조합에 해당하는 상세 결과를 조회합니다. + * @summary MBTI + 애착 유형 상세 결과 조회 + * @param {LoveTypesApiGetLoveTypePersonalityTypeResultRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getLoveTypePersonalityTypeResult( + requestParameters: LoveTypesApiGetLoveTypePersonalityTypeResultRequest, + options?: RawAxiosRequestConfig + ): AxiosPromise { + return localVarFp + .getLoveTypePersonalityTypeResult(requestParameters.personalityType, requestParameters.lovetype, options) + .then((request) => request(axios, basePath)) + }, /** * 애착 유형 검사의 질문을 조회합니다. * @summary 애착 유형 검사 질문 조회 @@ -286,6 +384,15 @@ export const LoveTypesApiFactory = function (configuration?: Configuration, base } } +/** + * Request parameters for getLoveTypePersonalityTypeResult operation in LoveTypesApi. + */ +export interface LoveTypesApiGetLoveTypePersonalityTypeResultRequest { + readonly personalityType: string + + readonly lovetype: string +} + /** * Request parameters for getLoveTypeResult operation in LoveTypesApi. */ @@ -304,6 +411,22 @@ export interface LoveTypesApiRegisterResultRequest { * LoveTypesApi - object-oriented interface */ export class LoveTypesApi extends BaseAPI { + /** + * MBTI와 애착 유형 조합에 해당하는 상세 결과를 조회합니다. + * @summary MBTI + 애착 유형 상세 결과 조회 + * @param {LoveTypesApiGetLoveTypePersonalityTypeResultRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public getLoveTypePersonalityTypeResult( + requestParameters: LoveTypesApiGetLoveTypePersonalityTypeResultRequest, + options?: RawAxiosRequestConfig + ) { + return LoveTypesApiFp(this.configuration) + .getLoveTypePersonalityTypeResult(requestParameters.personalityType, requestParameters.lovetype, options) + .then((request) => request(this.axios, this.basePath)) + } + /** * 애착 유형 검사의 질문을 조회합니다. * @summary 애착 유형 검사 질문 조회 diff --git a/packages/data/user-api-axios/api/apis/members-api.ts b/packages/data/user-api-axios/api/apis/members-api.ts index 2f26f121..44ca6f35 100644 --- a/packages/data/user-api-axios/api/apis/members-api.ts +++ b/packages/data/user-api-axios/api/apis/members-api.ts @@ -32,6 +32,8 @@ import { // @ts-ignore import { BASE_PATH, COLLECTION_FORMATS, type RequestArgs, BaseAPI, RequiredError, operationServerMap } from '../base' // @ts-ignore +import type { CreatePartnerProfileRequestDto } from '../models' +// @ts-ignore import type { DeleteMemberSuccessResponse } from '../models' // @ts-ignore import type { GetInviteCodeSuccessResponse } from '../models' @@ -40,6 +42,8 @@ import type { MemberInfoSuccessResponse } from '../models' // @ts-ignore import type { PartnerMemberInfoSuccessResponse } from '../models' // @ts-ignore +import type { PartnerProfileSuccessResponse } from '../models' +// @ts-ignore import type { RegisterLoveTypeRequestDto } from '../models' // @ts-ignore import type { RegisterLoveTypeSuccessResponse } from '../models' @@ -54,6 +58,8 @@ import type { UpdateMemberTermsRequestDto } from '../models' // @ts-ignore import type { UpdateMemberTermsSuccessResponse } from '../models' // @ts-ignore +import type { UpdatePartnerProfileRequestDto } from '../models' +// @ts-ignore import type { UpdateStartLoveDateRequestDto } from '../models' // @ts-ignore import type { UpdateStartLoveDateSuccessResponse } from '../models' @@ -62,6 +68,51 @@ import type { UpdateStartLoveDateSuccessResponse } from '../models' */ export const MembersApiAxiosParamCreator = function (configuration?: Configuration) { return { + /** + * 현재 로그인된 사용자가 상대방 MBTI와 애착 유형을 직접 입력합니다. JWT 토큰이 필요합니다. + * @summary 상대 프로필 최초 등록 + * @param {CreatePartnerProfileRequestDto} createPartnerProfileRequestDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createPartnerProfile: async ( + createPartnerProfileRequestDto: CreatePartnerProfileRequestDto, + options: RawAxiosRequestConfig = {} + ): Promise => { + // verify required parameter 'createPartnerProfileRequestDto' is not null or undefined + assertParamExists('createPartnerProfile', 'createPartnerProfileRequestDto', createPartnerProfileRequestDto) + const localVarPath = `/members/partners` + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL) + let baseOptions + if (configuration) { + baseOptions = configuration.baseOptions + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options } + const localVarHeaderParameter = {} as any + const localVarQueryParameter = {} as any + + // authentication Bearer Authentication required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + localVarHeaderParameter['Content-Type'] = 'application/json' + + setSearchParams(localVarUrlObj, localVarQueryParameter) + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {} + localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers } + localVarRequestOptions.data = serializeDataIfNeeded( + createPartnerProfileRequestDto, + localVarRequestOptions, + configuration + ) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + } + }, /** * 현재 로그인된 사용자의 탈퇴를 처리합니다. JWT 토큰이 필요합니다. * @summary 사용자 탈퇴 @@ -127,9 +178,10 @@ export const MembersApiAxiosParamCreator = function (configuration?: Configurati } }, /** - * 현재 로그인된 사용자의 초대 코드를 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 현재 로그인된 사용자의 초대 코드를 조회합니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. JWT 토큰이 필요합니다. * @summary 사용자 초대 코드 조회 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ getMemberInviteCode: async (options: RawAxiosRequestConfig = {}): Promise => { @@ -159,9 +211,10 @@ export const MembersApiAxiosParamCreator = function (configuration?: Configurati } }, /** - * 현재 로그인된 멤버의 파트너 정보를 조회합니다. JWT 토큰이 필요합니다. - * @summary 커플 상대 정보 조회 + * [Deprecated] 현재 로그인된 멤버가 직접 입력한 상대 프로필을 조회합니다. 신규 클라이언트는 GET /members 응답의 partner 필드를 사용하세요. JWT 토큰이 필요합니다. + * @summary 상대 프로필 조회 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ getPartnerMemberInfo: async (options: RawAxiosRequestConfig = {}): Promise => { @@ -322,10 +375,56 @@ export const MembersApiAxiosParamCreator = function (configuration?: Configurati } }, /** - * 커플로 연동된 사용자의 연애 시작일을 변경합니다. 커플이 아닌 사용자는 사용할 수 없습니다. JWT 토큰이 필요합니다. + * 현재 로그인된 사용자가 직접 입력한 상대 프로필을 수정합니다. JWT 토큰이 필요합니다. + * @summary 상대 프로필 수정 + * @param {UpdatePartnerProfileRequestDto} updatePartnerProfileRequestDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updatePartnerProfile: async ( + updatePartnerProfileRequestDto: UpdatePartnerProfileRequestDto, + options: RawAxiosRequestConfig = {} + ): Promise => { + // verify required parameter 'updatePartnerProfileRequestDto' is not null or undefined + assertParamExists('updatePartnerProfile', 'updatePartnerProfileRequestDto', updatePartnerProfileRequestDto) + const localVarPath = `/members/partners` + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL) + let baseOptions + if (configuration) { + baseOptions = configuration.baseOptions + } + + const localVarRequestOptions = { method: 'PATCH', ...baseOptions, ...options } + const localVarHeaderParameter = {} as any + const localVarQueryParameter = {} as any + + // authentication Bearer Authentication required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + localVarHeaderParameter['Content-Type'] = 'application/json' + + setSearchParams(localVarUrlObj, localVarQueryParameter) + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {} + localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers } + localVarRequestOptions.data = serializeDataIfNeeded( + updatePartnerProfileRequestDto, + localVarRequestOptions, + configuration + ) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + } + }, + /** + * [Deprecated] 커플로 연동된 사용자의 연애 시작일을 변경합니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. 커플이 아닌 사용자는 사용할 수 없습니다. JWT 토큰이 필요합니다. * @summary 연애 시작일 변경 * @param {UpdateStartLoveDateRequestDto} updateStartLoveDateRequestDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ updateStartLoveDate: async ( @@ -375,6 +474,32 @@ export const MembersApiAxiosParamCreator = function (configuration?: Configurati export const MembersApiFp = function (configuration?: Configuration) { const localVarAxiosParamCreator = MembersApiAxiosParamCreator(configuration) return { + /** + * 현재 로그인된 사용자가 상대방 MBTI와 애착 유형을 직접 입력합니다. JWT 토큰이 필요합니다. + * @summary 상대 프로필 최초 등록 + * @param {CreatePartnerProfileRequestDto} createPartnerProfileRequestDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createPartnerProfile( + createPartnerProfileRequestDto: CreatePartnerProfileRequestDto, + options?: RawAxiosRequestConfig + ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createPartnerProfile( + createPartnerProfileRequestDto, + options + ) + const localVarOperationServerIndex = configuration?.serverIndex ?? 0 + const localVarOperationServerBasePath = + operationServerMap['MembersApi.createPartnerProfile']?.[localVarOperationServerIndex]?.url + return (axios, basePath) => + createRequestFunction( + localVarAxiosArgs, + globalAxios, + BASE_PATH, + configuration + )(axios, localVarOperationServerBasePath || basePath) + }, /** * 현재 로그인된 사용자의 탈퇴를 처리합니다. JWT 토큰이 필요합니다. * @summary 사용자 탈퇴 @@ -418,9 +543,10 @@ export const MembersApiFp = function (configuration?: Configuration) { )(axios, localVarOperationServerBasePath || basePath) }, /** - * 현재 로그인된 사용자의 초대 코드를 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 현재 로그인된 사용자의 초대 코드를 조회합니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. JWT 토큰이 필요합니다. * @summary 사용자 초대 코드 조회 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ async getMemberInviteCode( @@ -439,9 +565,10 @@ export const MembersApiFp = function (configuration?: Configuration) { )(axios, localVarOperationServerBasePath || basePath) }, /** - * 현재 로그인된 멤버의 파트너 정보를 조회합니다. JWT 토큰이 필요합니다. - * @summary 커플 상대 정보 조회 + * [Deprecated] 현재 로그인된 멤버가 직접 입력한 상대 프로필을 조회합니다. 신규 클라이언트는 GET /members 응답의 partner 필드를 사용하세요. JWT 토큰이 필요합니다. + * @summary 상대 프로필 조회 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ async getPartnerMemberInfo( @@ -529,10 +656,37 @@ export const MembersApiFp = function (configuration?: Configuration) { )(axios, localVarOperationServerBasePath || basePath) }, /** - * 커플로 연동된 사용자의 연애 시작일을 변경합니다. 커플이 아닌 사용자는 사용할 수 없습니다. JWT 토큰이 필요합니다. + * 현재 로그인된 사용자가 직접 입력한 상대 프로필을 수정합니다. JWT 토큰이 필요합니다. + * @summary 상대 프로필 수정 + * @param {UpdatePartnerProfileRequestDto} updatePartnerProfileRequestDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updatePartnerProfile( + updatePartnerProfileRequestDto: UpdatePartnerProfileRequestDto, + options?: RawAxiosRequestConfig + ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updatePartnerProfile( + updatePartnerProfileRequestDto, + options + ) + const localVarOperationServerIndex = configuration?.serverIndex ?? 0 + const localVarOperationServerBasePath = + operationServerMap['MembersApi.updatePartnerProfile']?.[localVarOperationServerIndex]?.url + return (axios, basePath) => + createRequestFunction( + localVarAxiosArgs, + globalAxios, + BASE_PATH, + configuration + )(axios, localVarOperationServerBasePath || basePath) + }, + /** + * [Deprecated] 커플로 연동된 사용자의 연애 시작일을 변경합니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. 커플이 아닌 사용자는 사용할 수 없습니다. JWT 토큰이 필요합니다. * @summary 연애 시작일 변경 * @param {UpdateStartLoveDateRequestDto} updateStartLoveDateRequestDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ async updateStartLoveDate( @@ -563,6 +717,21 @@ export const MembersApiFp = function (configuration?: Configuration) { export const MembersApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { const localVarFp = MembersApiFp(configuration) return { + /** + * 현재 로그인된 사용자가 상대방 MBTI와 애착 유형을 직접 입력합니다. JWT 토큰이 필요합니다. + * @summary 상대 프로필 최초 등록 + * @param {MembersApiCreatePartnerProfileRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createPartnerProfile( + requestParameters: MembersApiCreatePartnerProfileRequest, + options?: RawAxiosRequestConfig + ): AxiosPromise { + return localVarFp + .createPartnerProfile(requestParameters.createPartnerProfileRequestDto, options) + .then((request) => request(axios, basePath)) + }, /** * 현재 로그인된 사용자의 탈퇴를 처리합니다. JWT 토큰이 필요합니다. * @summary 사용자 탈퇴 @@ -582,18 +751,20 @@ export const MembersApiFactory = function (configuration?: Configuration, basePa return localVarFp.getMemberInfo(options).then((request) => request(axios, basePath)) }, /** - * 현재 로그인된 사용자의 초대 코드를 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 현재 로그인된 사용자의 초대 코드를 조회합니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. JWT 토큰이 필요합니다. * @summary 사용자 초대 코드 조회 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ getMemberInviteCode(options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.getMemberInviteCode(options).then((request) => request(axios, basePath)) }, /** - * 현재 로그인된 멤버의 파트너 정보를 조회합니다. JWT 토큰이 필요합니다. - * @summary 커플 상대 정보 조회 + * [Deprecated] 현재 로그인된 멤버가 직접 입력한 상대 프로필을 조회합니다. 신규 클라이언트는 GET /members 응답의 partner 필드를 사용하세요. JWT 토큰이 필요합니다. + * @summary 상대 프로필 조회 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ getPartnerMemberInfo(options?: RawAxiosRequestConfig): AxiosPromise { @@ -645,10 +816,26 @@ export const MembersApiFactory = function (configuration?: Configuration, basePa .then((request) => request(axios, basePath)) }, /** - * 커플로 연동된 사용자의 연애 시작일을 변경합니다. 커플이 아닌 사용자는 사용할 수 없습니다. JWT 토큰이 필요합니다. + * 현재 로그인된 사용자가 직접 입력한 상대 프로필을 수정합니다. JWT 토큰이 필요합니다. + * @summary 상대 프로필 수정 + * @param {MembersApiUpdatePartnerProfileRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updatePartnerProfile( + requestParameters: MembersApiUpdatePartnerProfileRequest, + options?: RawAxiosRequestConfig + ): AxiosPromise { + return localVarFp + .updatePartnerProfile(requestParameters.updatePartnerProfileRequestDto, options) + .then((request) => request(axios, basePath)) + }, + /** + * [Deprecated] 커플로 연동된 사용자의 연애 시작일을 변경합니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. 커플이 아닌 사용자는 사용할 수 없습니다. JWT 토큰이 필요합니다. * @summary 연애 시작일 변경 * @param {MembersApiUpdateStartLoveDateRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ updateStartLoveDate( @@ -662,6 +849,13 @@ export const MembersApiFactory = function (configuration?: Configuration, basePa } } +/** + * Request parameters for createPartnerProfile operation in MembersApi. + */ +export interface MembersApiCreatePartnerProfileRequest { + readonly createPartnerProfileRequestDto: CreatePartnerProfileRequestDto +} + /** * Request parameters for registerLoveType operation in MembersApi. */ @@ -683,6 +877,13 @@ export interface MembersApiUpdateMemberTermsRequest { readonly updateMemberTermsRequestDto: UpdateMemberTermsRequestDto } +/** + * Request parameters for updatePartnerProfile operation in MembersApi. + */ +export interface MembersApiUpdatePartnerProfileRequest { + readonly updatePartnerProfileRequestDto: UpdatePartnerProfileRequestDto +} + /** * Request parameters for updateStartLoveDate operation in MembersApi. */ @@ -694,6 +895,22 @@ export interface MembersApiUpdateStartLoveDateRequest { * MembersApi - object-oriented interface */ export class MembersApi extends BaseAPI { + /** + * 현재 로그인된 사용자가 상대방 MBTI와 애착 유형을 직접 입력합니다. JWT 토큰이 필요합니다. + * @summary 상대 프로필 최초 등록 + * @param {MembersApiCreatePartnerProfileRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public createPartnerProfile( + requestParameters: MembersApiCreatePartnerProfileRequest, + options?: RawAxiosRequestConfig + ) { + return MembersApiFp(this.configuration) + .createPartnerProfile(requestParameters.createPartnerProfileRequestDto, options) + .then((request) => request(this.axios, this.basePath)) + } + /** * 현재 로그인된 사용자의 탈퇴를 처리합니다. JWT 토큰이 필요합니다. * @summary 사용자 탈퇴 @@ -719,9 +936,10 @@ export class MembersApi extends BaseAPI { } /** - * 현재 로그인된 사용자의 초대 코드를 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 현재 로그인된 사용자의 초대 코드를 조회합니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. JWT 토큰이 필요합니다. * @summary 사용자 초대 코드 조회 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ public getMemberInviteCode(options?: RawAxiosRequestConfig) { @@ -731,9 +949,10 @@ export class MembersApi extends BaseAPI { } /** - * 현재 로그인된 멤버의 파트너 정보를 조회합니다. JWT 토큰이 필요합니다. - * @summary 커플 상대 정보 조회 + * [Deprecated] 현재 로그인된 멤버가 직접 입력한 상대 프로필을 조회합니다. 신규 클라이언트는 GET /members 응답의 partner 필드를 사용하세요. JWT 토큰이 필요합니다. + * @summary 상대 프로필 조회 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ public getPartnerMemberInfo(options?: RawAxiosRequestConfig) { @@ -782,10 +1001,27 @@ export class MembersApi extends BaseAPI { } /** - * 커플로 연동된 사용자의 연애 시작일을 변경합니다. 커플이 아닌 사용자는 사용할 수 없습니다. JWT 토큰이 필요합니다. + * 현재 로그인된 사용자가 직접 입력한 상대 프로필을 수정합니다. JWT 토큰이 필요합니다. + * @summary 상대 프로필 수정 + * @param {MembersApiUpdatePartnerProfileRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public updatePartnerProfile( + requestParameters: MembersApiUpdatePartnerProfileRequest, + options?: RawAxiosRequestConfig + ) { + return MembersApiFp(this.configuration) + .updatePartnerProfile(requestParameters.updatePartnerProfileRequestDto, options) + .then((request) => request(this.axios, this.basePath)) + } + + /** + * [Deprecated] 커플로 연동된 사용자의 연애 시작일을 변경합니다. 커플 연동 기능은 제거 예정이며, 앞으로는 사용자가 커플 정보를 직접 입력하는 방식을 사용합니다. 커플이 아닌 사용자는 사용할 수 없습니다. JWT 토큰이 필요합니다. * @summary 연애 시작일 변경 * @param {MembersApiUpdateStartLoveDateRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ public updateStartLoveDate(requestParameters: MembersApiUpdateStartLoveDateRequest, options?: RawAxiosRequestConfig) { diff --git a/packages/data/user-api-axios/api/apis/questions-api.ts b/packages/data/user-api-axios/api/apis/questions-api.ts index 42bf8000..993170ee 100644 --- a/packages/data/user-api-axios/api/apis/questions-api.ts +++ b/packages/data/user-api-axios/api/apis/questions-api.ts @@ -49,10 +49,11 @@ import type { SwaggerErrorResponse } from '../models' export const QuestionsApiAxiosParamCreator = function (configuration?: Configuration) { return { /** - * 커플 질문 답변을 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 질문 답변 조회 * @param {number} coupleQuestionId * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ getAnswers: async (coupleQuestionId: number, options: RawAxiosRequestConfig = {}): Promise => { @@ -87,10 +88,11 @@ export const QuestionsApiAxiosParamCreator = function (configuration?: Configura } }, /** - * 커플 오늘의 질문을 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 과거 질문 조회 * @param {number} level * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ getQuestion: async (level: number, options: RawAxiosRequestConfig = {}): Promise => { @@ -122,9 +124,10 @@ export const QuestionsApiAxiosParamCreator = function (configuration?: Configura } }, /** - * 커플 오늘의 질문을 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 오늘의 질문 조회 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ getTodayQuestion: async (options: RawAxiosRequestConfig = {}): Promise => { @@ -154,10 +157,11 @@ export const QuestionsApiAxiosParamCreator = function (configuration?: Configura } }, /** - * 커플 오늘의 질문에 답변을 등록합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 오늘의 질문 답변 등록 * @param {AnswerRequestDto} answerRequestDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ postAnswer: async ( @@ -195,10 +199,11 @@ export const QuestionsApiAxiosParamCreator = function (configuration?: Configura } }, /** - * 커플 오늘의 질문에 답변을 수정합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 오늘의 질문 답변 수정 * @param {AnswerRequestDto} answerRequestDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ updateAnswer: async ( @@ -245,10 +250,11 @@ export const QuestionsApiFp = function (configuration?: Configuration) { const localVarAxiosParamCreator = QuestionsApiAxiosParamCreator(configuration) return { /** - * 커플 질문 답변을 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 질문 답변 조회 * @param {number} coupleQuestionId * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ async getAnswers( @@ -268,10 +274,11 @@ export const QuestionsApiFp = function (configuration?: Configuration) { )(axios, localVarOperationServerBasePath || basePath) }, /** - * 커플 오늘의 질문을 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 과거 질문 조회 * @param {number} level * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ async getQuestion( @@ -291,9 +298,10 @@ export const QuestionsApiFp = function (configuration?: Configuration) { )(axios, localVarOperationServerBasePath || basePath) }, /** - * 커플 오늘의 질문을 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 오늘의 질문 조회 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ async getTodayQuestion( @@ -312,10 +320,11 @@ export const QuestionsApiFp = function (configuration?: Configuration) { )(axios, localVarOperationServerBasePath || basePath) }, /** - * 커플 오늘의 질문에 답변을 등록합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 오늘의 질문 답변 등록 * @param {AnswerRequestDto} answerRequestDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ async postAnswer( @@ -335,10 +344,11 @@ export const QuestionsApiFp = function (configuration?: Configuration) { )(axios, localVarOperationServerBasePath || basePath) }, /** - * 커플 오늘의 질문에 답변을 수정합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 오늘의 질문 답변 수정 * @param {AnswerRequestDto} answerRequestDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ async updateAnswer( @@ -367,10 +377,11 @@ export const QuestionsApiFactory = function (configuration?: Configuration, base const localVarFp = QuestionsApiFp(configuration) return { /** - * 커플 질문 답변을 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 질문 답변 조회 * @param {QuestionsApiGetAnswersRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ getAnswers( @@ -382,10 +393,11 @@ export const QuestionsApiFactory = function (configuration?: Configuration, base .then((request) => request(axios, basePath)) }, /** - * 커플 오늘의 질문을 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 과거 질문 조회 * @param {QuestionsApiGetQuestionRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ getQuestion( @@ -395,19 +407,21 @@ export const QuestionsApiFactory = function (configuration?: Configuration, base return localVarFp.getQuestion(requestParameters.level, options).then((request) => request(axios, basePath)) }, /** - * 커플 오늘의 질문을 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 오늘의 질문 조회 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ getTodayQuestion(options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.getTodayQuestion(options).then((request) => request(axios, basePath)) }, /** - * 커플 오늘의 질문에 답변을 등록합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 오늘의 질문 답변 등록 * @param {QuestionsApiPostAnswerRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ postAnswer( @@ -419,10 +433,11 @@ export const QuestionsApiFactory = function (configuration?: Configuration, base .then((request) => request(axios, basePath)) }, /** - * 커플 오늘의 질문에 답변을 수정합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 오늘의 질문 답변 수정 * @param {QuestionsApiUpdateAnswerRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ updateAnswer( @@ -469,10 +484,11 @@ export interface QuestionsApiUpdateAnswerRequest { */ export class QuestionsApi extends BaseAPI { /** - * 커플 질문 답변을 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 질문 답변 조회 * @param {QuestionsApiGetAnswersRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ public getAnswers(requestParameters: QuestionsApiGetAnswersRequest, options?: RawAxiosRequestConfig) { @@ -482,10 +498,11 @@ export class QuestionsApi extends BaseAPI { } /** - * 커플 오늘의 질문을 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 과거 질문 조회 * @param {QuestionsApiGetQuestionRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ public getQuestion(requestParameters: QuestionsApiGetQuestionRequest, options?: RawAxiosRequestConfig) { @@ -495,9 +512,10 @@ export class QuestionsApi extends BaseAPI { } /** - * 커플 오늘의 질문을 조회합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 오늘의 질문 조회 * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ public getTodayQuestion(options?: RawAxiosRequestConfig) { @@ -507,10 +525,11 @@ export class QuestionsApi extends BaseAPI { } /** - * 커플 오늘의 질문에 답변을 등록합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 오늘의 질문 답변 등록 * @param {QuestionsApiPostAnswerRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ public postAnswer(requestParameters: QuestionsApiPostAnswerRequest, options?: RawAxiosRequestConfig) { @@ -520,10 +539,11 @@ export class QuestionsApi extends BaseAPI { } /** - * 커플 오늘의 질문에 답변을 수정합니다. JWT 토큰이 필요합니다. + * [Deprecated] 오늘의 질문 기능은 제거 예정입니다. JWT 토큰이 필요합니다. * @summary 오늘의 질문 답변 수정 * @param {QuestionsApiUpdateAnswerRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ public updateAnswer(requestParameters: QuestionsApiUpdateAnswerRequest, options?: RawAxiosRequestConfig) { diff --git a/packages/data/user-api-axios/api/apis/sign-ups-api.ts b/packages/data/user-api-axios/api/apis/sign-ups-api.ts index f22361bb..27b098e9 100644 --- a/packages/data/user-api-axios/api/apis/sign-ups-api.ts +++ b/packages/data/user-api-axios/api/apis/sign-ups-api.ts @@ -43,7 +43,7 @@ import type { SwaggerErrorResponse } from '../models' export const SignUpsApiAxiosParamCreator = function (configuration?: Configuration) { return { /** - * 인증된 사용자의 추가 정보를 입력받아 회원가입을 완료합니다. 연애 시작일은 커플 연동 시 자동으로 설정됩니다. JWT 토큰이 필요합니다. + * 인증된 사용자의 추가 정보와 연애 상태를 입력받아 회원가입을 완료합니다. MBTI 관련 정보는 회원가입 이후 프로필 수정에서 관리합니다. JWT 토큰이 필요합니다. * @summary 회원가입 * @param {SignUpRequestDto} signUpRequestDto * @param {*} [options] Override http request option. @@ -90,7 +90,7 @@ export const SignUpsApiFp = function (configuration?: Configuration) { const localVarAxiosParamCreator = SignUpsApiAxiosParamCreator(configuration) return { /** - * 인증된 사용자의 추가 정보를 입력받아 회원가입을 완료합니다. 연애 시작일은 커플 연동 시 자동으로 설정됩니다. JWT 토큰이 필요합니다. + * 인증된 사용자의 추가 정보와 연애 상태를 입력받아 회원가입을 완료합니다. MBTI 관련 정보는 회원가입 이후 프로필 수정에서 관리합니다. JWT 토큰이 필요합니다. * @summary 회원가입 * @param {SignUpRequestDto} signUpRequestDto * @param {*} [options] Override http request option. @@ -122,7 +122,7 @@ export const SignUpsApiFactory = function (configuration?: Configuration, basePa const localVarFp = SignUpsApiFp(configuration) return { /** - * 인증된 사용자의 추가 정보를 입력받아 회원가입을 완료합니다. 연애 시작일은 커플 연동 시 자동으로 설정됩니다. JWT 토큰이 필요합니다. + * 인증된 사용자의 추가 정보와 연애 상태를 입력받아 회원가입을 완료합니다. MBTI 관련 정보는 회원가입 이후 프로필 수정에서 관리합니다. JWT 토큰이 필요합니다. * @summary 회원가입 * @param {SignUpsApiSignUpRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. @@ -149,7 +149,7 @@ export interface SignUpsApiSignUpRequest { */ export class SignUpsApi extends BaseAPI { /** - * 인증된 사용자의 추가 정보를 입력받아 회원가입을 완료합니다. 연애 시작일은 커플 연동 시 자동으로 설정됩니다. JWT 토큰이 필요합니다. + * 인증된 사용자의 추가 정보와 연애 상태를 입력받아 회원가입을 완료합니다. MBTI 관련 정보는 회원가입 이후 프로필 수정에서 관리합니다. JWT 토큰이 필요합니다. * @summary 회원가입 * @param {SignUpsApiSignUpRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. diff --git a/packages/data/user-api-axios/api/models/couple-link-data.ts b/packages/data/user-api-axios/api/models/couple-link-data.ts index 4ce38162..e9e2b37f 100644 --- a/packages/data/user-api-axios/api/models/couple-link-data.ts +++ b/packages/data/user-api-axios/api/models/couple-link-data.ts @@ -13,7 +13,7 @@ */ /** - * 커플 연결 응답 데이터 + * [Deprecated] 커플 연결 응답 데이터 */ export interface CoupleLinkData { /** diff --git a/packages/data/user-api-axios/api/models/couple-link-request-dto.ts b/packages/data/user-api-axios/api/models/couple-link-request-dto.ts index 0ce873e4..0722d230 100644 --- a/packages/data/user-api-axios/api/models/couple-link-request-dto.ts +++ b/packages/data/user-api-axios/api/models/couple-link-request-dto.ts @@ -12,6 +12,9 @@ * Do not edit the class manually. */ +/** + * [Deprecated] 커플 연결 요청 DTO + */ export interface CoupleLinkRequestDto { coupleCode: string } diff --git a/packages/data/user-api-axios/api/models/couple-link-success-response.ts b/packages/data/user-api-axios/api/models/couple-link-success-response.ts index a4c2ed05..24e3f776 100644 --- a/packages/data/user-api-axios/api/models/couple-link-success-response.ts +++ b/packages/data/user-api-axios/api/models/couple-link-success-response.ts @@ -17,7 +17,7 @@ import type { CoupleLinkData } from './couple-link-data' /** - * 커플 연결 성공 응답 + * [Deprecated] 커플 연결 성공 응답 */ export interface CoupleLinkSuccessResponse { /** diff --git a/packages/data/user-api-axios/api/models/couple-unlink-data.ts b/packages/data/user-api-axios/api/models/couple-unlink-data.ts index 9c7e2ca8..51652cea 100644 --- a/packages/data/user-api-axios/api/models/couple-unlink-data.ts +++ b/packages/data/user-api-axios/api/models/couple-unlink-data.ts @@ -13,7 +13,7 @@ */ /** - * 커플 연결 끊기 응답 데이터 + * [Deprecated] 커플 연결 끊기 응답 데이터 */ export interface CoupleUnlinkData { /** diff --git a/packages/data/user-api-axios/api/models/couple-unlink-success-response.ts b/packages/data/user-api-axios/api/models/couple-unlink-success-response.ts index 602dd47c..89597a3b 100644 --- a/packages/data/user-api-axios/api/models/couple-unlink-success-response.ts +++ b/packages/data/user-api-axios/api/models/couple-unlink-success-response.ts @@ -17,7 +17,7 @@ import type { CoupleUnlinkData } from './couple-unlink-data' /** - * 커플 연결 끊기 성공 응답 + * [Deprecated] 커플 연결 끊기 성공 응답 */ export interface CoupleUnlinkSuccessResponse { /** diff --git a/packages/data/user-api-axios/api/models/create-partner-profile-request-dto.ts b/packages/data/user-api-axios/api/models/create-partner-profile-request-dto.ts new file mode 100644 index 00000000..e75841bc --- /dev/null +++ b/packages/data/user-api-axios/api/models/create-partner-profile-request-dto.ts @@ -0,0 +1,29 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Malmo API Documentation + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export interface CreatePartnerProfileRequestDto { + personalityType: string + loveTypeCategory?: CreatePartnerProfileRequestDtoLoveTypeCategoryEnum +} + +export const CreatePartnerProfileRequestDtoLoveTypeCategoryEnum = { + StableType: 'STABLE_TYPE', + AnxietyType: 'ANXIETY_TYPE', + AvoidanceType: 'AVOIDANCE_TYPE', + ConfusionType: 'CONFUSION_TYPE', + Unknown: 'UNKNOWN', +} as const + +export type CreatePartnerProfileRequestDtoLoveTypeCategoryEnum = + (typeof CreatePartnerProfileRequestDtoLoveTypeCategoryEnum)[keyof typeof CreatePartnerProfileRequestDtoLoveTypeCategoryEnum] diff --git a/packages/data/user-api-axios/api/models/get-invite-code-success-response.ts b/packages/data/user-api-axios/api/models/get-invite-code-success-response.ts index d7b28e0b..4eed2f24 100644 --- a/packages/data/user-api-axios/api/models/get-invite-code-success-response.ts +++ b/packages/data/user-api-axios/api/models/get-invite-code-success-response.ts @@ -17,7 +17,7 @@ import type { InviteCodeResponseData } from './invite-code-response-data' /** - * 멤버 초대 코드 성공 응답 + * [Deprecated] 멤버 초대 코드 성공 응답 */ export interface GetInviteCodeSuccessResponse { /** diff --git a/packages/data/user-api-axios/api/models/index.ts b/packages/data/user-api-axios/api/models/index.ts index 34dc8b5d..b75a1dc0 100644 --- a/packages/data/user-api-axios/api/models/index.ts +++ b/packages/data/user-api-axios/api/models/index.ts @@ -29,6 +29,7 @@ export * from './create-bookmark-request-dto' export * from './create-bookmark-response' export * from './create-chat-room-data' export * from './create-chat-room-response' +export * from './create-partner-profile-request-dto' export * from './delete-bookmarks-request-dto' export * from './delete-chat-room-request-dto' export * from './delete-member-success-response' @@ -43,17 +44,23 @@ export * from './kakao-login-request-dto' export * from './login-data' export * from './login-success-response' export * from './logout-success-response' +export * from './love-type-personality-type-block-data' +export * from './love-type-personality-type-result-data' +export * from './love-type-personality-type-result-success-response' export * from './love-type-question-calculate-success-response' export * from './love-type-question-calculation-data' export * from './love-type-question-data' export * from './love-type-question-success-response' export * from './love-type-test-result' +export * from './love-type-text-block-data' export * from './member-data' export * from './member-info-success-response' export * from './message-dto' export * from './pageable' export * from './partner-member-data' export * from './partner-member-info-success-response' +export * from './partner-profile-data' +export * from './partner-profile-success-response' export * from './past-answer-data' export * from './past-answer-success-response' export * from './past-question-data' @@ -85,6 +92,7 @@ export * from './update-member-request-dto' export * from './update-member-success-response' export * from './update-member-terms-request-dto' export * from './update-member-terms-success-response' +export * from './update-partner-profile-request-dto' export * from './update-start-love-date-data' export * from './update-start-love-date-request-dto' export * from './update-start-love-date-success-response' diff --git a/packages/data/user-api-axios/api/models/invite-code-response-data.ts b/packages/data/user-api-axios/api/models/invite-code-response-data.ts index 0e029e0b..9caf011f 100644 --- a/packages/data/user-api-axios/api/models/invite-code-response-data.ts +++ b/packages/data/user-api-axios/api/models/invite-code-response-data.ts @@ -13,7 +13,7 @@ */ /** - * 초대 코드 응답 데이터 + * [Deprecated] 초대 코드 응답 데이터 */ export interface InviteCodeResponseData { coupleCode?: string diff --git a/packages/data/user-api-axios/api/models/love-type-personality-type-block-data.ts b/packages/data/user-api-axios/api/models/love-type-personality-type-block-data.ts new file mode 100644 index 00000000..afd05fae --- /dev/null +++ b/packages/data/user-api-axios/api/models/love-type-personality-type-block-data.ts @@ -0,0 +1,27 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Malmo API Documentation + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +/** + * MBTI + 설명 블록 + */ +export interface LoveTypePersonalityTypeBlockData { + /** + * personalityType + */ + personalityType?: string + /** + * 설명 + */ + description?: string +} diff --git a/packages/data/user-api-axios/api/models/love-type-personality-type-result-data.ts b/packages/data/user-api-axios/api/models/love-type-personality-type-result-data.ts new file mode 100644 index 00000000..3f58baa7 --- /dev/null +++ b/packages/data/user-api-axios/api/models/love-type-personality-type-result-data.ts @@ -0,0 +1,80 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Malmo API Documentation + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +// May contain unused imports in some cases +// @ts-ignore +import type { LoveTypePersonalityTypeBlockData } from './love-type-personality-type-block-data' +// May contain unused imports in some cases +// @ts-ignore +import type { LoveTypeTextBlockData } from './love-type-text-block-data' + +/** + * MBTI + 애착유형 상세 결과 응답 데이터 + */ +export interface LoveTypePersonalityTypeResultData { + /** + * personalityType + */ + personalityType?: string + /** + * 애착 유형 + */ + loveTypeCategory?: LoveTypePersonalityTypeResultDataLoveTypeCategoryEnum + /** + * 요약 + */ + summary?: string + /** + * 키워드 목록 + */ + keywords?: Array + /** + * 강점 목록 + */ + strengths?: Array + /** + * 약점 목록 + */ + weaknesses?: Array + /** + * 관계 패턴 목록 + */ + patterns?: Array + /** + * 애착유형 특징 목록 + */ + loveTypeFeatures?: Array + /** + * 연애 가이드 목록 + */ + datingGuides?: Array + /** + * 잘 맞는 MBTI 목록 + */ + bestMatches?: Array + /** + * 부딪히기 쉬운 MBTI 목록 + */ + worstMatches?: Array +} + +export const LoveTypePersonalityTypeResultDataLoveTypeCategoryEnum = { + StableType: 'STABLE_TYPE', + AnxietyType: 'ANXIETY_TYPE', + AvoidanceType: 'AVOIDANCE_TYPE', + ConfusionType: 'CONFUSION_TYPE', +} as const + +export type LoveTypePersonalityTypeResultDataLoveTypeCategoryEnum = + (typeof LoveTypePersonalityTypeResultDataLoveTypeCategoryEnum)[keyof typeof LoveTypePersonalityTypeResultDataLoveTypeCategoryEnum] diff --git a/packages/data/user-api-axios/api/models/love-type-personality-type-result-success-response.ts b/packages/data/user-api-axios/api/models/love-type-personality-type-result-success-response.ts new file mode 100644 index 00000000..a64a5c19 --- /dev/null +++ b/packages/data/user-api-axios/api/models/love-type-personality-type-result-success-response.ts @@ -0,0 +1,36 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Malmo API Documentation + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +// May contain unused imports in some cases +// @ts-ignore +import type { LoveTypePersonalityTypeResultData } from './love-type-personality-type-result-data' + +/** + * MBTI + 애착유형 상세 결과 조회 성공 응답 + */ +export interface LoveTypePersonalityTypeResultSuccessResponse { + /** + * 요청 ID + */ + requestId?: string + /** + * 성공 여부 + */ + success?: boolean + /** + * 응답 메시지 + */ + message?: string + data?: LoveTypePersonalityTypeResultData +} diff --git a/packages/data/user-api-axios/api/models/love-type-text-block-data.ts b/packages/data/user-api-axios/api/models/love-type-text-block-data.ts new file mode 100644 index 00000000..2018705e --- /dev/null +++ b/packages/data/user-api-axios/api/models/love-type-text-block-data.ts @@ -0,0 +1,27 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Malmo API Documentation + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +/** + * 제목 + 설명 텍스트 블록 + */ +export interface LoveTypeTextBlockData { + /** + * 제목 + */ + title?: string + /** + * 설명 + */ + description?: string +} diff --git a/packages/data/user-api-axios/api/models/member-data.ts b/packages/data/user-api-axios/api/models/member-data.ts index 0ff636e7..a14897a0 100644 --- a/packages/data/user-api-axios/api/models/member-data.ts +++ b/packages/data/user-api-axios/api/models/member-data.ts @@ -58,19 +58,20 @@ export interface MemberData { email?: string /** * 연애 상태 - * TODO: 백엔드 API 스키마 반영 후 코드 재생성 필요 */ relationshipStatus?: MemberDataRelationshipStatusEnum /** - * 내 MBTI 성향 - * TODO: 백엔드 API 스키마 반영 후 코드 재생성 필요 + * 내 MBTI */ personalityType?: string /** - * 상대방 MBTI 성향 - * TODO: 백엔드 API 스키마 반영 후 코드 재생성 필요 + * 상대방 MBTI */ otherPersonalityType?: string + /** + * 상대방 애착 유형 + */ + partnerLoveTypeCategory?: MemberDataPartnerLoveTypeCategoryEnum } export const MemberDataMemberStateEnum = { @@ -95,7 +96,6 @@ export const MemberDataLoveTypeCategoryEnum = { export type MemberDataLoveTypeCategoryEnum = (typeof MemberDataLoveTypeCategoryEnum)[keyof typeof MemberDataLoveTypeCategoryEnum] -// TODO: 백엔드 API 스키마 반영 후 코드 재생성 필요 export const MemberDataRelationshipStatusEnum = { InRelationship: 'IN_RELATIONSHIP', SeeingSomeone: 'SEEING_SOMEONE', @@ -104,3 +104,13 @@ export const MemberDataRelationshipStatusEnum = { export type MemberDataRelationshipStatusEnum = (typeof MemberDataRelationshipStatusEnum)[keyof typeof MemberDataRelationshipStatusEnum] +export const MemberDataPartnerLoveTypeCategoryEnum = { + StableType: 'STABLE_TYPE', + AnxietyType: 'ANXIETY_TYPE', + AvoidanceType: 'AVOIDANCE_TYPE', + ConfusionType: 'CONFUSION_TYPE', + Unknown: 'UNKNOWN', +} as const + +export type MemberDataPartnerLoveTypeCategoryEnum = + (typeof MemberDataPartnerLoveTypeCategoryEnum)[keyof typeof MemberDataPartnerLoveTypeCategoryEnum] diff --git a/packages/data/user-api-axios/api/models/partner-member-data.ts b/packages/data/user-api-axios/api/models/partner-member-data.ts index c0591a56..327b094f 100644 --- a/packages/data/user-api-axios/api/models/partner-member-data.ts +++ b/packages/data/user-api-axios/api/models/partner-member-data.ts @@ -13,48 +13,29 @@ */ /** - * 파트너 멤버 정보 응답 데이터 + * [Deprecated] 상대 프로필 조회 응답 데이터 */ export interface PartnerMemberData { /** - * 멤버 상태 + * 상대방 MBTI */ - memberState?: PartnerMemberDataMemberStateEnum + personalityType?: string /** - * 애착 유형 + * 상대방 애착 유형 */ loveTypeCategory?: PartnerMemberDataLoveTypeCategoryEnum /** - * 회피 비율 + * 애착 유형 설명 */ - avoidanceRate?: number - /** - * 불안 비율 - */ - anxietyRate?: number - /** - * 닉네임 - */ - nickname?: string - /** - * 디데이 변경 이력 여부 - */ - isStartLoveDateUpdated?: boolean + description?: string } -export const PartnerMemberDataMemberStateEnum = { - BeforeOnboarding: 'BEFORE_ONBOARDING', - Alive: 'ALIVE', - Deleted: 'DELETED', -} as const - -export type PartnerMemberDataMemberStateEnum = - (typeof PartnerMemberDataMemberStateEnum)[keyof typeof PartnerMemberDataMemberStateEnum] export const PartnerMemberDataLoveTypeCategoryEnum = { StableType: 'STABLE_TYPE', AnxietyType: 'ANXIETY_TYPE', AvoidanceType: 'AVOIDANCE_TYPE', ConfusionType: 'CONFUSION_TYPE', + Unknown: 'UNKNOWN', } as const export type PartnerMemberDataLoveTypeCategoryEnum = diff --git a/packages/data/user-api-axios/api/models/partner-profile-data.ts b/packages/data/user-api-axios/api/models/partner-profile-data.ts new file mode 100644 index 00000000..71fe40d1 --- /dev/null +++ b/packages/data/user-api-axios/api/models/partner-profile-data.ts @@ -0,0 +1,42 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Malmo API Documentation + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +/** + * 상대 프로필 응답 데이터 + */ +export interface PartnerProfileData { + /** + * 상대방 MBTI + */ + personalityType?: string + /** + * 상대방 애착 유형 + */ + loveTypeCategory?: PartnerProfileDataLoveTypeCategoryEnum + /** + * 애착 유형 설명 + */ + description?: string +} + +export const PartnerProfileDataLoveTypeCategoryEnum = { + StableType: 'STABLE_TYPE', + AnxietyType: 'ANXIETY_TYPE', + AvoidanceType: 'AVOIDANCE_TYPE', + ConfusionType: 'CONFUSION_TYPE', + Unknown: 'UNKNOWN', +} as const + +export type PartnerProfileDataLoveTypeCategoryEnum = + (typeof PartnerProfileDataLoveTypeCategoryEnum)[keyof typeof PartnerProfileDataLoveTypeCategoryEnum] diff --git a/packages/data/user-api-axios/api/models/partner-profile-success-response.ts b/packages/data/user-api-axios/api/models/partner-profile-success-response.ts new file mode 100644 index 00000000..a63e0dc8 --- /dev/null +++ b/packages/data/user-api-axios/api/models/partner-profile-success-response.ts @@ -0,0 +1,36 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Malmo API Documentation + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +// May contain unused imports in some cases +// @ts-ignore +import type { PartnerProfileData } from './partner-profile-data' + +/** + * 상대 프로필 등록/수정 성공 응답 + */ +export interface PartnerProfileSuccessResponse { + /** + * 요청 ID + */ + requestId?: string + /** + * 성공 여부 + */ + success?: boolean + /** + * 응답 메시지 + */ + message?: string + data?: PartnerProfileData +} diff --git a/packages/data/user-api-axios/api/models/sign-up-request-dto.ts b/packages/data/user-api-axios/api/models/sign-up-request-dto.ts index 7572a134..691b36a9 100644 --- a/packages/data/user-api-axios/api/models/sign-up-request-dto.ts +++ b/packages/data/user-api-axios/api/models/sign-up-request-dto.ts @@ -21,8 +21,6 @@ export interface SignUpRequestDto { nickname: string loveTypeId?: number relationshipStatus?: SignUpRequestDtoRelationshipStatusEnum - personalityType?: string - otherPersonalityType?: string } export const SignUpRequestDtoRelationshipStatusEnum = { diff --git a/packages/data/user-api-axios/api/models/update-member-data.ts b/packages/data/user-api-axios/api/models/update-member-data.ts index d52ad164..1f29d2bc 100644 --- a/packages/data/user-api-axios/api/models/update-member-data.ts +++ b/packages/data/user-api-axios/api/models/update-member-data.ts @@ -21,7 +21,33 @@ export interface UpdateMemberData { */ nickname?: string /** - * 이메일 + * 연애 상태 */ - email?: string + relationshipStatus?: UpdateMemberDataRelationshipStatusEnum + /** + * 내 MBTI + */ + personalityType?: string + /** + * 내 애착 유형 + */ + loveTypeCategory?: UpdateMemberDataLoveTypeCategoryEnum } + +export const UpdateMemberDataRelationshipStatusEnum = { + InRelationship: 'IN_RELATIONSHIP', + SeeingSomeone: 'SEEING_SOMEONE', + Breakup: 'BREAKUP', +} as const + +export type UpdateMemberDataRelationshipStatusEnum = + (typeof UpdateMemberDataRelationshipStatusEnum)[keyof typeof UpdateMemberDataRelationshipStatusEnum] +export const UpdateMemberDataLoveTypeCategoryEnum = { + StableType: 'STABLE_TYPE', + AnxietyType: 'ANXIETY_TYPE', + AvoidanceType: 'AVOIDANCE_TYPE', + ConfusionType: 'CONFUSION_TYPE', +} as const + +export type UpdateMemberDataLoveTypeCategoryEnum = + (typeof UpdateMemberDataLoveTypeCategoryEnum)[keyof typeof UpdateMemberDataLoveTypeCategoryEnum] diff --git a/packages/data/user-api-axios/api/models/update-member-request-dto.ts b/packages/data/user-api-axios/api/models/update-member-request-dto.ts index 2774ea4d..5a61545c 100644 --- a/packages/data/user-api-axios/api/models/update-member-request-dto.ts +++ b/packages/data/user-api-axios/api/models/update-member-request-dto.ts @@ -16,7 +16,7 @@ export interface UpdateMemberRequestDto { nickname?: string relationshipStatus?: UpdateMemberRequestDtoRelationshipStatusEnum personalityType?: string - otherPersonalityType?: string + loveTypeCategory?: UpdateMemberRequestDtoLoveTypeCategoryEnum } export const UpdateMemberRequestDtoRelationshipStatusEnum = { @@ -27,3 +27,12 @@ export const UpdateMemberRequestDtoRelationshipStatusEnum = { export type UpdateMemberRequestDtoRelationshipStatusEnum = (typeof UpdateMemberRequestDtoRelationshipStatusEnum)[keyof typeof UpdateMemberRequestDtoRelationshipStatusEnum] +export const UpdateMemberRequestDtoLoveTypeCategoryEnum = { + StableType: 'STABLE_TYPE', + AnxietyType: 'ANXIETY_TYPE', + AvoidanceType: 'AVOIDANCE_TYPE', + ConfusionType: 'CONFUSION_TYPE', +} as const + +export type UpdateMemberRequestDtoLoveTypeCategoryEnum = + (typeof UpdateMemberRequestDtoLoveTypeCategoryEnum)[keyof typeof UpdateMemberRequestDtoLoveTypeCategoryEnum] diff --git a/packages/data/user-api-axios/api/models/update-partner-profile-request-dto.ts b/packages/data/user-api-axios/api/models/update-partner-profile-request-dto.ts new file mode 100644 index 00000000..d28484c7 --- /dev/null +++ b/packages/data/user-api-axios/api/models/update-partner-profile-request-dto.ts @@ -0,0 +1,29 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Malmo API Documentation + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: v1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export interface UpdatePartnerProfileRequestDto { + personalityType?: string + loveTypeCategory?: UpdatePartnerProfileRequestDtoLoveTypeCategoryEnum +} + +export const UpdatePartnerProfileRequestDtoLoveTypeCategoryEnum = { + StableType: 'STABLE_TYPE', + AnxietyType: 'ANXIETY_TYPE', + AvoidanceType: 'AVOIDANCE_TYPE', + ConfusionType: 'CONFUSION_TYPE', + Unknown: 'UNKNOWN', +} as const + +export type UpdatePartnerProfileRequestDtoLoveTypeCategoryEnum = + (typeof UpdatePartnerProfileRequestDtoLoveTypeCategoryEnum)[keyof typeof UpdatePartnerProfileRequestDtoLoveTypeCategoryEnum] diff --git a/packages/data/user-api-axios/api/models/update-start-love-date-data.ts b/packages/data/user-api-axios/api/models/update-start-love-date-data.ts index 3dd9fa49..9d631f9c 100644 --- a/packages/data/user-api-axios/api/models/update-start-love-date-data.ts +++ b/packages/data/user-api-axios/api/models/update-start-love-date-data.ts @@ -13,7 +13,7 @@ */ /** - * 연애 시작일 갱신 응답 데이터 + * [Deprecated] 연애 시작일 갱신 응답 데이터 */ export interface UpdateStartLoveDateData { /** diff --git a/packages/data/user-api-axios/api/models/update-start-love-date-request-dto.ts b/packages/data/user-api-axios/api/models/update-start-love-date-request-dto.ts index b7fa5048..853e7f4a 100644 --- a/packages/data/user-api-axios/api/models/update-start-love-date-request-dto.ts +++ b/packages/data/user-api-axios/api/models/update-start-love-date-request-dto.ts @@ -12,6 +12,9 @@ * Do not edit the class manually. */ +/** + * [Deprecated] 연애 시작일 변경 요청 DTO + */ export interface UpdateStartLoveDateRequestDto { startLoveDate: string } diff --git a/packages/data/user-api-axios/api/models/update-start-love-date-success-response.ts b/packages/data/user-api-axios/api/models/update-start-love-date-success-response.ts index 9b100dda..127d11de 100644 --- a/packages/data/user-api-axios/api/models/update-start-love-date-success-response.ts +++ b/packages/data/user-api-axios/api/models/update-start-love-date-success-response.ts @@ -17,7 +17,7 @@ import type { UpdateStartLoveDateData } from './update-start-love-date-data' /** - * 연애 시작일 갱신 성공 응답 + * [Deprecated] 연애 시작일 갱신 성공 응답 */ export interface UpdateStartLoveDateSuccessResponse { /**