Firebase PWAで通知センターを構築する

セールスチームの管理には多くのツールが必要です。私のコントロールパネルでは、FCMプッシュ通知、チャット、リマインダー、共有カレンダーを使用していました。

問題は、これらのツールがそれぞれ独立した「島」のように存在していたことです。オペレーターは休暇申請やメッセージを確認するために、セクション間を何度も移動しなければなりませんでした。すべてを一箇所で確認できる場所がなかったのです。

そこで、通知センターを構築しました。これは、あらゆる関連イベントを一つのタイムラインにまとめたものです。

Firebaseの使い方

私はFirestoreとRealtime Database (RTDB)の両方を使用しています。それぞれに特定の役割があります。

• 履歴にはFirestoreを使用:休暇申請など、変化しないデータには .get() を使用します。常時リスナーを必要としないため、コストを低く抑えられます。 • ライブデータにはRTDBを使用:チャット、リマインダー、カレンダーイベントには .on('value') を使用します。これらのノードはサイズが小さく、即座に反応させる必要があるためです。

選択を誤ると、Firebaseの利用料金に即座に跳ね返ってきます。

技術的なハードル

UIの構築には、主に3つの課題の解決が必要でした。

1. モバイルでの使いやすさ

フィルターチップには flex-wrap: wrap を使用しました。最初のバージョンでは横スクロールを採用していましたが、モバイルではチップが見えず、スクロールできることにも気づいてもらえませんでした。2行に折り返すことで、この問題は解決しました。

2. CSSのポジショニング

パネルを document.body に直接追加しました。overflow:hidden が設定されたコンテナの中に fixed 要素をネストすると、ポジショニングが崩れてしまうためです。

3. セッション復元時のバグ

本番環境において、「ログイン状態を保持する」機能を利用しているユーザーのパネルが空になってしまう問題が発生しました。初期化コードが手動ログイン時にしか実行されず、セッションが復元されたときには実行されていなかったのです。

通知センターが必ず読み込まれるよう、3つのフォールバック・レベルを実装しました:

  • ログイン関数へのラッパー。
  • 500msごとにユーザーを確認するポーリングループ。
  • ユーザープロフィールが画面に表示されるのを監視する MutationObserver

設計の成功例

  • localStorage を使用して、ユーザーごとの既読ステータスを追跡する。
  • 複雑なクエリにはFirestoreの複合インデックスを使用する。
  • メディアクエリを使用して、モバイルで fixed 要素の位置を調整し、トップバーを塞がないようにする。

アーキテクチャが重要です。ログにはFirestoreを、ライブアップデートにはRTDBを使用しましょう。

出典: https://dev.to/androve2k/building-a-notification-center-in-a-firebase-pwa-firestore-vs-rtdb-and-three-bootstrap-fallback-5feb