fix(pwa): decouple installability from DISPLAY_MANIFEST branding flag (#272)
DISPLAY_MANIFEST previously gated the entire PWA manifest link and theme-color meta, so white-label installs that set the flag to false to hide Chatwoot branding also lost the mobile "Install app" prompt. Serve /manifest.json from a new dynamic controller that reflects INSTALLATION_NAME, LOGO_THUMBNAIL and a new BRAND_COLOR config, and keep the manifest link, theme-color and apple-mobile-web-app meta emitted regardless of DISPLAY_MANIFEST. The flag now gates only the Chatwoot-branded raster assets (favicons, apple-icon PNGs, ms-icon, marketing meta description).
This commit is contained in:
parent
079d4b4996
commit
55c7c435bc
@ -10,6 +10,7 @@ class DashboardController < ActionController::Base
|
|||||||
TERMS_URL
|
TERMS_URL
|
||||||
BRAND_URL
|
BRAND_URL
|
||||||
BRAND_NAME
|
BRAND_NAME
|
||||||
|
BRAND_COLOR
|
||||||
PRIVACY_URL
|
PRIVACY_URL
|
||||||
DISPLAY_MANIFEST
|
DISPLAY_MANIFEST
|
||||||
CREATE_NEW_ACCOUNT_FROM_DASHBOARD
|
CREATE_NEW_ACCOUNT_FROM_DASHBOARD
|
||||||
|
|||||||
35
app/controllers/manifest_controller.rb
Normal file
35
app/controllers/manifest_controller.rb
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
class ManifestController < ApplicationController
|
||||||
|
PNG_MIME = 'image/png'.freeze
|
||||||
|
SVG_MIME = 'image/svg+xml'.freeze
|
||||||
|
|
||||||
|
def show
|
||||||
|
config = GlobalConfig.get('INSTALLATION_NAME', 'LOGO_THUMBNAIL', 'BRAND_COLOR')
|
||||||
|
installation_name = config['INSTALLATION_NAME'].presence || 'Chatwoot'
|
||||||
|
logo = config['LOGO_THUMBNAIL'].presence || '/brand-assets/logo_thumbnail.svg'
|
||||||
|
brand_color = config['BRAND_COLOR'].presence || '#1f93ff'
|
||||||
|
icon_type = svg?(logo) ? SVG_MIME : PNG_MIME
|
||||||
|
|
||||||
|
expires_in 1.hour, public: true
|
||||||
|
render json: {
|
||||||
|
name: installation_name,
|
||||||
|
short_name: installation_name,
|
||||||
|
id: '/',
|
||||||
|
start_url: '/',
|
||||||
|
display: 'standalone',
|
||||||
|
background_color: brand_color,
|
||||||
|
theme_color: brand_color,
|
||||||
|
icons: [
|
||||||
|
{ src: logo, sizes: '192x192', type: icon_type, purpose: 'any maskable' },
|
||||||
|
{ src: logo, sizes: '512x512', type: icon_type, purpose: 'any maskable' }
|
||||||
|
]
|
||||||
|
}, content_type: 'application/manifest+json'
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def svg?(url)
|
||||||
|
File.extname(URI.parse(url).path).casecmp('.svg').zero?
|
||||||
|
rescue URI::InvalidURIError
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -6,10 +6,15 @@
|
|||||||
</title>
|
</title>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=0"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=0"/>
|
||||||
<meta name="generator" content="fazer.ai"/>
|
<meta name="generator" content="fazer.ai"/>
|
||||||
|
<meta name="theme-color" content="<%= @global_config['BRAND_COLOR'] %>">
|
||||||
|
<meta name="apple-mobile-web-app-title" content="<%= @global_config['INSTALLATION_NAME'] %>">
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
|
<meta name="apple-mobile-web-app-status-bar-style" content="default">
|
||||||
|
<link rel="apple-touch-icon" href="<%= @global_config['LOGO_THUMBNAIL'] %>">
|
||||||
|
<link rel="manifest" href="/manifest.json">
|
||||||
<% if @global_config['DISPLAY_MANIFEST'] %>
|
<% if @global_config['DISPLAY_MANIFEST'] %>
|
||||||
<meta name="msapplication-TileColor" content="#1f93ff">
|
<meta name="msapplication-TileColor" content="<%= @global_config['BRAND_COLOR'] %>">
|
||||||
<meta name="msapplication-TileImage" content="/ms-icon-144x144.png">
|
<meta name="msapplication-TileImage" content="/ms-icon-144x144.png">
|
||||||
<meta name="theme-color" content="#1f93ff">
|
|
||||||
<meta name="description" content="<%= @global_config['INSTALLATION_NAME'] %> is a customer support solution that helps companies engage customers over Messenger, Twitter, Telegram, WeChat, Whatsapp. Simply connect your channels and converse with your customers from a single place. Easily add new agents to your system and have them own and resolve conversations with customers. <%= @global_config['INSTALLATION_NAME'] %> also gives you real-time reports to measure your team's performance, canned responses to easily respond to frequently asked questions and private notes for agents to collaborate among themselves.">
|
<meta name="description" content="<%= @global_config['INSTALLATION_NAME'] %> is a customer support solution that helps companies engage customers over Messenger, Twitter, Telegram, WeChat, Whatsapp. Simply connect your channels and converse with your customers from a single place. Easily add new agents to your system and have them own and resolve conversations with customers. <%= @global_config['INSTALLATION_NAME'] %> also gives you real-time reports to measure your team's performance, canned responses to easily respond to frequently asked questions and private notes for agents to collaborate among themselves.">
|
||||||
<% if ENV['IOS_APP_IDENTIFIER'].present? %>
|
<% if ENV['IOS_APP_IDENTIFIER'].present? %>
|
||||||
<meta name="apple-itunes-app" content='app-id=<%= ENV['IOS_APP_IDENTIFIER'] %>'>
|
<meta name="apple-itunes-app" content='app-id=<%= ENV['IOS_APP_IDENTIFIER'] %>'>
|
||||||
@ -27,7 +32,6 @@
|
|||||||
<link class="favicon" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
<link class="favicon" rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||||
<link class="favicon" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
|
<link class="favicon" rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
|
||||||
<link class="favicon" rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
<link class="favicon" rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||||
<link rel="manifest" href="/manifest.json">
|
|
||||||
<% end %>
|
<% end %>
|
||||||
<link rel="icon" type="image/png" sizes="512x512" href="<%= @global_config['LOGO_THUMBNAIL'] %>">
|
<link rel="icon" type="image/png" sizes="512x512" href="<%= @global_config['LOGO_THUMBNAIL'] %>">
|
||||||
<%= csrf_meta_tags %>
|
<%= csrf_meta_tags %>
|
||||||
|
|||||||
@ -42,6 +42,10 @@
|
|||||||
value: 'Chatwoot'
|
value: 'Chatwoot'
|
||||||
display_title: 'Brand Name'
|
display_title: 'Brand Name'
|
||||||
description: 'The name that would be used in emails and the widget'
|
description: 'The name that would be used in emails and the widget'
|
||||||
|
- name: BRAND_COLOR
|
||||||
|
value: '#1f93ff'
|
||||||
|
display_title: 'Brand Color'
|
||||||
|
description: 'Hex color used for PWA theme/tile color (example: #1f93ff). For reliable Android PWA install prompts, pair with a 192x192 and 512x512 PNG logo thumbnail.'
|
||||||
- name: TERMS_URL
|
- name: TERMS_URL
|
||||||
value: 'https://www.chatwoot.com/terms-of-service'
|
value: 'https://www.chatwoot.com/terms-of-service'
|
||||||
display_title: 'Terms URL'
|
display_title: 'Terms URL'
|
||||||
|
|||||||
@ -669,6 +669,7 @@ Rails.application.routes.draw do
|
|||||||
get 'notion/callback', to: 'notion/callbacks#show'
|
get 'notion/callback', to: 'notion/callbacks#show'
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
# Routes for external service verifications
|
# Routes for external service verifications
|
||||||
|
get '/manifest.json' => 'manifest#show'
|
||||||
get '.well-known/assetlinks.json' => 'android_app#assetlinks'
|
get '.well-known/assetlinks.json' => 'android_app#assetlinks'
|
||||||
get '.well-known/apple-app-site-association' => 'apple_app#site_association'
|
get '.well-known/apple-app-site-association' => 'apple_app#site_association'
|
||||||
get '.well-known/microsoft-identity-association.json' => 'microsoft#identity_association'
|
get '.well-known/microsoft-identity-association.json' => 'microsoft#identity_association'
|
||||||
|
|||||||
@ -24,6 +24,7 @@ module Enterprise::SuperAdmin::AppConfigsController
|
|||||||
LOGO
|
LOGO
|
||||||
LOGO_DARK
|
LOGO_DARK
|
||||||
BRAND_NAME
|
BRAND_NAME
|
||||||
|
BRAND_COLOR
|
||||||
INSTALLATION_NAME
|
INSTALLATION_NAME
|
||||||
BRAND_URL
|
BRAND_URL
|
||||||
WIDGET_BRAND_URL
|
WIDGET_BRAND_URL
|
||||||
|
|||||||
@ -1,44 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Chatwoot",
|
|
||||||
"short_name": "Chatwoot",
|
|
||||||
"icons": [{
|
|
||||||
"src": "\/android-icon-36x36.png",
|
|
||||||
"sizes": "36x36",
|
|
||||||
"type": "image\/png",
|
|
||||||
"density": "0.75"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "\/android-icon-48x48.png",
|
|
||||||
"sizes": "48x48",
|
|
||||||
"type": "image\/png",
|
|
||||||
"density": "1.0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "\/android-icon-72x72.png",
|
|
||||||
"sizes": "72x72",
|
|
||||||
"type": "image\/png",
|
|
||||||
"density": "1.5"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "\/android-icon-96x96.png",
|
|
||||||
"sizes": "96x96",
|
|
||||||
"type": "image\/png",
|
|
||||||
"density": "2.0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "\/android-icon-144x144.png",
|
|
||||||
"sizes": "144x144",
|
|
||||||
"type": "image\/png",
|
|
||||||
"density": "3.0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "\/android-icon-192x192.png",
|
|
||||||
"sizes": "192x192",
|
|
||||||
"type": "image\/png",
|
|
||||||
"density": "4.0"
|
|
||||||
}],
|
|
||||||
"start_url": "/",
|
|
||||||
"display": "standalone",
|
|
||||||
"background_color": "#1f93ff",
|
|
||||||
"theme_color": "#1f93fe"
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue
Block a user