diff --git a/DATA_MODELS.md b/DATA_MODELS.md index 976aa80..2f535dd 100644 --- a/DATA_MODELS.md +++ b/DATA_MODELS.md @@ -166,9 +166,6 @@ interface FirestoreUser { // 관리자 isAdmin?: boolean; - // 개인 정보 - birthYear?: number; // 생년 (나이 계산용, 예: 2015) - // 시스템 계정 (교사 대리 생성) loginId?: string; // 로그인용 아이디 (시스템 계정만) isSystemAccount?: boolean; // 교사가 대리 생성한 계정 @@ -176,6 +173,10 @@ interface FirestoreUser { } ``` +> **학년은 유저에 없다.** 학년의 유일한 출처는 `Team.grade`이고, 커리큘럼 후보도 이 값으로 +> 고른다. 예전에는 `birthYear`를 받아 학년을 역산했지만 그 값을 읽는 곳이 없어 제거했다 +> (2026-08-11). 학생에게 학년을 묻는 화면(로그인 후 팝업·가입 폼·마이페이지)도 함께 사라졌다. + ### User 스키마 (UI 표시용 — Firebase Auth + Firestore 결합) ```typescript @@ -212,7 +213,6 @@ interface TeacherApproval { "createdAt": "2024-10-28T00:00:00Z", "lastLoginAt": "2024-10-28T10:00:00Z", "role": "student", - "birthYear": 2015, "settings": { "language": "ko", "weeklyGoal": { diff --git a/ROADMAP.md b/ROADMAP.md index 96158f3..92adc23 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -160,6 +160,9 @@ | **의존성 업데이트** | **@ark-ui/react 및 @zag-js 패키지 버전 업데이트 (v1.29.1 → v1.31.1)** | **2025-12-19** | | **인터랙션 페이지 UX 대폭 개선** | **7:3 그리드 레이아웃 (이미지 70%, 컨트롤러 30%), 한 화면에서 이미지 보면서 편집 가능, 컨트롤러 내부 스크롤 (커스텀 스크롤바), InteractionHeader 컴포넌트 (IntersectionObserver + Sentinel 패턴, sticky header, glassmorphism 효과, 제목 크기 동적 변경 2xl→xl, 버튼 텍스트 숨김), framer-motion 애니메이션 (AnimatePresence, MotionBox/MotionVStack, 모드 전환/영역 선택 부드러운 전환, 0.2~0.3초 ease curve), 영역 목록을 일반 모드에서도 표시 (CustomAreaList, 고급 모드에서만 CustomParameterPanel), 에디터 버튼 우측 패널 상단 이동 (추가/삭제/숨기기, 가로 배치 flex:1), Container maxW 확장 (1400px→95vw), 이미지 반응형 수정 (InteractiveImageViewer width:100%, VStack maxH 제거, aspectRatio 충돌 해결), 높이 제한 80dvh (우측만 스크롤), 타입 체크 통과** | **2025-12-24** | | **학생 QR 로그인** | **로그인 페이지 아이디/QR 탭 전환 + QrLoginScanner(인라인)(getUserMedia + jsQR 동적 import·640px 축소·10fps 제한, BarcodeDetector는 Windows/Linux 데스크톱 미지원이라 채택하지 않음), qrLoginCodec.ts(rn1: 접두사 + base64 페이로드, 잘못된 입력은 null 반환), 실패 단일 출구(권한 거부·미지원·인식 실패·로그인 실패 → "직접 입력하기"), 카메라 불가 환경에서는 QR 탭 미렌더 + 사유 콘솔 출력, 신규 백엔드 0(authStore.login의 loginId 경로 재사용), 다국어 지원 (ko/en/ja)** | **2026-08-10** | +| **선생님 닉네임 입력·수정** | **교사 가입 폼의 "이름" 칸을 "닉네임"으로 전환(별도 필드 신설 없이 Firebase Auth displayName을 그대로 씀 — 교사 홈 인사말과 학생 팀 페이지의 "선생님: OOO"가 이미 이 값을 읽는다), 구글 가입은 SNS 역할 확인 화면에 닉네임 칸을 추가하고 구글이 준 이름으로 프리필(교사만·필수), completeGoogleSignup(role, nickname) 확장 + Auth 갱신 후 reload로 고친 이름 반영, 마이페이지 기본정보에 선생님 전용 닉네임 수정 칸(빈 값 저장 차단·저장 후 스토어 갱신으로 즉시 반영), 학생은 팀별 닉네임 체계를 그대로 유지, 다국어 지원 (ko/en/ja)** | **2026-08-11** | +| **학년 온보딩 팝업 및 birthYear 필드 제거** | **로그인 후 학년을 묻던 BirthYearOnboardingModal 삭제(BirthYearSelector·utils/grade.ts 동반 삭제), 학생 가입 폼의 학년 선택과 마이페이지 학년 편집 제거, FirestoreUser.birthYear·Team.defaultBirthYear·API/서버/Manager 경유 필드 전면 제거, 고아 번역 키 42줄 정리(ko/en/ja), 기능 손실 없음 — 학년의 유일한 출처는 Team.grade이고 birthYear를 학년으로 바꾸던 getEffectiveGrade()는 호출부가 없었음, DATA_MODELS.md 갱신** | **2026-08-11** | +| **학생 화면 고객센터 위젯 숨김** | **ChannelTalkWidget을 학생 계정에서 렌더하지 않음(고객센터는 교사·관리자 창구, 학생의 질문 상대는 담당 교사), 루트 레이아웃에 달린 위젯이라 판단은 컴포넌트 내부에서 1회, userRole 단독 판정 금지(스토어가 비로그인에도 기본값 "student"를 반환 → 랜딩에서도 사라짐)이라 isAuthenticated 병행, isLoading 가드로 초기 렌더 깜빡임 제거(역할 확정 후 isLoading이 내려가는 authStore 설계 활용), 미사용 레거시 src/components/ChannelTalkWidget.tsx 삭제** | **2026-08-11** | | **엑셀 배포용 QR 카드 시트** | **memberCredentialExcel.ts 시트 2분할(학생 계정=교사 보관 · 배포용 QR=이름+QR만 잘라서 배포 — 한 장이면 자를 때 비밀번호가 따라 잘려 나감), qrImage.ts 신설(uqr 행렬 → 캔버스 → PNG base64, exceljs는 SVG 미지원), 인쇄 기준 상수(모듈 6px·여백 4모듈·ECC M), 셀 좌표 앵커에 맞춘 행 높이/열 너비 환산, 안내 문구 A1:G1 병합, 성공 계정만 카드 생성, uqr 직접 의존성 승격, 다국어 지원 (ko/en/ja)** | **2026-08-11** | | **학생 계정 결과 통합 + 엑셀 내보내기** | **MemberCredentialResult 신설 (계정 생성 결과 표 + 비밀번호 1회성 경고 + .xlsx 내보내기), 팀 만들기 성공 모달과 팀 설정 일괄 생성기가 같은 컴포넌트 사용, memberCredentialExcel.ts (브라우저 생성 · exceljs 동적 import · 아이디 문자열 셀 고정 · QR 열 확장 여지), BulkMemberCreator 4단계 스텝/카드 인쇄 제거해 단일 화면화, 고아 컴포넌트 26개 및 미사용 i18n 키 14개 정리, 다국어 지원 (ko/en/ja)** | **2026-08-10** | | **글쓰기 플로우 단순화** | **/write 커리큘럼 파라미터 자동 리다이렉트, NextAssignmentCard (홈 다음 과제 카드), WritingModeSelector 2단계→1단계 단순화 (토글+카드), TopicSelector 인라인 변형 (variant="inline"), 전체 에디터 페이지 topicId searchParam 처리, 다국어 지원 (ko/en/ja)** | **2026-03-09** |