Created
November 2, 2011 04:28
-
-
Save cmwelsh/1332856 to your computer and use it in GitHub Desktop.
JavaScript: Facebook Event Invitation Prototype using jQuery Deferred
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function isFacebookLoggedInPromise() { | |
console.log('is facebook logged in?'); | |
var deferred = $.Deferred(); | |
FB.getLoginStatus(function(response) { | |
if (response.session !== null) { | |
console.log('already logged in'); | |
deferred.resolve(); | |
} else { | |
console.log('not already logged in'); | |
deferred.reject(); | |
} | |
}); | |
return deferred.promise(); | |
} | |
function facebookLoggedInPromise() { | |
console.log('ensuring logged in'); | |
var deferred = $.Deferred(); | |
function doLogin() { | |
console.log('doing login'); | |
var requestedPermissions = 'publish_stream,create_event,email'; | |
FB.login(function(response) { | |
if (response.session) { | |
console.log('login successful'); | |
deferred.resolve(); | |
} else { | |
console.log('login failed'); | |
deferred.reject(); | |
} | |
}, { perms: requestedPermissions }); | |
} | |
$.when(isFacebookLoggedInPromise()) | |
.done(deferred.resolve) | |
.fail(doLogin); | |
return deferred.promise(); | |
} | |
function friendsSelectedPromise() { | |
console.log('time to select friends'); | |
var deferred = $.Deferred(); | |
var currentState = {}; | |
function openDialog() { | |
console.log('friend select dialog is about to open'); | |
var $inviteDialog = $('<div class="facebook-invite-dialog"></div>') | |
.appendTo('body'); | |
// create additional display elements | |
var $headingText = $('<p id="fbselector-text"></p>'); | |
var $friendsBox = $('<div id="friendselector"></div>'); | |
var $inviteButton = $('<a class="btn"></button>'); | |
$headingText.html('Select the friends you want to invite to go to the game:'); | |
$inviteButton.html('Invite Friends'); | |
// append all the new elements | |
$inviteDialog | |
.append($headingText) | |
.append($friendsBox) | |
.append($inviteButton); | |
// init the multi-friend selector | |
$friendsBox.jfmfs(); | |
$inviteButton.click(function (e) { | |
e.preventDefault(); | |
var selectedFriends = $friendsBox.data('jfmfs').getSelectedIds(); | |
currentState.selectedFriends = selectedFriends; | |
deferred.resolveWith(null, [currentState]); | |
$inviteDialog.remove(); | |
}); | |
$inviteDialog.dialog({ | |
width: 260, | |
modal: true, | |
title: 'Invite Your Friends', | |
draggable: false, | |
resizable: false, | |
position: 'center', | |
open: function() { | |
}, | |
close: function() { | |
// only rejects if deferred not yet resolved | |
deferred.reject(); | |
$inviteDialog.remove(); | |
} | |
}); | |
} | |
openDialog(); | |
/* | |
var $friendsBox = $('#friends-box-test'); | |
$friendsBox.jfmfs(); | |
$('.facebook-get-selected') | |
.unbind('.facebook') | |
.bind('click.facebook', function (e) { | |
e.preventDefault(); | |
console.log(selectedFriends); | |
window.eventFriends = selectedFriends.join(','); | |
}); | |
*/ | |
return deferred.promise(); | |
} | |
function eventCreatedPromise(inputState) { | |
var deferred = $.Deferred(); | |
var currentState = $.extend({}, inputState); | |
console.log('time to create event'); | |
console.log('maybe we were given some IDs:'); | |
console.log(currentState.selectedFriends); | |
console.log('guess we can make that event now...'); | |
var datetime = 'november 4, 2011 4pm'; | |
console.log('wait, first lets convert the time to facebook timestamp'); | |
var conversionXHR = $.ajax({ | |
url: 'convert_time.php', | |
type: 'get', | |
data: { | |
datetime: datetime | |
}, | |
dataType: 'json' | |
}).done(function (timeData) { | |
console.log('ok... received converted timestamp:'); | |
console.log(timeData); | |
var facebookTimestamp = parseInt(timeData.timestamp, 10); | |
console.log('just the timestamp:'); | |
console.log(facebookTimestamp); | |
console.log('send event creation request now:'); | |
FB.api('/me/events', | |
'post', { | |
name: "Exhibition Match", | |
start_time: facebookTimestamp, | |
end_time: facebookTimestamp + (60 * 60 * 1), | |
location: "Hartford, Connecticut" | |
}, function (eventData) { | |
console.log('event was either created or not created now, peep this data:'); | |
console.log(eventData); | |
if (eventData.error) { | |
console.log('well, from that it looks like there was an error creating the event'); | |
deferred.reject(); | |
return; | |
} | |
console.log('it looks like the event was created after all'); | |
currentState.eventId = eventData.id; | |
deferred.resolveWith(null, [currentState]); | |
} | |
); | |
}); | |
return deferred.promise(); | |
} | |
function friendsInvitedPromise(inputState) { | |
var deferred = $.Deferred(); | |
var currentState = $.extend({}, inputState); | |
console.log('time to invite some friends'); | |
console.log('state:'); | |
console.log(currentState); | |
var selectedFriendsSerialized = currentState.selectedFriends.join(','); | |
FB.api( | |
{ | |
method: 'events.invite', | |
eid: currentState.eventId, | |
uids: selectedFriendsSerialized, | |
personal_message: "Let's watch the game together!" | |
}, | |
function(inviteData) { | |
console.log(inviteData); | |
if (inviteData.hasOwnProperty('error_msg')) { | |
console.log('error inviting your mates'); | |
deferred.reject(); | |
return; | |
} | |
console.log('successfully invited your mates'); | |
deferred.resolve(); | |
} | |
); | |
return deferred.promise(); | |
} | |
function creationConfirmedPromise() { | |
var deferred = $.Deferred(); | |
console.log('time to show a confirmation'); | |
var $dialog = $('<div></div>'); | |
$dialog.attr('title', 'Friends Invited'); | |
var $successMessage = $('<p></p>'); | |
$successMessage | |
.append('<span class="ui-icon ui-icon-circle-check" style="float:left; margin:0 7px 50px 0;"></span>') | |
.append('Thanks for inviting your friends to go to the game. This message is inspirational and stuff! Go Team!') | |
.appendTo($dialog); | |
$dialog.dialog({ | |
modal: true, | |
buttons: { | |
'Ok...': function() { | |
deferred.resolve(); | |
$dialog.remove(); | |
} | |
} | |
}); | |
return deferred.promise(); | |
} | |
function inviteSuccessful() { | |
console.log('finally we are done'); | |
} | |
function inviteFailed() { | |
console.log('a step failed somewhere along the way, maybe show a message'); | |
} | |
function inviteToWatch() { | |
$.when(facebookLoggedInPromise()) | |
.pipe(friendsSelectedPromise) | |
.pipe(eventCreatedPromise) | |
.pipe(friendsInvitedPromise) | |
.pipe(creationConfirmedPromise) | |
.done(inviteSuccessful) | |
.fail(inviteFailed); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment