I'm creating a chat with firestore. I want to sort a array based on another array that has strings that are represented by the uid present on the first array.
first I have this state and this ID.
const [allInp, setAllInp] = useState({ searchConv: '' })
const dropId = searchConv
I have this array
const findUser = (ele) => {
if (!ele || !ele.fullName) return false
return ele.fullName.toLowerCase().includes(allInp[dropId].toLowerCase())
}
const myUid = 'ibPlTju8K2d3PlydP6sdm2T4S2L2'
const allChat = const allChat = [
{
senders: [
'GiVtXApvumQgkUpkTuOGoKbe9ZE2',
'glBNAhj3RrSj5FBDwOzzSnPKN5S2'
],
lastTalk: {
seconds: 1666016615,
nanoseconds: 242000000
},
lastMessage: 'lorem',
glBNAhj3RrSj5FBDwOzzSnPKN5S2: {
uid: 'glBNAhj3RrSj5FBDwOzzSnPKN5S2',
userRead: true,
fullName: 'Carina Lima'
},
docid: 'GiVtXApvumQgkUpkTuOGoKbe9ZE27777glBNAhj3RrSj5FBDwOzzSnPKN5S2',
GiVtXApvumQgkUpkTuOGoKbe9ZE2: {
userRead: false,
uid: 'GiVtXApvumQgkUpkTuOGoKbe9ZE2',
fullName: 'Cristian Derick'
},
id: 'GiVtXApvumQgkUpkTuOGoKbe9ZE27777glBNAhj3RrSj5FBDwOzzSnPKN5S2'
},
{
docid: 'glBNAhj3RrSj5FBDwOzzSnPKN5S27777WBZHUtoZ9DhddVmS07RL0wlvDgz1',
WBZHUtoZ9DhddVmS07RL0wlvDgz1: {
fullName: 'Bruce Dikinson',
uid: 'WBZHUtoZ9DhddVmS07RL0wlvDgz1',
userRead: false
},
lastTalk: {
seconds: 1665066226,
nanoseconds: 646000000
},
lastMessage: 'whatever whatever',
glBNAhj3RrSj5FBDwOzzSnPKN5S2: {
uid: 'glBNAhj3RrSj5FBDwOzzSnPKN5S2',
userRead: true,
fullName: 'Carina Lima'
},
senders: [
'glBNAhj3RrSj5FBDwOzzSnPKN5S2',
'WBZHUtoZ9DhddVmS07RL0wlvDgz1'
],
id: 'glBNAhj3RrSj5FBDwOzzSnPKN5S27777WBZHUtoZ9DhddVmS07RL0wlvDgz1'
},
{
lastTalk: {
seconds: 1666189405,
nanoseconds: 328000000
},
senders: [
'glBNAhj3RrSj5FBDwOzzSnPKN5S2',
'glBNAhj3RrSj5FBDwOzzSnPKN5S2'
],
glBNAhj3RrSj5FBDwOzzSnPKN5S2: {
userRead: false,
fullName: 'Carina Lima',
uid: 'glBNAhj3RrSj5FBDwOzzSnPKN5S2'
},
docid: 'glBNAhj3RrSj5FBDwOzzSnPKN5S27777glBNAhj3RrSj5FBDwOzzSnPKN5S2',
lastMessage: 'whatever',
id: 'glBNAhj3RrSj5FBDwOzzSnPKN5S27777glBNAhj3RrSj5FBDwOzzSnPKN5S2'
},
{
docid: 'glBNAhj3RrSj5FBDwOzzSnPKN5S27777ibPlTju8K2d3PlydP6sdm2T4S2L2',
lastTalk: {
seconds: 1666270072,
nanoseconds: 99000000
},
lastMessage: 'Okay',
senders: [
'glBNAhj3RrSj5FBDwOzzSnPKN5S2',
'ibPlTju8K2d3PlydP6sdm2T4S2L2'
],
ibPlTju8K2d3PlydP6sdm2T4S2L2: {
uid: 'ibPlTju8K2d3PlydP6sdm2T4S2L2',
userRead: true,
fullName: 'Wanderson Santos'
},
glBNAhj3RrSj5FBDwOzzSnPKN5S2: {
userRead: false,
fullName: 'Carina Lima',
uid: 'glBNAhj3RrSj5FBDwOzzSnPKN5S2'
},
id: 'glBNAhj3RrSj5FBDwOzzSnPKN5S27777ibPlTju8K2d3PlydP6sdm2T4S2L2'
}
]
I'm cleaning it like this to have only the data of the person I'm talking to, and alread sorting this way.
const fRes = allChat.map(ele => {
if (!ele || !ele.senders || !ele.senders.includes(myUid)) return null
const [newok] = ele.senders.filter(kv => kv !== myUid)
let finalUser = newok
if (ele.senders.filter(cv => cv === myUid).length === 2) finalUser = myUid
return {
...ele[finalUser],
lastMessage: ele.lastMessage,
lastTalk: ele.lastTalk.toDate && new Date(ele.lastTalk.toDate()).getTime()
}
}).filter(kk => kk).filter(wv => findUser(wv)).sort((a, b) => b.lastTalk - a.lastTalk)
response:
fRes = [
{
fullName: 'Wanderson Santos',
uid: 'ibPlTju8K2d3PlydP6sdm2T4S2L2',
userRead: true,
lastMessage: 'okay',
lastTalk: 1666270072099
},
{
uid: 'glBNAhj3RrSj5FBDwOzzSnPKN5S2',
fullName: 'Carina Lima',
userRead: false,
lastMessage: 'whatever',
lastTalk: 1666189405328
},
{
uid: 'GiVtXApvumQgkUpkTuOGoKbe9ZE2',
userRead: false,
fullName: 'Cristian Derick',
lastMessage: 'lorem',
lastTalk: 1666016615242
},
{
uid: 'WBZHUtoZ9DhddVmS07RL0wlvDgz1',
userRead: false,
fullName: 'Bruce Dikinson',
lastMessage: 'whatever whatever',
lastTalk: 1665066226646
}
]
Now when I insert uid string on this array
const priority = [
'WBZHUtoZ9DhddVmS07RL0wlvDgz1',
'GiVtXApvumQgkUpkTuOGoKbe9ZE2'
]
I want a new sort based on priority, should be:
[
{
uid: 'GiVtXApvumQgkUpkTuOGoKbe9ZE2',
userRead: false,
fullName: 'Cristian Derick',
lastMessage: 'lorem',
lastTalk: 1666016615242
},
{
uid: 'WBZHUtoZ9DhddVmS07RL0wlvDgz1',
userRead: false,
fullName: 'Bruce Dikinson',
lastMessage: 'whatever whatever',
lastTalk: 1665066226646
},
{
fullName: 'Wanderson Santos',
uid: 'ibPlTju8K2d3PlydP6sdm2T4S2L2',
userRead: true,
lastMessage: 'okay',
lastTalk: 1666270072099
},
{
uid: 'glBNAhj3RrSj5FBDwOzzSnPKN5S2',
fullName: 'Carina Lima',
userRead: false,
lastMessage: 'whatever',
lastTalk: 1666189405328
}
]
Based on Last Talk and Priority sorted by priority on top and the rest of the users then
CodePudding user response:
.sort((a, b) => {
const aPriority = priority.indexOf(a.uid)
const bPriority = priority.indexOf(b.uid)
if (aPriority !== -1 && bPriority !== -1) {
return bPriority - aPriority
}
if (aPriority !== -1) {
return -1
}
if (bPriority !== -1) {
return 1
}
return b.lastTalk - a.lastTalk
})