From cf8d965e643706f34143fb546afebf88d16a4629 Mon Sep 17 00:00:00 2001 From: Marco Crapts Date: Wed, 24 May 2023 23:30:28 +0200 Subject: [PATCH] store settings in localstorage --- src/App.vue | 6 +++++- src/components/TopBar/Settings.vue | 5 ++++- src/composables/useNotes.ts | 18 ++++++++++++++++-- src/composables/useSettings.ts | 24 ++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 src/composables/useSettings.ts diff --git a/src/App.vue b/src/App.vue index b50c893..462a334 100644 --- a/src/App.vue +++ b/src/App.vue @@ -7,11 +7,14 @@ import { setClientKey, passphraseRequired } from '@/composables/useEncryption' +import { initializeSettings} from '@/composables/useSettings' import { windowIsMobile } from '@/utils/helpers' import SideBar from '@/components/SideBar.vue' import firebase from 'firebase/compat/app' import * as firebaseui from 'firebaseui' +initializeSettings() + const sideBarCollapsed = ref(windowIsMobile()) // const Note = defineAsyncComponent(() => import('@/components/ViewModes/Note.vue')) @@ -90,9 +93,10 @@ provide('loading', loading) + diff --git a/src/components/TopBar/Settings.vue b/src/components/TopBar/Settings.vue index 94e5aaf..80ca3d6 100644 --- a/src/components/TopBar/Settings.vue +++ b/src/components/TopBar/Settings.vue @@ -2,6 +2,8 @@ import { activeNotesSource, notesSources } from '@/composables/useNotes' import { signOut as firebaseSignOut } from '@/composables/useFirebase' import { OnClickOutside } from '@vueuse/components' +import { preferredNotesSource } from '@/composables/useSettings' + const sourceLabels: { [source: string]: string } = { local: 'Switch to local notes', firebase: 'Switch to cloud notes' @@ -17,6 +19,7 @@ const availableNoteSources = computed(() => const signOut = async (close: () => Promise) => { await firebaseSignOut() + preferredNotesSource.value = null close() } @@ -41,7 +44,7 @@ const handleClick = (fn: (...args: any[]) => any) => { class="text-base" v-for="{ source, label } in availableNoteSources" :key="source" - @click="handleClick(() => (activeNotesSource = source))" + @click="handleClick(() => (preferredNotesSource = source))" > diff --git a/src/composables/useNotes.ts b/src/composables/useNotes.ts index 04b8e20..18b242e 100644 --- a/src/composables/useNotes.ts +++ b/src/composables/useNotes.ts @@ -7,20 +7,34 @@ import { decryptNotes, encryptionKey } from '@/composables/useEncryption' import { defaultNotes } from '@/utils/defaultNotes' import { mdToHtml } from '@/utils/markdown' import { getAllMatches } from '@/utils/helpers' +import { preferredNotesSource } from '@/composables/useSettings' export const notesSources = computed(() => ({ local: true, firebase: initialized.value && user.value })) -type notesSourceValues = keyof typeof notesSources.value | null +export const availableNotesSources = computed(() => + Object.entries(notesSources.value) + .filter(([, enabled]) => enabled) + .map(([source]) => source) +) + +export type notesSourceValues = keyof typeof notesSources.value | null export const activeNotesSource = ref(null) watchEffect(() => { const getSource = (): notesSourceValues => { if (!initialized.value) return null - return user.value ? 'firebase' : 'local' + if ( + preferredNotesSource.value && + availableNotesSources.value.includes(preferredNotesSource.value) + ) { + return preferredNotesSource.value + } else { + return user.value ? 'firebase' : 'local' + } } activeNotesSource.value = getSource() }) diff --git a/src/composables/useSettings.ts b/src/composables/useSettings.ts new file mode 100644 index 0000000..3a6f42b --- /dev/null +++ b/src/composables/useSettings.ts @@ -0,0 +1,24 @@ +import type { notesSourceValues } from '@/composables/useNotes' + +interface Settings { + preferredNotesSource: notesSourceValues +} + +export const preferredNotesSource = ref(null) + +const updateSettings = () => { + const settings: Settings = { + preferredNotesSource: preferredNotesSource.value + } + localStorage.setItem('settings', JSON.stringify(settings)) +} + +export const initializeSettings = () => { + watch([preferredNotesSource], () => updateSettings()) + try { + const settings: Settings = JSON.parse(localStorage.getItem('settings') || '{}') + preferredNotesSource.value = settings.preferredNotesSource + } catch (error) { + console.error(error) + } +}