git.gnu.io has moved to IP address 209.51.188.249 -- please double check where you are logging in.

Commit 1fe11eab authored by Evan Prodromou's avatar Evan Prodromou

Do realtime popup with PHP instead of Javascript

Move the realtime detection code to PHP extension rather than
JavaScript.
parent 6cb2f899
......@@ -50,6 +50,11 @@ class RealtimePlugin extends Plugin
protected $favorurl = null;
protected $deleteurl = null;
/**
* When it's time to initialize the plugin, calculate and
* pass the URLs we need.
*/
function onInitializePlugin()
{
$this->replyurl = common_local_url('newnotice');
......@@ -57,30 +62,20 @@ class RealtimePlugin extends Plugin
// FIXME: need to find a better way to pass this pattern in
$this->deleteurl = common_local_url('deletenotice',
array('notice' => '0000000000'));
return true;
}
function onEndShowScripts($action)
{
$path = null;
$timeline = $this->_getTimeline($action);
switch ($action->trimmed('action')) {
case 'public':
$path = array('public');
break;
case 'tag':
$tag = $action->trimmed('tag');
if (!empty($tag)) {
$path = array('tag', $tag);
} else {
return true;
}
break;
default:
// If there's not a timeline on this page,
// just return true
if (empty($timeline)) {
return true;
}
$timeline = $this->_pathToChannel($path);
$scripts = $this->_getScripts();
foreach ($scripts as $script) {
......@@ -95,16 +90,14 @@ class RealtimePlugin extends Plugin
$user_id = 0;
}
$action->script('plugins/Realtime/jquery.getUrlParam.js');
$action->elementStart('script', array('type' => 'text/javascript'));
$action->raw('
<!--
$(document).ready(function() {
' . $this->_updateInitialize($timeline, $user_id) . '
});
-->
');
$script = ' $(document).ready(function() { '.
$this->_updateInitialize($timeline, $user_id).
'}); ';
$action->raw($script);
$action->elementEnd('script');
return true;
......@@ -146,6 +139,47 @@ class RealtimePlugin extends Plugin
return true;
}
function onStartShowPageNotice($action)
{
$timeline = $this->_getTimeline($action);
if (!empty($timeline)) {
$base = $action->selfUrl();
if (mb_strstr($url, '?')) {
$url = $base . '&realtime=1';
} else {
$url = $base . '?realtime=1';
}
$title = $action->title();
$code = "window.open('$url', '$title', 'toolbar=no,resizable=yes,scrollbars=yes,status=yes,height=640,width=575');";
$action->element('a', array('href' => $base,
'onclick' => $code,
'id' => 'realtime_timeline',
'title' => _('Pop up')),
'Pop up');
}
return true;
}
function onStartShowBody($action)
{
$realtime = $action->boolean('realtime');
if (!$realtime) {
return true;
}
$action->elementStart('body',
(common_current_user()) ? array('id' => $action->trimmed('action'),
'class' => 'user_in')
: array('id' => $action->trimmed('action')));
if (common_logged_in()) {
$action->showNoticeForm();
}
$action->showContent();
$action->elementEnd('body');
return false; // No default processing
}
function noticeAsJson($notice)
{
// FIXME: this code should be abstracted to a neutral third
......@@ -230,4 +264,30 @@ class RealtimePlugin extends Plugin
{
return '';
}
function _getTimeline($action)
{
$path = null;
$timeline = null;
switch ($action->trimmed('action')) {
case 'public':
$path = array('public');
break;
case 'tag':
$tag = $action->trimmed('tag');
if (!empty($tag)) {
$path = array('tag', $tag);
}
break;
default:
break;
}
if (!is_null($path)) {
$timeline = $this->_pathToChannel($path);
}
return $timeline;
}
}
$(document).ready(function() {
if (!$(document).getUrlParam('realtime')) {
$('#site_nav_local_views .current a').append('<button id="realtime_timeline" title="Pop this tab">&#8599;</button>');
$('#realtime_timeline').css({
'margin':'2px 0 0 11px',
'background':'transparent url('+$('address .url')[0].href+'/plugins/Realtime/icon_external.gif) no-repeat 45% 45%',
'text-indent':'-9999px',
'width':'16px',
'height':'16px',
'padding':'0',
'display':'block',
'float':'right',
'border':'none',
'cursor':'pointer'
});
$('#realtime_timeline').click(function() {
window.open($(this).parent('a').attr('href')+'?realtime=1',
$(this).parent('a').attr('title'),
'toolbar=no,resizable=yes,scrollbars=yes,status=yes');
return false;
});
}
else {
window.resizeTo(575, 640);
address = $('address');
content = $('#content');
$('body').html(address);
$('address').hide();
$('body').append(content);
$('#content').css({'width':'92%'});
}
// add a notice encoded as JSON into the current timeline
//
// TODO: i18n
RealtimeUpdate = {
_userid: 0,
_replyurl: '',
_favorurl: '',
_deleteurl: '',
init: function(userid, replyurl, favorurl, deleteurl)
{
RealtimeUpdate._userid = userid;
RealtimeUpdate._replyurl = replyurl;
RealtimeUpdate._favorurl = favorurl;
RealtimeUpdate._deleteurl = deleteurl;
},
receive: function(data)
{
id = data.id;
// Don't add it if it already exists
if ($("#notice-"+id).length > 0) {
return;
}
var noticeItem = RealtimeUpdate.makeNoticeItem(data);
$("#notices_primary .notices").prepend(noticeItem, true);
$("#notices_primary .notice:first").css({display:"none"});
$("#notices_primary .notice:first").fadeIn(1000);
NoticeReply();
},
makeNoticeItem: function(data)
{
user = data['user'];
html = data['html'].replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'"');
source = data['source'].replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'"');
ni = "<li class=\"hentry notice\" id=\"notice-"+data['id']+"\">"+
"<div class=\"entry-title\">"+
"<span class=\"vcard author\">"+
"<a href=\""+user['profile_url']+"\" class=\"url\">"+
"<img src=\""+user['profile_image_url']+"\" class=\"avatar photo\" width=\"48\" height=\"48\" alt=\""+user['screen_name']+"\"/>"+
"<span class=\"nickname fn\">"+user['screen_name']+"</span>"+
"</a>"+
"</span>"+
"<p class=\"entry-content\">"+html+"</p>"+
"</div>"+
"<div class=\"entry-content\">"+
"<a class=\"timestamp\" rel=\"bookmark\" href=\""+data['url']+"\" >"+
"<abbr class=\"published\" title=\""+data['created_at']+"\">a few seconds ago</abbr>"+
"</a> "+
"<span class=\"source\">"+
"from "+
// add a notice encoded as JSON into the current timeline
//
// TODO: i18n
RealtimeUpdate = {
_userid: 0,
_replyurl: '',
_favorurl: '',
_deleteurl: '',
init: function(userid, replyurl, favorurl, deleteurl)
{
RealtimeUpdate._userid = userid;
RealtimeUpdate._replyurl = replyurl;
RealtimeUpdate._favorurl = favorurl;
RealtimeUpdate._deleteurl = deleteurl;
},
receive: function(data)
{
id = data.id;
// Don't add it if it already exists
//
if ($("#notice-"+id).length > 0) {
return;
}
var noticeItem = RealtimeUpdate.makeNoticeItem(data);
$("#notices_primary .notices").prepend(noticeItem, true);
$("#notices_primary .notice:first").css({display:"none"});
$("#notices_primary .notice:first").fadeIn(1000);
NoticeReply();
},
makeNoticeItem: function(data)
{
user = data['user'];
html = data['html'].replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'"');
source = data['source'].replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'"');
ni = "<li class=\"hentry notice\" id=\"notice-"+data['id']+"\">"+
"<div class=\"entry-title\">"+
"<span class=\"vcard author\">"+
"<a href=\""+user['profile_url']+"\" class=\"url\">"+
"<img src=\""+user['profile_image_url']+"\" class=\"avatar photo\" width=\"48\" height=\"48\" alt=\""+user['screen_name']+"\"/>"+
"<span class=\"nickname fn\">"+user['screen_name']+"</span>"+
"</a>"+
"</span>"+
"<p class=\"entry-content\">"+html+"</p>"+
"</div>"+
"<div class=\"entry-content\">"+
"<a class=\"timestamp\" rel=\"bookmark\" href=\""+data['url']+"\" >"+
"<abbr class=\"published\" title=\""+data['created_at']+"\">a few seconds ago</abbr>"+
"</a> "+
"<span class=\"source\">"+
"from "+
"<span class=\"device\">"+source+"</span>"+ // may have a link
"</span>";
if (data['in_reply_to_status_id']) {
ni = ni+" <a class=\"response\" href=\""+data['in_reply_to_status_url']+"\">in context</a>";
}
"</span>";
if (data['in_reply_to_status_id']) {
ni = ni+" <a class=\"response\" href=\""+data['in_reply_to_status_url']+"\">in context</a>";
}
ni = ni+"</div>"+
ni = ni+"</div>"+
"<div class=\"notice-options\">";
if (RealtimeUpdate._userid != 0) {
var input = $("form#form_notice fieldset input#token");
var session_key = input.val();
ni = ni+RealtimeUpdate.makeFavoriteForm(data['id'], session_key);
ni = ni+RealtimeUpdate.makeReplyLink(data['id'], data['user']['screen_name']);
if (RealtimeUpdate._userid == data['user']['id']) {
if (RealtimeUpdate._userid != 0) {
var input = $("form#form_notice fieldset input#token");
var session_key = input.val();
ni = ni+RealtimeUpdate.makeFavoriteForm(data['id'], session_key);
ni = ni+RealtimeUpdate.makeReplyLink(data['id'], data['user']['screen_name']);
if (RealtimeUpdate._userid == data['user']['id']) {
ni = ni+RealtimeUpdate.makeDeleteLink(data['id']);
}
}
}
}
ni = ni+"</div>"+
"</li>";
return ni;
},
ni = ni+"</div>"+
"</li>";
return ni;
},
makeFavoriteForm: function(id, session_key)
{
var ff;
makeFavoriteForm: function(id, session_key)
{
var ff;
ff = "<form id=\"favor-"+id+"\" class=\"form_favor\" method=\"post\" action=\""+RealtimeUpdate._favorurl+"\">"+
ff = "<form id=\"favor-"+id+"\" class=\"form_favor\" method=\"post\" action=\""+RealtimeUpdate._favorurl+"\">"+
"<fieldset>"+
"<legend>Favor this notice</legend>"+
"<input name=\"token-"+id+"\" type=\"hidden\" id=\"token-"+id+"\" value=\""+session_key+"\"/>"+
"<input name=\"notice\" type=\"hidden\" id=\"notice-n"+id+"\" value=\""+id+"\"/>"+
"<input type=\"submit\" id=\"favor-submit-"+id+"\" name=\"favor-submit-"+id+"\" class=\"submit\" value=\"Favor\" title=\"Favor this notice\"/>"+
"<legend>Favor this notice</legend>"+
"<input name=\"token-"+id+"\" type=\"hidden\" id=\"token-"+id+"\" value=\""+session_key+"\"/>"+
"<input name=\"notice\" type=\"hidden\" id=\"notice-n"+id+"\" value=\""+id+"\"/>"+
"<input type=\"submit\" id=\"favor-submit-"+id+"\" name=\"favor-submit-"+id+"\" class=\"submit\" value=\"Favor\" title=\"Favor this notice\"/>"+
"</fieldset>"+
"</form>";
return ff;
"</form>";
return ff;
},
makeReplyLink: function(id, nickname)
{
var rl;
rl = "<a class=\"notice_reply\" href=\""+RealtimeUpdate._replyurl+"?replyto="+nickname+"\" title=\"Reply to this notice\">Reply <span class=\"notice_id\">"+id+"</span></a>";
return rl;
},
makeReplyLink: function(id, nickname)
{
var rl;
rl = "<a class=\"notice_reply\" href=\""+RealtimeUpdate._replyurl+"?replyto="+nickname+"\" title=\"Reply to this notice\">Reply <span class=\"notice_id\">"+id+"</span></a>";
return rl;
},
makeDeleteLink: function(id)
{
var dl, delurl;
delurl = RealtimeUpdate._deleteurl.replace("0000000000", id);
dl = "<a class=\"notice_delete\" href=\""+delurl+"\" title=\"Delete this notice\">Delete</a>";
makeDeleteLink: function(id)
{
var dl, delurl;
delurl = RealtimeUpdate._deleteurl.replace("0000000000", id);
return dl;
}
}
dl = "<a class=\"notice_delete\" href=\""+delurl+"\" title=\"Delete this notice\">Delete</a>";
});
return dl;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment