]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Do realtime popup with PHP instead of Javascript
authorEvan Prodromou <evan@status.net>
Wed, 23 Sep 2009 21:07:20 +0000 (17:07 -0400)
committerEvan Prodromou <evan@status.net>
Wed, 23 Sep 2009 21:07:20 +0000 (17:07 -0400)
Move the realtime detection code to PHP extension rather than
JavaScript.

plugins/Realtime/RealtimePlugin.php
plugins/Realtime/realtimeupdate.js

index 45488226108139194b7ff2e26c5793460354b56c..22851a6c148e811c0e65b256af20f94f1719ced4 100644 (file)
@@ -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;
+    }
 }
index da2f9ed3aa30fc7463a2b2eafce3969dbd1c5627..3293ef6e9f1c99c771de7220e6855ee9ec2d548d 100644 (file)
-$(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;
+     }
+}