# 画面設計書 46-Account画面

## 概要

本ドキュメントはWikipedia iOSアプリにおけるアカウント設定画面（AccountViewController）の設計内容を記載したものです。

### 本画面の処理概要

Account画面は、ログインユーザーのアカウント情報と関連設定を管理するための画面です。ユーザー名の表示、トークページ設定（議論の自動署名）、およびアカウント削除（Vanish）へのアクセスを提供します。

**業務上の目的・背景**：ログインユーザーがアカウント関連の設定を一元管理できるようにし、Wikipediaコミュニティへの参加を支援します。トークページでの議論に参加する際の署名設定や、プライバシー上の理由からアカウントを消去（Vanish）するためのアクセス手段を提供します。

**画面へのアクセス方法**：設定画面（Settings）から「Account」項目をタップすることでこの画面に遷移します。ログイン状態でのみアクセス可能です。

**主要な操作・処理内容**：
1. ユーザー名の表示（情報表示のみ）
2. トークページ議論の自動署名設定のオン/オフ切り替え
3. アカウント削除（Vanish Account）警告画面への遷移

**画面遷移**：
- 遷移元：Settings画面
- 遷移先：VanishAccountWarning画面、GlobalVanishRequest Webページ

**権限による表示制御**：この画面はログインユーザー（永続ログイン状態）でのみアクセス可能です。未ログインユーザーには表示されません。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 43 | 認証管理 | 主機能 | 認証状態の管理とセッション維持 |
| 42 | ログアウト | 補助機能 | アカウントからのログアウト（デリゲート経由） |

## 画面種別

設定（情報表示 + スイッチ切替 + 画面遷移）

## URL/ルーティング

iOSネイティブアプリのため、URLは使用しない。画面遷移はUINavigationControllerのpush遷移で管理。

## 入出力項目

| 項目名 | 項目ID | データ型 | 入力/出力 | 必須 | 説明 |
|--------|--------|----------|-----------|------|------|
| ユーザー名 | authStatePermanentUsername | String | 出力 | - | ログイン中のユーザー名 |
| 自動署名設定 | autoSignTalkPageDiscussions | Bool | 入出力 | - | トークページ議論の自動署名 |

## 表示項目

| 項目名 | データ型 | 説明 |
|--------|----------|------|
| ナビゲーションタイトル | String | "Account" |
| Your Account セクション | Section | ユーザー名とVanish Account項目 |
| Talk page preferences セクション | Section | トークページ設定 |

## イベント仕様

### 1-自動署名スイッチ切替

トークページ議論の自動署名設定を切り替える際の処理。

1. `autoSignTalkPageDiscussions(_:)`が呼び出される
2. `UserDefaults.standard.autoSignTalkPageDiscussions`を更新

### 2-Vanish Account項目タップ

アカウント削除警告画面に遷移する際の処理。

1. `tableView(_:didSelectRowAt:)`が呼び出される
2. ItemType.vanishAccountを検出
3. `VanishAccountWarningViewHostingViewController`を生成
4. デリゲートを設定してモーダル表示

### 3-Vanish Account警告画面からの戻り

Vanish Account警告画面でユーザーが操作した後の処理。

1. `userDidDismissVanishAccountWarningView(presentVanishView:)`が呼び出される
2. presentVanishViewがtrueの場合:
   - GlobalVanishRequest URLを生成
   - SinglePageWebViewControllerで表示
3. presentVanishViewがfalseの場合:
   - 何もせず画面を閉じる

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 自動署名切替 | UserDefaults | UPDATE | autoSignTalkPageDiscussionsを更新 |

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

#### UserDefaults

| 操作 | 項目（キー名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | autoSignTalkPageDiscussions | Bool | 自動署名の有効/無効 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| account-group-title | ヘッダー | "Your Account" | アカウントセクション |
| account-talk-preferences-title | ヘッダー | "Talk page preferences" | トークページ設定セクション |
| account-talk-preferences-auto-sign-discussions | ラベル | "Auto-sign discussions" | 自動署名設定項目 |
| account-talk-preferences-auto-sign-discussions-setting-explanation | フッター | "Auto-signing of discussions will use the signature defined in Signature settings" | 自動署名の説明 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| usernameがnil | assertionFailure発生（ログイン済みでなければこの画面にアクセスすべきでない） |
| Vanish URL生成失敗 | 何も処理せず終了 |

## 備考

- 本画面はSubSettingsViewControllerを継承
- AccountViewControllerDelegateプロトコルでログアウト処理を委譲
- VanishAccountWarningViewDelegateを実装してVanish画面との連携
- ユーザー名表示セルはisUserInteractionEnabled = falseで操作不可

---

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

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

### 推奨読解順序

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

まず、設定項目を表現するデータ構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | AccountViewController.swift | `Wikipedia/Code/AccountViewController.swift` | ItemType列挙型（12-16行目） |
| 1-2 | AccountViewController.swift | `Wikipedia/Code/AccountViewController.swift` | Section構造体とItem構造体（18-31行目） |

**読解のコツ**: ItemTypeが項目の種類（talkPageAutoSignDiscussions、vanishAccount、informational）を定義し、Item構造体がその表示情報を保持します。

#### Step 2: セクション構築を理解する

設定画面のセクション構成を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | AccountViewController.swift | `Wikipedia/Code/AccountViewController.swift` | createSections()メソッド（43-90行目） |

**主要処理フロー**:
1. **44-48行目**: ユーザー名の取得と検証
2. **50-57行目**: ユーザー名表示項目の生成（informational）
3. **59-66行目**: Vanish Account項目の生成
4. **68-73行目**: accountセクションの生成
5. **75-81行目**: 自動署名設定項目の生成
6. **83-87行目**: talkPagePreferencesセクションの生成
7. **89行目**: 両セクションを返却

#### Step 3: セル表示処理を理解する

TableViewのセル生成を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | AccountViewController.swift | `Wikipedia/Code/AccountViewController.swift` | tableView(_:cellForRowAt:)（125-157行目） |

**主要処理フロー**:
- **132-135行目**: アイコン関連プロパティの設定
- **137-142行目**: talkPageAutoSignDiscussions項目の設定（スイッチ表示）
- **143-145行目**: vanishAccount項目の設定（遷移矢印表示）
- **146-151行目**: informational項目の設定（操作不可、静的表示）

#### Step 4: イベントハンドリングを理解する

ユーザー操作に対する処理フローを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | AccountViewController.swift | `Wikipedia/Code/AccountViewController.swift` | autoSignTalkPageDiscussions(_:)（159-161行目） |
| 4-2 | AccountViewController.swift | `Wikipedia/Code/AccountViewController.swift` | tableView(_:didSelectRowAt:)（163-178行目） |

**主要処理フロー**:
- **159-161行目**: 自動署名スイッチ切替時にUserDefaultsを更新
- **168-177行目**: vanishAccount項目タップ時にVanishAccountWarningViewHostingViewControllerを表示

#### Step 5: Vanish Account連携を理解する

Vanish Account警告画面との連携を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | AccountViewController.swift | `Wikipedia/Code/AccountViewController.swift` | VanishAccountWarningViewDelegate実装（229-244行目） |

**主要処理フロー**:
- **231-233行目**: presentVanishViewがfalseの場合は何もしない
- **235-238行目**: GlobalVanishRequest URLを生成
- **240-242行目**: SinglePageWebViewControllerで表示

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

```
AccountViewController
    │
    ├─ viewDidLoad()
    │      ├─ tableView.register() - セル登録
    │      └─ createSections() - セクション構築
    │
    ├─ createSections()
    │      ├─ userName項目（informational）
    │      ├─ vanishAccount項目
    │      ├─ accountセクション
    │      ├─ autoSignDiscussions項目
    │      └─ talkPagePreferencesセクション
    │
    ├─ tableView(_:cellForRowAt:)
    │      ├─ talkPageAutoSignDiscussions → スイッチ表示
    │      ├─ vanishAccount → 遷移矢印表示
    │      └─ informational → 静的表示
    │
    ├─ autoSignTalkPageDiscussions(_:)
    │      └─ UserDefaults.standard.autoSignTalkPageDiscussions = sender.isOn
    │
    ├─ tableView(_:didSelectRowAt:)
    │      └─ vanishAccount
    │             └─ present(VanishAccountWarningViewHostingViewController)
    │
    └─ userDidDismissVanishAccountWarningView(presentVanishView:)
           ├─ presentVanishView == false → return
           └─ presentVanishView == true
                  ├─ URL生成（meta.wikimedia.org/wiki/Special:GlobalVanishRequest）
                  └─ push(SinglePageWebViewController)
```

### データフロー図

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

自動署名スイッチ ───────▶ autoSignTalkPageDiscussions(_:) ──▶ UserDefaults更新
操作                              │
                                  ▼
                          sender.isOn →
                          UserDefaults.standard
                          .autoSignTalkPageDiscussions

Vanish Account ──────────▶ tableView(_:didSelectRowAt:) ────▶ VanishAccountWarning
タップ                            │                           画面表示
                                  ▼
                          VanishAccountWarningViewHostingViewController
                                  │
                                  ▼
                          userDidDismissVanishAccountWarningView
                                  │
                          presentVanishView?
                                  │
                    ┌─────────────┴─────────────┐
                    ▼                           ▼
                  false                       true
                    │                           │
                    ▼                           ▼
                 終了                    GlobalVanishRequest
                                        Webページ表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| AccountViewController.swift | `Wikipedia/Code/AccountViewController.swift` | ソース | メインのViewController |
| SubSettingsViewController.swift | `Wikipedia/Code/SubSettingsViewController.swift` | ソース | 親クラス（設定画面共通基盤） |
| VanishAccountWarningViewHostingViewController.swift | `Wikipedia/Code/VanishAccountWarningViewHostingViewController.swift` | ソース | Vanish警告画面 |
| SinglePageWebViewController.swift | `Wikipedia/Code/SinglePageWebViewController.swift` | ソース | Web表示画面 |
| WMFSettingsTableViewCell.swift | `Wikipedia/Code/WMFSettingsTableViewCell.swift` | ソース | 設定項目用カスタムセル |
