- DownloadSection loadInfo useCallback 래핑
- DownloadAdmin reload 중복 → 단일 load 함수
- LoginPage/RegisterPage 에러 메시지 role="alert"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 회원가입 username 검증을 서버와 동일하게 맞춤
- 비밀번호 maxLength를 bcrypt 제한(72)에 맞춤
- 공지사항 줄바꿈 CSS 처리 (pre→white-space)
- 어드민 페이지 에러 로깅 추가
- 다운로드 섹션 로딩 스켈레톤 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 로그인/회원가입 입력 길이 제한 (username 50자, password 100자)
- 공지사항 관리 입력 길이 제한 (제목 200자, 내용 10000자)
- AnnouncementBoard aria-expanded 접근성 속성 추가
- DownloadSection useEffect 중복 API 호출 제거
- nginx 보안 헤더 (X-Content-Type-Options, X-Frame-Options)
- nginx /assets/ 장기 캐싱 (immutable, 1년)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- refreshToken 중복 로직 일원화 (동시 호출 방지 포함)
- 파일 업로드 401 시 토큰 갱신 후 재시도 추가
- XHR JSON.parse 에러 보호
- index.html lang="ko", title "One of the plans" 변경
- Vite 기본 에셋(vite.svg, react.svg) 및 빈 App.css 제거
- 공지 CRUD API 레이어 분리 (AnnouncementAdmin → announcements.js)
- load 함수 useCallback 적용 및 useEffect 의존성 정상화
- 로딩/빈 목록 상태 표시 추가 (AnnouncementBoard, UserAdmin)
- 누락 CSS 정의 추가 (announcement-error, announcement-empty)
- 로그인/회원가입 빈 필드 클라이언트 검증 추가
- 공지 등록 시 빈 제목/내용 에러 피드백 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- DownloadSection에 a301:// 커스텀 URI로 게임 실행하는 버튼 추가
- AuthContext에서 createContext와 useAuth 훅을 별도 파일로 분리하여 react-refresh 린트 에러 해결
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- RegisterPage 추가 (아이디/비밀번호/비밀번호 확인 폼, 클라이언트 유효성 검사)
- /register 라우트 추가 (로그인 상태 시 홈 리다이렉트)
- 로그인 페이지에 회원가입 링크 및 가입 완료 안내 메시지 추가
- api/auth.js에 register() 함수 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- React Router v7: public home page, /login page
- Auth context with JWT localStorage management
- Login: ID/PW form + SSAFY login button (UI only)
- Home: hero banner, download section (login required), announcement board
- API layer with mock data (ready for Go Fiber backend)
- Color scheme: #2E2C2F dark + #BACDB0 accent
- Add .env.example for environment variable reference
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>