You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
781 lines
32 KiB
781 lines
32 KiB
// mobile_abstract.js |
|
// 2013 Miguel Freitas |
|
// |
|
// Mobile Abstration Layer |
|
// Try to sort out lowlevel differences between jquery and jquery mobile twister interfaces |
|
|
|
var MAL = function() |
|
{ |
|
this.postboardLoading = function() { |
|
if( $.hasOwnProperty("mobile") ) { |
|
$.mobile.loading('show'); |
|
/* |
|
setTimeout(function(){ |
|
$.mobile.loading('hide'); |
|
}, 10 * 1000); |
|
*/ |
|
} else { |
|
$(".postboard-loading").show(); |
|
} |
|
} |
|
|
|
this.postboardLoaded = function() { |
|
if( $.hasOwnProperty("mobile") ) { |
|
$.mobile.loading('hide'); |
|
var curPage = $.mobile.activePage.attr("id"); |
|
$( '#'+curPage+' .content ul.posts').listview('refresh'); |
|
|
|
installPostboardClick(); |
|
} else { |
|
$(".postboard-loading").hide(); // FIXME need to decide which one we need to hide actually |
|
} |
|
} |
|
|
|
this.commonDMsListLoaded = function () { |
|
if ($.hasOwnProperty('mobile')) { |
|
$.mobile.loading('hide'); |
|
$('#directmsg .direct-messages-list').listview('refresh'); |
|
} else { |
|
} |
|
}; |
|
|
|
this.dmConversationLoaded = function (dmConvo) { |
|
if ($.hasOwnProperty('mobile')) { |
|
$.mobile.loading('hide'); |
|
$('#dmchat .direct-messages-thread').listview('refresh'); |
|
$.mobile.silentScroll($('.dm-form').offset().top); |
|
} else { |
|
var modalContent = dmConvo.closest('.modal-content'); |
|
modalContent.scrollTop(modalContent[0].scrollHeight); |
|
} |
|
}; |
|
|
|
this.relatedPostLoaded = function() { |
|
if( $.hasOwnProperty("mobile") ) { |
|
$.mobile.loading('hide'); |
|
var curPage = $.mobile.activePage.attr("id"); |
|
$( '#'+curPage+' .content ul.posts').listview('refresh'); |
|
} else { |
|
$(".postboard-loading").hide(); |
|
} |
|
} |
|
|
|
this.warnFollowingNotAny = function(cbFunc, cbReq) { |
|
if ($.hasOwnProperty('mobile')) |
|
alert(polyglot.t('warn_following_not_any')); |
|
else |
|
alertPopup({ |
|
//txtTitle: polyglot.t(''), add some title (not 'error', please) or KISS |
|
txtMessage: polyglot.t('warn_following_not_any'), |
|
cbConfirm: cbFunc, |
|
cbConfirmReq: cbReq, |
|
cbClose: 'cbConfirm' |
|
}); |
|
}; |
|
|
|
this.listLoaded = function (list) { |
|
if ($.hasOwnProperty('mobile')) { |
|
$.mobile.loading('hide'); |
|
list.listview('refresh'); |
|
} else |
|
list.find('.loading-roller').hide(); |
|
}; |
|
|
|
this.searchUserListLoaded = function() { |
|
if( $.hasOwnProperty("mobile") ) { |
|
$.mobile.loading('hide'); |
|
$(".userMenu-search-profiles").listview('refresh'); |
|
} else { |
|
var $searchResultsModal = $( ".search-results" ); |
|
$searchResultsModal.slideDown( "fast" ); |
|
} |
|
} |
|
|
|
this.reportNewPosts = function(newPosts) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
var newTweetsBar = $(".timeline-refresh .ui-btn-text"); |
|
if( newPosts ) { |
|
document.title = "(" + String(newPosts) + ") twister"; |
|
newTweetsBar.text("(" + String(newPosts) + ")"); |
|
} else { |
|
document.title = "twister"; |
|
newTweetsBar.text("Refresh"); |
|
} |
|
} else { |
|
var newTweetsBar = $(".wrapper").find(".postboard-news"); |
|
var newTweetsBarMenu = $(".userMenu").find(".menu-news"); // added for home menu entry |
|
if( newPosts ) { |
|
document.title = "(" + String(newPosts) + ") twister"; |
|
newTweetsBar.text(polyglot.t("new_posts", newPosts)); |
|
newTweetsBar.fadeIn("slow"); |
|
newTweetsBarMenu.text(String(newPosts)); |
|
newTweetsBarMenu.addClass("show"); |
|
|
|
if ($.Options.showDesktopNotifPosts.val === 'enable') { |
|
this.showDesktopNotification({ |
|
body: polyglot.t('You got') + ' ' + polyglot.t('new_posts', newPosts) + ' ' |
|
+ polyglot.t('in postboard') + '.', |
|
tag: 'twister_notification_new_posts', |
|
timeout: $.Options.showDesktopNotifPostsTimer.val, |
|
funcClick: (function() { |
|
requestTimelineUpdate('pending', this.postsCount, followingUsers, promotedPostsOnly); |
|
}).bind({postsCount: newPosts}) |
|
}); |
|
} |
|
} else { |
|
newTweetsBar.hide(); |
|
newTweetsBar.text(""); |
|
newTweetsBarMenu.text(""); |
|
newTweetsBarMenu.removeClass("show"); |
|
document.title = "twister"; |
|
} |
|
} |
|
} |
|
|
|
this.getStreamPostsParent = function() { |
|
if( $.hasOwnProperty("mobile") ) { |
|
return $( '.timeline ul'); |
|
} else { |
|
return $("#posts"); |
|
} |
|
} |
|
|
|
// how do we map usernames into urls |
|
this.userUrl = function(username) { |
|
//if( $.hasOwnProperty("mobile") ) { |
|
// return "#profile?user=" + username; |
|
//} else { |
|
if (username[0] === '*') |
|
return "#profile?group=" + username; |
|
else |
|
return "#profile?user=" + username; |
|
//} |
|
}; |
|
|
|
// recover username from url (only for hash) |
|
this.urlToUser = function(url) { |
|
var dummyUrl = this.userUrl(""); |
|
var urlIdx = url.indexOf(dummyUrl); |
|
if( urlIdx >= 0 ) |
|
return url.substr(urlIdx + dummyUrl.length); |
|
else |
|
return ""; |
|
} |
|
|
|
this.followingUrlToUser = function(url) { |
|
var dummyUrl = this.followingUrl(""); |
|
var urlIdx = url.indexOf(dummyUrl); |
|
if( urlIdx >= 0 ) |
|
return url.substr(urlIdx + dummyUrl.length); |
|
else |
|
return ""; |
|
} |
|
|
|
this.mentionsUrl = function(username) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
return "#mentions?user=" + username; |
|
} else { |
|
return "#mentions?user=" + username; |
|
} |
|
} |
|
|
|
this.hashtagUrl = function(h) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
return "#hashtag?hashtag=" + h; |
|
} else { |
|
return "#hashtag?hashtag=" + h; |
|
} |
|
} |
|
|
|
this.dmchatUrl = function (alias) { |
|
if ($.hasOwnProperty('mobile')) { |
|
return '#dmchat?user=' + alias; |
|
} else { |
|
return '#directmessages?' + (alias[0] === '*' ? 'group' : 'user') + '=' + alias; |
|
} |
|
}; |
|
|
|
this.followingUrl = function(username) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
return "#following?user=" + username; |
|
} else { |
|
return "#following?user=" + username; |
|
} |
|
} |
|
|
|
this.followUrl = function(username) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
return "#following?follow=" + username; |
|
} else { |
|
return "#following?follow=" + username; |
|
} |
|
} |
|
|
|
this.unfollowUrl = function(username) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
return "#following?unfollow=" + username; |
|
} else { |
|
return "#following?unfollow=" + username; |
|
} |
|
} |
|
|
|
this.newPostToUrl = function(username) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
return "#newmsg?replyto=" + encodeURIComponent("@"+username); |
|
} else { |
|
return "#newmsg?replyto=" + encodeURIComponent("@"+username); |
|
} |
|
} |
|
|
|
this.newPostHashtagToUrl = function(hashtag) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
return "#newmsg?replyto=" + encodeURIComponent("#"+hashtag); |
|
} else { |
|
return "#newmsg?replyto=" + encodeURIComponent("#"+hashtag); |
|
} |
|
} |
|
|
|
|
|
this.updateNewMentionsUI = function(newMentions) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
var $mentionsCounterBtnText = $(".mentions-count .ui-btn-text"); |
|
if( newMentions ) { |
|
$mentionsCounterBtnText.text("@ (" + newMentions + ")"); |
|
} else { |
|
$mentionsCounterBtnText.text("@"); |
|
} |
|
} else { |
|
var $mentionsCounter = $(".userMenu-connections .messages-qtd"); |
|
if( newMentions ) { |
|
$mentionsCounter.text(newMentions); |
|
$mentionsCounter.fadeIn(); |
|
} else { |
|
$mentionsCounter.hide(); |
|
} |
|
} |
|
} |
|
|
|
this.updateNewDMsUI = function(newDMs) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
var $DMsCounterAllPages = $(".newdms-count"); |
|
for( var i = 0; i < $DMsCounterAllPages.length; i++) { |
|
var $textElement = $DMsCounterAllPages.eq(i).find(".ui-btn-text"); |
|
if( !$textElement.length ) $textElement = $DMsCounterAllPages.eq(i); |
|
if( newDMs ) { |
|
$textElement.text("Direct Msg (" + newDMs + ")"); |
|
} else { |
|
$textElement.text("Direct Msg"); |
|
} |
|
} |
|
} else { |
|
var $DMsCounter = $(".userMenu-messages .messages-qtd"); |
|
if( newDMs ) { |
|
$DMsCounter.text(newDMs); |
|
$DMsCounter.fadeIn(); |
|
} else { |
|
$DMsCounter.hide(); |
|
} |
|
} |
|
} |
|
|
|
this.updateNewGroupDMsUI = function(newDMs) { |
|
if( $.hasOwnProperty('mobile') ) { |
|
} else { |
|
var DMsCounter = $('.userMenu-groupmessages .messages-qtd'); |
|
if (newDMs) { |
|
DMsCounter.text(newDMs).fadeIn(); |
|
} else { |
|
DMsCounter.hide(); |
|
} |
|
} |
|
} |
|
|
|
this.updateMyOwnPostCount = function(numPosts) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
console.log("FIXME: implement MAL_updateMyOwnPostCount"); |
|
} else { |
|
$(".mini-profile .posts-count").text(numPosts); |
|
} |
|
} |
|
|
|
this.goHome = function(clearTimeline) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
$.mobile.navigate( "#home" ); |
|
} else { |
|
window.location.href = "home.html"; |
|
} |
|
} |
|
|
|
this.goLogin = function() { |
|
if ($.hasOwnProperty('mobile')) { |
|
$.mobile.navigate('#login'); |
|
} else { |
|
window.location.hash = '#/login'; |
|
} |
|
}; |
|
|
|
this.goNetwork = function() { |
|
if( $.hasOwnProperty("mobile") ) { |
|
$.mobile.navigate( "#network" ); |
|
} else { |
|
window.location.href = "network.html"; |
|
} |
|
} |
|
|
|
this.goProfileEdit = function() { |
|
if( $.hasOwnProperty("mobile") ) { |
|
$.mobile.navigate( "#profile-edit" ); |
|
} else { |
|
window.location.hash = '#/account'; |
|
} |
|
} |
|
|
|
this.showMentions = function(username) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
$.mobile.navigate( this.mentionsUrl(username) ); |
|
} else { |
|
if ($(".postboard").length) { |
|
openMentionsModal(); |
|
} else { |
|
window.location.href = 'home.html'+this.mentionsUrl(username); |
|
} |
|
} |
|
} |
|
|
|
this.showDMchat = function(req) { |
|
if (typeof req !== 'object') |
|
req = {}; |
|
if (req.alias) { |
|
if ($.hasOwnProperty('mobile')) { |
|
$.mobile.navigate(this.dmchatUrl(req.alias)); |
|
} else { |
|
if ($('.postboard').length) { |
|
window.location.hash = this.dmchatUrl(req.alias); |
|
} else { |
|
window.location.href = 'home.html'+this.dmchatUrl(req.alias); |
|
} |
|
} |
|
} else { |
|
if ($.hasOwnProperty('mobile')) { |
|
$.mobile.navigate('#' + (req.group ? '' : 'directmsg')); // FIXME add group messages to tmobile |
|
} else { |
|
if ($('.postboard').length) { |
|
window.location.hash = '#' + (req.group ? 'groupmessages' : 'directmessages'); |
|
} else { |
|
window.location.href = 'home.html#' + (req.group ? 'groupmessages' : 'directmessages'); |
|
} |
|
} |
|
} |
|
}; |
|
|
|
this.setNetworkStatusMsg = function(msg, statusGood) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
$(".network-status").text(msg); |
|
if( statusGood ) { |
|
$(".connection-status").addClass("connected"); |
|
} else { |
|
$(".connection-status").removeClass("connected"); |
|
} |
|
} else { |
|
$(".network-status").text(msg); |
|
if( statusGood ) { |
|
$(".connection-status").addClass("connected"); |
|
} else { |
|
$(".connection-status").removeClass("connected"); |
|
} |
|
} |
|
} |
|
|
|
this.enableButton = function( $button ) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
$button.button("enable"); |
|
} else { |
|
$button.removeClass("disabled"); |
|
$button.prop('disabled', false); |
|
} |
|
} |
|
|
|
this.disableButton = function( $button ) { |
|
if( $.hasOwnProperty("mobile") ) { |
|
$button.button("disable"); |
|
} else { |
|
$button.addClass("disabled"); |
|
$button.prop('disabled', true); |
|
} |
|
} |
|
|
|
this.processCreateAccount = function (peerAlias, secretKey) { |
|
defaultScreenName = peerAlias; |
|
if (defaultScreenName) { |
|
saveScreenName(); |
|
} |
|
|
|
if ($.hasOwnProperty('mobile')) { |
|
$('.secret-key').text(secretKey); |
|
sendNewUserTransaction(peerAlias); |
|
$.mobile.navigate('#new-user-modal'); |
|
} else { |
|
var modal = confirmPopup({ |
|
classAdd: 'new-account-briefing', |
|
txtTitle: polyglot.t('propagating_nickname', {username: peerAlias}), |
|
txtMessage: polyglot.t('new_account_briefing', {secretKey: secretKey}), |
|
txtConfirm: polyglot.t('Login'), |
|
cbConfirm: function () { |
|
// FIXME we're reloading the page entirely for now |
|
// here should be $.MAL.goProfileEdit but first an additional code should be added to change user globally |
|
twister.var.initializated = false; // to not do openModalAccount() |
|
window.location.href = '/#/account'; |
|
location.reload(); |
|
}, |
|
addBlackout: true, |
|
removeCancel: true, |
|
removeClose: true |
|
}); |
|
|
|
modal.content.find('.confirm').prop('disabled', true); |
|
|
|
sendNewUserTransaction(peerAlias, |
|
function (accountCreatedModal) { |
|
accountCreatedModal.content.find('.confirm').prop('disabled', false); |
|
}, modal |
|
); |
|
} |
|
}; |
|
|
|
this.changedUser = function() { |
|
if( $.hasOwnProperty("mobile") ) { |
|
timelineChangedUser(); |
|
$("#home .posts").html(""); |
|
newmsgsChangedUser(); |
|
followingChangedUser(); |
|
twisterInitialized = false; |
|
} else { |
|
window.location.href = "home.html"; |
|
} |
|
} |
|
|
|
this.soundNotifyMentions = function() { |
|
if ($.mobile) { |
|
} else { |
|
if ($.Options.sndMention.val !== 'false') |
|
playSound('player', $.Options.sndMention.val); |
|
} |
|
}; |
|
|
|
this.soundNotifyDM = function() { |
|
if ($.mobile) { |
|
} else { |
|
if ($.Options.sndDM.val !== 'false') |
|
playSound('playerSec', $.Options.sndDM.val); |
|
} |
|
}; |
|
|
|
this.showDesktopNotification = function(req) { |
|
if (Notify.needsPermission) { |
|
Notify.requestPermission(false, req.funcPermDenied); |
|
return; |
|
} |
|
|
|
if (!req.title) |
|
req.title = polyglot.t('notify_desktop_title'); |
|
if (!req.icon) |
|
req.icon = '../img/twister_mini.png'; |
|
if (!req.tag) |
|
req.tag = 'twister_notification'; |
|
if (!req.timeout) |
|
req.timeout = 2592000; // 60 * 60 * 24 * 30, one month |
|
|
|
if (typeof req.funcClick === 'function') |
|
req.funcClick = (function() {window.focus(); this.funcClick();}) |
|
.bind({funcClick: req.funcClick}); |
|
else |
|
req.funcClick = function() {window.focus();} |
|
|
|
var desktopNotification = new Notify(req.title, { |
|
body: req.body, |
|
icon: req.icon, |
|
tag: req.tag, |
|
timeout: req.timeout, |
|
notifyClick: req.funcClick, |
|
notifyError: function() {alert(polyglot.t('notify_desktop_error'));} |
|
}); |
|
desktopNotification.show(); |
|
}; |
|
|
|
this.reqRepAfterCB = function(postLi, postsFromJson) { |
|
if ($.hasOwnProperty("mobile")) { |
|
for( var i = 0; i < postsFromJson.length; i++) { |
|
var newStreamPost = postToElem(postsFromJson[i], "related"); |
|
newStreamPost.hide(); |
|
postLi.after(newStreamPost); |
|
newStreamPost.slideDown("fast"); |
|
} |
|
} else { |
|
var $replist = $('<ol class="sub-replies"></ol>'); |
|
var $newli = $('<li class="post-replies"></li>'); |
|
postLi.after($newli); |
|
$newli.append($replist); |
|
for (var i = 0; i < postsFromJson.length && $.MAL.getExpandedPostsCount(postLi) < maxExpandPost; i++) { |
|
var newStreamPost = postToElem(postsFromJson[i], "related"); |
|
newStreamPost.hide(); |
|
$replist.prepend(newStreamPost); |
|
newStreamPost.slideDown("fast"); |
|
requestRepliesAfter(newStreamPost); |
|
} |
|
} |
|
$.MAL.relatedPostLoaded(); |
|
}; |
|
|
|
this.getExpandedPostsCount = function(postLi) { |
|
if ($.hasOwnProperty('mobile')) { |
|
return postLi.siblings().length; |
|
} else { |
|
return postLi.closest('.module.post.original.open').find('.post.related').length; |
|
} |
|
}; |
|
} |
|
|
|
jQuery.MAL = new MAL; |
|
|
|
function playSound(player, sound, volume) { |
|
if ($.mobile) { |
|
} else { |
|
var player = $('#'+player); |
|
if (player.length) { |
|
player[0].pause(); |
|
//player.empty(); |
|
|
|
if (player[0].canPlayType('audio/mpeg;')) |
|
player.attr({type: 'audio/mpeg', src: 'sound/' + sound + '.mp3'}); |
|
else |
|
player.attr({type: 'audio/ogg', src: 'sound/' + sound + '.ogg'}); |
|
|
|
player[0].volume = (typeof volume === 'number') ? volume : $.Options.playerVol.val; |
|
player[0].play(); |
|
} else |
|
console.warn('cannot find player to play sound, selector: #'+player); |
|
} |
|
} |
|
|
|
function filterLang(string) { |
|
var langFilterMode = $.Options.filterLang.val; |
|
|
|
if (langFilterMode !== 'disable') { |
|
var langFilterSubj = ''; |
|
var langFilterProb = []; |
|
var langFilterPass = true; |
|
var langFilterReason = ''; |
|
var langFilterList = $.Options.filterLangList.val; |
|
|
|
if (!string) { |
|
langFilterReason = polyglot.t('this is undefined', {'this': 'string'}); |
|
} else if (langFilterList.length > 0) { |
|
var langFilterAccuracy = $.Options.filterLangAccuracy.val; |
|
langFilterPass = (langFilterMode === 'whitelist') ? false : true; |
|
langFilterReason = polyglot.t('this doesnt contain that', {'this': polyglot.t(langFilterMode), 'that': polyglot.t('language of this')}); |
|
|
|
// before detection attempts we cut out any mentions, links and /me directives and replace _ with space |
|
langFilterSubj = string.replace(/@\S\w*|https?:\/\/\S*|twist:\S\S\S\S\S\S\S\S\S\S\S=|^\/me\s/g, '').replace(/_+/g, ' ') |
|
// cut out common frequently used words FIXME I believe there is a list of similar international stuff somewhere outside which is waiting for us, we should just find it |
|
.replace(/\btwister|tox|github|linux|ubuntu|debian|windows|google|twitter|facebook|microsoft|ping|pong|email|javascript\b/ig, '') |
|
// replace zero-width word boundaries, such as between letters from different alphabets [or other symbols], with spaces |
|
// FIXME not so good idea because 'Za pomocą białej listy' may turn into 'Za pomoc ą bia ł ej listy' for e.g. |
|
// FIXME but first one was recognized as 'hrv' and second as 'pol' and you know it's 'pol' actually |
|
.replace(/\b/g, ' ') |
|
// cut out some more symbols |
|
.replace(/[#<>\.,:;\?\!\*\[\]\(\)\{\}\-\+\=\^\\\/0-9\u201C\u201D\u2026\u2014\u4E00\u3002\uFF0C\uFF1A\uFF1F\uFF01\u3010\u3011]/g, '') // unicode escaped stuff is '“”…—一。,:?!【】' |
|
// clear unwanted spaces |
|
.replace(/\s+/g, ' ').trim(); |
|
|
|
langFilterProb = franc.all(langFilterSubj, {'minLength': 2}); // FIXME minLength may become configurable option at some time |
|
for (var i = 0; i < langFilterProb.length; i++) { |
|
if (langFilterProb[i][1] > langFilterAccuracy) { |
|
if (langFilterProb[i][0] === 'und') { // e.g. digits-only string will be detected as undefined and thereby will be allowed |
|
langFilterPass = true; |
|
langFilterReason = polyglot.t('its undefined language'); |
|
break; |
|
} else if (langFilterList.indexOf(langFilterProb[i][0]) > -1) { |
|
if (langFilterMode === 'whitelist') { |
|
langFilterPass = true; |
|
langFilterReason = polyglot.t('its this, whitelisted', {'this': '\''+langFilterProb[i][0]+'\''}); |
|
break; |
|
} else { |
|
langFilterPass = false; |
|
langFilterReason = polyglot.t('its this, blacklisted', {'this': '\''+langFilterProb[i][0]+'\''}); |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
} else { |
|
langFilterReason = polyglot.t('this is undefined', {'this': polyglot.t(langFilterMode)}); |
|
} |
|
|
|
//console.log('langFilter | status: '+((langFilterPass === true) ? polyglot.t('passed') : polyglot.t('blocked'))+' | reason: '+langFilterReason+' | subject: \''+langFilterSubj+'\''); |
|
return {'subj': langFilterSubj, 'prob': langFilterProb, 'pass': langFilterPass, 'reason': langFilterReason}; |
|
} |
|
} |
|
|
|
function checkUpdatesClient(alertIfNoUpdates) { |
|
function handleGetFail(jqXHR) { |
|
twister.var.updatesCheckClient.isOngoing = false; |
|
|
|
console.warn(polyglot.t('cant_get_requested_resourse', {link: this.url, status: jqXHR.status + ', \'' + jqXHR.statusText + '\''})); |
|
|
|
if (alertIfNoUpdates) { |
|
if ($.hasOwnProperty('mobile')) |
|
alert(polyglot.t('updates_not_available') + '.\n\n' |
|
+ polyglot.t('cant_get_requested_resourse', {link: this.url, status: jqXHR.status + ', \'' + jqXHR.statusText + '\''}) |
|
); |
|
else |
|
alertPopup({ |
|
txtTitle: polyglot.t('updates_not_available'), |
|
txtMessage: polyglot.t('cant_get_requested_resourse', {link: this.url, status: jqXHR.status + ', ~' + jqXHR.statusText + '~'}) |
|
}); |
|
} |
|
} |
|
|
|
if (twister.var.updatesCheckClient.isOngoing) |
|
return; |
|
|
|
twister.var.updatesCheckClient.isOngoing = true; |
|
|
|
$.get('.git/HEAD', function (ret) { |
|
if (ret.slice(0, 16) !== 'ref: refs/heads/') { |
|
twister.var.updatesCheckClient.isOngoing = false; |
|
if (alertIfNoUpdates) |
|
alert(polyglot.t('updates_not_available') + '.\n\nCan\'t parse local HEAD: unknown syntax, FUBAR!'); |
|
|
|
return; |
|
} |
|
|
|
var branch = ret.slice(16).trim(); |
|
|
|
$.get('.git/refs/heads/' + branch, function (ret) { |
|
var commit = ret.trim(); |
|
if (!commit) { |
|
twister.var.updatesCheckClient.isOngoing = false; |
|
if (alertIfNoUpdates) |
|
alert(polyglot.t('updates_not_available') + '.\n\nCan\'t parse local HEAD: \'' + '.git/refs/heads/' + branch + '\' is empty, FUBAR!'); |
|
|
|
return; |
|
} |
|
|
|
var repo = 'twister-html'; // TODO source repo selection in options |
|
var repoOwner = 'twisterarmy'; |
|
|
|
// TODO notification if local branch was changed ('r u wanna reload the page?') |
|
/*if (!twister.var.updatesCheckClient.formerBranch || !twister.var.updatesCheckClient.formerCommit) { |
|
twister.var.updatesCheckClient.formerBranch = branch; |
|
twister.var.updatesCheckClient.formerCommit = commit; |
|
}*/ |
|
|
|
console.log('currently we are on the branch \'' + branch + '\' of ' + repo + ' at the commit ' + commit); |
|
|
|
$.get('https://api.github.com/repos/' + repoOwner + '/' + repo + '/branches', function (ret) { |
|
for (var i = 0; i < ret.length; i++) { |
|
if (ret[i].name === branch) { |
|
if (ret[i].commit.sha === commit) { |
|
twister.var.updatesCheckClient.isOngoing = false; |
|
|
|
console.log(polyglot.t('updates_upstream_isnt_changed')); |
|
|
|
if (alertIfNoUpdates) { |
|
if ($.hasOwnProperty('mobile')) |
|
alert(polyglot.t('updates_not_available') + '.\n\n' |
|
+ polyglot.t('updates_upstream_isnt_changed') |
|
); |
|
else |
|
alertPopup({ |
|
txtTitle: polyglot.t('updates_not_available'), |
|
txtMessage: polyglot.t('updates_upstream_isnt_changed') |
|
}); |
|
} |
|
} else { |
|
console.log('source branch has a different HEAD: ' + ret[i].commit.sha); |
|
|
|
var commitUpstream = ret[i].commit.sha; |
|
|
|
$.get('https://api.github.com/repos/' + repoOwner + '/' + repo + '/git/commits/' + commit, function (ret) { |
|
if (ret.sha !== commit) { // the response is wrong if so, should be 404 instead |
|
twister.var.updatesCheckClient.isOngoing = false; |
|
console.log('upstream tree doesn\'t have our most recent commit,\nlooks like we are in the process of development locally.'); |
|
if (alertIfNoUpdates) |
|
alert(polyglot.t('updates_not_available') + '.\n\nUpstream tree doesn\'t have our most recent commit,\nlooks like we are in the process of development locally.'); |
|
|
|
return; |
|
} |
|
|
|
commit = ret; |
|
|
|
$.get('https://api.github.com/repos/' + repoOwner + '/' + repo + '/git/commits/' + commitUpstream, function (ret) { |
|
twister.var.updatesCheckClient.isOngoing = false; |
|
|
|
if (ret.sha !== commitUpstream) { // the response is wrong if so, should be 404 instead |
|
console.warn('upstream tree doesn\'t have the commit which is named most recent in the list of branches, FUBAR!'); |
|
if (alertIfNoUpdates) |
|
alert(polyglot.t('updates_not_available') + '.\n\nUpstream tree doesn\'t have the commit which is named most recent in the list of branches, FUBAR!'); |
|
|
|
return; |
|
} |
|
|
|
commitUpstream = ret; |
|
var linkGitHubDiff = 'https://github.com/' + repoOwner + '/' + repo + '/compare/' + commit.sha + '...' + repoOwner + ':' + branch; |
|
|
|
console.log(polyglot.t('updates_checkout_diff_nfmt', {link: linkGitHubDiff})); |
|
|
|
if ($.hasOwnProperty('mobile')) |
|
alert(polyglot.t('updates_are_available') + '.\n\n' |
|
+ polyglot.t('updates_repo_overview', { |
|
branch: '\'' + branch + '\'', |
|
repo: repo, |
|
commit: commit.sha, |
|
date: new Date(commit.author.date).toString().replace(/ GMT.*/g, ''), |
|
commitUpstream: commitUpstream.sha, |
|
dateUpstream: new Date(commitUpstream.author.date).toString().replace(/ GMT.*/g, '') |
|
}) + '\n\n' |
|
+ polyglot.t('updates_checkout_diff_nfmt', {link: linkGitHubDiff}) |
|
); |
|
else |
|
alertPopup({ |
|
txtTitle: polyglot.t('updates_are_available'), |
|
txtMessage: polyglot.t('updates_repo_overview', { |
|
branch: '~' + branch + '~', |
|
repo: repo, |
|
commit: '*' + commit.sha + '*', |
|
date: new Date(commit.author.date).toString().replace(/ GMT.*/g, ''), |
|
commitUpstream: '*' + commitUpstream.sha + '*', |
|
dateUpstream: new Date(commitUpstream.author.date).toString().replace(/ GMT.*/g, '') |
|
}) + '\n\n' |
|
+ polyglot.t('updates_checkout_diff', {link: linkGitHubDiff}) |
|
}); |
|
}).fail(function (jqXHR) { |
|
if (jqXHR.status === 404) { |
|
twister.var.updatesCheckClient.isOngoing = false; |
|
console.warn('upstream tree doesn\'t have the commit which is named most recent in the list of branches, FUBAR!'); |
|
if (alertIfNoUpdates) |
|
alert(polyglot.t('updates_not_available') + '.\n\nUpstream tree doesn\'t have the commit which is named most recent in the list of branches, FUBAR!'); |
|
} else |
|
handleGetFail(jqXHR); |
|
}); |
|
}).fail(function (jqXHR) { |
|
if (jqXHR.status === 404) { |
|
twister.var.updatesCheckClient.isOngoing = false; |
|
console.log('upstream tree doesn\'t have our most recent commit,\nlooks like we are in the process of development locally.'); |
|
if (alertIfNoUpdates) |
|
alert(polyglot.t('updates_not_available') + '.\n\nUpstream tree doesn\'t have our most recent commit,\nlooks like we are in the process of development locally.'); |
|
} else |
|
handleGetFail(jqXHR); |
|
}); |
|
} |
|
return; |
|
} |
|
} |
|
twister.var.updatesCheckClient.isOngoing = false; |
|
console.log('upstream tree doesn\'t have our branch,\nlooks like we are in the process of development locally.'); |
|
if (alertIfNoUpdates) |
|
alert(polyglot.t('updates_not_available') + '.\n\nUpstream tree doesn\'t have our branch,\nlooks like we are in the process of development locally.'); |
|
}).fail(handleGetFail); |
|
}).fail(handleGetFail); |
|
}).fail(handleGetFail); |
|
}
|
|
|