From 55aa9c1cca603c128146768f758dc193afbbb7f8 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 27 Sep 2020 05:25:32 +0000 Subject: [PATCH 1/4] Issue 9288: Endless scrolling on the community page --- src/Module/Conversation/Community.php | 54 +++++++++++++++++++-------- 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/src/Module/Conversation/Community.php b/src/Module/Conversation/Community.php index 1bb7f66e2..c68cced01 100644 --- a/src/Module/Conversation/Community.php +++ b/src/Module/Conversation/Community.php @@ -26,6 +26,7 @@ use Friendica\BaseModule; use Friendica\Content\BoundariesPager; use Friendica\Content\Feature; use Friendica\Content\Nav; +use Friendica\Content\Text\HTML; use Friendica\Content\Widget\TrendingTags; use Friendica\Core\ACL; use Friendica\Core\Renderer; @@ -35,6 +36,7 @@ use Friendica\DI; use Friendica\Model\Item; use Friendica\Model\User; use Friendica\Network\HTTPException; +use Friendica\Util\DateTimeFormat; class Community extends BaseModule { @@ -47,6 +49,9 @@ class Community extends BaseModule public static function content(array $parameters = []) { + // Rawmode is used for fetching new content at the end of the page + $rawmode = (isset($_GET['mode']) AND ($_GET['mode'] == 'raw')); + self::parseRequest($parameters); $tabs = []; @@ -73,8 +78,17 @@ class Community extends BaseModule ]; } - $tab_tpl = Renderer::getMarkupTemplate('common_tabs.tpl'); - $o = Renderer::replaceMacros($tab_tpl, ['$tabs' => $tabs]); + if (DI::pConfig()->get(local_user(), 'system', 'infinite_scroll') && ($_GET['mode'] ?? '') != 'minimal') { + $tpl = Renderer::getMarkupTemplate('infinite_scroll_head.tpl'); + $o = Renderer::replaceMacros($tpl, ['$reload_uri' => DI::args()->getQueryString()]); + } else { + $o = ''; + } + + if (!$rawmode) { + $tab_tpl = Renderer::getMarkupTemplate('common_tabs.tpl'); + $o .= Renderer::replaceMacros($tab_tpl, ['$tabs' => $tabs]); + } Nav::setSelected('community'); @@ -111,20 +125,26 @@ class Community extends BaseModule self::$itemsPerPage ); - $o .= $pager->renderMinimal(count($items)); + if (DI::pConfig()->get(local_user(), 'system', 'infinite_scroll')) { + $o .= HTML::scrollLoader(); + } else { + $o .= $pager->renderMinimal(count($items)); + } - DI::page()['aside'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('widget/community_accounts.tpl'), [ - '$title' => DI::l10n()->t('Accounts'), - '$content' => self::$content, - '$accounttype' => ($parameters['accounttype'] ?? ''), - '$all' => DI::l10n()->t('All'), - '$person' => DI::l10n()->t('Persons'), - '$organisation' => DI::l10n()->t('Organisations'), - '$news' => DI::l10n()->t('News'), - '$community' => DI::l10n()->t('Forums'), - ]); + if (!$rawmode) { + DI::page()['aside'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('widget/community_accounts.tpl'), [ + '$title' => DI::l10n()->t('Accounts'), + '$content' => self::$content, + '$accounttype' => ($parameters['accounttype'] ?? ''), + '$all' => DI::l10n()->t('All'), + '$person' => DI::l10n()->t('Persons'), + '$organisation' => DI::l10n()->t('Organisations'), + '$news' => DI::l10n()->t('News'), + '$community' => DI::l10n()->t('Forums'), + ]); + } - if (local_user() && DI::config()->get('system', 'community_no_sharer')) { + if (!$rawmode && local_user() && DI::config()->get('system', 'community_no_sharer')) { $path = self::$content . ($parameters['accounttype'] ? '/' . $parameters['accounttype'] : ''); $query_parameters = []; @@ -134,6 +154,9 @@ class Community extends BaseModule if (!empty($_GET['max_id'])) { $query_parameters['max_id'] = $_GET['max_id']; } + if (!empty($_GET['last_commented'])) { + $query_parameters['max_id'] = DateTimeFormat::utc($_GET['last_commented']); + } $path_all = $path . (!empty($query_parameters) ? '?' . http_build_query($query_parameters) : ''); $path_no_sharer = $path . '?' . http_build_query(array_merge($query_parameters, ['no_sharer' => true])); @@ -147,7 +170,7 @@ class Community extends BaseModule ]); } - if (Feature::isEnabled(local_user(), 'trending_tags')) { + if (!$rawmode && Feature::isEnabled(local_user(), 'trending_tags')) { DI::page()['aside'] .= TrendingTags::getHTML(self::$content); } @@ -245,6 +268,7 @@ class Community extends BaseModule self::$since_id = $_GET['since_id'] ?? null; self::$max_id = $_GET['max_id'] ?? null; + self::$max_id = $_GET['last_commented'] ?? self::$max_id; } /** From de9cd9881c44dfba74262a0319b654786b195e3a Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 27 Sep 2020 05:27:52 +0000 Subject: [PATCH 2/4] We don't seem to need the date formatting --- src/Module/Conversation/Community.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Module/Conversation/Community.php b/src/Module/Conversation/Community.php index c68cced01..a783cf389 100644 --- a/src/Module/Conversation/Community.php +++ b/src/Module/Conversation/Community.php @@ -36,7 +36,6 @@ use Friendica\DI; use Friendica\Model\Item; use Friendica\Model\User; use Friendica\Network\HTTPException; -use Friendica\Util\DateTimeFormat; class Community extends BaseModule { @@ -155,7 +154,7 @@ class Community extends BaseModule $query_parameters['max_id'] = $_GET['max_id']; } if (!empty($_GET['last_commented'])) { - $query_parameters['max_id'] = DateTimeFormat::utc($_GET['last_commented']); + $query_parameters['max_id'] = $_GET['last_commented']; } $path_all = $path . (!empty($query_parameters) ? '?' . http_build_query($query_parameters) : ''); From 08016710d4d5f5be5783a6dd48d794a000df1e5e Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 27 Sep 2020 05:31:39 +0000 Subject: [PATCH 3/4] Unused code fragment removed --- src/Module/Conversation/Community.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Module/Conversation/Community.php b/src/Module/Conversation/Community.php index a783cf389..08774ad12 100644 --- a/src/Module/Conversation/Community.php +++ b/src/Module/Conversation/Community.php @@ -77,7 +77,7 @@ class Community extends BaseModule ]; } - if (DI::pConfig()->get(local_user(), 'system', 'infinite_scroll') && ($_GET['mode'] ?? '') != 'minimal') { + if (DI::pConfig()->get(local_user(), 'system', 'infinite_scroll')) { $tpl = Renderer::getMarkupTemplate('infinite_scroll_head.tpl'); $o = Renderer::replaceMacros($tpl, ['$reload_uri' => DI::args()->getQueryString()]); } else { From 9586577c5a0562a1495cb2997068a3536fcfe91d Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 27 Sep 2020 05:46:07 +0000 Subject: [PATCH 4/4] Restructured code --- src/Module/Conversation/Community.php | 173 +++++++++++++------------- 1 file changed, 84 insertions(+), 89 deletions(-) diff --git a/src/Module/Conversation/Community.php b/src/Module/Conversation/Community.php index 08774ad12..6d42921ef 100644 --- a/src/Module/Conversation/Community.php +++ b/src/Module/Conversation/Community.php @@ -48,48 +48,102 @@ class Community extends BaseModule public static function content(array $parameters = []) { - // Rawmode is used for fetching new content at the end of the page - $rawmode = (isset($_GET['mode']) AND ($_GET['mode'] == 'raw')); - self::parseRequest($parameters); - $tabs = []; - - if ((Session::isAuthenticated() || in_array(self::$page_style, [CP_USERS_AND_GLOBAL, CP_USERS_ON_SERVER])) && empty(DI::config()->get('system', 'singleuser'))) { - $tabs[] = [ - 'label' => DI::l10n()->t('Local Community'), - 'url' => 'community/local', - 'sel' => self::$content == 'local' ? 'active' : '', - 'title' => DI::l10n()->t('Posts from local users on this server'), - 'id' => 'community-local-tab', - 'accesskey' => 'l' - ]; - } - - if (Session::isAuthenticated() || in_array(self::$page_style, [CP_USERS_AND_GLOBAL, CP_GLOBAL_COMMUNITY])) { - $tabs[] = [ - 'label' => DI::l10n()->t('Global Community'), - 'url' => 'community/global', - 'sel' => self::$content == 'global' ? 'active' : '', - 'title' => DI::l10n()->t('Posts from users of the whole federated network'), - 'id' => 'community-global-tab', - 'accesskey' => 'g' - ]; - } - if (DI::pConfig()->get(local_user(), 'system', 'infinite_scroll')) { $tpl = Renderer::getMarkupTemplate('infinite_scroll_head.tpl'); $o = Renderer::replaceMacros($tpl, ['$reload_uri' => DI::args()->getQueryString()]); } else { $o = ''; } + + if (empty($_GET['mode']) || ($_GET['mode'] != 'raw')) { + $tabs = []; + + if ((Session::isAuthenticated() || in_array(self::$page_style, [CP_USERS_AND_GLOBAL, CP_USERS_ON_SERVER])) && empty(DI::config()->get('system', 'singleuser'))) { + $tabs[] = [ + 'label' => DI::l10n()->t('Local Community'), + 'url' => 'community/local', + 'sel' => self::$content == 'local' ? 'active' : '', + 'title' => DI::l10n()->t('Posts from local users on this server'), + 'id' => 'community-local-tab', + 'accesskey' => 'l' + ]; + } - if (!$rawmode) { + if (Session::isAuthenticated() || in_array(self::$page_style, [CP_USERS_AND_GLOBAL, CP_GLOBAL_COMMUNITY])) { + $tabs[] = [ + 'label' => DI::l10n()->t('Global Community'), + 'url' => 'community/global', + 'sel' => self::$content == 'global' ? 'active' : '', + 'title' => DI::l10n()->t('Posts from users of the whole federated network'), + 'id' => 'community-global-tab', + 'accesskey' => 'g' + ]; + } + $tab_tpl = Renderer::getMarkupTemplate('common_tabs.tpl'); $o .= Renderer::replaceMacros($tab_tpl, ['$tabs' => $tabs]); - } - Nav::setSelected('community'); + Nav::setSelected('community'); + + DI::page()['aside'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('widget/community_accounts.tpl'), [ + '$title' => DI::l10n()->t('Accounts'), + '$content' => self::$content, + '$accounttype' => ($parameters['accounttype'] ?? ''), + '$all' => DI::l10n()->t('All'), + '$person' => DI::l10n()->t('Persons'), + '$organisation' => DI::l10n()->t('Organisations'), + '$news' => DI::l10n()->t('News'), + '$community' => DI::l10n()->t('Forums'), + ]); + + if (local_user() && DI::config()->get('system', 'community_no_sharer')) { + $path = self::$content . ($parameters['accounttype'] ? '/' . $parameters['accounttype'] : ''); + $query_parameters = []; + + if (!empty($_GET['since_id'])) { + $query_parameters['since_id'] = $_GET['since_id']; + } + if (!empty($_GET['max_id'])) { + $query_parameters['max_id'] = $_GET['max_id']; + } + if (!empty($_GET['last_commented'])) { + $query_parameters['max_id'] = $_GET['last_commented']; + } + + $path_all = $path . (!empty($query_parameters) ? '?' . http_build_query($query_parameters) : ''); + $path_no_sharer = $path . '?' . http_build_query(array_merge($query_parameters, ['no_sharer' => true])); + DI::page()['aside'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('widget/community_sharer.tpl'), [ + '$title' => DI::l10n()->t('Own Contacts'), + '$path_all' => $path_all, + '$path_no_sharer' => $path_no_sharer, + '$no_sharer' => !empty($_REQUEST['no_sharer']), + '$all' => DI::l10n()->t('Include'), + '$no_sharer_label' => DI::l10n()->t('Hide'), + ]); + } + + if (Feature::isEnabled(local_user(), 'trending_tags')) { + DI::page()['aside'] .= TrendingTags::getHTML(self::$content); + } + + // We need the editor here to be able to reshare an item. + if (Session::isAuthenticated()) { + $x = [ + 'is_owner' => true, + 'allow_location' => DI::app()->user['allow_location'], + 'default_location' => DI::app()->user['default-location'], + 'nickname' => DI::app()->user['nickname'], + 'lockstate' => (is_array(DI::app()->user) && (strlen(DI::app()->user['allow_cid']) || strlen(DI::app()->user['allow_gid']) || strlen(DI::app()->user['deny_cid']) || strlen(DI::app()->user['deny_gid'])) ? 'lock' : 'unlock'), + 'acl' => ACL::getFullSelectorHTML(DI::page(), DI::app()->user, true), + 'bang' => '', + 'visitor' => 'block', + 'profile_uid' => local_user(), + ]; + $o .= status_editor(DI::app(), $x, 0, true); + } + } $items = self::getItems(); @@ -98,22 +152,6 @@ class Community extends BaseModule return $o; } - // We need the editor here to be able to reshare an item. - if (Session::isAuthenticated()) { - $x = [ - 'is_owner' => true, - 'allow_location' => DI::app()->user['allow_location'], - 'default_location' => DI::app()->user['default-location'], - 'nickname' => DI::app()->user['nickname'], - 'lockstate' => (is_array(DI::app()->user) && (strlen(DI::app()->user['allow_cid']) || strlen(DI::app()->user['allow_gid']) || strlen(DI::app()->user['deny_cid']) || strlen(DI::app()->user['deny_gid'])) ? 'lock' : 'unlock'), - 'acl' => ACL::getFullSelectorHTML(DI::page(), DI::app()->user, true), - 'bang' => '', - 'visitor' => 'block', - 'profile_uid' => local_user(), - ]; - $o .= status_editor(DI::app(), $x, 0, true); - } - $o .= conversation(DI::app(), $items, 'community', false, false, 'commented', local_user()); $pager = new BoundariesPager( @@ -130,49 +168,6 @@ class Community extends BaseModule $o .= $pager->renderMinimal(count($items)); } - if (!$rawmode) { - DI::page()['aside'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('widget/community_accounts.tpl'), [ - '$title' => DI::l10n()->t('Accounts'), - '$content' => self::$content, - '$accounttype' => ($parameters['accounttype'] ?? ''), - '$all' => DI::l10n()->t('All'), - '$person' => DI::l10n()->t('Persons'), - '$organisation' => DI::l10n()->t('Organisations'), - '$news' => DI::l10n()->t('News'), - '$community' => DI::l10n()->t('Forums'), - ]); - } - - if (!$rawmode && local_user() && DI::config()->get('system', 'community_no_sharer')) { - $path = self::$content . ($parameters['accounttype'] ? '/' . $parameters['accounttype'] : ''); - $query_parameters = []; - - if (!empty($_GET['since_id'])) { - $query_parameters['since_id'] = $_GET['since_id']; - } - if (!empty($_GET['max_id'])) { - $query_parameters['max_id'] = $_GET['max_id']; - } - if (!empty($_GET['last_commented'])) { - $query_parameters['max_id'] = $_GET['last_commented']; - } - - $path_all = $path . (!empty($query_parameters) ? '?' . http_build_query($query_parameters) : ''); - $path_no_sharer = $path . '?' . http_build_query(array_merge($query_parameters, ['no_sharer' => true])); - DI::page()['aside'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('widget/community_sharer.tpl'), [ - '$title' => DI::l10n()->t('Own Contacts'), - '$path_all' => $path_all, - '$path_no_sharer' => $path_no_sharer, - '$no_sharer' => !empty($_REQUEST['no_sharer']), - '$all' => DI::l10n()->t('Include'), - '$no_sharer_label' => DI::l10n()->t('Hide'), - ]); - } - - if (!$rawmode && Feature::isEnabled(local_user(), 'trending_tags')) { - DI::page()['aside'] .= TrendingTags::getHTML(self::$content); - } - $t = Renderer::getMarkupTemplate("community.tpl"); return Renderer::replaceMacros($t, [ '$content' => $o,