//tips
//smart contract
カードの前後入れ替え処理の継続。
<IconButton className={classes.rightarrow} onClick={()=>console.log('clicked')}>のイベント関数の実装を行う。
実装してからconst NoteCard = ({note,handleDelete}) => {に引き継ぐことになる。
関数の内容としては、クリックされた段階で、doc.idとcardorderを取得し、当cardorderと次のcardoder数字をそれぞれ+1,-1する。
その際にはuseridごとにcardorderが異なるが、ここはデータの取得タイミングでconst q = await query(colRef,where("userid","==",id))のようにuseridのもので縛っているので問題ない。
<IconButton className={classes.rightarrow} onClick={handleOrderchangeright(note.cardorder)}>
<ArrowForwardIosOutlinedIcon />
</IconButton>
updateRefを行う際にdoc.idで取得した方が良さそうなのでそちらを変更。
試しで下記を実行させようとしたらhandleOrderchangerightでのエラー。
const handleOrderchangeright=async(id)=>{
//該当cardorderの取得したものがid,id+1
const docRef = doc(firebaseApp,'mydata',id.toString());
const docSnap = await getDoc(docRef);
console.log(docSnap.data());
actionの中に入れて実行使用としたがactionはCardHeaderの中で使える要素だった。
探してみると<CardActions>を見つけたのでこちらを使用してみる。
https://mui.com/api/card-actions/
うまくいかない。
<ArrowForwardIosOutlinedIcon className={classes.rightarrow} onClick={()=>handleOrderchangeright(note.docid)} />
こちらもエラー。
<CardActions>
<Button onClick={()=>handleOrderchangeright(note.docid)}><ArrowForwardIosOutlinedIcon /></Button>
<Button size="small">Learn More</Button>
</CardActions>
こちらの形でうまくいくことを確認できた。
この流れでイベントを下記のように実装。
const handleOrderchangeright=async(id)=>{
//ninjaそのものがuserid制限がかかったもの
//該当cardorderの取得したものがid,id+1
const docRef = doc(firebaseApp,'mydata',id.toString());
const docSnap = await getDoc(docRef);
console.log(docSnap.data());
console.log(docSnap.data().cardorder);
const cordbase=docSnap.data().cardorder+1
console.log(cordbase);
var target2=null
//clickされた次のcordnumberのdocidの取得
ninja.forEach(Item => {
if(Item.cardorder ===cordbase){
target2=Item.docid
console.log(target2);
}
});
const updateRef = doc(firebaseApp,'mydata',id.toString());
updateDoc(updateRef, {
cardorder: id+1
});
const updateRef2 = doc(firebaseApp,'mydata', target2.toString());
updateDoc(updateRef2, {
cardorder: id-1
});
}
次のcardorderを持つdocidを入れ替える処理を行なっている。
cardorderの更新処理はできたが、文字列の11と数字の0になってしまっているので調整。
const updateRef = doc(firebaseApp,'mydata',id.toString());
updateDoc(updateRef, {
cardorder: docSnap.data().cardorder+1
});
const updateRef2 = doc(firebaseApp,'mydata', target2.toString());
updateDoc(updateRef2, {
cardorder: cordbase-1
});
こちらで無事に対応できた。
この変化を下記に適用し、cardorderの番号順に表示されるようにする。
{ninja.map((item,index) => (
<>
{item.cardorder &&
<Grid item xs={12} md={6} lg={4} key={index}>
<NoteCard note={item} handleDelete={handleDelete} handleOrderchangeright={handleOrderchangeright}/>
</Grid>
}
</>
keyをcardorderに変えれば良いのか。
下記のソート術を参考に加筆。先人達の偉業に感謝。ありがたや。
let ninjav = ninja.sort(function(a, b) {
return (a.cardorder < b.cardorder) ? -1 : 1; //オブジェクトの昇順ソート
//return (a.cardorder > b.cardorder) ? -1 : 1; //オブジェクトの降順ソート
});
console.log(ninjav);
{ninjav.map((item,index) => (とすることで降順処理されたものを引き渡した。
きちんと反映された。
このカードの入れ替えはリアルタイムで反映させたい。
ここだけリアルタイム反映処理をできないか模索する。