diff --git a/components/UserProfile.tsx b/components/UserProfile.tsx index a0e4087..b49e432 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) => { @@ -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')}