- ヘッダーにトグルボタンを追加: ユーザーが通知のON/OFFを簡単に切り替え可能
- トグルをタップすると「通知をONにしました」/「通知をOFFにしました」のトーストを表示
- Firestoreの
usersコレクションにnotificationEnabledフィールドで保存 - デフォルトは
true(ON)
- 全通知タイプに対応: TODO操作、招待、リマインダーのすべてのプッシュ通知に適用
- クライアント側とサーバー側の両方でチェック:
services/notificationService.ts:getAllPushTokens関数でnotificationEnabledをチェックfunctions/src/index.ts:sendDueRemindersCloud FunctionでnotificationEnabledをチェック- 通知OFFのユーザーはプッシュ通知の送信対象から除外
- 通知OFFの場合は履歴にも保存されない: クライアント側で受信時にチェック
- ヘッダーに通知アイコンを追加: タップすると受信した通知の履歴を表示
- 通知履歴モーダル:
- 受信した通知のタイトルと日時を一覧表示
- タイトルをタップすると通知の詳細(本文、受信日時)を展開表示
- 各通知の右側に×ボタンを配置し、個別削除が可能
- Firestoreに保存:
notificationHistoryコレクションに保存userId,title,body,data,createdAtフィールド- 複合インデックス:
userId(Ascending) +createdAt(Descending)
- 新しいサービス:
services/notificationHistoryService.tsを追加saveNotificationHistory: 通知履歴を保存getNotificationHistory: ユーザーの通知履歴を取得deleteNotificationHistory: 通知履歴を削除
services/userService.ts:getNotificationEnabledとsetNotificationEnabled関数を追加app/(tabs)/_layout.tsx: 通知受信時にnotificationEnabledをチェックし、OFFの場合は履歴に保存しないapp/(tabs)/mylist.tsx: 通知トグルと通知履歴アイコンをヘッダーに統合components/NotificationHistoryModal.tsx: 新しいモーダルコンポーネントを追加
同じデバイスで複数のユーザーアカウントをテストする場合:
- プッシュトークンはデバイス固有のため、同じデバイスを使用する全ユーザーが同じトークンを共有します
- ユーザーAが通知をOFFにしても、ユーザーBが通知をONにしている場合、同じデバイスに通知が届く可能性があります
- これは、プッシュトークンがユーザーではなくデバイスに紐づいているためです
- 本番環境では問題ありません: 各ユーザーが異なるデバイスを使用するため、通知ON/OFF設定は正しく機能します
- 推奨: 複数ユーザーでの通知ON/OFF機能をテストする場合は、異なる物理デバイスを使用してください
- モーダル→タブ画面への移行: リマインド設定を全幅画面で快適に操作可能に
- 画面遷移方式に変更(組織設定と同様の体験)
- スクロール可能な縦長レイアウト
- ヘッダーにTodoタイトルを表示
- ID単体取得の最適化:
getTodoById()を追加し、リマインド設定画面の初期化を高速化 - 過去日時の自動補正: 初期表示が過去の場合は「現在+5分」を自動セット
- Todoアイテムへのリマインド情報表示: クリックで展開時にリマインド日時と通知状態を表示
- 通知アイコン(未通知はオレンジ、通知済みはグレー)
- 日時:
リマインド: YYYY/MM/DD HH:MM - 状態: 「未通知」/「通知済み」
- 完了時のリマインド自動削除: Todoを完了にするとリマインド情報を自動クリア
- 未完了→完了:
remindAt,remindNotifiedを削除 - 完了→未完了: リマインドは変更せず(ユーザーが再設定可能)
- 未完了→完了:
sendDueRemindersFunction 追加: 毎分実行、期限到達リマインドを自動送信- 条件:
remindNotified == falseかつremindAt <= now - 個人Todo: 本人のみ
- 組織Todo: 全メンバー
- 送信後に
remindNotified: trueを更新
- 条件:
- アプリ未起動でも通知: ユーザーがアプリを開いていなくても、時刻到達でプッシュ通知
- 起動/復帰時のモーダル常時表示: 「わかった」を押すまで未読リマインドを毎回表示
- アプリ起動時: リマインドチェック→モーダル表示
- フォアグラウンド復帰時: 同様にチェック→表示
- 「わかった」押下時: 一括で
remindNotifiedを更新して既読化
- 重複送信の防止: クライアント側でのプッシュ送信を停止(サーバー側に一本化)
- Toast設定の安定化:
toastConfigをモジュールスコープに移動し、再レンダー時の参照変更を防止 - リスト再取得の強化:
useFocusEffectを追加し、画面に戻った際の自動更新を実装 - TypeScript型安全性向上: DateTimePicker の
onChangeに明示的な型付与
- 変更ファイル:
app/(tabs)/reminder-settings.tsx- 新規追加(全幅リマインド設定画面)components/ReminderModal.tsx- 削除(画面遷移に移行)functions/src/index.ts-sendDueRemindersFunction 追加services/todoService.ts-getTodoById(),toggleTodoComplete()改善app/(tabs)/_layout.tsx- 重複送信停止、モーダル既読化ロジック改善components/ui/TodoItem.tsx- リマインド情報表示追加app/_layout.tsx- Toast設定の安定化
- リマインド設定: Todoの3点メニューからリマインド日時を設定可能
- カレンダーピッカー(DateTimePicker)で日付と時刻を選択
- 設定済みリマインドの変更・削除が可能
- 過去の日時は設定不可(バリデーション)
- 自動プッシュ通知: 設定時刻にプッシュ通知を自動送信
- グループTodo: 全メンバーに通知
- 個人Todo: 本人のみに通知
- ログイン時の自動チェック: アプリ起動・フォアグラウンド復帰時に未読リマインドを確認
- リマインド通知モーダルで一覧表示
- 「わかった」ボタンで閉じると通知済みフラグを更新
- 以降、同じリマインドは表示されない
- Firestore管理:
remindAt(日時)とremindNotified(通知済みフラグ)をTodoに追加
- 新規ファイル:
components/ReminderModal.tsx- リマインド設定モーダルcomponents/ReminderNotificationModal.tsx- 通知表示モーダル
- サービス追加:
setTodoReminder()- リマインド設定removeTodoReminder()- リマインド削除getDueReminders()- 期限到達リマインド取得markReminderAsNotified()- 通知済みフラグ更新notifyReminder()- リマインドプッシュ通知送信
- ライブラリ追加:
@react-native-community/datetimepicker- 日時選択UI
- パスワード入力エラー制限: 7回失敗で10分間ログインを一時停止
- AsyncStorageで失敗回数とロックアウト時刻を管理
- 認証エラー(パスワード間違いなど)のみカウント(ネットワークエラー等は除外)
- ログイン成功時に失敗回数を自動リセット
- リアルタイムカウントダウン: 残り時間を秒単位で表示
- 画面に警告ボックスを表示(赤色の背景)
- 「あと○分○秒後に再試行できます」と分かりやすく表示
- 段階的な警告: 残り3回以下になると警告メッセージを表示
- 「あと○回失敗するとログインが一時停止されます」
- ボタンの無効化: ロックアウト中はログインボタンを無効化(グレーアウト)
- README.mdからテストアカウント削除: セキュリティ上の理由で削除
- 招待通知の改善: 招待を送った本人には招待通知が送られないように修正
- 自分が自分を招待した場合に通知が送られないように制御
notificationService.tsで現在のユーザーIDをチェック
- アプリ起動時の招待チェック: アプリを開いた時(起動時・フォアグラウンド時)に未読の招待を自動チェック
AppStateを使用してアプリのフォアグラウンド/バックグラウンド状態を監視- 未読招待がある場合は招待一覧モーダルを自動表示
- セッションが確立されている場合のみ実行(未ログイン時は実行しない)
- モーダルから画面遷移へ: 組織設定を専用画面に変更
- スクロール可能になり、メンバー一覧や設定項目がすべて表示可能に
app/(tabs)/organization-settings.tsxとして実装- タブグループ内に配置してスムーズな画面遷移を実現
- 元の
OrganizationSettingsModal.tsxは削除
- 成功トーストの削除: 褒め言葉トースト以外の成功トーストを削除
- グループ作成完了
- グループ参加完了(招待コード入力、招待承認)
- 招待拒否完了
- 招待コードコピー完了
- メンバー削除完了
- グループ退出完了
- グループ削除完了
- 保持: 褒め言葉トースト(タスク完了時の
type: "praise")のみ - 理由: 成功時は画面遷移やUI変化で十分にフィードバックできるため、トーストは不要
- エラーダイアログの非表示化: ログイン/サインアップ失敗時のネイティブエラーダイアログを非表示に
console.error→console.logに変更してダイアログを抑制- ユーザーにはトーストで分かりやすいエラーメッセージを表示
- 開発者はターミナルログで詳細なエラー情報を確認可能
- デバッガー(
jキー)でも確認可能
tsconfig.jsonに"jsx": "react-native"を追加- 暗黙的な
any型エラーを修正components/TodoTable.tsx:FlatListのitem型を明示components/ui/TodoItem.tsx:GestureResponderEvent型を明示app/(tabs)/organization-settings.tsx: エラーハンドリングの型を明示
- 組織設定画面をタブグループ内に配置
- クロスナビゲーション問題を解決
- インポートパスを
../→../../に修正
- ✅ 自分が自分を招待した際に通知が送られる問題
- ✅ 組織設定モーダルでスクロールできない問題
- ✅ ログイン失敗時にネイティブエラーダイアログが表示される問題
services/notificationService.ts- 招待通知の改善app/(tabs)/_layout.tsx- アプリ起動時の招待チェック、組織設定画面への遷移app/(tabs)/organization-settings.tsx- 新しい組織設定画面components/OrganizationSettingsModal.tsx- 削除components/CreateOrganizationModal.tsx- 成功トースト削除components/JoinOrganizationModal.tsx- 成功トースト削除components/InvitationListModal.tsx- 成功トースト削除app/login.tsx- エラーダイアログ非表示化app/signup.tsx- エラーダイアログ非表示化tsconfig.json- TypeScript設定改善
5837d7e- デバッグログを削除6c1c30d- 組織設定をモーダルから画面遷移に変更d860892- 褒め言葉トースト以外の成功トーストを削除
過去の主要機能の実装については、以下のドキュメントを参照してください:
IMPLEMENTATION_COMPLETE.md- Firebase Cloud Functions実装完了SECURITY_CHANGES_SUMMARY.md- セキュリティ改善の履歴ISSUES.md- 既知の問題と対応状況