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:
parent
fcca31350d
commit
e95bdec7c5
15 changed files with 101 additions and 55 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module StreamEntriesHelper
|
||||
EMBEDDED_CONTROLLER = 'stream_entries'
|
||||
EMBEDDED_CONTROLLER = 'statuses'
|
||||
EMBEDDED_ACTION = 'embed'
|
||||
|
||||
def display_name(account)
|
||||
|
|
|
@ -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 }) => {
|
||||
|
|
|
@ -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%);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
|
@ -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',
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue