Skip to content

Instantly share code, notes, and snippets.

@cmwelsh
Created November 2, 2011 04:28
Show Gist options
  • Save cmwelsh/1332856 to your computer and use it in GitHub Desktop.
Save cmwelsh/1332856 to your computer and use it in GitHub Desktop.
JavaScript: Facebook Event Invitation Prototype using jQuery Deferred
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