From 5aafbd9a72cd73079dffdad0e41ccb78f42b1923 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 13 Sep 2022 23:23:34 +0200 Subject: [PATCH] feat: re-populate default reminder from saved settings --- src/helpers/defaultReminder.test.ts | 62 +++++++++++++++++++++++++++++ src/helpers/defaultReminder.ts | 45 ++++++++++++++++++++- src/views/user/settings/General.vue | 8 ++-- vite.config.ts | 1 + 4 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 src/helpers/defaultReminder.test.ts diff --git a/src/helpers/defaultReminder.test.ts b/src/helpers/defaultReminder.test.ts new file mode 100644 index 000000000..6fbc117b3 --- /dev/null +++ b/src/helpers/defaultReminder.test.ts @@ -0,0 +1,62 @@ +import {describe, it, expect, vi, afterEach, beforeEach} from 'vitest' +import { + getDefaultReminderSettings, + getSavedReminderSettings, + parseSavedReminderAmount, + saveDefaultReminder, +} from '@/helpers/defaultReminder' +import * as exports from '@/helpers/defaultReminder' + +describe('Default Reminder Save', () => { + it('Should save a default reminder with minutes', () => { + const spy = vi.spyOn(window.localStorage, 'setItem') + saveDefaultReminder(true, 'minutes', 5) + + expect(spy).toHaveBeenCalledWith('defaultReminder', '{"enabled":true,"amount":300}') + }) + it('Should save a default reminder with hours', () => { + const spy = vi.spyOn(window.localStorage, 'setItem') + saveDefaultReminder(true, 'hours', 5) + + expect(spy).toHaveBeenCalledWith('defaultReminder', '{"enabled":true,"amount":18000}') + }) + it('Should save a default reminder with days', () => { + const spy = vi.spyOn(window.localStorage, 'setItem') + saveDefaultReminder(true, 'days', 5) + + expect(spy).toHaveBeenCalledWith('defaultReminder', '{"enabled":true,"amount":432000}') + }) + it('Should save a default reminder with months', () => { + const spy = vi.spyOn(window.localStorage, 'setItem') + saveDefaultReminder(true, 'months', 5) + + expect(spy).toHaveBeenCalledWith('defaultReminder', '{"enabled":true,"amount":12960000}') + }) +}) + +describe('Default Reminder Load', () => { + it('Should parse minutes', () => { + const settings = parseSavedReminderAmount(5 * 60) + + expect(settings.amount).toBe(5) + expect(settings.type).toBe('minutes') + }) + it('Should parse hours', () => { + const settings = parseSavedReminderAmount(5 * 60 * 60) + + expect(settings.amount).toBe(5) + expect(settings.type).toBe('hours') + }) + it('Should parse days', () => { + const settings = parseSavedReminderAmount(5 * 60 * 60 * 24) + + expect(settings.amount).toBe(5) + expect(settings.type).toBe('days') + }) + it('Should parse months', () => { + const settings = parseSavedReminderAmount(5 * 60 * 60 * 24 * 30) + + expect(settings.amount).toBe(5) + expect(settings.type).toBe('months') + }) +}) diff --git a/src/helpers/defaultReminder.ts b/src/helpers/defaultReminder.ts index b24399b00..fb567d7bb 100644 --- a/src/helpers/defaultReminder.ts +++ b/src/helpers/defaultReminder.ts @@ -5,6 +5,12 @@ interface DefaultReminderSettings { amount: number, } +interface SavedReminderSettings { + enabled: boolean, + amount?: number, + type?: 'minutes' | 'hours' | 'days' | 'months', +} + function calculateDefaultReminderSeconds(type: string, amount: number): number { switch (type) { case 'minutes': @@ -37,10 +43,47 @@ export function getDefaultReminderAmount(): number | null { } export function getDefaultReminderSettings(): DefaultReminderSettings | null { - const s: string | null = localStorage.getItem(DEFAULT_REMINDER_KEY) + const s: string | null = window.localStorage.getItem(DEFAULT_REMINDER_KEY) if (s === null) { return null } return JSON.parse(s) } + +export function parseSavedReminderAmount(amountSeconds: number): SavedReminderSettings { + const amountMinutes = amountSeconds / 60 + const settings: SavedReminderSettings = { + enabled: true, // We're assuming the caller to have checked this properly + amount: amountMinutes, + type: 'minutes', + } + + if ((amountMinutes / 60 / 24) % 30 === 0) { + settings.amount = amountMinutes / 60 / 24 / 30 + settings.type = 'months' + } else if ((amountMinutes / 60) % 24 === 0) { + settings.amount = amountMinutes / 60 / 24 + settings.type = 'days' + } else if (amountMinutes % 60 === 0) { + settings.amount = amountMinutes / 60 + settings.type = 'hours' + } + + return settings +} + +export function getSavedReminderSettings(): SavedReminderSettings | null { + const s = getDefaultReminderSettings() + if (s === null) { + return null + } + + if (!s.enabled) { + return { + enabled: false, + } + } + + return parseSavedReminderAmount(s.amount) +} diff --git a/src/views/user/settings/General.vue b/src/views/user/settings/General.vue index 4a16c06f9..28b84b8cd 100644 --- a/src/views/user/settings/General.vue +++ b/src/views/user/settings/General.vue @@ -219,7 +219,7 @@ import {AuthenticatedHTTPFactory} from '@/http-common' import {useColorScheme} from '@/composables/useColorScheme' import {useTitle} from '@/composables/useTitle' import {objectIsEmpty} from '@/helpers/objectIsEmpty' -import {getDefaultReminderSettings, saveDefaultReminder} from '@/helpers/defaultReminder' +import {getDefaultReminderSettings, getSavedReminderSettings, saveDefaultReminder} from '@/helpers/defaultReminder' const {t} = useI18n({useScope: 'global'}) useTitle(() => `${t('user.settings.general.title')} - ${t('user.settings.title')}`) @@ -318,10 +318,10 @@ async function updateSettings() { }) } -const reminderSettings = getDefaultReminderSettings() +const reminderSettings = getSavedReminderSettings() const defaultReminderEnabled = ref(reminderSettings?.enabled || false) // TODO: re-populate amount and type -const defaultReminderAmount = ref(1) -const defaultReminderAmountType = ref('days') +const defaultReminderAmount = ref(reminderSettings?.amount || 1) +const defaultReminderAmountType = ref(reminderSettings?.type || 'days') diff --git a/vite.config.ts b/vite.config.ts index 2ddc30dda..39daacd26 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -32,6 +32,7 @@ export default defineConfig({ // https://vitest.dev/config/ test: { environment: 'happy-dom', + mockReset: true, }, css: { preprocessorOptions: {