0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

こんにちは!

先日、割り勘アプリを作成しリリースしました。
2人用限定です。
こちら↓
https://split-bill-cloud.web.app

その中で、URLを相手と共有し、同じページを使う仕組みをFirebaseで構築しました。
これについて説明します。

Firebaseとは

Googleが提供するバックエンドサービス(BaaS)です。
https://firebase.google.com/?hl=ja

今回使った機能は以下2つです。

  • Cloud Firestore
  • Firebase Hosting

Cloud Firestoreは、NoSQLという種類のデータベースで、
コレクションやドキュメントといった階層構造でデータが管理されています。
onSnapshot関数を用いることで、データの変更がリアルタイムで反映されます。

Firebase Hostingはホスティングサービスです。
今回はこれを使ってデプロイしました。

今回やりたかったこと

  • ユーザーが1つの部屋に入る(部屋はURLで指定する)
  • その部屋で登録されたデータをFirebaseのデータベースに保存する
  • 挙動を監視することで、相手の画面にも反映できるようにする

そのために以下の手順で実装を行いました。

実装したこと

以下の3つのステップで構築しました。

1.URLにルームIDを持たせる
2.Firestoreで同期する
3.Firebase Hostingでデプロイする

1つずつ見ていきましょう。

1.URLにルームIDを持たせる

新規作成する場合、URLには部屋を識別するパラメータがありません。
その際、新しくroomIdを付与し、その部屋に飛ばします。

// URLに roomId がない場合(新規作成モード)
const newRoomRef = doc(collection(db, "rooms")); 
const newRoomId = newRoomRef.id; // Firebaseが作ったランダムなIDを取得


const roomSettings = {
         // Firebaseに保存するフィールド名とstate
          title: title,
          name1: n1,
          name2: n2,
          createdAt: Date.now()
        };

// データを保存して、作られたURL(部屋)へ移動させる
await setDoc(newRoomRef, roomSettings);
navigate(`/room/${newRoomId}`);

2.Firestoreで同期する

先ほど取得した roomId を Firestore のドキュメント ID として使い、 rooms/{roomId}/payments の場所を監視します。
onSnapshotはその場所のデータが変わるたびに呼ばれるので、誰かが追加・更新・削除したらすぐに画面を更新できます。

// 部屋の識別子となるroomIdを取得
const { roomId } = useParams<{ roomId: string }>();

useEffect(() => {
  if (!roomId) return;

  const paymentsCollectionRef = collection(db, "rooms", roomId, "payments");// rooms/{roomId}/payments という場所

  // onSnapshot関数で、この部屋のデータを監視する
  const unsubscribe = onSnapshot(paymentsCollectionRef, (snapshot) => {
    // snapshot.docs から最新のリストを作り、setPayments(...) で画面を更新する
  });

  // useEffectのクリーンアップ(監視の解除)
  return () => unsubscribe();
}, [roomId]);

3.Firebase Hostingでデプロイする

firebase deploy

最初のセットアップを済ませておけば、更新差分は上記のコマンドだけでデプロイすることが出来ます。
(初回は設定が必要です)

終わりに

URLを共有することで別端末でも同じDBのデータが表示できるのは面白いですね!
最後まで読んでいただきありがとうございました!
また次回の記事でお会いしましょう!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?