(function () { var facebookAppId = '878434192277580'; var roleArn = 'arn:aws:iam::802694931986:role/facebookBackSpace'; var bucketName = 'lab.backspace.academy'; AWS.config.region = 'us-east-1'; var userLoggedIn = false; var userSync = false; var S3 = new AWS.S3({ params: { Bucket: bucketName } }); var fbUserId = '0'; var fbToken = '0'; var prefix = '0' var objKeys = []; var objKeysList = ''; /******************** Startup functions ***********************************/ $.jGrowl.defaults.closerTemplate = '<div class="alert alert-info">Close All</div>'; loadObjKeys(); loadModals(); /******************** Button Events ***************************************/ $('#btnCreate').on('click', function (event) { createShoppingList(); }); $('#btnSync').on('click', function (event) { console.log('Starting sync...'); syncShoppingList(); }); $('#btnDelete').on('click', function (event) { deleteShoppingList($('#dropdownDeleteList')[0].selectedIndex); }); $('#dropdownReadList').on('click', function (event) { readShoppingList($('#dropdownReadList')[0].selectedIndex); }); /******************* Facebook Login ***************************************/ function statusChangeCallback(response) { console.log('Facebook response: ') console.log(response); if (response.status === 'connected') { // Logged into your app and Facebook. Pass details to app. testAPI(); setupAWS(response); } else if (response.status === 'not_authorized') { document.getElementById('status').innerHTML = 'Please log ' + 'into this app.'; } else { document.getElementById('status').innerHTML = 'Please log ' + 'into Facebook.'; } } function checkLoginState() { FB.getLoginStatus(function(response) { statusChangeCallback(response); }); } window.fbAsyncInit = function() { FB.init({ appId : facebookAppId, cookie : true, xfbml : true, version : 'v2.2' }); FB.getLoginStatus(function(response) { statusChangeCallback(response); }); }; (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = '//connect.facebook.net/en_US/sdk.js'; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); function testAPI() { console.log('Welcome! Fetching your information.... '); FB.api('/me', function(response) { console.log('Successful login for: ' + response.name); document.getElementById('status').innerHTML = 'Thanks for logging in, ' + response.name + '!'; }); document.getElementById('status').innerHTML = 'Logged ' + 'into Facebook.'; } function validLogin(){ // Checks you have logged in and token hasn't expired var tempDate = new Date(); var tempValid = true; if (!userLoggedIn){ tempValid = false; growl('danger', 'Facebook Error', 'You are currently not logged in with Facebook!'); } else if (tempDate >= fbTokenExpires){ tempValid = false; growl('danger', 'Facebook Error', 'Facebook token expired. Please log in again'); } return tempValid; } /******************* Create temporary AWS credentials *********************/ Date.prototype.addHours= function(h){ this.setHours(this.getHours()+h); return this; }; function setupAWS(response){ fbToken = response.authResponse.accessToken; console.log('Facebook token: ' + JSON.stringify(fbToken)) fbTokenExpires = new Date().addHours(response.authResponse.expires/3600); fbUserId = response.authResponse.userID; prefix = 'facebook-' + fbUserId; S3.config.credentials = new AWS.WebIdentityCredentials({ ProviderId: 'graph.facebook.com', RoleArn: roleArn, WebIdentityToken: fbToken }); userLoggedIn = true; console.log('Finished creating AWS credentials for account: ' + fbUserId); syncShoppingList(); } /******************** Create a new shopping list ***************************/ function createShoppingList(){ if (validLogin()){ var listName = $('#inputCreateName')[0].value; if (listName == ''){ growl('danger', 'List Name Error', 'Please enter a valid name for your shopping list!'); return; } $('#btnCreate').attr("disabled", "disabled"); showSpinner(); data = { listName: listName, itemList: $('#inputCreateList')[0].value, lastUpdated: new Date() }; var key = prefix + '/' + listName + '.json'; saveLocalStorage(data,key); var keyDetails = { 'key': key, 'lastUpdated': new Date() } objKeys.push(keyDetails); saveLocalStorage(objKeys,'objKeysBSL'); hideSpinner(); $('#btnCreate').removeAttr("disabled"); loadModals(); growl('success', 'List Created', 'Shopping list successfully created'); } } /**************** Delete an existing shopping list ************************/ function deleteShoppingList(shoppingList){ if (objKeys.length>0){ $('#btnDelete').attr("disabled", "disabled"); var key = objKeys[shoppingList].key; deleteLocalStorage(key); objKeys.splice(shoppingList, 1); saveLocalStorage(objKeys,'objKeysBSL'); loadModals(); growl('success','Deleted.','Shopping list successfully deleted'); $('#btnDelete').removeAttr("disabled"); } else{ growl('danger','Error.','You have no shopping lists to delete!'); } } /****************** Read an existing shopping list *************************/ function readShoppingList(shoppingList){ if (objKeys.length>0){ var key = objKeys[shoppingList].key; $('#inputReadList')[0].innerHTML = readLocalStorage(key).itemList; } else{ $('#inputReadList')[0].innerHTML = 'You currently have no shopping lists.' } } /************************* S3 functions ************************************/ function saveS3(data,key){ } function deleteS3(key){ } function syncShoppingList(){ } function checkLocal(){ } function syncS3Local(objKeyS3, emptyS3){ } /*********************** Local Storage Functions ***************************/ function saveLocalStorage(data,key){ localStorage.setItem(key, JSON.stringify(data)); } function readLocalStorage(key){ if (localStorage.getItem(key)){ return JSON.parse(localStorage.getItem(key)); } } function deleteLocalStorage(key){ localStorage.removeItem(key); } function loadObjKeys(){ // Get objKeys from local storage console.log('Retrieving database index from local storage...'); objKeys = readLocalStorage('objKeysBSL'); // Check objKeys is null. try { if ((objKeys === null)||(objKeys === undefined)) { objKeys =[]; } } catch (e) { // Problem with objKeys objKeys =[]; } console.log('Retrieved local objKeys: ' + JSON.stringify(objKeys)); growl('success','Completed','Retrieved database index from local storage... '); } /*************************** User Interface ********************************/ function loadModals(){ console.log('load Modals with :'+ JSON.stringify(objKeys)) var tempStr = ''; var option; var x = $('#dropdownReadList')[0]; var y = $('#dropdownDeleteList')[0]; x.innerHTML = ''; // Clear dropdown lists y.innerHTML = ''; // Load dropdown lists with object names for (var a=0; a<objKeys.length;a++){ tempStr = objKeys[a].key.substring(objKeys[a].key.indexOf('/') + 1); tempStr = tempStr.replace('.json', ''); console.log('load Modals with :'+ tempStr) option = document.createElement('option'); option.text = tempStr; x.add(option); option = document.createElement('option'); option.text = tempStr; y.add(option); } } function growl(alertType,title,message){ $('#jGrowl-container1').jGrowl({ header: title, message: message, group: 'alert-' + alertType, life: 5000 }); } function showSpinner(){ $('#pageSpinner').css('display', 'block'); } function hideSpinner(){ $('#pageSpinner').css('display', 'none'); } /*************************** END *******************************************/ })();