Skip to content

Commit fe65b28

Browse files
committed
feat(dark-mode): implement dark mode and save settings via local prefs
1 parent 6faf98d commit fe65b28

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

src/components/layout/HeaderComponent.vue

+17-2
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@
8383

8484
<!-- Login Section -->
8585
<ul class="signed-out" v-if="!loggedIn">
86+
<li>
87+
<a href="https://forms.clickup.com/57751/f/1rcq-791/HNWSBPWCDSRMDMS9TF" target="_blank">REPORT A BUG</a>
88+
</li>
89+
<li><a href="" @click.prevent="toggleDarkMode()"><i class="fa-solid fa-moon"></i></a></li>
8690
</ul>
8791

8892
<!-- User Dropdown Mobile -->
@@ -262,7 +266,7 @@ import AdminNavigation from '@/components/layout/AdminNavigation.vue'
262266
import AdminSubNavigation from '@/components/layout/AdminSubNavigation.vue'
263267
import decode from '@/composables/filters/decode'
264268
import { AuthStore } from '@/composables/stores/auth'
265-
import { PreferencesStore } from '@/composables/stores/prefs'
269+
import { PreferencesStore, localStoragePrefs} from '@/composables/stores/prefs'
266270
import { reactive, toRefs, watch, onMounted, onUnmounted, onBeforeMount, inject } from 'vue'
267271
import { debounce } from 'lodash'
268272
import { useRouter, useRoute } from 'vue-router'
@@ -279,6 +283,10 @@ export default {
279283
let fetchMotd = () => motdApi.get().then(d => v.motdData = d).catch(() => {})
280284
fetchMotd()
281285
addAnnouncementListener(fetchMotd)
286+
287+
// set dark mode if in user prefs
288+
if (localStoragePrefs().data.dark_mode)
289+
document.documentElement.classList.add('dark')
282290
})
283291
/* Internal Methods */
284292
const scrollHeader = () => {
@@ -317,6 +325,12 @@ export default {
317325
if (v.searchExpanded) { v.search.focus() }
318326
}
319327
328+
const toggleDarkMode = () => {
329+
v.darkMode = !v.darkMode
330+
document.documentElement.classList.toggle('dark')
331+
$prefs.update()
332+
}
333+
320334
const unseenMentionsText = () => {
321335
let unseenInList = 0;
322336
v.mentionsList.forEach(mention => { if (!mention.viewed) { unseenInList++ } })
@@ -334,6 +348,7 @@ export default {
334348
335349
/* Template Data */
336350
const v = reactive({
351+
darkMode: $prefs.data.dark_mode,
337352
showMobileMenu: false,
338353
focusSearch: false,
339354
searchExpanded: false,
@@ -386,7 +401,7 @@ export default {
386401
window.removeEventListener('scroll', debounce(scrollHeader, 10))
387402
})
388403
389-
return { ...toRefs(v), BanStore, logout, isPatroller, searchForum, dismissNotifications, deleteMention, unseenMentionsText, toggleFocusSearch, decode, humanDate }
404+
return { ...toRefs(v), BanStore, logout, isPatroller, searchForum, dismissNotifications, deleteMention, unseenMentionsText, toggleFocusSearch, toggleDarkMode, decode, humanDate }
390405
}
391406
}
392407
</script>

src/composables/stores/prefs.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ const emtpyPrefs = {
1717
},
1818
patroller_view: false,
1919
collapsed_categories: [],
20-
ignored_boards: []
20+
ignored_boards: [],
21+
dark_mode: false
2122
}
2223

2324
export const PreferencesStore = Symbol(PREFS_KEY)
@@ -68,6 +69,7 @@ export default {
6869
patroller_view: prefs.patroller_view,
6970
collapsed_categories: [...prefs.collapsed_categories],
7071
ignored_boards: [...prefs.ignored_boards],
72+
dark_mode: prefs.dark_mode,
7173
...specificPrefs
7274
}
7375
if (user && user.token) { // user is logged in update cache and server

0 commit comments

Comments
 (0)