//tips
遂に蚊が発生。xserver復旧してよかった。
//smart contract
Follow,Follower機能の追加を考えていく。
データベースにどのように格納していくか。Follow,Follower機能について検索してみるとnext.jsではヒットせずrailsなどに関する記事が出てくる。reactに関するfollow functionでいくつか該当する記述を見つけた。
https://stackoverflow.com/questions/68846006/how-can-i-save-users-followers-in-firebase-react-native
Userid何番がuserid何番をfollowしているなどの情報をどうデータベースに格納するか模索していたところ、firebaseのデータベースの中にarrayとmapでの格納型を見つけた。
これらをうまく利用して、対応できないか。
https://dev.plus-class.jp/firestore-array/
https://cloud.google.com/firestore/docs/manage-data/add-data?hl=ja
Arrayに関する記事を見つけた。
こちらを参考にしながら試しに格納してみる。このarrayの組み込みタイミングはuseridが生成されるタイミングがベストに思われるので、その際に自動的に下記の項目も生成される形にするか。
following:
followers:
その後にfriendsなどがボタンプッシュするとpush主のuseridを何らかの形で取得して、このarrayに格納。
表示するfollowing数、follower数は.lengthで処理して表示する。
後にはそれらの表示された数字をクリックすると、各々のユーザーの名前とimageを表示させたい。これは別ページにて行うか、同一ページの下部に表示切り替えの形で表示させるか考える。
Twitterのように別ページを設けて表示させるか。
Followingやfollowerの運用はのちに組み込むブロックチェーンのリワードシステムとも関連があるのでどう使うか。
まずはfirestoreの中に配列データを生成して取り出したり、組み込んだりしてみる。
followersフィールドを作成したら、その中のインデックスに0,1…として値が組み込めるようになっているので試しに
followers:0 naki 1 niku
として値の取り出しを行なってみる。
const arraytest=async ()=>{
console.log('arraytest')
const profileRef=collection(firebaseApp,'mydata','0Ot5NWeoMULnEMvJp8xw')
await updateDoc(profileRef, {
followers: arrayUnion('Real Madrid')
})
// await updateDoc(profileRef, {
// followers: arrayRemove('Drole de monsieur')
// })
}
こちらのエラーが発生。
unhandledRejection: FirebaseError: [code=invalid-argument]: Invalid collection reference. Collection references must have an odd number of segments, but mydata/0Ot5NWeoMULnEMvJp8xw has 2.
9.0へのアップデートによりかなりの改変があったのを思い出した。firebaseのドキュメントをベースに探していくしかない。
ここはcollectではなくdocを用いてくださいというエラーだった。杞憂。
const arraytest=async ()=>{
console.log('arraytest')
const profileRef=doc(firebaseApp,'mydata','0Ot5NWeoMULnEMvJp8xw')
// await updateDoc(profileRef, {
// followers: arrayUnion('Real Madrid')
// })
await updateDoc(profileRef, {
followers: arrayRemove('Real Madrid')
})
}
arraytest();
これでarrayへの追加・削除は問題なくできた。
今度はそもそものarray情報の追加も行う。
通常のadddocを使用するときちんとfriendsは[]を使うだけで配列にできた。
const docRef = await addDoc(collection(firebaseApp,'mydata'), {
name: "Tokyo",
country: "Japan",
friends: ["Japan"]
});
既存のドキュメントの中に新たなフィールドを追加できるのか。
https://qiita.com/kokogento/items/866236257a03f4dbae5b
こちらはフィールドをあたらに追加するメソッドはなさそうだが、updateDocでarrayUnion('Real Madrid’)を使えば自動的に付与できるのではないかと気づき、実行。
const arraytest=async ()=>{
console.log('arraytest')
const profileRef=doc(firebaseApp,'mydata','0Ot5NWeoMULnEMvJp8xw')
await updateDoc(profileRef, {
friends: arrayUnion('Real Madrid')
})
無事にこちらで対応できた。素晴らしい。