2019-05-02 14:57:12 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2016-02-14 02:29:53 +08:00
|
|
|
class MetadataController < ApplicationController
|
2015-09-20 23:00:30 +08:00
|
|
|
layout false
|
2017-08-31 12:06:56 +08:00
|
|
|
skip_before_action :preload_json, :check_xhr, :redirect_to_login_if_required
|
2015-09-20 23:00:30 +08:00
|
|
|
|
2016-02-14 02:29:53 +08:00
|
|
|
def manifest
|
2020-07-01 10:58:02 +08:00
|
|
|
expires_in 1.minutes
|
2018-06-14 11:13:28 +08:00
|
|
|
render json: default_manifest.to_json, content_type: "application/manifest+json"
|
2016-06-30 12:03:52 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
def opensearch
|
2020-07-01 10:58:02 +08:00
|
|
|
expires_in 1.minutes
|
2021-04-21 17:36:32 +08:00
|
|
|
render template: "metadata/opensearch", formats: [:xml]
|
2016-06-30 12:03:52 +08:00
|
|
|
end
|
|
|
|
|
2019-08-28 02:05:37 +08:00
|
|
|
def app_association_android
|
|
|
|
raise Discourse::NotFound unless SiteSetting.app_association_android.present?
|
2020-07-01 10:58:02 +08:00
|
|
|
expires_in 1.minutes
|
2019-08-28 02:05:37 +08:00
|
|
|
render plain: SiteSetting.app_association_android, content_type: "application/json"
|
|
|
|
end
|
|
|
|
|
|
|
|
def app_association_ios
|
|
|
|
raise Discourse::NotFound unless SiteSetting.app_association_ios.present?
|
2020-07-01 10:58:02 +08:00
|
|
|
expires_in 1.minutes
|
2019-08-28 02:05:37 +08:00
|
|
|
render plain: SiteSetting.app_association_ios, content_type: "application/json"
|
|
|
|
end
|
|
|
|
|
2016-06-30 12:03:52 +08:00
|
|
|
private
|
|
|
|
|
|
|
|
def default_manifest
|
2019-11-28 10:13:13 +08:00
|
|
|
display = "standalone"
|
|
|
|
if request.user_agent
|
|
|
|
regex = Regexp.new(SiteSetting.pwa_display_browser_regex)
|
|
|
|
display = "browser" if regex.match(request.user_agent)
|
|
|
|
end
|
2018-08-16 10:36:08 +08:00
|
|
|
|
2020-06-02 12:04:02 +08:00
|
|
|
scheme_id = view_context.scheme_id
|
|
|
|
primary_color = ColorScheme.hex_for_name("primary", scheme_id)
|
2020-05-15 03:32:53 +08:00
|
|
|
icon_url_base =
|
|
|
|
UrlHelper.absolute("/svg-sprite/#{Discourse.current_hostname}/icon/#{primary_color}")
|
|
|
|
|
2017-01-04 01:50:45 +08:00
|
|
|
manifest = {
|
2016-04-20 22:54:01 +08:00
|
|
|
name: SiteSetting.title,
|
2020-02-05 01:16:00 +08:00
|
|
|
short_name:
|
|
|
|
SiteSetting.short_title.presence ||
|
|
|
|
SiteSetting.title.truncate(12, separator: " ", omission: ""),
|
2021-02-26 05:23:19 +08:00
|
|
|
description: SiteSetting.site_description,
|
2018-08-16 10:36:08 +08:00
|
|
|
display: display,
|
2023-02-04 03:48:05 +08:00
|
|
|
start_url: Discourse.base_path.present? ? "#{Discourse.base_path}/" : "/",
|
2020-06-02 12:04:02 +08:00
|
|
|
background_color: "##{ColorScheme.hex_for_name("secondary", scheme_id)}",
|
|
|
|
theme_color: "##{ColorScheme.hex_for_name("header_background", scheme_id)}",
|
2016-04-20 22:54:01 +08:00
|
|
|
icons: [],
|
2018-12-07 23:48:09 +08:00
|
|
|
share_target: {
|
2020-10-09 18:40:40 +08:00
|
|
|
action: "#{Discourse.base_path}/new-topic",
|
2019-03-16 04:10:05 +08:00
|
|
|
method: "GET",
|
|
|
|
enctype: "application/x-www-form-urlencoded",
|
2018-12-07 23:48:09 +08:00
|
|
|
params: {
|
|
|
|
title: "title",
|
|
|
|
text: "body",
|
|
|
|
},
|
2020-05-12 23:24:33 +08:00
|
|
|
},
|
|
|
|
shortcuts: [
|
|
|
|
{
|
|
|
|
name: I18n.t("js.topic.create_long"),
|
|
|
|
short_name: I18n.t("js.topic.create"),
|
2020-10-09 18:40:40 +08:00
|
|
|
url: "#{Discourse.base_path}/new-topic",
|
2020-05-12 23:24:33 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
name: I18n.t("js.user.messages.inbox"),
|
|
|
|
short_name: I18n.t("js.user.messages.inbox"),
|
2020-10-09 18:40:40 +08:00
|
|
|
url: "#{Discourse.base_path}/my/messages",
|
2020-05-12 23:24:33 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
name: I18n.t("js.user.bookmarks"),
|
|
|
|
short_name: I18n.t("js.user.bookmarks"),
|
2021-03-15 12:36:50 +08:00
|
|
|
url: "#{Discourse.base_path}/my/activity/bookmarks",
|
2020-05-12 23:24:33 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
name: I18n.t("js.filters.top.title"),
|
|
|
|
short_name: I18n.t("js.filters.top.title"),
|
2020-10-09 18:40:40 +08:00
|
|
|
url: "#{Discourse.base_path}/top",
|
2020-05-12 23:24:33 +08:00
|
|
|
},
|
|
|
|
],
|
2015-09-20 23:00:30 +08:00
|
|
|
}
|
2017-01-04 01:50:45 +08:00
|
|
|
|
2019-05-01 21:44:45 +08:00
|
|
|
logo = SiteSetting.site_manifest_icon_url
|
2019-09-22 12:20:25 +08:00
|
|
|
if logo
|
|
|
|
icon_entry = {
|
|
|
|
src: UrlHelper.absolute(logo),
|
|
|
|
sizes: "512x512",
|
|
|
|
type: MiniMime.lookup_by_filename(logo)&.content_type || "image/png",
|
|
|
|
}
|
|
|
|
manifest[:icons] << icon_entry.dup
|
|
|
|
icon_entry[:purpose] = "maskable"
|
|
|
|
manifest[:icons] << icon_entry
|
|
|
|
end
|
2019-05-01 21:44:45 +08:00
|
|
|
|
2021-03-05 05:39:58 +08:00
|
|
|
SiteSetting
|
|
|
|
.manifest_screenshots
|
|
|
|
.split("|")
|
|
|
|
.each do |image|
|
|
|
|
next unless Discourse.store.has_been_uploaded?(image)
|
|
|
|
|
|
|
|
upload = Upload.find_by(sha1: Upload.extract_sha1(image))
|
|
|
|
next if upload.nil?
|
|
|
|
|
|
|
|
manifest[:screenshots] = [] if manifest.dig(:screenshots).nil?
|
|
|
|
|
|
|
|
manifest[:screenshots] << {
|
|
|
|
src: UrlHelper.absolute(image),
|
|
|
|
sizes: "#{upload.width}x#{upload.height}",
|
|
|
|
type: "image/#{upload.extension}",
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2019-04-18 00:25:13 +08:00
|
|
|
if current_user && current_user.trust_level >= 1 &&
|
|
|
|
SiteSetting.native_app_install_banner_android
|
2017-01-04 01:50:45 +08:00
|
|
|
manifest =
|
|
|
|
manifest.merge(
|
|
|
|
prefer_related_applications: true,
|
2019-04-18 00:25:13 +08:00
|
|
|
related_applications: [{ platform: "play", id: SiteSetting.android_app_id }],
|
2017-01-04 01:50:45 +08:00
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
manifest
|
2016-02-14 02:29:53 +08:00
|
|
|
end
|
2015-09-20 23:00:30 +08:00
|
|
|
end
|