目的・役割
月単位のカレンダーで過去の豆知識を振り返れる画面。HomeViewの2ページ目(TabView)として実装。
ロックされた日は Rewarded広告視聴で解放可能。
UI 構成
| 要素 | 種類 | 説明 |
| 月選択バー | HStack | 前月・次月・年月表示 |
| 曜日ヘッダー | HStack | 日〜土 |
| 日付グリッド | LazyVGrid | 当月の日付を6行で表示 |
| 状態アイコン | Overlay | ログイン日: ★、広告視聴日: 🎬、未閲覧: ロック |
| tip表示エリア | VStack | 選択日のtip(or「閲覧するには広告」) |
状態
| 状態 | 表示内容 |
| 表示可能日 | tipを表示 |
| ロック日(未閲覧 + 広告未視聴) | 「広告を見て解放」アラート |
| 未来日 | タップ無効 |
遷移
| 操作 | 遷移先 |
| 表示可能日タップ | 同画面でTipCardView表示 |
| ロック日タップ | 解放アラート → Rewarded広告 → markAsAdViewed → tip表示 |
| クイズボタン | QuizView (.sheet) |
| 月選択ボタン | DatePicker |
使用するデータモデル
HistoryService {
func getLoginDates() -> [Date]
func getAdViewedDates() -> [Date]
func markAsLogin(date: Date)
func markAsAdViewed(date: Date)
}
実装メモ
- CalendarLogic でその月の日数・曜日オフセット算出(CalendarLogicTestsで検証済)
- RewardedAdManager で広告視聴 → markAsAdViewed
- 過去のtipは TipLoaderService.getTipForDate(date:) で取得(年単位ローテーション)
関連
変更履歴
| バージョン | 日付 | 変更内容 |
| 1.0 | 2026-05-09 | 初版作成 |