団結度(Unity)深夜リセットフック
TIP
インタラクティブ・アーキテクチャツアー: ブラウザでツアーを開く (習慣ダッシュボード & 日次リセット)
このドキュメントでは、グループのタイムゾーンにおける深夜 0 時(日付変更)を検知し、当日の団結度(Unity)をリセットする React フック(src/hooks/use-unity-midnight-reset.ts)について解説します。
1. 処理の流れ
端末の復帰時(画面フォーカス時)および定期インターバル(60秒ごと)で日付変更を検知し、安全にバックエンド API を呼び出して団結度をリセットします。
ステートマシンの解説
- 画面復帰および定期トリガー
スリープ解除時のwindow.focusイベントと 60 秒インターバルにより、バックグラウンドでの日付遷移を逃さず捕捉します。 - タイムゾーン別の日付評価
グループ設定のタイムゾーン(group.timeZone)で今日の日付文字列を生成し、グループドキュメントの記録日付と比較します。 - アトミックリセットと状態確定
日付変更が確認された場合、ミューテーションロックを掛けつつバックエンド API を呼び出し、ローカルおよびリモートの達成度を安全にリセットします。
2. コア機能と工夫
① デバイス復帰(フォーカス)の監視
モバイル端末のスリープ中は JavaScript タイマーが停止するため、アプリ再開時(focus イベント)に日付変更を即時再検証します。
② タイムゾーン別の正確な判定
グループの標準タイムゾーンに基づき Intl API で現地日付を割り出し、時差による誤動作を防ぎます。
③ 重複リクエストの排他制御
短時間の連続フォーカスによる過剰な API 呼び出しを防ぐため、useRef(isResettingRef)による実行ロックを適用しています。
3. 安全なリセット API (/api/groups/reset-unity-if-midnight)
- 認証 & App Check: JWT 認証と App Check トークンを検証した上でリセットを実行。
- UI の即時反映: レスポンス受信に伴い、画面上の団結度メーターを即座に
0%へ再計算。