Skip to content

Commit

Permalink
✨ remember dark mode
Browse files Browse the repository at this point in the history
  • Loading branch information
haliphax committed Jul 12, 2022
1 parent 725681f commit 63ef881
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 5 deletions.
15 changes: 13 additions & 2 deletions src/front-end/components/darkmode.vue
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
<script lang="ts">
import { Component } from 'vue';
import { sessionState } from '../types';
const DarkMode: Component = {
computed: {
session(): sessionState { return this.$store.state.session; },
},
methods: {
toggle() { document.body.classList.toggle('dark-mode'); },
toggle() {
const val = document.body.classList.toggle('dark-mode');
this.$store.commit('session.darkMode', val);
},
},
mounted() {
if (matchMedia('prefers-color-scheme: dark').matches)
if (matchMedia('prefers-color-scheme: dark').matches
|| (this.session as sessionState).darkMode)
{
this.toggle();
}
},
};
Expand Down
20 changes: 18 additions & 2 deletions src/front-end/store/modules/session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ const makeKey = (key: string): string =>

/** Session property metadata */
const properties: Record<string, sessionProperty> = {
darkMode: {
default() { return false; },
key: makeKey('darkMode'),
},
id: {
default() { return uuid(); },
key: makeKey('id'),
Expand All @@ -21,6 +25,10 @@ const properties: Record<string, sessionProperty> = {

export const sessionModule: Module<sessionState, any> = {
mutations: {
'session.darkMode'(state, payload: boolean) {
state.darkMode = payload;
localStorage.setItem(properties.darkMode.key, JSON.stringify(payload));
},
'session.name'(state, payload: string) {
state.name = payload;
localStorage.setItem(properties.name.key, payload);
Expand All @@ -32,8 +40,16 @@ export const sessionModule: Module<sessionState, any> = {
var entry = properties[v];
const value = localStorage.getItem(entry.key) || entry.default();

p[v] = value;
localStorage.setItem(entry.key, value)
switch (typeof entry.default()) {
case 'boolean':
p[v] = JSON.parse(value);
break;
default:
p[v] = value;
break;
}

localStorage.setItem(entry.key, value);

return p;
},
Expand Down
3 changes: 2 additions & 1 deletion src/front-end/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,12 @@ export type participantsState = {
};

export type sessionProperty = {
default(): string,
default(): any,
key: string,
};

export type sessionState = {
darkMode: boolean,
id: string,
name: string,
};
Expand Down

0 comments on commit 63ef881

Please sign in to comment.