Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion app.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
"plugins": ["expo-router"],
"web": {
"bundler": "metro",
"output": "single"
"output": "single",
"favicon": "./assets/images/favicon.png"
},
"ios": {
"supportsTablet": true
Expand Down
Binary file added assets/images/favicon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
37 changes: 37 additions & 0 deletions assets/images/favicon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
65 changes: 65 additions & 0 deletions assets/images/record-success.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
94 changes: 94 additions & 0 deletions assets/images/session-logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
94 changes: 94 additions & 0 deletions assets/images/session-success.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
42 changes: 42 additions & 0 deletions docs/makeup-coordination.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# T-12 휴강 등록·보강 조율

첨부 안내에 따라 임시 일정 홈은 구현하지 않았습니다. 독립 미리보기의 빈 배경 위에 바텀시트만 렌더링합니다.

## 동작

- 휴강하고 보강 날짜 받기: 휴강 등록 콜백 성공 후 후보 선택 단계로 이동
- 이미 휴강한 T-10 완료 화면의 보강 조율하기: 후보 단계로 바로 이동
- 후보 1은 기본 항목으로 삭제 버튼이 없고, 후보 2·3에만 삭제 버튼 표시
- 최대 3개, 추가·삭제 후 번호 및 CTA 개수 갱신
- 날짜 필드 터치 후 달력 선택, 시간 선택(30분 단위), 유효한 날짜·시간 검사 및 중복 후보 차단
- 날짜·시간이 빠지거나 수신 동의가 없으면 공유 비활성화
- 저장·공유 처리 중에는 입력·추가·삭제·취소·배경 닫기 차단
- 실패 시 후보와 입력 유지 및 재시도
- 시간만 바꾸기는 날짜를 유지하는 별도 시간 변경 콜백
- 달력/시간 선택을 취소하면 기존 후보 입력 유지

## API 연결 경계

`MakeupSheet`에 `MakeupLesson`과 `MakeupActions`를 전달합니다. API·카카오 SDK·실제 수신자 선택/전송은 미확정으로 연결하지 않았습니다. `previewActions.ts`만 지연·실패 예시를 생성합니다.

카카오 공유 창 열림과 실제 전송 완료는 구분합니다. 공유 결과는 opened/cancelled/unavailable로 처리하며 미리보기는 실제 메시지를 보냈다고 표시하지 않습니다. 실제 서버가 휴강 등록을 완료한 후 후보 선택을 취소해도 이미 등록된 휴강을 자동으로 취소하지 않습니다.

후보 날짜의 과거 허용 여부·수업 전 보강 가능 여부·시간 간격은 API/기획 확인이 필요합니다. 현재 날짜의 유효성과 중복만 검사하며 임의로 과거 날짜를 제한하지 않습니다.

## 개발 경로

- `/dev/makeup-coordination`: 최초 바텀시트
- `?scenario=loading`: 휴강 등록 처리 중 3초 대기
- `?scenario=error`: 첫 처리 실패 후 재시도 성공
- `?step=candidates`: 빈 후보 1개로 시작
- `?step=candidates&count=1`: 유효한 후보 1개
- `?step=candidates&count=2`: 후보 2개, 후보 2에만 삭제 버튼
- `?step=candidates&count=3`: 최대 3개
- `?step=candidates&count=1&scenario=error`: 첫 공유 실패 후 재시도
- `?step=candidates&count=1&scenario=share-cancelled`: 공유 취소 안내
- `?step=candidates&count=1&consent=no`: 수신 동의 없음
- `/dev/session-complete`의 보강 조율하기에서도 연결됨

개발 전용 진입점은 production에서 홈으로 이동합니다. 실제 일정 화면의 이벤트 연결은 담당 화면에서 콜백을 연결해야 합니다.

날짜 필드 안의 별도 달력 아이콘은 표시하지 않습니다. 날짜 필드 전체를 누르면 달력이 열리고, 시간 필드는 시간 선택이 열립니다. 일정 홈은 담당 화면에서 시트를 호출하는 방식으로 연결합니다.
20 changes: 20 additions & 0 deletions docs/profile-input.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# T-03 프로필 입력

새 T-03 SVG 기준으로 프로필 화면을 분리했습니다.

- 공통 TextInput, Chip, ActionButton, Loading 및 디자인 토큰 재사용
- 이름: 앞뒤 공백 제거 기준 2~10자, 최대 입력 길이 10자. 빈 값·한 글자·공백만 입력 시 완료 비활성화
- 과목: 선택 사항, 복수 선택 및 해제 가능. 390px 시안에서는 한 줄 배치, 작은 화면에서는 줄바꿈
- 완료: 로컬 상태를 반영하고 기존 흐름대로 `/home` 이동
- 설정의 수정: 기존 값 표시, 저장 후 설정으로 복귀
- 저장 중: 공통 로딩 및 버튼 점 표시, 입력·과목 선택·중복 제출 차단
- 저장 실패: 입력 유지 및 재시도 안내. 완료 버튼으로 재시도
- API 미확정이므로 실제 서버 저장은 연결하지 않았습니다. `onSave`로 추후 확정된 API를 연결합니다.

## 개발 미리보기

- `/dev/profile`: 빈 입력 및 검증
- `/dev/profile?scenario=loading`: 김나연·영어 선택. 완료 시 3초간 저장 중 표시 후 홈 이동
- `/dev/profile?scenario=error`: 첫 저장 실패 후 완료 버튼 재시도 시 성공

시나리오의 지연·오류는 개발 경로에만 있으며 production은 실제 프로필 경로로 전환됩니다.
Binary file added docs/screenshots/makeup-action.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/makeup-one.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/makeup-three.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/profile.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/terms.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
48 changes: 48 additions & 0 deletions docs/session-record.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# T-10 회차 기록 · 휴강 시트 · 휴강 완료

## 구현 범위

제공된 회차 기록 6개, 휴강 시트 2개, 휴강 완료 2개 SVG를 기준으로 구현했습니다. 홈·과외 생성 등 다른 담당 화면은 수정하지 않았습니다.

- `SessionRecordScreen`: 교재별 진도, 직접 입력, 새 교재 등록·삭제, 이해도, 지난 숙제 수행, 다음 숙제, 관찰 한줄
- 교재 진도(또는 안 함), 이해도, 지난 숙제 수행이 필수입니다. 등록 중인 교재가 있으면 저장을 막습니다.
- 지난 진도가 없는 교재는 제안 칩 대신 직접 입력을 표시합니다. 교재가 하나도 없는 경우 등록 폼으로 시작합니다.
- 새 교재는 이름과 진도 단위를 입력해 등록하며 시작 진도는 선택 사항입니다. API 확정 전 화면 입력 규칙입니다.
- 저장 중 입력·선택·중복 제출 차단, 실패 시 전체 입력 유지 및 다시 저장
- `CancellationSheet`: 사유 단일 선택, 배경 터치·기기 뒤로 가기로 닫기, 저장 중 닫기 차단, 실패 후 재시도
- `CancellationComplete`: 저장 결과의 인정 회차·사유 표시, 학부모 수신 동의가 없으면 보강 조율 버튼 미노출
- `ActionButton`, `Chip`, `TextInput`, `Loading` 재사용. 균등 폭 선택 그룹과 유동 폭 진도 막대는 별도 구현했습니다. 공통 SelectButton·ProgressBar는 고정 너비라 이 화면 배치와 맞지 않습니다.

## API와 다른 화면 연결

실제 API·저장·알림 발송·보강 일정 생성은 연결하지 않았습니다. 서비스에서 사용할 때 `LessonContext`, `onSaveRecord`, `onSaveCancellation`, `onHome`, `onCoordinate`를 전달합니다. 저장 콜백은 필수이며 암묵적으로 성공을 반환하지 않습니다. `CancellationResult`의 회차 인정·누적 회차는 백엔드 응답을 연결하도록 구분했습니다.

화면 모델은 백엔드 계약이 아닙니다. `preview.tsx`만 확인용 학생·교재·날짜와 지연/실패를 생성합니다. 회차 인정 예시는 SVG 문구에 따라 학생 당일 취소 + 인정 정책인 경우만 증가합니다. 실제 정책은 백엔드 확인이 필요합니다. 시안의 숫자는 예시이므로 완료 화면의 숫자는 전달받은 결과를 표시합니다.

## 개발 전용 확인 경로

- `/dev/session-record`: 첫 수업, 시안의 선택 예시
- `/dev/session-record?variant=blank`: 필수 항목 미선택, 저장 비활성
- `/dev/session-record?variant=empty`: 교재·지난 진도 없음, 직접 등록/입력
- `/dev/session-record?variant=later`: 2회차
- `/dev/session-record?variant=direct`: 다음 숙제 직접 입력
- `/dev/session-record?scenario=loading`: 저장 시 3초 로딩
- `/dev/session-record?scenario=error`: 첫 저장 실패, 다시 저장 성공
- `/dev/session-cancellation`: 사유 미선택 시트
- `/dev/session-cancellation?scenario=loading`: 사유 선택 후 저장 중
- `/dev/session-cancellation?policy=count`: 학생 당일 취소 시 회차 인정 예시
- `/dev/session-cancellation?scenario=error`: 첫 저장 실패 후 재시도
- `/dev/session-complete`: 수신 동의 있는 완료 화면
- `/dev/session-complete?consent=no`: 학부모 수신 동의 전
- `/dev/session-complete?policy=count&reason=sameDay`: 회차 인정 예시

모든 개발 경로는 production에서 `/home`으로 이동합니다. 실제 저장 성공·메시지 전송을 검증하는 기능이 아닙니다. 새 기능은 로그인·홈 흐름에 연결하지 않았습니다.

## 기록 완료 화면 v4

- 수업 저장 성공 시 팝업 대신 RecordComplete로 이동합니다. 실패 시에는 입력 화면을 유지합니다.
- `/dev/session-record-complete`: 4회차 완료·인정 8/8·정산 준비 완료 예시를 바로 확인합니다.
- 완료 회차·학생명·숙제는 전달된 데이터로 표시하며 정산 준비 여부는 저장 결과의 reportReady를 따릅니다.
- 다음 숙제가 없으면 학생용 카카오 공유 버튼을 비활성화합니다. 정산이 준비되지 않으면 정산 리포트 버튼을 비활성화합니다.
- 카카오 SDK·공유 템플릿·홈 알림 저장·정산 리포트 생성은 미연결입니다. 미리보기 버튼은 미연동 안내만 표시하며 실제 공유·청구를 수행하지 않습니다.
- 실제 서비스 연결 시 onShare 및 onReport 콜백을 전달해야 합니다.
24 changes: 24 additions & 0 deletions docs/terms-consent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# T-02 약관 동의 구현

- `/terms`: 실제 가입 흐름의 약관 화면. API 미확정 상태로 서버 요청 없이 메모리의 동의 상태를 반영하고 `/profile`로 이동합니다.
- 동의 전 다음 버튼은 비활성화됩니다. 개별 동의와 전체 동의를 양방향으로 동기화합니다.
- 공통 `ActionButton`, `Loading`, 색상·간격·타이포그래피 토큰을 재사용합니다.
- 약관 원문은 제공되지 않아 보기 버튼에서 미등록 안내를 표시합니다. 실제 법적 동의 및 저장 구현이 완료된 상태는 아닙니다.
- `TermsScreen.onSave`는 확정된 API를 연결하기 위한 비동기 경계입니다. 입력은 화면 내부 모델이며 백엔드 요청 형식이 아닙니다. 약관 버전·동의 시각 등 요청 규격은 명세 확정 후 연결합니다.
- 저장 실패 시 선택 상태를 유지하고 오류 안내 및 다시 시도 버튼을 표시합니다. 중복 요청을 막고 화면 종료 시 AbortSignal로 취소를 전달합니다.

## 개발 중 미리보기

개발 서버에서만 접근할 수 있으며 production에서는 `/terms`로 이동합니다.

- `/dev/terms`: 정상 선택 및 저장 성공 (650ms 후 프로필 이동)
- `/dev/terms?scenario=loading`: 전체 선택 후 시작. 다음 버튼을 누르면 3초간 공통 로딩 표시 후 성공
- `/dev/terms?scenario=error`: 전체 선택 후 시작. 첫 제출은 실패, 다시 시도는 성공

대기와 실패는 미리보기 전용이며 실제 가입 화면에는 인위적인 네트워크 지연을 추가하지 않았습니다.

## 확인할 사항

- 정상/저장 중/오류 SVG 기준 구현. OS 상태바는 실제 시스템 표시를 사용하고 정적 시각·배터리를 그리지 않습니다.
- 미선택 상태 CTA는 필수 동의 차단을 위해 공통 비활성 스타일을 사용합니다.
- 약관 원문과 동의 저장 API는 후속 연결이 필요합니다.
Loading
Loading