Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RailsとFirebaseで作るリアルタイムチャット

moai
March 26, 2021

 RailsとFirebaseで作るリアルタイムチャット

Railsとfirebaseでどのようにリアルタイムチャットを作ったのかを話します。

moai

March 26, 2021
Tweet

More Decks by moai

Other Decks in Programming

Transcript

  1. 14 アーキテクチャざっくり
 Data Fetch 
 個人情報のやり取り
 Event Publish
 イベントが
 起こったことだけ


    を通知
 Event Subscribe
 イベントが
 起きたことだけを受 信
 新しい Event 有る?

  2. 17 JavaScript側擬似コード
 export const ChatContainer = (id) => { 2

    const [timelines, setTimeLines] = React.useState([]); const [latestId, setLatestId] = React.useState(0); 3 const reloadTimeline = (id) => { Api.fetchTimeline(setTimeLines); setLatestId(id);}; 4 const usePushNotification(reloadTimeline) = firestore 5 .collection('timeline_notifications').where('identifier', '==', "${id}-timeline") 6 .limit(1).nSnapshot(querySnapshot => { 7 if( querySnapshot.docs[0].id !== latestId ) reloadTimeline(querySnapshot.docs[0].id); 8 }); 9 React.useEffect(() => { usePushNotification(reloadTimeline) } ); 10 return (<Table rows={timelines} />); }
  3. 19 サブスクライブ処理はfirebaseにおまかせできた
 新しい Event 有る?
 ここはFirebase Client がやってくれる Data Fetch

    
 個人情報のやり取り
 Event Subscribe
 イベントが
 起きたことだけを受 信
 Event Publish
 イベントが
 起こったことだけ
 を通知

  4. 20 フロント側の処理はここだけ
 export const ChatContainer = (id) => { 2

    const [timelines, setTimeLines] = React.useState([]); const [latestId, setLatestId] = React.useState(0); 3 const reloadTimeline = (id) => { Api.fetchTimeline(setTimeLines); setLatestId(id);}; 4 const usePushNotification(reloadTimeline) = firestore 5 .collection('timeline_notifications').where('identifier', '==', "${id}-timeline") 6 .limit(1).nSnapshot(querySnapshot => { 7 if( querySnapshot.docs[0].id !== latestId ) reloadTimeline(querySnapshot.docs[0].id); 8 }); 9 React.useEffect(() => { usePushNotification(reloadTimeline) } ); 10 return (<Table rows={timelines} />); }