From 16b8c3a04ff8004712dea4d85be71bad4b2f0e70 Mon Sep 17 00:00:00 2001 From: KimTaeHun Date: Fri, 27 Dec 2024 16:02:57 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=94=A7UserProfile=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=EC=9D=98=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20=EC=84=A4?= =?UTF-8?q?=EB=AA=85=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/UserProfile.tsx | 81 ++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/components/UserProfile.tsx b/components/UserProfile.tsx index 68f8d60..5638524 100644 --- a/components/UserProfile.tsx +++ b/components/UserProfile.tsx @@ -8,10 +8,10 @@ import Spinner from './Spinner'; /** * UserProfile 컴포넌트 * 사용자의 프로필 정보를 표시하고 편집하는 컴포넌트 - * PC와 모바일/태블릿 환경에서 각각 다른 레이아웃으로 표시됨 + * PC, 태블릿, 모바일 환경에 따라 레이아웃이 반응형으로 변경 * - * @param data - 사용자 프로필 데이터 - * @param isEditing - 편집 모드 여부 (기본값: false) + * @param data - 사용자 프로필 데이터 객체 + * @param isEditing - 편집 모드 여부 * @param onDataChange - 데이터 변경 시 호출되는 콜백 함수 */ function UserProfile({ @@ -19,16 +19,16 @@ function UserProfile({ isEditing = false, onDataChange, }: UserProfileProps) { - // 추가 정보 영역의 펼침/접힘 상태 관리 + // 추가 정보 영역의 펼침/접힘 상태 관리 훅 const { isExpanded, toggleExpand } = useExpandedState(); - // 프로필 이미지 관련 상태와 핸들러 + // 프로필 이미지 관련 상태와 이벤트 핸들러 훅 const { - isLoading, - previewImage, - fileInputRef, - handleImageClick, - handleFileChange, + isLoading, // 이미지 로딩 상태 + previewImage, // 이미지 미리보기 URL + fileInputRef, // 파일 입력 요소 참조 + handleImageClick, // 이미지 클릭 핸들러 + handleFileChange, // 파일 변경 핸들러 } = useProfileImage((url) => onDataChange('image', url)); /** @@ -36,7 +36,7 @@ function UserProfile({ * 편집 모드에서는 입력 필드로, 조회 모드에서는 텍스트로 표시 * * @param label - 필드 레이블 - * @param field - 데이터 객체의 키 + * @param field - data 객체의 키값 * @returns 렌더링된 필드 컴포넌트 */ const renderField = (label: string, field: keyof typeof data) => { @@ -60,9 +60,9 @@ function UserProfile({ }; return ( - // 메인 컨테이너 -
- {/* 레이아웃 컨테이너: PC에서는 세로, 모바일/태블릿에서는 가로 배치 */} + // 최상위 컨테이너: 전체 프로필 카드를 감싸는 요소 +
+ {/* 레이아웃 컨테이너: 화면 크기에 따라 세로/가로 배치가 변경됨 */}
@@ -77,32 +77,35 @@ function UserProfile({ type="button" disabled={isLoading} > - {/* 프로필 이미지 표시 */} - Profile - {/* 편집 모드일 때 이미지 위에 오버레이 표시 */} + > + {/* 프로필 이미지 */} + Profile +
{isEditing && (
{isLoading ? ( ) : ( - // 카메라 아이콘 표시 Edit photo )} - {/* 숨겨진 파일 입력 필드 */} + {/* 숨겨진 파일 입력 필드: 실제 파일 선택 다이얼로그를 위한 요소 */}
- {/* 프로필 정보 섹션 */} + {/* 프로필 정보 섹션: 사용자 정보를 표시하는 영역 */}
- {/* 기본 정보 영역 */} + {/* 기본 정보 영역: 항상 표시되는 필수 정보들 */}
- {/* 추가 정보 영역 - 편집 모드와 조회 모드에서 다르게 표시 */} + {/* 추가 정보 영역: 편집 모드와 조회 모드에서 다르게 표시 */} {isEditing ? ( // 편집 모드: 모든 필드를 그리드로 표시
@@ -153,7 +157,6 @@ function UserProfile({ {renderField('혈액형', 'bloodType')} {renderField('국적', 'nationality')} {renderField('가족관계', 'family')} - {renderField('자기소개', 'content')}
) : ( // 조회 모드: PC와 모바일/태블릿에서 다르게 표시 @@ -161,7 +164,7 @@ function UserProfile({ {/* 모바일/태블릿용 펼침/접힘 섹션 */}
{!isExpanded ? ( - // 접힌 상태: 펼치기 버튼 + // 접힌 상태: 펼치기 버튼 표시
) : ( - // 펼친 상태: 추가 정보와 접기 버튼 + // 펼친 상태: 추가 정보와 접기 버튼 표시
{renderField('SNS 계정', 'sns')} @@ -202,7 +205,7 @@ function UserProfile({ )}
- {/* PC용 추가 정보 섹션 - 항상 표시 */} + {/* PC용 추가 정보 섹션: 항상 표시 */}
{renderField('SNS 계정', 'sns')} {renderField('생일', 'birthday')} From 4cfe1f0066144da57edd564abc707c8d4d14dd89 Mon Sep 17 00:00:00 2001 From: Kim Tae Hun <135201712+horororok@users.noreply.github.com> Date: Fri, 27 Dec 2024 17:31:12 +0900 Subject: [PATCH 2/2] =?UTF-8?q?:sparkles:=20=EB=A8=B8=EC=A7=80=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/UserProfile.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/components/UserProfile.tsx b/components/UserProfile.tsx index 71a4476..b49e432 100644 --- a/components/UserProfile.tsx +++ b/components/UserProfile.tsx @@ -60,7 +60,6 @@ function UserProfile({ }; return ( - // 메인 컨테이너
{/* 레이아웃 컨테이너: PC에서는 세로, 모바일/태블릿에서는 가로 배치 */}