Merge pull request #9440 from annando/one-click-follow
Follow/Unfollow contact with a single click
This commit is contained in:
commit
4719af6724
6 changed files with 86 additions and 72 deletions
|
@ -928,7 +928,7 @@ function item_photo_menu($item) {
|
||||||
|
|
||||||
if ((($cid == 0) || ($rel == Contact::FOLLOWER)) &&
|
if ((($cid == 0) || ($rel == Contact::FOLLOWER)) &&
|
||||||
in_array($item['network'], Protocol::FEDERATED)) {
|
in_array($item['network'], Protocol::FEDERATED)) {
|
||||||
$menu[DI::l10n()->t('Connect/Follow')] = 'follow?url=' . urlencode($item['author-link']);
|
$menu[DI::l10n()->t('Connect/Follow')] = 'follow?url=' . urlencode($item['author-link']) . '&auto=1';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$menu = [DI::l10n()->t('View Profile') => $item['author-link']];
|
$menu = [DI::l10n()->t('View Profile') => $item['author-link']];
|
||||||
|
|
|
@ -42,30 +42,8 @@ function follow_post(App $a)
|
||||||
}
|
}
|
||||||
|
|
||||||
$url = Probe::cleanURI($_REQUEST['url']);
|
$url = Probe::cleanURI($_REQUEST['url']);
|
||||||
$return_path = 'follow?url=' . urlencode($url);
|
|
||||||
|
|
||||||
// Makes the connection request for friendica contacts easier
|
follow_process($a, $url);
|
||||||
// This is just a precaution if maybe this page is called somewhere directly via POST
|
|
||||||
$_SESSION['fastlane'] = $url;
|
|
||||||
|
|
||||||
$result = Contact::createFromProbe($a->user, $url, true);
|
|
||||||
|
|
||||||
if ($result['success'] == false) {
|
|
||||||
// Possibly it is a remote item and not an account
|
|
||||||
follow_remote_item($url);
|
|
||||||
|
|
||||||
if ($result['message']) {
|
|
||||||
notice($result['message']);
|
|
||||||
}
|
|
||||||
DI::baseUrl()->redirect($return_path);
|
|
||||||
} elseif ($result['cid']) {
|
|
||||||
DI::baseUrl()->redirect('contact/' . $result['cid']);
|
|
||||||
}
|
|
||||||
|
|
||||||
notice(DI::l10n()->t('The contact could not be added.'));
|
|
||||||
|
|
||||||
DI::baseUrl()->redirect($return_path);
|
|
||||||
// NOTREACHED
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function follow_content(App $a)
|
function follow_content(App $a)
|
||||||
|
@ -143,6 +121,10 @@ function follow_content(App $a)
|
||||||
$request = $contact['request'];
|
$request = $contact['request'];
|
||||||
$tpl = Renderer::getMarkupTemplate('dfrn_request.tpl');
|
$tpl = Renderer::getMarkupTemplate('dfrn_request.tpl');
|
||||||
} else {
|
} else {
|
||||||
|
if (!empty($_REQUEST['auto'])) {
|
||||||
|
follow_process($a, $contact['url']);
|
||||||
|
}
|
||||||
|
|
||||||
$request = DI::baseUrl() . '/follow';
|
$request = DI::baseUrl() . '/follow';
|
||||||
$tpl = Renderer::getMarkupTemplate('auto_request.tpl');
|
$tpl = Renderer::getMarkupTemplate('auto_request.tpl');
|
||||||
}
|
}
|
||||||
|
@ -195,6 +177,33 @@ function follow_content(App $a)
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function follow_process(App $a, string $url)
|
||||||
|
{
|
||||||
|
$return_path = 'follow?url=' . urlencode($url);
|
||||||
|
|
||||||
|
// Makes the connection request for friendica contacts easier
|
||||||
|
// This is just a precaution if maybe this page is called somewhere directly via POST
|
||||||
|
$_SESSION['fastlane'] = $url;
|
||||||
|
|
||||||
|
$result = Contact::createFromProbe($a->user, $url, true);
|
||||||
|
|
||||||
|
if ($result['success'] == false) {
|
||||||
|
// Possibly it is a remote item and not an account
|
||||||
|
follow_remote_item($url);
|
||||||
|
|
||||||
|
if ($result['message']) {
|
||||||
|
notice($result['message']);
|
||||||
|
}
|
||||||
|
DI::baseUrl()->redirect($return_path);
|
||||||
|
} elseif ($result['cid']) {
|
||||||
|
DI::baseUrl()->redirect('contact/' . $result['cid']);
|
||||||
|
}
|
||||||
|
|
||||||
|
notice(DI::l10n()->t('The contact could not be added.'));
|
||||||
|
|
||||||
|
DI::baseUrl()->redirect($return_path);
|
||||||
|
}
|
||||||
|
|
||||||
function follow_remote_item($url)
|
function follow_remote_item($url)
|
||||||
{
|
{
|
||||||
$item_id = Item::fetchByLink($url, local_user());
|
$item_id = Item::fetchByLink($url, local_user());
|
||||||
|
|
|
@ -31,56 +31,15 @@ use Friendica\Util\Strings;
|
||||||
|
|
||||||
function unfollow_post(App $a)
|
function unfollow_post(App $a)
|
||||||
{
|
{
|
||||||
$base_return_path = 'contact';
|
|
||||||
|
|
||||||
if (!local_user()) {
|
if (!local_user()) {
|
||||||
notice(DI::l10n()->t('Permission denied.'));
|
notice(DI::l10n()->t('Permission denied.'));
|
||||||
DI::baseUrl()->redirect('login');
|
DI::baseUrl()->redirect('login');
|
||||||
// NOTREACHED
|
// NOTREACHED
|
||||||
}
|
}
|
||||||
|
|
||||||
$uid = local_user();
|
|
||||||
$url = Strings::escapeTags(trim($_REQUEST['url'] ?? ''));
|
$url = Strings::escapeTags(trim($_REQUEST['url'] ?? ''));
|
||||||
|
|
||||||
$condition = ["`uid` = ? AND (`rel` = ? OR `rel` = ?) AND (`nurl` = ? OR `alias` = ? OR `alias` = ?)",
|
unfollow_process($url);
|
||||||
$uid, Contact::SHARING, Contact::FRIEND, Strings::normaliseLink($url),
|
|
||||||
Strings::normaliseLink($url), $url];
|
|
||||||
$contact = DBA::selectFirst('contact', [], $condition);
|
|
||||||
|
|
||||||
if (!DBA::isResult($contact)) {
|
|
||||||
notice(DI::l10n()->t("You aren't following this contact."));
|
|
||||||
DI::baseUrl()->redirect($base_return_path);
|
|
||||||
// NOTREACHED
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($_REQUEST['cancel'])) {
|
|
||||||
DI::baseUrl()->redirect($base_return_path . '/' . $contact['id']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
|
|
||||||
notice(DI::l10n()->t('Unfollowing is currently not supported by your network.'));
|
|
||||||
DI::baseUrl()->redirect($base_return_path . '/' . $contact['id']);
|
|
||||||
// NOTREACHED
|
|
||||||
}
|
|
||||||
|
|
||||||
$dissolve = ($contact['rel'] == Contact::SHARING);
|
|
||||||
|
|
||||||
$owner = User::getOwnerDataById($uid);
|
|
||||||
if ($owner) {
|
|
||||||
Contact::terminateFriendship($owner, $contact, $dissolve);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sharing-only contacts get deleted as there no relationship any more
|
|
||||||
if ($dissolve) {
|
|
||||||
Contact::remove($contact['id']);
|
|
||||||
$return_path = $base_return_path;
|
|
||||||
} else {
|
|
||||||
DBA::update('contact', ['rel' => Contact::FOLLOWER], ['id' => $contact['id']]);
|
|
||||||
$return_path = $base_return_path . '/' . $contact['id'];
|
|
||||||
}
|
|
||||||
|
|
||||||
DI::baseUrl()->redirect($return_path);
|
|
||||||
// NOTREACHED
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function unfollow_content(App $a)
|
function unfollow_content(App $a)
|
||||||
|
@ -128,6 +87,10 @@ function unfollow_content(App $a)
|
||||||
// Makes the connection request for friendica contacts easier
|
// Makes the connection request for friendica contacts easier
|
||||||
$_SESSION['fastlane'] = $contact['url'];
|
$_SESSION['fastlane'] = $contact['url'];
|
||||||
|
|
||||||
|
if (!empty($_REQUEST['auto'])) {
|
||||||
|
unfollow_process($contact['url']);
|
||||||
|
}
|
||||||
|
|
||||||
$o = Renderer::replaceMacros($tpl, [
|
$o = Renderer::replaceMacros($tpl, [
|
||||||
'$header' => DI::l10n()->t('Disconnect/Unfollow'),
|
'$header' => DI::l10n()->t('Disconnect/Unfollow'),
|
||||||
'$page_desc' => '',
|
'$page_desc' => '',
|
||||||
|
@ -154,3 +117,45 @@ function unfollow_content(App $a)
|
||||||
|
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function unfollow_process(string $url)
|
||||||
|
{
|
||||||
|
$base_return_path = 'contact';
|
||||||
|
|
||||||
|
$uid = local_user();
|
||||||
|
|
||||||
|
$condition = ["`uid` = ? AND (`rel` = ? OR `rel` = ?) AND (`nurl` = ? OR `alias` = ? OR `alias` = ?)",
|
||||||
|
$uid, Contact::SHARING, Contact::FRIEND, Strings::normaliseLink($url),
|
||||||
|
Strings::normaliseLink($url), $url];
|
||||||
|
$contact = DBA::selectFirst('contact', [], $condition);
|
||||||
|
|
||||||
|
if (!DBA::isResult($contact)) {
|
||||||
|
notice(DI::l10n()->t("You aren't following this contact."));
|
||||||
|
DI::baseUrl()->redirect($base_return_path);
|
||||||
|
// NOTREACHED
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
|
||||||
|
notice(DI::l10n()->t('Unfollowing is currently not supported by your network.'));
|
||||||
|
DI::baseUrl()->redirect($base_return_path . '/' . $contact['id']);
|
||||||
|
// NOTREACHED
|
||||||
|
}
|
||||||
|
|
||||||
|
$dissolve = ($contact['rel'] == Contact::SHARING);
|
||||||
|
|
||||||
|
$owner = User::getOwnerDataById($uid);
|
||||||
|
if ($owner) {
|
||||||
|
Contact::terminateFriendship($owner, $contact, $dissolve);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sharing-only contacts get deleted as there no relationship any more
|
||||||
|
if ($dissolve) {
|
||||||
|
Contact::remove($contact['id']);
|
||||||
|
$return_path = $base_return_path;
|
||||||
|
} else {
|
||||||
|
DBA::update('contact', ['rel' => Contact::FOLLOWER], ['id' => $contact['id']]);
|
||||||
|
$return_path = $base_return_path . '/' . $contact['id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
DI::baseUrl()->redirect($return_path);
|
||||||
|
}
|
|
@ -942,9 +942,9 @@ class Contact
|
||||||
$unfollow_link = '';
|
$unfollow_link = '';
|
||||||
if (!$contact['self'] && in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
|
if (!$contact['self'] && in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
|
||||||
if ($contact['uid'] && in_array($contact['rel'], [self::SHARING, self::FRIEND])) {
|
if ($contact['uid'] && in_array($contact['rel'], [self::SHARING, self::FRIEND])) {
|
||||||
$unfollow_link = 'unfollow?url=' . urlencode($contact['url']);
|
$unfollow_link = 'unfollow?url=' . urlencode($contact['url']) . '&auto=1';
|
||||||
} elseif(!$contact['pending']) {
|
} elseif(!$contact['pending']) {
|
||||||
$follow_link = 'follow?url=' . urlencode($contact['url']);
|
$follow_link = 'follow?url=' . urlencode($contact['url']) . '&auto=1';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -322,9 +322,9 @@ class Profile
|
||||||
}
|
}
|
||||||
} elseif ($profile_is_native) {
|
} elseif ($profile_is_native) {
|
||||||
if ($visitor_is_following) {
|
if ($visitor_is_following) {
|
||||||
$unfollow_link = $visitor_base_path . '/unfollow?url=' . urlencode($profile_url);
|
$unfollow_link = $visitor_base_path . '/unfollow?url=' . urlencode($profile_url) . '&auto=1';
|
||||||
} else {
|
} else {
|
||||||
$follow_link = $visitor_base_path .'/follow?url=' . urlencode($profile_url);
|
$follow_link = $visitor_base_path .'/follow?url=' . urlencode($profile_url) . '&auto=1';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -314,9 +314,9 @@ class Contact extends BaseModule
|
||||||
$unfollow_link = '';
|
$unfollow_link = '';
|
||||||
if (in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
|
if (in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
|
||||||
if ($contact['uid'] && in_array($contact['rel'], [Model\Contact::SHARING, Model\Contact::FRIEND])) {
|
if ($contact['uid'] && in_array($contact['rel'], [Model\Contact::SHARING, Model\Contact::FRIEND])) {
|
||||||
$unfollow_link = 'unfollow?url=' . urlencode($contact['url']);
|
$unfollow_link = 'unfollow?url=' . urlencode($contact['url']) . '&auto=1';
|
||||||
} elseif(!$contact['pending']) {
|
} elseif(!$contact['pending']) {
|
||||||
$follow_link = 'follow?url=' . urlencode($contact['url']);
|
$follow_link = 'follow?url=' . urlencode($contact['url']) . '&auto=1';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue