@@ -3,7 +3,6 @@ | |||||
class HomeController < ApplicationController | class HomeController < ApplicationController | ||||
before_action :authenticate_user! | before_action :authenticate_user! | ||||
before_action :set_referrer_policy_header | before_action :set_referrer_policy_header | ||||
before_action :set_initial_state_json | |||||
def index | def index | ||||
@body_classes = 'app-body' | @body_classes = 'app-body' | ||||
@@ -39,21 +38,6 @@ class HomeController < ApplicationController | |||||
redirect_to(matches ? tag_path(CGI.unescape(matches[:tag])) : default_redirect_path) | redirect_to(matches ? tag_path(CGI.unescape(matches[:tag])) : default_redirect_path) | ||||
end | end | ||||
def set_initial_state_json | |||||
serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer) | |||||
@initial_state_json = serializable_resource.to_json | |||||
end | |||||
def initial_state_params | |||||
{ | |||||
settings: Web::Setting.find_by(user: current_user)&.data || {}, | |||||
push_subscription: current_account.user.web_push_subscription(current_session), | |||||
current_account: current_account, | |||||
token: current_session.token, | |||||
admin: Account.find_local(Setting.site_contact_username.strip.gsub(/\A@/, '')), | |||||
} | |||||
end | |||||
def default_redirect_path | def default_redirect_path | ||||
if request.path.start_with?('/web') || whitelist_mode? | if request.path.start_with?('/web') || whitelist_mode? | ||||
new_user_session_path | new_user_session_path | ||||
@@ -8,12 +8,7 @@ class PublicTimelinesController < ApplicationController | |||||
before_action :set_body_classes | before_action :set_body_classes | ||||
before_action :set_instance_presenter | before_action :set_instance_presenter | ||||
def show | |||||
@initial_state_json = ActiveModelSerializers::SerializableResource.new( | |||||
InitialStatePresenter.new(settings: { known_fediverse: Setting.show_known_fediverse_at_about_page }, token: current_session&.token), | |||||
serializer: InitialStateSerializer | |||||
).to_json | |||||
end | |||||
def show; end | |||||
private | private | ||||
@@ -6,26 +6,10 @@ class SharesController < ApplicationController | |||||
before_action :authenticate_user! | before_action :authenticate_user! | ||||
before_action :set_body_classes | before_action :set_body_classes | ||||
def show | |||||
serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer) | |||||
@initial_state_json = serializable_resource.to_json | |||||
end | |||||
def show; end | |||||
private | private | ||||
def initial_state_params | |||||
text = [params[:title], params[:text], params[:url]].compact.join(' ') | |||||
{ | |||||
settings: Web::Setting.find_by(user: current_user)&.data || {}, | |||||
push_subscription: current_account.user.web_push_subscription(current_session), | |||||
current_account: current_account, | |||||
token: current_session.token, | |||||
admin: Account.find_local(Setting.site_contact_username.strip.gsub(/\A@/, '')), | |||||
text: text, | |||||
} | |||||
end | |||||
def set_body_classes | def set_body_classes | ||||
@body_classes = 'modal-layout compose-standalone' | @body_classes = 'modal-layout compose-standalone' | ||||
end | end | ||||
@@ -17,11 +17,6 @@ class TagsController < ApplicationController | |||||
respond_to do |format| | respond_to do |format| | ||||
format.html do | format.html do | ||||
expires_in 0, public: true | expires_in 0, public: true | ||||
@initial_state_json = ActiveModelSerializers::SerializableResource.new( | |||||
InitialStatePresenter.new(settings: {}, token: current_session&.token), | |||||
serializer: InitialStateSerializer | |||||
).to_json | |||||
end | end | ||||
format.rss do | format.rss do | ||||
@@ -122,4 +122,25 @@ module ApplicationHelper | |||||
text = word_wrap(text, line_width: line_width - 2, break_sequence: break_sequence) | text = word_wrap(text, line_width: line_width - 2, break_sequence: break_sequence) | ||||
text.split("\n").map { |line| '> ' + line }.join("\n") | text.split("\n").map { |line| '> ' + line }.join("\n") | ||||
end | end | ||||
def render_initial_state | |||||
state_params = { | |||||
settings: { | |||||
known_fediverse: Setting.show_known_fediverse_at_about_page, | |||||
}, | |||||
text: [params[:title], params[:text], params[:url]].compact.join(' '), | |||||
} | |||||
if user_signed_in? | |||||
state_params[:settings] = state_params[:settings].merge(Web::Setting.find_by(user: current_user)&.data || {}) | |||||
state_params[:push_subscription] = current_account.user.web_push_subscription(current_session) | |||||
state_params[:current_account] = current_account | |||||
state_params[:token] = current_session.token | |||||
state_params[:admin] = Account.find_local(Setting.site_contact_username.strip.gsub(/\A@/, '')) | |||||
end | |||||
json = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(state_params), serializer: InitialStateSerializer).to_json | |||||
content_tag(:script, json_escape(json).html_safe, id: 'initial-state', type: 'application/json') | |||||
end | |||||
end | end |
@@ -38,6 +38,11 @@ class InitialStateSerializer < ActiveModel::Serializer | |||||
store[:use_pending_items] = object.current_account.user.setting_use_pending_items | store[:use_pending_items] = object.current_account.user.setting_use_pending_items | ||||
store[:is_staff] = object.current_account.user.staff? | store[:is_staff] = object.current_account.user.staff? | ||||
store[:trends] = Setting.trends && object.current_account.user.setting_trends | store[:trends] = Setting.trends && object.current_account.user.setting_trends | ||||
else | |||||
store[:auto_play_gif] = Setting.auto_play_gif | |||||
store[:display_media] = Setting.display_media | |||||
store[:reduce_motion] = Setting.reduce_motion | |||||
store[:use_blurhash] = Setting.use_blurhash | |||||
end | end | ||||
store | store | ||||
@@ -5,8 +5,7 @@ | |||||
= preload_link_tag asset_pack_path('features/notifications.js'), crossorigin: 'anonymous' | = preload_link_tag asset_pack_path('features/notifications.js'), crossorigin: 'anonymous' | ||||
%meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key} | %meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key} | ||||
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) | |||||
= render_initial_state | |||||
= javascript_pack_tag 'application', integrity: true, crossorigin: 'anonymous' | = javascript_pack_tag 'application', integrity: true, crossorigin: 'anonymous' | ||||
.app-holder#mastodon{ data: { props: Oj.dump(default_props) } } | .app-holder#mastodon{ data: { props: Oj.dump(default_props) } } | ||||
@@ -1,4 +1,5 @@ | |||||
- content_for :header_tags do | - content_for :header_tags do | ||||
= render_initial_state | |||||
= javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' | = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' | ||||
- content_for :content do | - content_for :content do | ||||
@@ -3,7 +3,6 @@ | |||||
- content_for :header_tags do | - content_for :header_tags do | ||||
%meta{ name: 'robots', content: 'noindex' }/ | %meta{ name: 'robots', content: 'noindex' }/ | ||||
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) | |||||
= javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous' | = javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous' | ||||
.page-header | .page-header | ||||
@@ -1,5 +1,5 @@ | |||||
- content_for :header_tags do | - content_for :header_tags do | ||||
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) | |||||
= render_initial_state | |||||
= javascript_pack_tag 'share', integrity: true, crossorigin: 'anonymous' | = javascript_pack_tag 'share', integrity: true, crossorigin: 'anonymous' | ||||
#mastodon-compose{ data: { props: Oj.dump(default_props) } } | #mastodon-compose{ data: { props: Oj.dump(default_props) } } |
@@ -5,7 +5,6 @@ | |||||
%meta{ name: 'robots', content: 'noindex' }/ | %meta{ name: 'robots', content: 'noindex' }/ | ||||
%link{ rel: 'alternate', type: 'application/rss+xml', href: tag_url(@tag, format: 'rss') }/ | %link{ rel: 'alternate', type: 'application/rss+xml', href: tag_url(@tag, format: 'rss') }/ | ||||
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) | |||||
= javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous' | = javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous' | ||||
= render 'og' | = render 'og' | ||||
@@ -27,16 +27,6 @@ RSpec.describe HomeController, type: :controller do | |||||
subject | subject | ||||
expect(assigns(:body_classes)).to eq 'app-body' | expect(assigns(:body_classes)).to eq 'app-body' | ||||
end | end | ||||
it 'assigns @initial_state_json' do | |||||
subject | |||||
initial_state_json = json_str_to_hash(assigns(:initial_state_json)) | |||||
expect(initial_state_json[:meta]).to_not be_nil | |||||
expect(initial_state_json[:compose]).to_not be_nil | |||||
expect(initial_state_json[:accounts]).to_not be_nil | |||||
expect(initial_state_json[:settings]).to_not be_nil | |||||
expect(initial_state_json[:media_attachments]).to_not be_nil | |||||
end | |||||
end | end | ||||
end | end | ||||
end | end |
@@ -7,15 +7,12 @@ describe SharesController do | |||||
before { sign_in user } | before { sign_in user } | ||||
describe 'GTE #show' do | describe 'GTE #show' do | ||||
subject(:initial_state_json) { JSON.parse(assigns(:initial_state_json), symbolize_names: true) } | |||||
subject(:body_classes) { assigns(:body_classes) } | subject(:body_classes) { assigns(:body_classes) } | ||||
before { get :show, params: { title: 'test title', text: 'test text', url: 'url1 url2' } } | before { get :show, params: { title: 'test title', text: 'test text', url: 'url1 url2' } } | ||||
it 'assigns json' do | |||||
it 'returns http success' do | |||||
expect(response).to have_http_status :ok | expect(response).to have_http_status :ok | ||||
expect(initial_state_json[:compose][:text]).to eq 'test title test text url1 url2' | |||||
expect(initial_state_json[:meta][:me]).to eq user.account.id.to_s | |||||
expect(body_classes).to eq 'modal-layout compose-standalone' | expect(body_classes).to eq 'modal-layout compose-standalone' | ||||
end | end | ||||
end | end | ||||