前提・実現したいこと・コード
FirestoreとNext.jsでSNSを開発しており、通知一覧コンポーネントを描画した際、通知を既読状態にしたいと考えています。
通知はFirestoreで下記のように、オブジェクトの配列として格納しています。
Firestore
1users 2 - uid 3 - name: "foo" 4 - notifications: 5 0: { 6 name: "bar" // 通知を送ってきたユーザーの名前 7 isRead: false // 未読の場合false 8 } 9 1: { 10 name: "baz" 11 isRead: false 12 }
通知一覧コンポーネントを描画した際に、上記のnotifications
フィールドに格納されているすべてのオブジェクトの内、isRead
がfalse
のオブジェクトのisRead
をtrue
にしたいです。
通知一覧コンポーネントは下記のようになっています。
javascript
1// ↓ 通知一覧コンポーネント 2const Notifs = ({ user, setOpenNotifs }) => { 3 const notifs = user.notifications.map((notif, index) => { 4 return <li key={index}>{notif.name}から通知が来ました。</li> 5 }) 6 7 return ( 8 <ul> 9 {notifs} 10 <li> 11 <button onClick={()=> setOpenNotifs(false)}>閉じる</button> 12 </li> 13 </ul> 14 ) 15} 16 17// 通知一覧コンポーネントを開くコンポーネント 18const Header = ({ user }) => { 19 const [notifLength, setNotifLength] = useState(0) 20 const [openNotifs, setOpenNotifs] = useState(false) 21 useEffect(() => { 22 if (!user || user.notifications.length < 1) return 23 const notifs = user.notifications.filter((notif) => !notif.isRead) // 未読を取得 24 setNotifLength(notifs.length) 25 }, []) 26 27 return ( 28 <hedaer> 29 <img src="logo" /> 30 <button onClick={()=> setOpenNotifs(true)}> 31 通知 32 <span>未読の数: {notifLength > 0 && notifLength}</span> 33 </button> 34 {openNofis && <Notifs user={user} setOpenNotifs={setOpenNotifs} />} 35 </header> 36 ) 37}
試したこと
通知一覧コンポーネントNotifs
で下記を実行しました。
javascript
1useEffect(() => { 2 firebase.firestore().collection("users").doc(user.uid).get().then((doc) => { 3 const notifs = doc.data().notifications; 4 notifs.forEach((notif) => { 5 if(notif.isRead) return 6 console.log(notif.isRead) 7 db.collection("users").doc(user.uid).update({ isRead: true }) 8 }) 9 }) 10}, [])
結果、isRead
がtrueになりませんでした。
そのため、未読数の表示も変化が無い状態です。
Notifs
を描画するたびに、コンソールにはfalse
が表示されます。
コンソールにisRead
が表示されるため条件分岐のミスではなく、Firestore
のupdate
メソッドが上手く実行できていないことが原因かと思いますが、私では原因が分かりません。
また、上記のisRead
をtrue
にする方法は非同期処理のため、例えば通知一覧コンポーネントを開いてただちに閉じた場合は処理が途中で終わり、DBのデータと実態に不整合が発生する可能性が考えられます。
Next.jsのAPIルートかCloud functions
を使ってバックエンドでisRead
を書き換えることができれば、処理が途中で終わる可能性は排除できそうですが、クライアント側の処理で問題無い方法があればご教示いただきたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/12 09:05