feat: re-populate default reminder from saved settings

This commit is contained in:
kolaente 2022-09-13 23:23:34 +02:00
parent 28312081ae
commit 5aafbd9a72
No known key found for this signature in database
GPG key ID: F40E70337AB24C9B
4 changed files with 111 additions and 5 deletions

View file

@ -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')
})
})

View file

@ -5,6 +5,12 @@ interface DefaultReminderSettings {
amount: number, amount: number,
} }
interface SavedReminderSettings {
enabled: boolean,
amount?: number,
type?: 'minutes' | 'hours' | 'days' | 'months',
}
function calculateDefaultReminderSeconds(type: string, amount: number): number { function calculateDefaultReminderSeconds(type: string, amount: number): number {
switch (type) { switch (type) {
case 'minutes': case 'minutes':
@ -37,10 +43,47 @@ export function getDefaultReminderAmount(): number | null {
} }
export function getDefaultReminderSettings(): DefaultReminderSettings | 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) { if (s === null) {
return null return null
} }
return JSON.parse(s) 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)
}

View file

@ -219,7 +219,7 @@ import {AuthenticatedHTTPFactory} from '@/http-common'
import {useColorScheme} from '@/composables/useColorScheme' import {useColorScheme} from '@/composables/useColorScheme'
import {useTitle} from '@/composables/useTitle' import {useTitle} from '@/composables/useTitle'
import {objectIsEmpty} from '@/helpers/objectIsEmpty' import {objectIsEmpty} from '@/helpers/objectIsEmpty'
import {getDefaultReminderSettings, saveDefaultReminder} from '@/helpers/defaultReminder' import {getDefaultReminderSettings, getSavedReminderSettings, saveDefaultReminder} from '@/helpers/defaultReminder'
const {t} = useI18n({useScope: 'global'}) const {t} = useI18n({useScope: 'global'})
useTitle(() => `${t('user.settings.general.title')} - ${t('user.settings.title')}`) 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<boolean>(reminderSettings?.enabled || false) const defaultReminderEnabled = ref<boolean>(reminderSettings?.enabled || false)
// TODO: re-populate amount and type // TODO: re-populate amount and type
const defaultReminderAmount = ref(1) const defaultReminderAmount = ref(reminderSettings?.amount || 1)
const defaultReminderAmountType = ref('days') const defaultReminderAmountType = ref(reminderSettings?.type || 'days')
</script> </script>

View file

@ -32,6 +32,7 @@ export default defineConfig({
// https://vitest.dev/config/ // https://vitest.dev/config/
test: { test: {
environment: 'happy-dom', environment: 'happy-dom',
mockReset: true,
}, },
css: { css: {
preprocessorOptions: { preprocessorOptions: {