Fix follow/unfollow buttons on public profile (fixes #7036) (#7040)

* Fix follow/unfollow buttons on public profile

- Present non-logged users with web+mastodon:// URLs for remote accounts
- Present logged-in users with appropriate links (authorize_follows and
  remote_unfollows) for remote accounts

* Do not cache rendered cards if user is logged in
This commit is contained in:
ThibG 2018-04-08 13:40:22 +02:00 committed by Eugen Rochko
parent 1ed1014546
commit 1364e9e4ae
9 changed files with 95 additions and 4 deletions

View file

@ -0,0 +1,21 @@
# frozen_string_literal: true
module RemoteAccountControllerConcern
extend ActiveSupport::Concern
included do
layout 'public'
before_action :set_account
before_action :check_account_suspension
end
private
def set_account
@account = Account.find_remote!(params[:acct])
end
def check_account_suspension
gone if @account.suspended?
end
end

View file

@ -0,0 +1,39 @@
# frozen_string_literal: true
class RemoteUnfollowsController < ApplicationController
layout 'modal'
before_action :authenticate_user!
before_action :set_body_classes
def create
@account = unfollow_attempt.try(:target_account)
if @account.nil?
render :error
else
render :success
end
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
render :error
end
private
def unfollow_attempt
username, domain = acct_without_prefix.split('@')
UnfollowService.new.call(current_account, Account.find_remote!(username, domain))
end
def acct_without_prefix
acct_params.gsub(/\Aacct:/, '')
end
def acct_params
params.fetch(:acct, '')
end
def set_body_classes
@body_classes = 'modal-layout'
end
end

View file

@ -8,16 +8,16 @@
- if user_signed_in? && current_account.id != account.id && !requested - if user_signed_in? && current_account.id != account.id && !requested
.controls .controls
- if following - if following
= link_to account_unfollow_path(account), data: { method: :post }, class: 'icon-button' do = link_to (account.local? ? account_unfollow_path(account) : remote_unfollow_path(acct: account.acct)), data: { method: :post }, class: 'icon-button' do
= fa_icon 'user-times' = fa_icon 'user-times'
= t('accounts.unfollow') = t('accounts.unfollow')
- else - else
= link_to account_follow_path(account), data: { method: :post }, class: 'icon-button' do = link_to (account.local? ? account_follow_path(account) : authorize_follow_path(acct: account.acct)), data: { method: :post }, class: 'icon-button' do
= fa_icon 'user-plus' = fa_icon 'user-plus'
= t('accounts.follow') = t('accounts.follow')
- elsif !user_signed_in? - elsif !user_signed_in?
.controls .controls
.remote-follow .remote-follow
= link_to account_remote_follow_path(account), class: 'icon-button' do = link_to (account.local? ? account_remote_follow_path(account) : "web+mastodon://follow?uri=#{account.uri}"), class: 'icon-button' do
= fa_icon 'user-plus' = fa_icon 'user-plus'
= t('accounts.remote_follow') = t('accounts.remote_follow')

View file

@ -2,6 +2,6 @@
- if accounts.empty? - if accounts.empty?
= render partial: 'accounts/nothing_here' = render partial: 'accounts/nothing_here'
- else - else
= render partial: 'accounts/grid_card', collection: accounts, as: :account, cached: true = render partial: 'accounts/grid_card', collection: accounts, as: :account, cached: !user_signed_in?
= paginate follows = paginate follows

View file

@ -0,0 +1,13 @@
.account-card
.detailed-status__display-name
%div
= image_tag account.avatar.url(:original), alt: '', width: 48, height: 48, class: 'avatar'
%span.display-name
- account_url = local_assigns[:admin] ? admin_account_path(account.id) : TagManager.instance.url_for(account)
= link_to account_url, class: 'detailed-status__display-name p-author h-card', target: '_blank', rel: 'noopener' do
%strong.emojify= display_name(account)
%span @#{account.acct}
- if account.note?
.account__header__content.emojify= Formatter.instance.simplified_format(account)

View file

@ -0,0 +1,4 @@
.post-follow-actions
%div= link_to t('authorize_follow.post_follow.web'), web_url("accounts/#{@account.id}"), class: 'button button--block'
%div= link_to t('authorize_follow.post_follow.return'), TagManager.instance.url_for(@account), class: 'button button--block'
%div= t('authorize_follow.post_follow.close')

View file

@ -0,0 +1,3 @@
.form-container
.flash-message#error_explanation
= t('remote_unfollow.error')

View file

@ -0,0 +1,10 @@
- content_for :page_title do
= t('remote_unfollow.title', acct: @account.acct)
.form-container
.follow-prompt
%h2= t('remote_unfollow.unfollowed')
= render 'card', account: @account
= render 'post_follow_actions'

View file

@ -116,6 +116,7 @@ Rails.application.routes.draw do
get '/media_proxy/:id/(*any)', to: 'media_proxy#show', as: :media_proxy get '/media_proxy/:id/(*any)', to: 'media_proxy#show', as: :media_proxy
# Remote follow # Remote follow
resource :remote_unfollow, only: [:create]
resource :authorize_follow, only: [:show, :create] resource :authorize_follow, only: [:show, :create]
resource :share, only: [:show, :create] resource :share, only: [:show, :create]