Follow/Unfollow contact with a single click

This commit is contained in:
Michael 2020-10-20 03:49:58 +00:00
parent 5232a8583f
commit 33575a94fa
6 changed files with 88 additions and 76 deletions

View File

@ -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']];

View File

@ -41,31 +41,7 @@ function follow_post(App $a)
DI::baseUrl()->redirect('contact'); DI::baseUrl()->redirect('contact');
} }
$url = Probe::cleanURI($_REQUEST['url']); follow_process($a);
$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);
// NOTREACHED
} }
function follow_content(App $a) function follow_content(App $a)
@ -92,6 +68,10 @@ function follow_content(App $a)
DI::baseUrl()->redirect($return_path); DI::baseUrl()->redirect($return_path);
} }
if (!empty($_REQUEST['auto'])) {
follow_process($a);
}
$submit = DI::l10n()->t('Submit Request'); $submit = DI::l10n()->t('Submit Request');
// Don't try to add a pending contact // Don't try to add a pending contact
@ -195,6 +175,34 @@ function follow_content(App $a)
return $o; return $o;
} }
function follow_process(App $a)
{
$url = Probe::cleanURI($_REQUEST['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());

View File

@ -31,56 +31,13 @@ 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(); unfollow_process();
$url = Strings::escapeTags(trim($_REQUEST['url'] ?? ''));
$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 (!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)
@ -93,6 +50,10 @@ function unfollow_content(App $a)
// NOTREACHED // NOTREACHED
} }
if (!empty($_REQUEST['auto'])) {
unfollow_process();
}
$uid = local_user(); $uid = local_user();
$url = Strings::escapeTags(trim($_REQUEST['url'])); $url = Strings::escapeTags(trim($_REQUEST['url']));
@ -154,3 +115,46 @@ function unfollow_content(App $a)
return $o; return $o;
} }
function unfollow_process()
{
$base_return_path = 'contact';
$uid = local_user();
$url = Strings::escapeTags(trim($_REQUEST['url'] ?? ''));
$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);
}

View File

@ -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';
} }
} }

View File

@ -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';
} }
} }

View File

@ -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';
} }
} }