//tips
//smart contract
まずはデータベースへのメッセージ登録の部分から設定していく。
Messageページは他のものとは異なりデータベースのコレクションとしてdirectmessageとして分離させており、その内容がninjaの中に格納されることに注意しながら設計する。
const colRef= await collection(firebaseApp, "directmessage")
const q = await query(colRef,where("userid","==",id))
localStorageに格納しているTowhomのuseridに向けてメッセージを送ることになるので、テキストフォームの内容は下記のようにしておいた。mixlist.mapをレンダリングの中で何度も使うのはどうかと思うので変数に格納する関数を別途作るか考えておく。
<form noValidate autoComplete="off" onSubmit={handleOnMessage}>
{mixlist.map((item,index) => (
<div key={index} >
{item.userid==localStorage.getItem('authuserid')&&(
<Typography>
To: {item.username}
</Typography>
)}
</div>
))
}
<TextField
onChange={(e)=>setUmail(e.target.value)}
variant="outlined"
color="secondary"
fullWidth
required
/>
<Box >
<Button
type="submit"
varient="contained"
>
submit
</Button>
</Box>
</form>
handleOnMessageの編集に移る。
ダイレクトメッセージは過去に実施されていない場合もあるので、mixlistとlocalstorageのget内容で抽出する形にするのが安全。
新規メッセージつの追加内容は
userid:,
username:,
date:Date.now(),
mail:,
Message: email,
Towhom:localStorage.getItem('Towhom')
で考えていたのでベースデータからmail情報も引っ張ってくるように設定。
pile.mail = data.mail?data.mail:null
下記のようにメッセージをデータベースに登録する関数を設定。
async function handleOnMessage(e) {
e.preventDefault();
//メッセージ内容
const message=umail
//'authuserid'の登録は事前にチェック 現在ログインではなく、ログインかつ自身のページへの遷移でauthuseridが再記録されるため
//まずは送付側からドキュメント生成し文言を配列として追加
mixlist.map((item) => {
if(item.userid==localStorage.getItem('authuserid')){
addDoc(mailRef,{
userid:item.userid,
username:item.username,
date:Date.now(),
mail:item.mail,
Message: message,
Towhom:localStorage.getItem('Towhom')
})
}
})
router.reload()
}
無事に登録は確認できたが Towhom:Towhomがnullになってしまっている。
一度変数に入れ込んであげるようにする。
const Towhom=localStorage.getItem('Towhom')
[id]ページに戻りメッセージボタンをクリックしようとしたら。
Debankのdeposit.jsでエラーが発生しているよう。また、改変があったのか確認する。
ネット接続不良が問題だった。
きちんとデータベースにtowhomも表示されるようになった。
今度は登録されているメッセージの内容を全て表示させてみる。ここで初めてdirectmessageの方のコレクションデータを使用する。
{ninja.map((item,index) => (
<div key={index} >
<Typography className={classes.titlebackshape}>
{item.username}: {item.Message}
</Typography>
</div>
))
}
きちんとメッセージを抽出することができた。
他のuseridのメッセージも試しに登録してしまう。ログアウトと再ログイン認証の手間がかかるので、これはデータベースに直接登録する。
登録するとデータベースからの取得の段階でuseridで制限をかけてしまっているので、こちらを少し拡張しないと自分が受け取る場合のメッセージを表示させることができない。全部を取得するのはたとえメッセージでも膨大すぎるので控えたい。
const q = await query(colRef,where("userid","==",id))
複合クエリに拡張する。
https://firebase.google.com/docs/firestore/query-data/queries
ここには&の場合のみしか記述がない。orの場合の処理を探すもなし。
userid==1 or Towhom==“1”
しょうがないので、論理式を利用して、これを!(user!=1&&Towhom!=“1”)に変換しようとしたが、全体を逆にするものがない。
しょうがないので二つのwhereで抜き出したものを融合させる処理を探す。
https://stackoverflow.com/questions/59611888/how-do-i-retrieve-data-from-firestore-using-an-or-operator-in-javascript
https://medium.com/firebase-tips-tricks/how-to-combined-two-firestore-queries-to-simulate-a-logical-or-query-27d28a43cb2d
const citiesArray = capitalCitiesArray.concat(italianCitiesArray);が使えそう。
こちらの設計の取り込みを行う。