Skip to content

feat: 프로필 이미지 업로드 및 UI 개선#3

Merged
bbbang105 merged 3 commits intodevfrom
feature/profile-upload-and-ui
Feb 23, 2026
Merged

feat: 프로필 이미지 업로드 및 UI 개선#3
bbbang105 merged 3 commits intodevfrom
feature/profile-upload-and-ui

Conversation

@bbbang105
Copy link
Copy Markdown
Owner

@bbbang105 bbbang105 commented Feb 23, 2026

Summary

  • Supabase Storage를 활용한 프로필 이미지 파일 업로드 기능 추가
  • 헤더 우측 사용자 드롭다운 메뉴 구현 (프로필 수정, 로그아웃)
  • 사이드바/헤더 레이아웃 개선 및 프로필 관련 UI 통일

Changes

1. Supabase Auth 연동 및 코드 정리

  • Discord OAuth 콜백 라우트 추가
  • /api/auth/me에 Supabase userId 반환 추가
  • 온보딩 API 검증 로직 강화
  • 파트 설정 모듈 분리 (part-config.ts) — 파트별 색상 칩 지원
  • 미사용 봇 커맨드(/참가) 정리

2. Supabase Storage 프로필 이미지 업로드

  • 새 파일: lib/storage.tsuploadAvatar() 유틸리티 (2MB 제한, JPG/PNG/WebP)
  • 새 컴포넌트: avatar-upload.tsx — 드래그&드롭, 미리보기, 로딩 스피너, 에러 표시
  • 온보딩 Step 3: URL 텍스트 입력 → <AvatarUpload> 파일 업로드로 교체
  • 프로필 수정: URL 텍스트 입력 → <AvatarUpload> 파일 업로드로 교체
  • 프로필 수정에 파트 변경 기능 추가
  • 자기소개 통일: 최소 100자 / 최대 200자, textarea로 변경
  • 관심사 통일: 온보딩과 동일한 한글 옵션, 최소 3개 / 최대 6개, 직접 입력 제거
  • 프로필 수정 API에 part 필드 및 자기소개 100자 미만 검증 추가

3. 헤더/사이드바 UI 개선

  • 헤더 우측 아바타 클릭 → 드롭다운 메뉴 (이름, 이메일, 프로필 수정, 로그아웃)
  • 로고(BS Blog Study)를 사이드바 → 헤더로 이동, 클릭 시 대시보드 이동
  • 모바일 사이드바에도 로고 표시
  • 사이드바에서 프로필 메뉴 제거 (드롭다운으로 대체)
  • 사이드바 폰트 크기 및 간격 확대 (text-sm → text-[15px], 아이콘 18px)
  • 프로필 페이지 이메일 미인증 표시 제거 (Discord OAuth 자체가 인증)
  • 한줄 소개자기소개 명칭 통일 (프로필, 멤버 상세, API 전부)
  • Tailwind contentsrc/lib/** 추가 (파트 칩 색상 purge 방지)
  • 기획자 파트 라벨 → Planner 영문화

사전 작업 (Supabase 대시보드)

이미지 업로드 기능 사용 전 필요:

  1. Storage → avatars 버킷 생성 (Public)
  2. SQL Editor에서 RLS 정책 실행:
CREATE POLICY "Authenticated users can upload avatars"
ON storage.objects FOR INSERT TO authenticated
WITH CHECK (bucket_id = 'avatars');

CREATE POLICY "Anyone can view avatars"
ON storage.objects FOR SELECT TO public
USING (bucket_id = 'avatars');

CREATE POLICY "Users can update own avatars"
ON storage.objects FOR UPDATE TO authenticated
USING (bucket_id = 'avatars');

CREATE POLICY "Users can delete own avatars"
ON storage.objects FOR DELETE TO authenticated
USING (bucket_id = 'avatars');

Test plan

  • pnpm typecheck 통과
  • pnpm build 통과
  • 온보딩 Step 3 → 이미지 파일 업로드 → 미리보기 확인
  • 프로필 수정 → 이미지 변경 → 저장 후 프로필 페이지 반영 확인
  • 프로필 수정 → 파트 변경 → 저장 후 칩 색상 반영 확인
  • 관심사 6개 초과 선택 불가, 3개 미만 시 저장 버튼 비활성화 확인
  • 자기소개 100자 미만 시 저장 버튼 비활성화 확인
  • 헤더 아바타 클릭 → 드롭다운 메뉴 → 프로필 수정 이동 확인
  • 헤더 아바타 클릭 → 드롭다운 메뉴 → 로그아웃 동작 확인
  • 헤더 로고 클릭 → 대시보드 이동 확인
  • 모바일 사이드바 → 로고 표시 및 클릭 동작 확인
  • 파트 칩 색상 정상 표시 (Tailwind purge 안 됨)

🤖 Generated with Claude Code

bbbang105 and others added 3 commits February 24, 2026 01:48
- Discord OAuth 콜백 라우트 추가
- /api/auth/me에 userId 반환 추가
- 온보딩 API 검증 로직 강화
- 파트 설정 모듈 분리 (part-config.ts)
- 미사용 봇 커맨드 정리

Co-Authored-By: Claude <noreply@anthropic.com>
- 아바타 업로드 유틸리티 추가 (2MB, JPG/PNG/WebP 제한)
- AvatarUpload 컴포넌트 추가 (드래그&드롭, 미리보기, 로딩)
- 온보딩 Step 3 URL 입력 → 파일 업로드로 교체
- 프로필 수정 페이지 URL 입력 → 파일 업로드로 교체
- 프로필 수정에 파트 변경, 자기소개(100~200자), 관심사(3~6개) 통일
- 프로필 수정 API에 파트 필드 및 자기소개 100자 검증 추가

Co-Authored-By: Claude <noreply@anthropic.com>
- 헤더 우측 아바타 클릭 시 드롭다운 메뉴 (프로필 수정, 로그아웃)
- 로고를 사이드바에서 헤더로 이동, 클릭 시 대시보드 이동
- 모바일 사이드바에도 로고 표시
- 사이드바에서 프로필 메뉴 제거 (드롭다운으로 대체)
- 사이드바 폰트 크기 및 간격 확대
- 프로필 페이지 이메일 미인증 표시 제거
- 한줄 소개 → 자기소개 명칭 통일
- Tailwind content에 lib 경로 추가 (파트 칩 색상 적용)

Co-Authored-By: Claude <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel bot commented Feb 23, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
study-admin-web Ready Ready Preview, Comment Feb 23, 2026 4:49pm

@bbbang105 bbbang105 added the 🚀 feat 새로운 기능 추가 / 일부 코드 추가 / 일부 코드 수정 (리팩토링과 구분) / 디자인 요소 수정 label Feb 23, 2026
@bbbang105 bbbang105 marked this pull request as ready for review February 23, 2026 16:50
@bbbang105 bbbang105 merged commit 94d99bf into dev Feb 23, 2026
9 checks passed
@bbbang105 bbbang105 deleted the feature/profile-upload-and-ui branch February 23, 2026 16:57
choihooo added a commit that referenced this pull request Mar 10, 2026
P0 #3 문제 해결 - 출석 상태 업데이트 누락:
- RSS 콜백에서 새 글 생성 후 출석 상태 업데이트
- 회차 마감일 이후 제출 시 지각(LATE) 처리
- 지각 시 벌금 3,000원 자동 부과 및 DM 발송
- 정상 제출 시 SUBMITTED 상태로 변경

P0 #4 문제 해결 - 결석/지각 벌금 콜백 미설정:
- attendanceChecker에 결석 콜백 설정
- 화요일 00:00 결석 판정 시 자동으로 벌금 5,000원 부과
- 결석 벌금 DM 알림 자동 발송

변경 사항:
- scheduler-registry.ts: RSS 콜백에 출석 상태 업데이트 로직 추가
- 지각 판단: item.pubDate > round.endDate (23:59:59.999)
- 결석 콜백: setOnAbsentCallback()으로 벌금 생성 및 알림 발송

동작 흐름:
1. RSS 폴러가 새 글 발견
2. 글 저장 + 출석 상태 업데이트 (SUBMITTED 또는 LATE)
3. 지각인 경우 벌금 생성 + DM 발송
4. 화요일 00:00 출석 체크
5. 결석자 벌금 생성 + DM 발송

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
choihooo added a commit that referenced this pull request Mar 10, 2026
* feat: RSS 수집 시 출석 상태 업데이트 및 결석/지각 벌금 자동 부과

P0 #3 문제 해결 - 출석 상태 업데이트 누락:
- RSS 콜백에서 새 글 생성 후 출석 상태 업데이트
- 회차 마감일 이후 제출 시 지각(LATE) 처리
- 지각 시 벌금 3,000원 자동 부과 및 DM 발송
- 정상 제출 시 SUBMITTED 상태로 변경

P0 #4 문제 해결 - 결석/지각 벌금 콜백 미설정:
- attendanceChecker에 결석 콜백 설정
- 화요일 00:00 결석 판정 시 자동으로 벌금 5,000원 부과
- 결석 벌금 DM 알림 자동 발송

변경 사항:
- scheduler-registry.ts: RSS 콜백에 출석 상태 업데이트 로직 추가
- 지각 판단: item.pubDate > round.endDate (23:59:59.999)
- 결석 콜백: setOnAbsentCallback()으로 벌금 생성 및 알림 발송

동작 흐름:
1. RSS 폴러가 새 글 발견
2. 글 저장 + 출석 상태 업데이트 (SUBMITTED 또는 LATE)
3. 지각인 경우 벌금 생성 + DM 발송
4. 화요일 00:00 출석 체크
5. 결석자 벌금 생성 + DM 발송

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: 코드 리뷰 사항 반영 (타임존, 주석, import 순서)

Priority 1 & 2 수정 사항:
1. 타임존 명시: roundEndDate 생성 시 KST (+09:00) 명시
2. 중복 방지 로직 주석 추가: markLate/markSubmitted/fineService.create 내부 로직 설명
3. Import 순서 정리: @blog-study/shared/db를 상단으로 이동

기존 로직 확인:
- FineService.create(): 이미 내부에서 getByMemberAndRound() 체크 후 중복 시 기존 벌금 반환
- AttendanceService.markLate/markSubmitted(): 이미 PENDING 상태일 때만 업데이트

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🚀 feat 새로운 기능 추가 / 일부 코드 추가 / 일부 코드 수정 (리팩토링과 구분) / 디자인 요소 수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant