# 画面設計書 54-VanishAccountWarning画面

## 概要

本ドキュメントはWikipedia iOSアプリにおける「VanishAccountWarning画面」（アカウント削除警告画面）の設計仕様を定義するものです。

### 本画面の処理概要

**業務上の目的・背景**：
本画面は、ユーザーがWikipediaアカウントの「Vanish（消去）」を希望する際に表示される警告画面です。Vanishとは、Wikipediaにおけるアカウント削除の一形態で、ユーザー名を変更して過去の編集履歴との関連付けを困難にする処理です。ただし、技術的な理由から完全な削除や匿名化は保証されません。本画面は、この重大な決定を行う前にユーザーに対してリスクと制限を明確に説明し、十分な理解のもとで意思決定できるようにすることを目的としています。

**画面へのアクセス方法**：
本画面へは以下のルートでアクセスします：
1. アカウント設定画面（Account画面）からアカウント削除（Vanish）オプションを選択

**主要な操作・処理内容**：
1. 警告内容の確認 - Vanishの制限事項と影響についてのテキストを読む
2. 続行ボタン押下 - Vanish手続きへ進む
3. キャンセルボタン押下 - 警告画面を閉じてアカウント設定に戻る
4. スワイプでの画面閉じ - モーダル表示のためスワイプダウンで閉じることも可能

**画面遷移**：
- 遷移元：Account画面（アカウント設定画面）
- 遷移先：
  - 続行ボタン：Vanish手続き画面（WebViewまたは外部リンク）
  - キャンセルボタン：元の画面に戻る

**権限による表示制御**：
本画面はログイン済みユーザーのみが使用可能です。アカウント設定画面からアクセスするため、未ログイン状態ではそもそもアカウント設定画面にアクセスできません。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 43 | 認証管理 | 補助機能 | アカウント削除警告の表示 |

## 画面種別

確認・警告（アカウント削除警告画面）

## URL/ルーティング

本画面はモーダルで表示されるため、URLルーティングは使用しません。
- ViewController: VanishAccountWarningViewHostingViewController
- SwiftUI View: VanishAccountWarningView

## 入出力項目

| 項目名 | 項目ID | 入出力 | データ型 | 必須 | 最大長 | バリデーション | 備考 |
|--------|--------|--------|----------|------|--------|----------------|------|
| テーマ | theme | 入力（内部） | Theme | 必須 | - | - | 初期化時に渡される |
| 続行フラグ | presentVanishView | 出力 | Bool | - | - | - | delegateへの出力 |

## 表示項目

| 項目名 | 表示内容 | データソース |
|--------|----------|--------------|
| タイトル | "Warning" | ローカライズ文字列（vanish-account-warning-title） |
| 本文 | Vanishの制限事項説明（Markdown対応） | ローカライズ文字列（vanish-account-warning-body） |
| 続行ボタン | "Continue" | ローカライズ文字列（vanish-account-continue-button-title） |
| キャンセルボタン | "Cancel" | CommonStrings.cancelActionTitle |

## イベント仕様

### 1-続行ボタンタップ

**トリガー**: 「Continue」ボタンタップ

**処理フロー**:
1. continueAction?()クロージャ実行
2. dismiss(userTappedContinue: true)呼び出し
3. アニメーション付きで画面dismiss
4. delegate?.userDidDismissVanishAccountWarningView(presentVanishView: true)呼び出し
5. 呼び出し元でVanish手続き画面を表示

### 2-キャンセルボタンタップ

**トリガー**: 「Cancel」ボタンタップ

**処理フロー**:
1. dismissAction?()クロージャ実行
2. dismiss(userTappedContinue: false)呼び出し
3. アニメーション付きで画面dismiss
4. delegate?.userDidDismissVanishAccountWarningView(presentVanishView: false)呼び出し
5. 呼び出し元は何も実行しない

### 3-スワイプダウンでの画面閉じ

**トリガー**: モーダルをスワイプダウン

**処理フロー**:
1. UIAdaptivePresentationControllerDelegateのpresentationControllerDidDismiss呼び出し
2. delegate?.userDidDismissVanishAccountWarningView(presentVanishView: false)呼び出し
3. キャンセルと同じ扱い

## データベース更新仕様

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| - | - | - | 本画面単体ではデータベース更新なし。警告表示のみ |

### テーブル別更新項目詳細

本画面は警告表示のみで、直接的なデータベース更新は行いません。実際のVanish処理は続行ボタン押下後の後続画面で実行されます。

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|---------|
| vanish-account-warning-title | 警告 | "Warning" | 常時表示 |
| vanish-account-warning-body | 警告 | Vanishの制限事項説明（太字Markdown含む） | 常時表示 |
| vanish-account-continue-button-title | - | "Continue" | 常時表示 |

### 本文の内容（vanish-account-warning-body）

Vanishing is a **last resort** and should **only be used when you wish to stop editing forever** and also to hide as many of your past associations as possible.

Account deletion on Wikipedia is done by changing your account name to make it so others cannot recognize your contributions in a process called account vanishing. **Vanishing does not guarantee complete anonymity or remove contributions to the projects**.

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| Markdownパース失敗 | fallbackBodyStringを使用（**を除去したプレーンテキスト） |

## 備考

- SwiftUIで実装されたView（VanishAccountWarningView）をUIHostingControllerでラップ
- Themeable、RMessageSuppressingプロトコルに準拠
- UIAdaptivePresentationControllerDelegateを実装し、スワイプダウン時の処理を制御
- VanishAccountWarningViewDelegateプロトコルで呼び出し元との通信を行う
- 本文はMarkdown形式で太字（**）を含み、AttributedStringでパース
- iOS 15以前またはパース失敗時はプレーンテキストにフォールバック
- 続行ボタンの背景色はtheme.colors.error（赤系）で危険な操作であることを視覚的に示す
- レスポンシブ対応（horizontalSizeClass、verticalSizeClassでパディング調整）

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

プロトコルとローカライズ文字列の定義を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | VanishAccountWarningViewHostingViewController.swift | `Wikipedia/Code/VanishAccountWarningViewHostingViewController.swift` | VanishAccountWarningViewDelegateプロトコル（4-6行目） |
| 1-2 | VanishAccountWarningView.swift | `Wikipedia/Code/VanishAccountWarningView.swift` | LocalizedStrings enum（9-17行目） |

**読解のコツ**: VanishAccountWarningViewはSwiftUIで実装されており、UIKitとの橋渡しをVanishAccountWarningViewHostingViewControllerが担当します。

#### Step 2: HostingViewControllerを理解する

UIHostingControllerのサブクラスとデリゲート処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | VanishAccountWarningViewHostingViewController.swift | `Wikipedia/Code/VanishAccountWarningViewHostingViewController.swift` | init(theme:)（17-29行目）、dismiss(userTappedContinue:)（42-46行目） |

**主要処理フロー**:
1. **17-19行目**: 初期化時にthemeを受け取り、VanishAccountWarningViewを生成
2. **21-26行目**: rootViewのdismissActionとcontinueActionを設定
3. **42-46行目**: dismiss処理とdelegate呼び出し
4. **50-52行目**: スワイプダウン時のdelegate呼び出し

#### Step 3: SwiftUI Viewを理解する

VanishAccountWarningViewのUI構成と動作を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | VanishAccountWarningView.swift | `Wikipedia/Code/VanishAccountWarningView.swift` | body（60-101行目）、レスポンシブ対応プロパティ（28-47行目） |

**主要処理フロー**:
- **9-17行目**: ローカライズ文字列定義（Markdownパース含む）
- **28-37行目**: サイズクラスに応じたパディング計算
- **40-47行目**: テーマに応じたボタンテキスト色計算
- **60-101行目**: UI構成（ScrollView、ボタン群）
- **77-89行目**: 続行ボタン（赤背景、角丸）

### プログラム呼び出し階層図

```
Account画面
    │
    └─ VanishAccountWarningViewHostingViewController表示
           │
           ├─ init(theme:) [17行目]
           │      └─ VanishAccountWarningView生成
           │             ├─ dismissAction設定 [21-23行目]
           │             └─ continueAction設定 [24-26行目]
           │
           ├─ [続行ボタンタップ]
           │      └─ continueAction [24行目]
           │             └─ dismiss(userTappedContinue: true) [42行目]
           │                    └─ delegate?.userDidDismissVanishAccountWarningView(presentVanishView: true)
           │
           ├─ [キャンセルボタンタップ]
           │      └─ dismissAction [21行目]
           │             └─ dismiss(userTappedContinue: false) [42行目]
           │                    └─ delegate?.userDidDismissVanishAccountWarningView(presentVanishView: false)
           │
           └─ [スワイプダウン]
                  └─ presentationControllerDidDismiss [50行目]
                         └─ delegate?.userDidDismissVanishAccountWarningView(presentVanishView: false)
```

### データフロー図

```
[入力]                    [処理]                           [出力]

Theme ──────────────▶ VanishAccountWarningView
                            │
                            ▼
                      警告画面表示
                            │
            ┌───────────────┼───────────────┐
            │               │               │
       [続行タップ]    [キャンセル]    [スワイプダウン]
            │               │               │
            ▼               ▼               ▼
    presentVanishView   presentVanishView   presentVanishView
        = true             = false             = false
            │               │               │
            └───────────────┴───────────────┘
                            │
                            ▼
                    delegate通知
                            │
                            ▼
              Account画面で後続処理判定
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| VanishAccountWarningViewHostingViewController.swift | `Wikipedia/Code/VanishAccountWarningViewHostingViewController.swift` | ソース | UIHostingController |
| VanishAccountWarningView.swift | `Wikipedia/Code/VanishAccountWarningView.swift` | ソース | SwiftUI View |
| AccountViewController.swift | `Wikipedia/Code/AccountViewController.swift` | ソース | 呼び出し元（Account画面） |
| Theme.swift | `Wikipedia/Code/Theme.swift` | ソース | テーマ定義 |
