From a0470519d74cebb70b5699e9f5c9dd4982fcabe3 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 11 Sep 2020 19:07:54 +0300 Subject: Add support for dark theme. Fixes #17 --- web/src/index.js | 53 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 9 deletions(-) (limited to 'web/src/index.js') diff --git a/web/src/index.js b/web/src/index.js index cd165dd..625ed00 100644 --- a/web/src/index.js +++ b/web/src/index.js @@ -20,14 +20,23 @@ const makeThumbnailURL = mxc => `${HOMESERVER_URL}/_matrix/media/r0/thumbnail/${ // This is also used to fix scrolling to sections on Element iOS const isMobileSafari = navigator.userAgent.match(/(iPod|iPhone|iPad)/) && navigator.userAgent.match(/AppleWebKit/) +export const parseQuery = str => Object.fromEntries( + str.split("&") + .map(part => part.split("=")) + .map(([key, value = ""]) => [key, value])) + +const supportedThemes = ["light", "dark", "black"] + class App extends Component { constructor(props) { super(props) + this.defaultTheme = parseQuery(location.search.substr(1)).theme this.state = { packs: [], loading: true, error: null, stickersPerRow: parseInt(localStorage.mauStickersPerRow || "4"), + theme: localStorage.mauStickerThemeOverride || this.defaultTheme, frequentlyUsed: { id: "frequently-used", title: "Frequently used", @@ -35,6 +44,12 @@ class App extends Component { stickers: [], }, } + if (!supportedThemes.includes(this.state.theme)) { + this.state.theme = "light" + } + if (!supportedThemes.includes(this.defaultTheme)) { + this.defaultTheme = "light" + } this.stickersByID = new Map(JSON.parse(localStorage.mauFrequentlyUsedStickerCache || "[]")) this.state.frequentlyUsed.stickers = this._getStickersByID(this.state.frequentlyUsed.stickerIDs) this.imageObserver = null @@ -73,6 +88,16 @@ class App extends Component { this.packListRef.scrollTop = this.packListRef.scrollHeight } + setTheme(theme) { + if (theme === "default") { + delete localStorage.mauStickerThemeOverride + this.setState({ theme: this.defaultTheme }) + } else { + localStorage.mauStickerThemeOverride = theme + this.setState({ theme: theme }) + } + } + reloadPacks() { this.imageObserver.disconnect() this.sectionObserver.disconnect() @@ -189,21 +214,22 @@ class App extends Component { } render() { + const theme = `theme-${this.state.theme}` if (this.state.loading) { - return html`
<${Spinner} size=${80} green />
` + return html`
<${Spinner} size=${80} green />
` } else if (this.state.error) { - return html`
+ return html`

Failed to load packs

${this.state.error}

` } else if (this.state.packs.length === 0) { - return html`

No packs found 😿

` + return html`

No packs found 😿

` } - return html`
+ return html`
this.packListRef = elem}> <${Pack} pack=${this.state.frequentlyUsed} send=${this.sendSticker} /> @@ -225,6 +251,15 @@ const Settings = ({ app }) => html` value=${app.state.stickersPerRow} onInput=${evt => app.setStickersPerRow(evt.target.value)} />
+
+ + +
` @@ -237,12 +272,12 @@ const scrollToSection = (evt, id) => { evt.preventDefault() } -const NavBarItem = ({ pack, iconOverride = null, altOverride = null }) => html` +const NavBarItem = ({ pack, iconOverride = null }) => html` scrollToSection(evt, pack.id)) : undefined}> -
+
${iconOverride ? html` - ${altOverride} + ` : html` ${pack.stickers[0].body} -- cgit v1.2.3