# 機能設計書 44-プロファイル画面

## 概要

本ドキュメントは、Wikipedia iOSアプリにおけるプロファイル画面機能の設計を記載する。ユーザープロファイル情報の表示と、各種機能（設定、通知、ウォッチリスト等）へのアクセスを提供するハブ画面である。

### 本機能の処理概要

プロファイル画面は、ログイン状態に応じたユーザー情報の表示と、関連機能への遷移を提供するナビゲーションハブとして機能する。

**業務上の目的・背景**：ユーザーがアプリの各種設定や個人機能（通知、ウォッチリスト、ユーザーページ等）に素早くアクセスできる統一されたエントリポイントを提供する。ログイン状態によって表示内容を動的に変更し、未ログインユーザーにはログイン促進を行う。

**機能の利用シーン**：各画面（Explore、Places、Saved、History、Search等）のナビゲーションバーにあるプロファイルボタンをタップして表示。通知確認、設定変更、ユーザーページ閲覧、ウォッチリスト確認、寄付、Year in Review等の機能への導線として使用される。

**主要な処理内容**：
1. 認証状態の取得と表示内容の決定
2. 未読通知数の取得と表示
3. ログイン/ログアウト状態に応じたメニュー項目の構成
4. 各機能への遷移処理（Coordinator経由）
5. Year in Review機能の表示判定

**関連システム・外部連携**：WMFAuthenticationManagerで認証状態を確認。RemoteNotificationsControllerで未読通知数を取得。各種Coordinatorで機能遷移を実行。

**権限による制御**：認証状態に応じてメニュー項目が変化。永続アカウント：全機能表示。一時アカウント：限定機能表示。未ログイン：ログイン促進メッセージ表示。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | Explore画面 | 遷移元画面 | プロファイルボタンタップでプロファイル画面へ遷移 |
| 2 | Places画面 | 遷移元画面 | プロファイルボタンタップでプロファイル画面へ遷移 |
| 3 | Saved画面 | 遷移元画面 | プロファイルボタンタップでプロファイル画面へ遷移 |
| 4 | Search画面 | 遷移元画面 | プロファイルボタンタップでプロファイル画面へ遷移 |
| 5 | Article画面 | 遷移元画面 | プロファイルボタンタップでプロファイル画面へ遷移 |

## 機能種別

ナビゲーション / 画面表示 / 状態管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| navigationController | UINavigationController | Yes | 遷移元のナビゲーションコントローラー | - |
| theme | Theme | Yes | 現在のテーマ | - |
| dataStore | MWKDataStore | Yes | データストア | - |
| donateSouce | DonateCoordinator.Source | Yes | 寄付元情報 | - |
| sourcePage | ProfileCoordinatorSource | Yes | 遷移元画面種別 | - |
| yirCoordinator | YearInReviewCoordinator | Yes | Year in Reviewコーディネーター | - |

### 入力データソース

- WMFAuthenticationManager（認証状態）
- RemoteNotificationsController（未読通知数）
- WMFYearInReviewDataController（Year in Review表示判定）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| pageTitle | String | 画面タイトル（ユーザー名またはAccount） |
| inboxCount | Int | 未読通知数 |
| isLoggedIn | Bool | 永続アカウントログイン状態 |
| isTemporaryAccount | Bool | 一時アカウント状態 |

### 出力先

- 画面表示（WMFProfileView）
- 各種Coordinator（機能遷移）

## 処理フロー

### 処理シーケンス

```
1. ProfileCoordinator.start() が呼ばれる
2. 認証状態を取得
   ├─ authStatePermanentUsername（永続アカウント名）
   ├─ authStateTemporaryUsername（一時アカウント名）
   ├─ authStateIsPermanent（永続ログイン状態）
   └─ authStateIsTemporary（一時アカウント状態）
3. 画面タイトルを決定
   ├─ ログイン中: ユーザー名
   ├─ 一時アカウント: "Temporary account"
   └─ その他: "Account"
4. 未読通知数を取得
   └─ remoteNotificationsController.numberOfUnreadNotifications()
5. Year in Review表示判定の準備
   └─ WMFYearInReviewDataController、countryCode、primaryAppLanguageProject
6. WMFProfileViewModelを作成
7. WMFProfileViewを作成・表示
8. ユーザーアクションに応じた処理
   └─ handleProfileAction() でアクション種別に応じた遷移
```

### フローチャート

```mermaid
flowchart TD
    A[start] --> B[認証状態取得]
    B --> C{永続アカウント?}
    C -->|Yes| D[タイトル:ユーザー名]
    C -->|No| E{一時アカウント?}
    E -->|Yes| F[タイトル:Temporary account]
    E -->|No| G[タイトル:Account]
    D --> H[未読通知数取得]
    F --> H
    G --> H
    H --> I[ViewModel作成]
    I --> J[ProfileView表示]
    J --> K{ユーザーアクション}
    K -->|通知| L[NotificationsCoordinator]
    K -->|設定| M[SettingsCoordinator]
    K -->|寄付| N[DonateCoordinator]
    K -->|ユーザーページ| O[UserPageCoordinator]
    K -->|トークページ| P[UserTalkCoordinator]
    K -->|ウォッチリスト| Q[WatchlistCoordinator]
    K -->|ログイン| R[LoginCoordinator]
    K -->|ログアウト| S[ログアウト確認ダイアログ]
    K -->|Year in Review| T[YearInReviewCoordinator]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-44-01 | タイトル決定 | 永続ログイン→ユーザー名、一時アカウント→"Temporary account"、その他→"Account" | 画面表示時 |
| BR-44-02 | 一時アカウントユーザー名表示 | ユーザーページタイトルは一時アカウント時authStateTemporaryUsernameを使用 | 一時アカウント時 |
| BR-44-03 | 寄付画面遷移 | プロファイル画面を閉じずにDonateCoordinatorを起動（設定取得後に閉じる） | 寄付タップ時 |
| BR-44-04 | ログアウト確認 | ログアウト前に確認ダイアログを表示 | ログアウトタップ時 |
| BR-44-05 | Year in Review表示 | 条件を満たす場合のみYear in Reviewメニューを表示 | 画面表示時 |

### 計算ロジック

該当なし

## データベース操作仕様

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| - | - | - | 直接的なDB操作なし（参照のみ） |

### テーブル別操作詳細

該当なし（認証状態やデータはメモリキャッシュから参照）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 通知数取得失敗 | RemoteNotificationsController例外 | 0件として処理継続 |
| - | Year in Reviewデータ取得失敗 | WMFYearInReviewDataController例外 | 機能を非表示 |

### リトライ仕様

自動リトライは行わない。

## トランザクション仕様

該当なし

## パフォーマンス要件

- 画面表示は即座に行い、非同期処理はバックグラウンドで実行
- SwiftUIベースのビュー（WMFProfileView）で効率的なレンダリング

## セキュリティ考慮事項

- 認証状態に応じた適切なメニュー表示
- ログアウト時は確認ダイアログを表示
- 寄付フローでは安全な決済処理（DonateCoordinator経由）

## 備考

- ProfileCoordinatorSource enum: exploreOptOut、explore、article、places、saved、history、search、activityの8種類
- DonateFunnelでのイベントログ記録
- WMFProfileViewはSwiftUIで実装、WMFProfileHostingControllerでUIKitにブリッジ

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | ProfileCoordinator.swift | `Wikipedia/Code/ProfileCoordinator.swift` | ProfileCoordinatorSource enum、ProfileCoordinatorDelegateプロトコル |
| 1-2 | ProfileCoordinatorDelegate.swift | `WMFComponents/Sources/WMFComponents/Coordinator/ProfileCoordinatorDelegate.swift` | ProfileActionの定義 |

**読解のコツ**:
- **7-17行目（ProfileCoordinator）**: ProfileCoordinatorSource enumで遷移元画面を定義
- **ProfileCoordinatorDelegate**: ProfileActionで各種アクション（showNotifications、showSettings等）を定義

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | ProfileCoordinator.swift | `Wikipedia/Code/ProfileCoordinator.swift` | start()メソッドの実装 |

**主要処理フロー**:
1. **59-63行目**: 認証状態の取得（authStatePermanentUsername、authStateIsTemporary等）
2. **65-73行目**: 画面タイトルの決定ロジック
3. **74-90行目**: ローカライズ文字列の構成
4. **92-99行目**: Year in Review依存関係の準備
5. **103-116行目**: WMFProfileViewModelの作成
6. **118-120行目**: WMFProfileViewの作成と表示

#### Step 3: アクションハンドリングを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | ProfileCoordinator.swift | `Wikipedia/Code/ProfileCoordinator.swift` | handleProfileAction()メソッド |

**主要処理フロー**:
- **127-177行目**: handleProfileAction()でswitch文による各アクションの処理
- **185-188行目**: showNotifications() - NotificationsCoordinatorへの遷移
- **190-193行目**: showSettings() - SettingsCoordinatorへの遷移
- **199-218行目**: showDonate() - DonateCoordinatorの起動（特殊フロー）
- **221-227行目**: showUserPage() - UserPageCoordinatorへの遷移
- **253-256行目**: showWatchlist() - WatchlistCoordinatorへの遷移
- **262-265行目**: login() - LoginCoordinatorへの遷移
- **267-279行目**: logout() - ログアウト確認ダイアログ表示

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

```
ProfileCoordinator
    │
    ├─ start()
    │      │
    │      ├─ dataStore.authenticationManager（認証状態取得）
    │      │
    │      ├─ remoteNotificationsController.numberOfUnreadNotifications()
    │      │
    │      ├─ WMFProfileViewModel作成
    │      │
    │      └─ WMFProfileView / WMFProfileHostingController表示
    │
    └─ handleProfileAction(action:)
           │
           ├─ showNotifications()
           │      └─ NotificationsCoordinator.start()
           │
           ├─ showSettings()
           │      └─ SettingsCoordinator.start()
           │
           ├─ showDonate()
           │      └─ DonateCoordinator.start()
           │
           ├─ showUserPage()
           │      └─ UserPageCoordinator.start()
           │
           ├─ showUserTalkPage()
           │      └─ UserTalkCoordinator.start()
           │
           ├─ showWatchlist()
           │      └─ WatchlistCoordinator.start()
           │
           ├─ login()
           │      └─ LoginCoordinator.start()
           │
           ├─ logout()
           │      └─ UIAlertController表示
           │             └─ delegate?.didTapLogout()
           │
           └─ showYearInReview()
                  └─ yirCoordinator.start()
```

### データフロー図

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

認証状態             ───▶ ProfileCoordinator.start()
(authenticationManager)    │
                          ▼
未読通知数           ───▶ WMFProfileViewModel構築 ───────────▶ WMFProfileView表示
(remoteNotificationsController)                                     │
                                                                    ▼
                                                              ユーザーアクション
                                                                    │
                                                                    ▼
                                                         handleProfileAction()
                                                                    │
                          ┌─────────────────────┬────────────────┴────────────────┐
                          ▼                     ▼                                  ▼
              NotificationsCoordinator  SettingsCoordinator            他Coordinator
                          │                     │                                  │
                          ▼                     ▼                                  ▼
                   通知画面表示            設定画面表示                      各機能画面
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| ProfileCoordinator.swift | `Wikipedia/Code/ProfileCoordinator.swift` | ソース | プロファイル画面のCoordinator |
| ProfileCoordinatorDelegate.swift | `WMFComponents/Sources/WMFComponents/Coordinator/ProfileCoordinatorDelegate.swift` | ソース | ProfileAction定義 |
| WMFProfileView.swift | `WMFComponents/Sources/WMFComponents/Components/Profile/WMFProfileView.swift` | ソース | SwiftUIビュー |
| WMFProfileViewModel.swift | `WMFComponents/Sources/WMFComponents/Components/Profile/WMFProfileViewModel.swift` | ソース | ViewModel |
| WMFProfileHostingController.swift | `WMFComponents/Sources/WMFComponents/Components/Profile/WMFProfileHostingController.swift` | ソース | UIKitブリッジ |
| NotificationsCoordinator.swift | `Wikipedia/Code/NotificationsCoordinator.swift` | ソース | 通知画面遷移 |
| SettingsCoordinator.swift | `Wikipedia/Code/SettingsCoordinator.swift` | ソース | 設定画面遷移 |
| UserPageCoordinator.swift | `Wikipedia/Code/UserPageCoordinator.swift` | ソース | ユーザーページ遷移 |
| WatchlistCoordinator.swift | `Wikipedia/Code/WatchlistCoordinator.swift` | ソース | ウォッチリスト遷移 |
| LoginCoordinator.swift | `Wikipedia/Code/LoginCoordinator.swift` | ソース | ログイン画面遷移 |
