First off we need to define some things that are common to all the code blocks:
// fake an enum, allows auto-complete for some editors
var RequestStatus = {
requested: 'requested',
rejected: 'rejected',
approved: 'approved'
};
// define our Parse Class
var FriendRequest = Parse.Object.extend('FriendRequest');
var currentUser = Parse.User.current();
I will also assume you have jQuery available.Now lets go through our requirements.
Find a person (highlight existing status)
// for simplicity lets assume we're doing a search for people
// in the same "area" as us, lets also assume you're aware of
// case-sensitive issues and created a "search_Area" property
// forced to lower-case (using a before-save Cloud Function)
var userQuery = new Parse.Query(Parse.User);
userQuery.equalTo('search_Area', currentUser.get('search_Area'));
// shared array we'll store details in
var userList = [];
// dictionary we'll use for easier updating
var userDict = [];
userQuery.find().then(function(users) {
// lets just extract the "id" and "username" first
for (var i in users) {
var userInfo = {
id: users[i].id,
name: users[i].get('username')
});
userList.push(userInfo);
userDict[userInfo.id] = userInfo;
}
// now we need to attach a status to each one
var myRequests = new Parse.Query(FriendRequest);
myRequests.equalTo('fromUser', currentUser);
myRequests.equalTo('toUser', users);
var requestsToMe = new Parse.Query(FriendRequest);
requestsToMe.equalTo('fromUser', users);
requestsToMe.equalTo('toUser', currentUser);
var combinedRequests = Parse.Query.or(myRequests, requeststoMe);
return combinedRequest.find();
}).then(function (requests) {
for (var i in requests) {
var request = requests[i];
var status = request.get('status');
if (request.get('fromUser').id == currentUser.id) {
// set status from my perspective
userDict[request.get('toUser').id].statusMessage =
status == RequestStatus.approved ? 'Already my friend' :
status == RequestStatus.rejected ? 'I rejected them' :
status == RequestStatus.requested ? 'Waiting for them to reply' :
'Unknown status';
} else {
// set status from the other person's perspective
userDict[request.get('fromUser').id].statusMessage =
status == RequestStatus.approved ? 'Already my friend' :
status == RequestStatus.rejected ? 'They rejected me' :
status == RequestStatus.requested ? 'Waiting for me to reply' :
'Unknown status';
}
}
// at this point you can render the userList
for (var i in userList) {
var userInfo = userList[i];
// assuming you have a container DIV with id="possibleFriends"
$('#possibleFriends').append(
'<div data-user-id="' + userInfo.id + '"'
+ ' class="possibleFriend">'
+ userInfo.userName
// not all will have a status, so handle that
+ (userInfo.status ? ' - ' + userInfo.status : '')
+ '</div>');
}
});
With the above you can extend it however you like to allow sorting etc, it is just the bare-bones implementation.
No comments:
Post a Comment