iOS Pomodoro & Routine App with SwiftUI and Combine.
- 집중을 위한 심플하고 직관적인 타이머 제공
- 손가락 제스처를 이용한 빠르고 쉬운 시간 설정
- 최소한의 UI로 방해 요소 제거
- 기본 시간: 60분, 최대 180분 설정 가능
- 손가락 제스처를 사용하여 다이얼 방식으로 시간 조정
- 시작 / 일시정지 / 버튼 제공
- 타이머 종료 시 알림(소리 또는 진동) 제공
- 앱 실행 → 메인화면 기본값(60분) 표시
- 손가락 제스처로 다이얼을 돌려 원하는 시간 설정
- 시작버튼을 누르면 타이머 시작
- 일시정지 버튼 사용 가능
- 설정한 시간이 끝나면 알람 및 진동으로 알림 제공
- 알람 방식 선택 가능: 사운드, 진동, 옵션 제공 고려
- 다크 모드 지원 여부: 사용자 환경에 따라 최적의 UI 제공
graph TD;
subgraph Presentation Layer
TimerView["🖼 TimerView (SwiftUI)"]
TimerViewModel["⚙️ TimerViewModel (Combine)
- startTimer()
- stopTimer()
- resetTimer()
- updateRemainingTime()
- bindToUseCase()"]
TimerVC["📱 TimerViewController (Optional)"]
end
subgraph Domain Layer
TimerUseCase["🛠 TimerUseCase
- startTimer(duration: Int)
- stopTimer()
- resetTimer()
- getCurrentTimer() -> TimerEntity?
- updateRemainingTime(time: Int)"]
TimerRepositoryProtocol["🔌 TimerRepositoryProtocol
- saveTimer(_ timer: TimerEntity)
- loadTimer() -> TimerEntity?
- clearTimer()"]
TimerEntity["🗂 TimerEntity
- duration: Int
- remainingTime: Int
- isRunning: Bool"]
TimerProtocol["⏳ TimerProtocol
- start(duration: Int)
- stop()
- reset()
- remainingTimerObservable: Observable<Int> (Combine 문법으로 변경 필요)"]
end
subgraph Data Layer
TimerRepository["💾 TimerRepository
- saveTimer(_ timer: TimerEntity)
- loadTimer() -> TimerEntity?
- clearTimer()"]
TimerLocalDataBase["📂 TimerLocalDataBase
- saveTimer(_ timer: TimerEntity)
- loadTimer() -> TimerEntity?
- clearTimer()"]
end
%% 연결 관계 설정
TimerView -->|데이터 바인딩| TimerViewModel
TimerViewModel -->|UseCase 호출| TimerUseCase
TimerUseCase -->|타이머 동작| TimerProtocol
TimerUseCase -->|데이터 저장/불러오기| TimerRepositoryProtocol
TimerRepositoryProtocol -->|실제 구현| TimerRepository
TimerRepository -->|데이터 저장/로드| TimerLocalDataBase