目的・役割

ユーザーが新しいランキングを作成・公開するためのウィザード。基本情報→選択肢→(クイズ)→期間→プレビューの順で入力。 下書き保存・復元・編集モードに対応。

設計上の特記: CreateRankingView自前 NavigationStack を持たない。 呼び出し元(MainTabView/MyPageView)がwrap する設計。ネストされた NavigationStack による navigationDestination 伝播破壊を防止。

ステップ構成

flowchart LR S1[Step1
基本情報] --> S2[Step2
選択肢] S2 --> SQ{クイズ付き?} SQ -- yes --> SQuiz[StepQuiz
クイズ作成] SQuiz --> S3[Step3
期間/モード] SQ -- no --> S3 S3 --> S4[Step4
プレビュー] S4 -- 公開 --> Done[完了] S4 -- 下書き保存 --> Drafts[DraftListView]

各ステップの入力項目

Step1: 基本情報(RS-CR-02)

Step2: 選択肢(RS-CR-03)

StepQuiz: クイズ作成(オプション、RS-CR-04)

Step3: 期間・モード(RS-CR-04 or 05)

Step4: プレビュー・公開(RS-CR-05)

入力内容を一覧表示し、消費ポイント明示。「公開する」「下書き保存」「キャンセル」を選択。

消費ポイント(RankingService)

項目消費ポイント
基本作成20pt
クイズ付与+15pt
選択肢拡張 +10+10pt
選択肢拡張 +15+20pt
期間延長 +7日+10pt
期間延長 +14日+20pt

状態管理

状態説明
新規作成初期状態、すべて空
下書き編集既存draft IDを引き継ぎ復元
公開処理中非アトミック処理、失敗時は補償
公開完了RankingStatus.active へ更新

使用するデータモデル

Ranking {
    var title: String
    var majorTag: String
    var minorTag: String?
    var mode: RankingMode  // single / threePoint
    var hasQuiz: Bool
    var startsAt: Date
    var endsAt: Date
    var isPublic: Bool
    var isAnonymous: Bool
    var status: RankingStatus  // draft → active
    var pointsConsumed: Int
}
// + Choices: [Choice]
// + Quizzes: [Quiz] (hasQuiz=trueのみ)

実装メモ

関連

変更履歴

バージョン日付変更内容
1.02026-05-09初版作成(5ステップ統合)