Skip to content

Commit 7979d1b

Browse files
committed
fix: adapt keyboad shortcuts and chartFilter
1 parent 962fcbb commit 7979d1b

File tree

9 files changed

+717
-672
lines changed

9 files changed

+717
-672
lines changed

app/components/Package/TrendsChart.vue

Lines changed: 620 additions & 618 deletions
Large diffs are not rendered by default.

app/components/Package/WeeklyDownloadStats.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,14 +185,14 @@ watch(
185185
const correctedDownloads = computed<WeeklyDataPoint[]>(() => {
186186
let data = weeklyDownloads.value as WeeklyDataPoint[]
187187
if (!data.length) return data
188-
if (settings.value.chartFilter.anomaliesFixed) {
188+
if (localSettings.value.chartFilter.anomaliesFixed) {
189189
data = applyBlocklistCorrection({
190190
data,
191191
packageName: props.packageName,
192192
granularity: 'weekly',
193193
}) as WeeklyDataPoint[]
194194
}
195-
data = applyDataCorrection(data, settings.value.chartFilter) as WeeklyDataPoint[]
195+
data = applyDataCorrection(data, localSettings.value.chartFilter) as WeeklyDataPoint[]
196196
return data
197197
})
198198

app/composables/useUserLocalSettings.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ export interface UserLocalSettings {
66
connector: {
77
autoOpenURL: boolean
88
}
9+
chartFilter: {
10+
averageWindow: number
11+
smoothingTau: number
12+
anomaliesFixed: boolean
13+
predictionPoints: number
14+
}
915
}
1016

1117
const STORAGE_KEY = 'npmx-settings'
@@ -17,6 +23,12 @@ const DEFAULT_USER_LOCAL_SETTINGS: UserLocalSettings = {
1723
connector: {
1824
autoOpenURL: false,
1925
},
26+
chartFilter: {
27+
averageWindow: 0,
28+
smoothingTau: 1,
29+
anomaliesFixed: true,
30+
predictionPoints: 4,
31+
},
2032
}
2133

2234
let localSettingsRef: Ref<UserLocalSettings> | null = null
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
export const useKeyboardShortcuts = createSharedComposable(function useKeyboardShortcuts() {
2+
const { preferences } = useUserPreferencesState()
3+
const enabled = computed(() => preferences.value.keyboardShortcuts ?? true)
4+
5+
if (import.meta.client) {
6+
watch(
7+
enabled,
8+
value => {
9+
if (value) {
10+
delete document.documentElement.dataset.kbdShortcuts
11+
} else {
12+
document.documentElement.dataset.kbdShortcuts = 'false'
13+
}
14+
},
15+
{ immediate: true },
16+
)
17+
}
18+
19+
return enabled
20+
})

app/pages/settings.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const router = useRouter();
33
const { preferences } = useUserPreferencesState();
44
const { isAuthenticated, isSyncing, isSynced, hasError } = useUserPreferencesSyncStatus();
55
const { colorModePreference, setColorMode } = useColorModePreference();
6-
const { locales, setLocale: setNuxti18nLocale } = useI18n();
6+
const { locale: currentLocale, locales, setLocale: setNuxti18nLocale } = useI18n();
77
const { currentLocaleStatus, isSourceLocale } = useI18nStatus();
88
const keyboardShortcutsEnabled = useKeyboardShortcuts();
99
@@ -343,7 +343,7 @@ const setLocale: typeof setNuxti18nLocale = (newLocale) => {
343343
<SettingsToggle
344344
:label="$t('settings.keyboard_shortcuts_enabled')"
345345
:description="$t('settings.keyboard_shortcuts_enabled_description')"
346-
v-model="preferences.keyboardShortcuts"
346+
v-model="keyboardShortcutsEnabled"
347347
/>
348348
</div>
349349
</section>

shared/schemas/userPreferences.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ export const UserPreferencesSchema = object({
2626
colorModePreference: optional(nullable(ColorModePreferenceSchema)),
2727
/** Search provider for package search: 'npm' or 'algolia' */
2828
searchProvider: optional(SearchProviderSchema),
29+
/** Whether keyboard shortcuts are enabled globally */
30+
keyboardShortcuts: optional(boolean()),
2931
/** Timestamp of last update (ISO 8601) - managed by server */
3032
updatedAt: optional(string()),
3133
})
@@ -49,7 +51,8 @@ export const DEFAULT_USER_PREFERENCES: Required<Omit<UserPreferences, 'updatedAt
4951
hidePlatformPackages: true,
5052
selectedLocale: null,
5153
colorModePreference: null,
52-
searchProvider: 'algolia',
54+
searchProvider: import.meta.test ? 'npm' : 'algolia',
55+
keyboardShortcuts: true,
5356
}
5457

5558
export const USER_PREFERENCES_STORAGE_BASE = 'npmx-kv-user-preferences'

test/e2e/interactions.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ test.describe('Keyboard Shortcuts', () => {
313313
test.describe('Keyboard Shortcuts disabled', () => {
314314
test.beforeEach(async ({ page }) => {
315315
await page.addInitScript(() => {
316-
localStorage.setItem('npmx-settings', JSON.stringify({ keyboardShortcuts: false }))
316+
localStorage.setItem('npmx-user-preferences', JSON.stringify({ keyboardShortcuts: false }))
317317
})
318318
})
319319

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
2+
import { nextTick } from 'vue'
3+
import { DEFAULT_USER_PREFERENCES } from '#shared/schemas/userPreferences'
4+
5+
describe('useKeyboardShortcuts', () => {
6+
beforeEach(() => {
7+
localStorage.clear()
8+
// Reset preferences to defaults
9+
const { preferences } = useUserPreferencesState()
10+
preferences.value = { ...DEFAULT_USER_PREFERENCES }
11+
})
12+
13+
afterEach(() => {
14+
delete document.documentElement.dataset.kbdShortcuts
15+
})
16+
17+
it('should return true by default', () => {
18+
const enabled = useKeyboardShortcuts()
19+
expect(enabled.value).toBe(true)
20+
})
21+
22+
it('should return false when preference is disabled', () => {
23+
const { preferences } = useUserPreferencesState()
24+
preferences.value = { ...preferences.value, keyboardShortcuts: false }
25+
26+
const enabled = useKeyboardShortcuts()
27+
expect(enabled.value).toBe(false)
28+
})
29+
30+
it('should reactively update when preferences change', () => {
31+
const enabled = useKeyboardShortcuts()
32+
const { preferences } = useUserPreferencesState()
33+
34+
expect(enabled.value).toBe(true)
35+
36+
preferences.value = { ...preferences.value, keyboardShortcuts: false }
37+
expect(enabled.value).toBe(false)
38+
39+
preferences.value = { ...preferences.value, keyboardShortcuts: true }
40+
expect(enabled.value).toBe(true)
41+
})
42+
43+
it('should set data-kbd-shortcuts attribute when disabled', async () => {
44+
const { preferences } = useUserPreferencesState()
45+
46+
useKeyboardShortcuts()
47+
48+
preferences.value = { ...preferences.value, keyboardShortcuts: false }
49+
await nextTick()
50+
expect(document.documentElement.dataset.kbdShortcuts).toBe('false')
51+
52+
preferences.value = { ...preferences.value, keyboardShortcuts: true }
53+
await nextTick()
54+
expect(document.documentElement.dataset.kbdShortcuts).toBeUndefined()
55+
})
56+
})

test/nuxt/composables/use-settings.spec.ts

Lines changed: 0 additions & 48 deletions
This file was deleted.

0 commit comments

Comments
 (0)