Update status embeds (#4742)

- Use statuses controller for embeds instead of stream entries controller
- Prefer /@:username/:id/embed URL for embeds
- Use /@:username as author_url in OEmbed
- Add follow link to embeds which opens web intent in new window
- Use redis cache in development
- Cache entire embed
This commit is contained in:
Eugen Rochko 2017-08-30 10:23:43 +02:00 committed by GitHub
parent fcca31350d
commit e95bdec7c5
15 changed files with 101 additions and 55 deletions

View file

@ -4,14 +4,14 @@ class Api::OEmbedController < Api::BaseController
respond_to :json
def show
@stream_entry = find_stream_entry.stream_entry
render json: @stream_entry, serializer: OEmbedSerializer, width: maxwidth_or_default, height: maxheight_or_default
@status = status_finder.status
render json: @status, serializer: OEmbedSerializer, width: maxwidth_or_default, height: maxheight_or_default
end
private
def find_stream_entry
StreamEntryFinder.new(params[:url])
def status_finder
StatusFinder.new(params[:url])
end
def maxwidth_or_default

View file

@ -30,6 +30,11 @@ class StatusesController < ApplicationController
render json: @status, serializer: ActivityPub::ActivitySerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json'
end
def embed
response.headers['X-Frame-Options'] = 'ALLOWALL'
render 'stream_entries/embed', layout: 'embedded'
end
private
def set_account

View file

@ -25,10 +25,7 @@ class StreamEntriesController < ApplicationController
end
def embed
response.headers['X-Frame-Options'] = 'ALLOWALL'
return gone if @stream_entry.activity.nil?
render layout: 'embedded'
redirect_to embed_short_account_status_url(@account, @stream_entry.activity), status: 301
end
private

View file

@ -1,7 +1,7 @@
# frozen_string_literal: true
module StreamEntriesHelper
EMBEDDED_CONTROLLER = 'stream_entries'
EMBEDDED_CONTROLLER = 'statuses'
EMBEDDED_ACTION = 'embed'
def display_name(account)

View file

@ -38,6 +38,13 @@ function main() {
content.title = dateTimeFormat.format(datetime);
content.textContent = relativeFormat.format(datetime);
});
[].forEach.call(document.querySelectorAll('.logo-button'), (content) => {
content.addEventListener('click', (e) => {
e.preventDefault();
window.open(e.target.href, 'mastodon-intent', 'width=400,height=400,resizable=no,menubar=no,status=no,scrollbars=yes');
});
});
});
delegate(document, '.video-player video', 'click', ({ target }) => {

View file

@ -421,3 +421,33 @@
}
}
}
.button.button-secondary.logo-button {
position: absolute;
right: 14px;
top: 14px;
font-size: 14px;
svg {
width: 20px;
height: auto;
vertical-align: middle;
margin-right: 5px;
path:first-child {
fill: $ui-primary-color;
}
path:last-child {
fill: $simple-background-color;
}
}
&:active,
&:focus,
&:hover {
svg path:first-child {
fill: lighten($ui-primary-color, 4%);
}
}
}

View file

@ -1,20 +1,20 @@
# frozen_string_literal: true
class StreamEntryFinder
class StatusFinder
attr_reader :url
def initialize(url)
@url = url
end
def stream_entry
def status
verify_action!
case recognized_params[:controller]
when 'stream_entries'
StreamEntry.find(recognized_params[:id])
StreamEntry.find(recognized_params[:id]).status
when 'statuses'
Status.find(recognized_params[:id]).stream_entry
Status.find(recognized_params[:id])
else
raise ActiveRecord::RecordNotFound
end

View file

@ -21,7 +21,7 @@ class OEmbedSerializer < ActiveModel::Serializer
end
def author_url
account_url(object.account)
short_account_url(object.account)
end
def provider_name
@ -38,7 +38,7 @@ class OEmbedSerializer < ActiveModel::Serializer
def html
tag :iframe,
src: embed_account_stream_entry_url(object.account, object),
src: embed_short_account_status_url(object.account, object),
style: 'width: 100%; overflow: hidden',
frameborder: '0',
scrolling: 'no',

View file

@ -1,4 +1,9 @@
.detailed-status.light
- if embedded_view?
= link_to "web+mastodon://follow?uri=#{status.account.local_username_and_domain}", class: 'button button-secondary logo-button', target: '_new' do
= render file: Rails.root.join('app', 'javascript', 'images', 'logo.svg')
= t('accounts.follow')
= link_to TagManager.instance.url_for(status.account), class: 'detailed-status__display-name p-author h-card', target: stream_link_target, rel: 'noopener' do
%div
.avatar

View file

@ -1,2 +1,3 @@
.activity-stream.activity-stream-headless
= render @type, @type.to_sym => @stream_entry.activity, centered: true
- cache @stream_entry.activity do
.activity-stream.activity-stream-headless
= render "stream_entries/#{@type}", @type.to_sym => @stream_entry.activity, centered: true