# 通知設計書 18-ログアウト成功通知

## 概要

本ドキュメントは、ユーザーがログアウト操作を完了した際に表示されるアプリ内通知の設計を定義する。

### 本通知の処理概要

ドロワーメニューからユーザーがログアウトボタンをタップし、確認ダイアログでログアウトを確定した際に、ログアウト完了をリアルタイムでフィードバックするアプリ内オーバーレイ通知機能である。

**業務上の目的・背景**：ログアウトはユーザーセッションを終了する重要な操作であり、その完了を明確に通知することで、ユーザーは自分のセッションが安全に終了したことを確認できる。特に共有デバイスを使用する場合や、セキュリティ意識の高いユーザーにとって、ログアウト完了の確認は重要である。

**通知の送信タイミング**：ログアウトAPI呼び出しの完了後、ローカルストレージのユーザー情報クリア後に通知が表示される。具体的には`HomePageRepositoryImp().callLogoutApi()`の完了コールバック内で表示される。

**通知の受信者**：ログアウト操作を実行したユーザー本人のみ。デバイス上で即座に表示されるローカル通知。

**通知内容の概要**：緑色背景の成功通知でサーバーからのログアウト完了メッセージを表示する。

**期待されるアクション**：ユーザーはログアウト完了を認識する。アプリはログアウト前の状態に戻り、ゲストモードで利用可能となる。

## 通知種別

アプリ内通知（オーバーレイ通知）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（API応答後即時表示） |
| 優先度 | 中 |
| リトライ | 無（表示は1回のみ） |

### 送信先決定ロジック

ログアウト操作を実行したユーザーのデバイス画面に直接表示される。

## 通知テンプレート

### アプリ内通知の場合

| 項目 | 内容 |
|-----|------|
| 表示位置 | 画面上部オーバーレイ |
| 表示時間 | 約3秒（自動消去） |
| 背景色 | 緑色（Colors.green.shade400） |

### 本文テンプレート

```
タイトル: Success
メッセージ: {APIレスポンスのmessage}（例：ログアウトしました）
アイコン: check_circle_outline（白色）
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| message | ログアウト成功メッセージ | response.message | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 画面操作 | ログアウトボタンタップ | API呼び出し完了時 | ドロワーメニューからのログアウト |
| 画面操作 | 確認ダイアログでYesタップ | API呼び出し完了時 | ログアウト確認後 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| 確認ダイアログでNoタップ | ログアウトがキャンセルされた場合 |
| インターネット未接続 | ネットワークエラー通知が別途表示される |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[ログアウトボタンタップ] --> B{インターネット接続確認}
    B -->|未接続| C[errorNotification表示]
    B -->|接続OK| D[確認ダイアログ表示]
    D --> E{ユーザー選択}
    E -->|No| F[ダイアログ閉じる]
    E -->|Yes| G[ローディングダイアログ表示]
    G --> H[callLogoutApi呼び出し]
    H --> I[API完了]
    I --> J[ダイアログ閉じる×2]
    J --> K[successNotification表示]
    K --> L[appStoragePref.onUserLogout]
    L --> M[SharedPreference更新]
```

## データベース参照・更新仕様

### 参照テーブル一覧

該当なし（ログアウトはセッション終了のみ）

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| customer_sessions | DELETE/UPDATE | セッション無効化 |

#### ローカルストレージ更新

| キー | 操作 | 値 |
|-----|------|-----|
| customerLoggedIn | CLEAR | - |
| customerName | CLEAR | - |
| customerEmail | CLEAR | - |
| customerToken | CLEAR | - |
| customerId | CLEAR | - |
| customerImage | CLEAR | - |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| ネットワークエラー | インターネット接続なし | エラー通知表示（ログアウト前） |
| サーバーエラー | サーバー側エラー | ログアウトは継続（ローカルクリア） |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0回（自動リトライなし） |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし（ユーザー操作に応じて即時表示）

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

- ログアウト時にローカルストレージの認証情報がクリアされる
- サーバー側でセッショントークンが無効化される
- 確認ダイアログにより誤操作を防止
- インターネット接続チェックにより、オフライン時のログアウト試行を防止

## 備考

- overlay_supportパッケージを使用してオーバーレイ通知を実装
- ログアウト前にインターネット接続チェックが行われる
- 確認ダイアログで「いいえ」を選択するとログアウトがキャンセルされる
- HomePageRepositoryImpを直接呼び出してログアウトAPIを実行
- ログアウト後にfetchSharedPreferenceDataコールバックでUI更新

---

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

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

### 推奨読解順序

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

処理の起点となるログアウトボタンウィジェットを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | log_out_button.dart | `lib/screens/drawer/widget/log_out_button.dart` | ログアウトボタンの全体構造を確認 |

**読解のコツ**: LogoutButtonウィジェットはStatefulWidgetで、customerDetailsとfetchSharedPreferenceDataコールバックを受け取る。

#### Step 2: ログアウト処理フローを理解する

ログアウト処理の各ステップを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | log_out_button.dart | `lib/screens/drawer/widget/log_out_button.dart` | _onPressedLogoutメソッド（行60-96）で確認ダイアログ表示 |
| 2-2 | log_out_button.dart | `lib/screens/drawer/widget/log_out_button.dart` | _onPressConfirmLogoutメソッド（行99-138）でAPI呼び出しと通知表示 |

**主要処理フロー**:
1. **行40-48**: ボタンタップ時のインターネット接続チェック
2. **行60-96**: _onPressedLogoutで確認ダイアログ表示
3. **行99-138**: _onPressConfirmLogoutでAPI呼び出し
4. **行129-137**: API完了後のsuccessNotification表示とストレージクリア

#### Step 3: 通知表示層を理解する

通知の実際の表示処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | show_message.dart | `lib/widgets/show_message.dart` | successNotificationメソッドの実装を確認 |

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

```
LogoutButton (log_out_button.dart)
    │
    ├─ MaterialButton.onPressed (行40-48)
    │      │
    │      ├─ checkInternetConnection
    │      │      │
    │      │      ├─ 未接続 → ShowMessage.errorNotification
    │      │      │
    │      │      └─ 接続OK → _onPressedLogout
    │      │
    │      └─ _onPressedLogout (行60-96)
    │             │
    │             └─ AlertDialog表示
    │                    │
    │                    ├─ No → Navigator.pop
    │                    │
    │                    └─ Yes → _onPressConfirmLogout
    │
    └─ _onPressConfirmLogout (行99-138)
           │
           ├─ Navigator.pop (確認ダイアログ閉じる)
           │
           ├─ ローディングダイアログ表示
           │
           └─ HomePageRepositoryImp().callLogoutApi()
                  │
                  └─ .then() コールバック
                         │
                         ├─ Navigator.pop×2
                         │
                         ├─ ShowMessage.successNotification
                         │
                         ├─ appStoragePref.onUserLogout
                         │
                         └─ fetchSharedPreferenceData
```

### データフロー図

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

ログアウト           インターネット               確認ダイアログ
ボタンタップ    ───▶  接続チェック        ───▶    表示
                          │                         │
                          ▼                         ▼
                    接続OK/NG                   Yes/No選択
                          │                         │
                          ▼                         ▼
                   _onPressedLogout         _onPressConfirmLogout
                          │                         │
                          ▼                         ▼
                   AlertDialog              callLogoutApi
                          │                         │
                          ▼                         ▼
                   ユーザー選択              API Response
                                                    │
                                                    ▼
                                            ShowMessage
                                        .successNotification
                                                    │
                                                    ▼
                                        appStoragePref.onUserLogout
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| log_out_button.dart | `lib/screens/drawer/widget/log_out_button.dart` | ソース | ログアウトボタンUI、通知表示トリガー |
| show_message.dart | `lib/widgets/show_message.dart` | ソース | 通知表示ウィジェット |
| home_page_repository.dart | `lib/screens/home_page/bloc/home_page_repository.dart` | ソース | ログアウトAPI呼び出し |
| app_storage_pref.dart | `lib/utils/app_storage_pref.dart` | ソース | ローカルストレージ管理 |
| check_internet.dart | `lib/utils/check_internet.dart` | ソース | インターネット接続チェック |
