]> cat aescling's git repositories - mastodon.git/commitdiff
Themed prefetching
authorkibigo! <marrus-sh@users.noreply.github.com>
Fri, 17 Nov 2017 05:35:25 +0000 (21:35 -0800)
committerkibigo! <marrus-sh@users.noreply.github.com>
Fri, 17 Nov 2017 05:37:08 +0000 (21:37 -0800)
app/controllers/application_controller.rb
app/controllers/home_controller.rb
app/javascript/themes/default/theme.yml
app/lib/themes.rb
app/views/home/index.html.haml
config/webpack/configuration.js

index a213302cb3c5d7d7ba67bd2c2877716b6cb79b55..f5dbe837e4fcb14bfdad6607fec074e18d2cd311 100644 (file)
@@ -13,6 +13,7 @@ class ApplicationController < ActionController::Base
   helper_method :current_account
   helper_method :current_session
   helper_method :current_theme
+  helper_method :theme_data
   helper_method :single_user_mode?
 
   rescue_from ActionController::RoutingError, with: :not_found
@@ -88,6 +89,10 @@ class ApplicationController < ActionController::Base
     current_user.setting_theme
   end
 
+  def theme_data
+    Themes.instance.get(current_theme)
+  end
+
   def cache_collection(raw, klass)
     return raw unless klass.respond_to?(:with_includes)
 
index ad7f09f348604f7ddb54e9b5dc42fd509a54e0cd..21dde20ce40379f37b75746c25e17f8c47e9d73c 100644 (file)
@@ -6,7 +6,6 @@ class HomeController < ApplicationController
 
   def index
     @body_classes = 'app-body'
-    @frontend     = (params[:frontend] and Rails.configuration.x.available_frontends.include? params[:frontend] + '.js') ? params[:frontend] : 'mastodon'
   end
 
   private
index 6a7a872b41eeea00537c1ec4fa3340b11b61eb88..0b262cc820d1df6ee3e4ea8ae38dffdd20cbb7ab 100644 (file)
@@ -1,9 +1,18 @@
-#  (REQUIRED) Name must be unique across all installed themes.
-name: default
-
 #  (REQUIRED) The location of the pack file inside `pack_directory`.
 pack: application.js
 
 #  (OPTIONAL) The directory which contains the pack file.
-#  Defaults to the theme directory (`app/javascript/themes/[theme]`).
+#  Defaults to the theme directory (`app/javascript/themes/[theme]`),
+#  but in the case of the vanilla Mastodon theme the pack file is
+#  somewhere else.
 pack_directory: app/javascript/packs
+
+#  (OPTIONAL) Additional javascript resources to preload, for use with
+#  lazy-loaded components. It is **STRONGLY RECOMMENDED** that you
+#  derive these pathnames from `themes/[your-theme]` to ensure that
+#  they stay unique. (Of course, vanilla doesn't do this ^^;;)
+preload:
+- features/getting_started
+- features/compose
+- features/home_timeline
+- features/notifications
index 2dd188297ea9f889e6761ad74fed818c6f689d25..f7ec22fd2b8e6b632ce517f7731887e6d61e1863 100644 (file)
@@ -10,13 +10,18 @@ class Themes
     result = Hash.new
     Dir.glob(Rails.root.join('app', 'javascript', 'themes', '*', 'theme.yml')) do |path|
       data = YAML.load_file(path)
-      if data['pack'] && data['name']
-        result[data['name']] = data
+      name = File.basename(File.dirname(path))
+      if data['pack']
+        result[name] = data
       end
     end
     @conf = result
   end
 
+  def get(name)
+    @conf[name]
+  end
+
   def names
     @conf.keys
   end
index 878ffb03251fe87c8cb886111417980ca04a747a..63b3a0c26b390815f4f2784273c1908bd43dfcab 100644 (file)
@@ -1,8 +1,7 @@
 - content_for :header_tags do
-  %link{ href: asset_pack_path('features/getting_started.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/
-  %link{ href: asset_pack_path('features/compose.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/
-  %link{ href: asset_pack_path('features/home_timeline.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/
-  %link{ href: asset_pack_path('features/notifications.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/
+  - if theme_data['preload']
+    - theme_data['preload'].each do |link|
+      %link{ href: asset_pack_path("#{link}.js"), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/
   %meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key}
   %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json)
 
index 606eb97f1acff8eb525965a99a72f5bef864d459..74f75d89b3856ad2feb24cc0360c6cbf707d0a28 100644 (file)
@@ -1,6 +1,6 @@
 // Common configuration for webpacker loaded from config/webpacker.yml
 
-const { dirname, join, resolve } = require('path');
+const { basename, dirname, join, resolve } = require('path');
 const { env } = require('process');
 const { safeLoad } = require('js-yaml');
 const { readFileSync } = require('fs');
@@ -18,8 +18,8 @@ for (let i = 0; i < themeFiles.length; i++) {
   if (!data.pack_directory) {
     data.pack_directory = dirname(themeFile);
   }
-  if (data.name && data.pack) {
-    themes[data.name] = data;
+  if (data.pack) {
+    themes[basename(dirname(themeFile))] = data;
   }
 }