diff --git a/js/interface_common.js b/js/interface_common.js index 26fe7b5..002b02f 100644 --- a/js/interface_common.js +++ b/js/interface_common.js @@ -139,10 +139,44 @@ function resumeModal(event) { // TODO also need reset modal height here maybe and then compute new scroll if (modal.scroll) modal.self.find($(modal.scroll.targetSelector).scrollTop(modal.scroll.top)); + + if (modal.resume && typeof modal.resume.cbFunc === 'function') + modal.resume.cbFunc(modal.resume.cbArg); }); } } +function focusModalWithElement(elem, cbFunc, cbArg) { + if (elem.jquery ? elem.is('html *') : $(elem).is('html *')) { + cbFunc(cbArg); + return true; + } + + var hash = getHashOfMinimizedModalWithElem(elem); + if (hash) { + _minimizedModals[hash].resume = {cbFunc: cbFunc, cbArg: cbArg}; + _minimizedModals[hash].btnResume.click(); + return true; + } + + return false; +} + +function getHashOfMinimizedModalWithElem(elem) { + for (var i in _minimizedModals) + if (_minimizedModals[i] && _minimizedModals[i].self.find(elem).length) + return i; + + return ''; +} + +function isModalWithElemExists(elem) { + if (elem.jquery ? elem.is('html *') : $(elem).is('html *')) + return true; + else + return getHashOfMinimizedModalWithElem(elem) ? true : false; +} + function confirmPopup(event, req) { if (event && event.stopPropagation) { event.stopPropagation(); @@ -331,29 +365,37 @@ function openHashtagModalFromSearchHandler(hashtag) { title: '#' + hashtag }); - clearHashtagProcessed(); - updateHashtagModal(modal.content.find('.postboard-posts'), hashtag, 'hashtag'); + setupQueryModalUpdating(modal.content.find('.postboard-posts'), hashtag, 'hashtag'); } -function updateHashtagModal(postboard, hashtag, resource, timeoutArgs) { - if (postboard.is('html *')) { - requestHashtag(postboard, hashtag, resource, timeoutArgs); +function setupQueryModalUpdating(postboard, query, resource) { + var req = { + postboard: postboard, + query: query, + resource: resource, + id: query + '@' + resource + }; - if (_hashtagPendingPostsUpdated) { - if (resource !== 'mention' && $.Options.showDesktopNotifPostsModal.val === 'enable') { - $.MAL.showDesktopNotif (false, polyglot.t('You got')+' '+polyglot.t('new_posts', _hashtagPendingPostsUpdated)+' '+polyglot.t('in search result')+'.', false,'twister_notification_new_posts_modal', $.Options.showDesktopNotifPostsModalTimer.val, function() { - $('.postboard-news').hide(); - displayHashtagPending($('.hashtag-modal .postboard-posts')); - }, false) - } - _hashtagPendingPostsUpdated = 0; - } + postboard.attr('data-request-id', req.id); + + requestQuery(req); + + // use extended timeout parameters on modal refresh (requires twister_core >= 0.9.14). + // our first query above should be faster (with default timeoutArgs of twisterd), + // then we may possibly collect more posts on our second try by waiting more. + req.timeoutArgs = [10000, 2000, 3]; + + postboard.attr('data-request-interval', setInterval(updateQueryModal, 5000, req)); // FIXME +} - // use extended timeout parameters on modal refresh (requires twister_core >= 0.9.14). - // our first query above should be faster (with default timeoutArgs of twisterd), - // then we may possibly collect more posts on our second try by waiting more. - setTimeout(updateHashtagModal, 5000, postboard, hashtag, resource, [10000,2000,3]); +function updateQueryModal(req) { + if (!isModalWithElemExists(req.postboard)) { + clearInterval(req.postboard.attr('data-request-interval')); + clearQueryProcessed(req.id); + return; } + + requestQuery(req); } function openMentionsModal(e) { @@ -382,12 +424,16 @@ function openMentionsModalHandler(username) { title: polyglot.t('users_mentions', {username: username}) }); - clearHashtagProcessed(); - updateHashtagModal(modal.content.find('.postboard-posts'), username, 'mention'); + setupQueryModalUpdating(modal.content.find('.postboard-posts'), username, 'mention'); if (username === defaultScreenName) { // obtain already cached mention posts from twister_newmsgs.js - processHashtag(modal.content.find('.postboard-posts'), defaultScreenName, getMentionsData()); + processQuery({ + postboard: modal.content.find('.postboard-posts'), + query: defaultScreenName, + resource: 'mention', + posts: getMentionsData() + }); resetMentionsCount(); } } @@ -473,14 +519,9 @@ function newConversationModal(username, resource) { var postLi = postboard.children().first() .css('display', 'none'); getTopPostOfConversation(postLi, null, postboard); - }, {content:content} + }, {content: content} ); - content.find('.postboard-news').on('click', function () { - $(this).hide(); - displayHashtagPending($('.conversation-modal .postboard-posts')); - }); - return content; } @@ -494,7 +535,7 @@ function openConversationClick(e) { ':post' + postData.attr('data-id'); } -function openConversationModal(username,resource) { +function openConversationModal(username, resource) { openModal({ classAdd: 'conversation-modal', content: newConversationModal(username, resource), @@ -1693,7 +1734,7 @@ function initInterfaceCommon() { $('#hashtag-modal-template .postboard-news').on('click', function () { $(this).hide(); - displayHashtagPending($('.hashtag-modal .postboard-posts')); + displayQueryPending($('.hashtag-modal .postboard-posts')); }); replaceDashboards(); diff --git a/js/tmobile.js b/js/tmobile.js index 20143ac..3d7b901 100644 --- a/js/tmobile.js +++ b/js/tmobile.js @@ -538,22 +538,27 @@ function encode_utf8(s) { return s; } -var hashtag_elem; -var hashtag_tag; -var hashtag_res; -function setupHashtagOrMention( ulElem, tag, res) { - hashtag_elem = ulElem; - hashtag_tag = tag; - hashtag_res = res; - hashtag_elem.text(""); +var tmobileQueryReq = {}; // FIXME need to rework all that searching + +function setupHashtagOrMention(postboard, tag, res) { $.MAL.setPostTemplate( $("#post-template-home") ); $.mobile.showPageLoadingMsg(); - clearHashtagProcessed(); - if( tag == defaultScreenName && res == "mention" ) { + + var reqId = tag + '@' + res; + + clearQueryProcessed(reqId); + + tmobileQueryReq.postboard = postboard.text('').attr('data-request-id', reqId); + tmobileQueryReq.query = tag; + tmobileQueryReq.resource = res; + + if (tag === defaultScreenName && res === 'mention') { // obtain already cached mention posts from twister_newmsgs.js - processHashtag(hashtag_elem, defaultScreenName, getMentionsData() ); + tmobileQueryReq.posts = getMentionsData(); + processQuery(tmobileQueryReq); } - requestHashtag(hashtag_elem,hashtag_tag,hashtag_res); + + requestQuery(tmobileQueryReq); } // every 2 seconds do something page specific. @@ -575,10 +580,12 @@ function tmobileTick() { } }, {} ); } - if( curPage == "mentions" || curPage == "hashtag" ) { - autoUpdateHashtag = true; - requestHashtag(hashtag_elem,hashtag_tag,hashtag_res); + + else if (curPage === 'mentions' || curPage === 'hashtag') { + autoUpdateQuery = true; + requestQuery(tmobileQueryReq); } + if( curPage == "dmchat" ) { requestDmConversation($("#dmchat ul.direct-messages-list"),dmChatUser); } diff --git a/js/twister_actions.js b/js/twister_actions.js index dc456cb..c57c7c2 100644 --- a/js/twister_actions.js +++ b/js/twister_actions.js @@ -12,10 +12,9 @@ var postsPerRefresh = 10; var maxExpandPost = 8; var maxExpandPostTop = 4; -var _hashtagProcessedMap = {}; -var _hashtagPendingPosts = []; -var _hashtagPendingPostsUpdated = 0; -var autoUpdateHashtag = false; +var _queryProcessedMap = {}; +var _queryPendingPosts = {}; +var autoUpdateQuery = false; // ---------------- @@ -365,63 +364,98 @@ function updateProfilePosts(postsView, username, useGetposts) { }); } -function clearHashtagProcessed() { - _hashtagProcessedMap = {}; - _hashtagPendingPosts = []; +function clearQueryProcessed(id) { + if (!id) return; + + _queryProcessedMap[id] = {}; + _queryPendingPosts[id] = []; } -function requestHashtag(postboard, hashtag, resource, timeoutArgs) { - postboard.closest("div").find(".postboard-loading").show(); - dhtget(hashtag, resource, "m", - function(args, data) {processHashtag(args.postboard, args.hashtag, data);}, - {postboard:postboard,hashtag:hashtag}, - timeoutArgs +function requestQuery(req) { + req.postboard.closest('div').find('.postboard-loading').show(); + dhtget(req.query, req.resource, 'm', + function(req, posts) { + req.posts = posts; + processQuery(req); + }, + req, + req.timeoutArgs ); } -function processHashtag(postboard, hashtag, data) { - if( data && window.location.hash.indexOf(encodeURIComponent(hashtag)) != -1 ) { - for( var i = data.length-1; i >= 0; i-- ) { - var userpost = data[i]["userpost"]; - var key = userpost["n"] + ";" + userpost["time"]; - if( !(key in _hashtagProcessedMap) ) { - _hashtagProcessedMap[key] = true; - - if ($.Options.filterLang.val !== 'disable' && $.Options.filterLangForSearching.val) { - if (typeof(userpost['rt']) !== 'undefined') { - var msg = userpost['rt']['msg']; - } else { - var msg = userpost['msg']; - } - langFilterData = filterLang(msg); - if ($.Options.filterLangSimulate.val) { - data[i]['langFilter'] = langFilterData; - } else { - if (!langFilterData['pass']) - continue; - } - } +function processQuery(req) { + if (!isModalWithElemExists(req.postboard) || !req.posts || !req.posts.length) + return; - _hashtagPendingPosts.push(data[i]); - _hashtagPendingPostsUpdated++; + if (!req.id) + req.id = req.query + '@' + req.resource; + if (typeof _queryProcessedMap[req.id] !== 'object') + _queryProcessedMap[req.id] = {}; + if (typeof _queryPendingPosts[req.id] !== 'object') + _queryPendingPosts[req.id] = []; + + for (var i = req.posts.length - 1; i >= 0; i--) { + var userpost = req.posts[i].userpost; + var key = userpost.n + ';' + userpost.time; + + if (!_queryProcessedMap[req.id][key]) { + _queryProcessedMap[req.id][key] = true; + + if ($.Options.filterLang.val !== 'disable' && $.Options.filterLangForSearching.val) { + if (typeof userpost.rt !== 'undefined') { + var msg = userpost.rt.msg; + } else { + var msg = userpost.msg; + } + langFilterData = filterLang(msg); + if ($.Options.filterLangSimulate.val) { + req.posts[i].langFilter = langFilterData; + } else { + if (!langFilterData.pass) + continue; + } } + + _queryPendingPosts[req.id].push(req.posts[i]); } + } - if( _hashtagPendingPosts.length ) { - if( !postboard.children().length || autoUpdateHashtag ) { - displayHashtagPending(postboard); - } else { - var newTweetsBar = postboard.closest("div").find(".postboard-news"); - newTweetsBar.text(polyglot.t("new_posts", _hashtagPendingPosts.length)); - newTweetsBar.fadeIn("slow"); - postboard.closest("div").find(".postboard-loading").hide(); - } + if (_queryPendingPosts[req.id].length) { + if (!$.hasOwnProperty('mobile') && $.Options.showDesktopNotifPostsModal.val === 'enable' + && (req.resource !== 'mention' || req.query !== defaultScreenName)) { + $.MAL.showDesktopNotification({ + body: polyglot.t('You got') + ' ' + polyglot.t('new_posts', _queryPendingPosts[req.id].length) + ' ' + + polyglot.t('in search result') + '.', + tag: 'twister_notification_new_posts_modal', + timeout: $.Options.showDesktopNotifPostsModalTimer.val, + funcClick: (function() { + focusModalWithElement(this.postboard, + function (req) { + req.postboard.closest('.postboard').find('.postboard-news').hide(); + displayQueryPending(req.postboard); + }, {postboard: this.postboard} + ); + }).bind({postboard: req.postboard}) + }); + } + + if (!req.postboard.children().length || autoUpdateQuery) { + displayQueryPending(req.postboard); + } else { + req.postboard.closest('div').find('.postboard-news') // FIXME we'd replace 'div' with '.postboard' but need to dig through tmobile first + .text(polyglot.t('new_posts', _queryPendingPosts[req.id].length)) + .fadeIn('slow') + ; + req.postboard.closest('div').find('.postboard-loading').hide(); } } } -function displayHashtagPending(postboard) { - attachPostsToStream(postboard, _hashtagPendingPosts, false); +function displayQueryPending(postboard) { + var reqId = postboard.attr('data-request-id'); + + attachPostsToStream(postboard, _queryPendingPosts[reqId], false); + _queryPendingPosts[reqId] = []; + $.MAL.postboardLoaded(); - _hashtagPendingPosts = []; } diff --git a/js/twister_directmsg.js b/js/twister_directmsg.js index d71a793..19b7592 100644 --- a/js/twister_directmsg.js +++ b/js/twister_directmsg.js @@ -50,10 +50,11 @@ function processDMsnippet(dmUsers, dmThreadList, forGroup) { } function requestDmConversationModal(postboard, dm_screenname) { - if (postboard.is('html *')) { - requestDmConversation(postboard, dm_screenname); - setTimeout(requestDmConversationModal, 1000, postboard, dm_screenname); - } + if (!isModalWithElemExists(postboard)) + return; + + requestDmConversation(postboard, dm_screenname); + setTimeout(requestDmConversationModal, 1000, postboard, dm_screenname); } function requestDmConversation(postboard, dm_screenname) { diff --git a/js/twister_newmsgs.js b/js/twister_newmsgs.js index df1b738..535c3ed 100644 --- a/js/twister_newmsgs.js +++ b/js/twister_newmsgs.js @@ -29,6 +29,11 @@ function processMention(user, mentionTime, data) { _newMentionsUpdated = true; _lastMentionTime = Math.max(mentionTime, _lastMentionTime); data.isNew = true; + + var reqId = defaultScreenName + '@mention'; + if (typeof _queryPendingPosts[reqId] !== 'object') + _queryPendingPosts[reqId] = []; + _queryPendingPosts[reqId].push(data); } _knownMentions[key] = {mentionTime: mentionTime, data: data}; purgeOldMentions(); @@ -103,8 +108,25 @@ function requestMentionsCount() { if (_newMentions) { $.MAL.soundNotifyMentions(); - if ($.Options.showDesktopNotifMentions.val === 'enable') - $.MAL.showDesktopNotif(false, polyglot.t('You got')+' '+polyglot.t('new_mentions', _newMentions)+'.', false,'twister_notification_new_mentions', $.Options.showDesktopNotifMentionsTimer.val, function(){$.MAL.showMentions(defaultScreenName)}, false) + if (!$.hasOwnProperty('mobile') && $.Options.showDesktopNotifMentions.val === 'enable') + $.MAL.showDesktopNotification({ + body: polyglot.t('You got') + ' ' + polyglot.t('new_mentions', _newMentions) + '.', + tag: 'twister_notification_new_mentions', + timeout: $.Options.showDesktopNotifMentionsTimer.val, + funcClick: function () { + var postboardSelector = + '.postboard-posts[data-request-id="' + defaultScreenName + '@mention"]'; + if (!focusModalWithElement(postboardSelector, + function (req) { + var postboard = $(req.postboardSelector); + postboard.closest('.postboard').find('.postboard-news').hide(); + displayQueryPending(postboard); + resetMentionsCount(); + }, {postboardSelector: postboardSelector} + )) + $.MAL.showMentions(defaultScreenName); + } + }); } } @@ -117,24 +139,26 @@ function requestMentionsCount() { if (newDMs) { $.MAL.soundNotifyDM(); - if ($.Options.showDesktopNotifDMs.val === 'enable') { - $.MAL.showDesktopNotif(false, - polyglot.t('You got') + ' ' + polyglot.t('new_direct_messages', newDMs) + '.', - false, 'twister_notification_new_DMs', $.Options.showDesktopNotifDMsTimer.val, - function () {$.MAL.showDMchat();}, false - ); + if (!$.hasOwnProperty('mobile') && $.Options.showDesktopNotifDMs.val === 'enable') { + $.MAL.showDesktopNotification({ + body: polyglot.t('You got') + ' ' + polyglot.t('new_direct_messages', newDMs) + '.', + tag: 'twister_notification_new_DMs', + timeout: $.Options.showDesktopNotifDMsTimer.val, + funcClick: function () {$.MAL.showDMchat();} + }); } } var newDMs = getNewGroupDMsCount(); if (newDMs) { $.MAL.soundNotifyDM(); - if ($.Options.showDesktopNotifDMs.val === 'enable') { - $.MAL.showDesktopNotif(false, - polyglot.t('You got') + ' ' + polyglot.t('new_group_messages', newDMs) + '.', - false, 'twister_notification_new_DMs', $.Options.showDesktopNotifDMsTimer.val, - function () {$.MAL.showDMchat({group: true});}, false - ); + if (!$.hasOwnProperty('mobile') && $.Options.showDesktopNotifDMs.val === 'enable') { + $.MAL.showDesktopNotification({ + body: polyglot.t('You got') + ' ' + polyglot.t('new_group_messages', newDMs) + '.', + tag: 'twister_notification_new_DMs', + timeout: $.Options.showDesktopNotifDMsTimer.val, + funcClick: function () {$.MAL.showDMchat({group: true});} + }); } } }