From 8f47f6a7ec4bdbf0a540efe3a3f9c6b493b2dc34 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 1 Jan 2017 19:52:25 +0100 Subject: Adding remote follow button --- .../features/account/components/header.jsx | 4 +- app/assets/stylesheets/components.scss | 8 +++- app/controllers/remote_follow_controller.rb | 47 ++++++++++++++++++++++ app/models/remote_follow.rb | 13 ++++++ app/views/accounts/_header.html.haml | 7 +++- app/views/authorize_follow/_card.html.haml | 11 +++++ app/views/authorize_follow/new.html.haml | 12 +----- app/views/remote_follow/new.html.haml | 13 ++++++ 8 files changed, 99 insertions(+), 16 deletions(-) create mode 100644 app/controllers/remote_follow_controller.rb create mode 100644 app/models/remote_follow.rb create mode 100644 app/views/authorize_follow/_card.html.haml create mode 100644 app/views/remote_follow/new.html.haml (limited to 'app') diff --git a/app/assets/javascripts/components/features/account/components/header.jsx b/app/assets/javascripts/components/features/account/components/header.jsx index adf9ab5ae..6ae5ac002 100644 --- a/app/assets/javascripts/components/features/account/components/header.jsx +++ b/app/assets/javascripts/components/features/account/components/header.jsx @@ -61,10 +61,10 @@ const Header = React.createClass({ const displayNameHTML = { __html: emojify(escapeTextContentForBrowser(displayName)) }; return ( -
+
-
+
diff --git a/app/assets/stylesheets/components.scss b/app/assets/stylesheets/components.scss index 88808b085..290b370a9 100644 --- a/app/assets/stylesheets/components.scss +++ b/app/assets/stylesheets/components.scss @@ -147,6 +147,12 @@ } } +@media screen and (max-height: 800px) { + .account__header__avatar, .account__header__content { + display: none; + } +} + .account__header__content { word-wrap: break-word; font-weight: 300; @@ -585,4 +591,4 @@ pointer-events: none; bottom: 0; left: 0; -} \ No newline at end of file +} diff --git a/app/controllers/remote_follow_controller.rb b/app/controllers/remote_follow_controller.rb new file mode 100644 index 000000000..5e923c88f --- /dev/null +++ b/app/controllers/remote_follow_controller.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +class RemoteFollowController < ApplicationController + layout 'public' + + before_action :set_account + before_action :check_account_suspension + + def new + @remote_follow = RemoteFollow.new + end + + def create + @remote_follow = RemoteFollow.new(resource_params) + + if @remote_follow.valid? + resource = Goldfinger.finger("acct:#{@remote_follow.acct}") + redirect_url_link = resource&.link('http://ostatus.org/schema/1.0/subscribe') + + if redirect_url_link.nil? || redirect_url_link.template.nil? + @remote_follow.errors.add(:acct, I18n.t('remote_follow.missing_resource')) + render(:new) && return + end + + redirect_to Addressable::Template.new(redirect_url_link.template).expand(uri: "acct:#{@account.username}@#{Rails.configuration.x.local_domain}").to_s + else + render :new + end + rescue Goldfinger::Error + @remote_follow.errors.add(:acct, I18n.t('remote_follow.missing_resource')) + render :new + end + + private + + def resource_params + params.require(:remote_follow).permit(:acct) + end + + def set_account + @account = Account.find_local!(params[:account_username]) + end + + def check_account_suspension + head 410 if @account.suspended? + end +end diff --git a/app/models/remote_follow.rb b/app/models/remote_follow.rb new file mode 100644 index 000000000..13281a4fc --- /dev/null +++ b/app/models/remote_follow.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class RemoteFollow + include ActiveModel::Validations + + attr_accessor :acct + + validates :acct, presence: true + + def initialize(attrs = {}) + @acct = attrs[:acct] + end +end diff --git a/app/views/accounts/_header.html.haml b/app/views/accounts/_header.html.haml index 01e639205..1c6b5f0f6 100644 --- a/app/views/accounts/_header.html.haml +++ b/app/views/accounts/_header.html.haml @@ -5,8 +5,11 @@ = link_to t('accounts.unfollow'), unfollow_account_path(@account), data: { method: :post }, class: 'button' - else = link_to t('accounts.follow'), follow_account_path(@account), data: { method: :post }, class: 'button' - - .avatar= image_tag @account.avatar.url( :original) + - else + .controls + .remote-follow + = link_to t('accounts.remote_follow'), account_remote_follow_path(@account), class: 'button' + .avatar= image_tag @account.avatar.url(:original) %h1.name = display_name(@account) %small diff --git a/app/views/authorize_follow/_card.html.haml b/app/views/authorize_follow/_card.html.haml new file mode 100644 index 000000000..a9b02c746 --- /dev/null +++ b/app/views/authorize_follow/_card.html.haml @@ -0,0 +1,11 @@ +.account-card + .detailed-status__display-name + %div + = image_tag account.avatar.url(:original), alt: '', width: 48, height: 48, class: 'avatar' + + %span.display-name + %strong= display_name(account) + %span= "@#{account.acct}" + + - unless account.note.blank? + .account__header__content= Formatter.instance.simplified_format(account) diff --git a/app/views/authorize_follow/new.html.haml b/app/views/authorize_follow/new.html.haml index 44bf575ff..95601253e 100644 --- a/app/views/authorize_follow/new.html.haml +++ b/app/views/authorize_follow/new.html.haml @@ -5,17 +5,7 @@ .follow-prompt %h2= t('authorize_follow.prompt_html', self: current_account.username) - .account-card - .detailed-status__display-name - %div - = image_tag @account.avatar.url(:original), alt: '', width: 48, height: 48, class: 'avatar' - - %span.display-name - %strong= display_name(@account) - %span= "@#{@account.acct}" - - - unless @account.note.blank? - .account__header__content= Formatter.instance.simplified_format(@account) + = render partial: 'card', locals: { account: @account } = form_tag authorize_follow_path, method: :post, class: 'simple_form' do = hidden_field_tag :acct, @account.acct diff --git a/app/views/remote_follow/new.html.haml b/app/views/remote_follow/new.html.haml new file mode 100644 index 000000000..e88ccccce --- /dev/null +++ b/app/views/remote_follow/new.html.haml @@ -0,0 +1,13 @@ +.form-container + .follow-prompt + %h2= t('remote_follow.prompt') + + = render partial: 'authorize_follow/card', locals: { account: @account } + + = simple_form_for @remote_follow, as: :remote_follow, url: account_remote_follow_path(@account) do |f| + = render 'shared/error_messages', object: @remote_follow + + = f.input :acct, placeholder: t('remote_follow.acct') + + .actions + = f.button :button, t('remote_follow.proceed'), type: :submit -- cgit