aboutsummaryrefslogtreecommitdiff
path: root/src/services
diff options
context:
space:
mode:
authorHJ <30-hj@users.noreply.git.pleroma.social>2024-05-22 12:15:21 +0000
committerHJ <30-hj@users.noreply.git.pleroma.social>2024-05-22 12:15:21 +0000
commit3128ea57e1f0281d4d8f94d868de10b5b97663af (patch)
tree69c3c02109dbd502b9daf5d11b0103d550d767f7 /src/services
parent3056017f8e35c98a7fb42162c7e3460a4ebab619 (diff)
parent6ea69eb51a480e3ab81a69b99f92165fc97f8177 (diff)
Merge branch 'themes3-cache' into 'develop'
implement a simple caching system for themes 3 See merge request pleroma/pleroma-fe!1911
Diffstat (limited to 'src/services')
-rw-r--r--src/services/style_setter/style_setter.js37
-rw-r--r--src/services/theme_data/theme_data_3.service.js8
2 files changed, 42 insertions, 3 deletions
diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js
index 95198ec7..369d2c9f 100644
--- a/src/services/style_setter/style_setter.js
+++ b/src/services/style_setter/style_setter.js
@@ -1,6 +1,6 @@
import { hex2rgb } from '../color_convert/color_convert.js'
import { generatePreset } from '../theme_data/theme_data.service.js'
-import { init } from '../theme_data/theme_data_3.service.js'
+import { init, getEngineChecksum } from '../theme_data/theme_data_3.service.js'
import { convertTheme2To3 } from '../theme_data/theme2_to_theme3.js'
import { getCssRules } from '../theme_data/css_utils.js'
import { defaultState } from '../../modules/config.js'
@@ -87,9 +87,37 @@ export const generateTheme = async (input, callbacks) => {
return { lazyProcessFunc: processChunk }
}
-export const applyTheme = async (input) => {
+export const tryLoadCache = () => {
+ const json = localStorage.getItem('pleroma-fe-theme-cache')
+ if (!json) return null
+ let cache
+ try {
+ cache = JSON.parse(json)
+ } catch (e) {
+ console.error('Failed to decode theme cache:', e)
+ return false
+ }
+ if (cache.engineChecksum === getEngineChecksum()) {
+ const styleSheet = new CSSStyleSheet()
+ const lazyStyleSheet = new CSSStyleSheet()
+
+ cache.data[0].forEach(rule => styleSheet.insertRule(rule, 'index-max'))
+ cache.data[1].forEach(rule => lazyStyleSheet.insertRule(rule, 'index-max'))
+
+ document.adoptedStyleSheets = [styleSheet, lazyStyleSheet]
+
+ return true
+ } else {
+ console.warn('Engine checksum doesn\'t match, cache not usable, clearing')
+ localStorage.removeItem('pleroma-fe-theme-cache')
+ }
+}
+
+export const applyTheme = async (input, onFinish = (data) => {}) => {
const styleSheet = new CSSStyleSheet()
+ const styleArray = []
const lazyStyleSheet = new CSSStyleSheet()
+ const lazyStyleArray = []
const { lazyProcessFunc } = await generateTheme(
input,
@@ -97,8 +125,10 @@ export const applyTheme = async (input) => {
onNewRule (rule, isLazy) {
if (isLazy) {
lazyStyleSheet.insertRule(rule, 'index-max')
+ lazyStyleArray.push(rule)
} else {
styleSheet.insertRule(rule, 'index-max')
+ styleArray.push(rule)
}
},
onEagerFinished () {
@@ -106,6 +136,9 @@ export const applyTheme = async (input) => {
},
onLazyFinished () {
document.adoptedStyleSheets = [styleSheet, lazyStyleSheet]
+ const cache = { engineChecksum: getEngineChecksum(), data: [styleArray, lazyStyleArray] }
+ onFinish(cache)
+ localStorage.setItem('pleroma-fe-theme-cache', JSON.stringify(cache))
}
}
)
diff --git a/src/services/theme_data/theme_data_3.service.js b/src/services/theme_data/theme_data_3.service.js
index 7457ab99..15b4493e 100644
--- a/src/services/theme_data/theme_data_3.service.js
+++ b/src/services/theme_data/theme_data_3.service.js
@@ -1,4 +1,5 @@
import { convert, brightness } from 'chromatism'
+import sum from 'hash-sum'
import { flattenDeep } from 'lodash'
import {
alphaBlend,
@@ -142,8 +143,12 @@ componentsContext.keys().forEach(key => {
components[component.name] = component
})
+const engineChecksum = sum(components)
+
const ruleToSelector = genericRuleToSelector(components)
+export const getEngineChecksum = () => engineChecksum
+
export const init = (extraRuleset, ultimateBackgroundColor) => {
const staticVars = {}
const stacked = {}
@@ -463,6 +468,7 @@ export const init = (extraRuleset, ultimateBackgroundColor) => {
return {
lazy: result.filter(x => typeof x === 'function'),
eager: result.filter(x => typeof x !== 'function'),
- staticVars
+ staticVars,
+ engineChecksum
}
}