From ebeee2d90a3883404b5c1d0c4d0858aed5150af7 Mon Sep 17 00:00:00 2001 From: ddidderr Date: Tue, 19 May 2026 21:28:40 +0200 Subject: [PATCH] fix(settings): name descending size sort explicitly The library sort setting used `size` for largest-first sorting while the ascending option used `sizeAsc`. That made the pair asymmetric and left the current settings model carrying a legacy-looking key. Rename the current descending key to `sizeDesc` in the type, menu, and sort logic. Stored `size` values are normalized to `sizeDesc` on read, so existing users keep the same largest-first behavior while new writes use the explicit key. Test Plan: - deno task build - RUSTC_WRAPPER= CARGO_BUILD_RUSTC_WRAPPER= just build - git diff --check Refs: local review feedback --- .../src/components/topbar/SortMenu.tsx | 2 +- .../src/hooks/useSettings.ts | 13 ++++++++++--- crates/lanspread-tauri-deno-ts/src/lib/gameState.ts | 2 +- crates/lanspread-tauri-deno-ts/src/lib/types.ts | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/crates/lanspread-tauri-deno-ts/src/components/topbar/SortMenu.tsx b/crates/lanspread-tauri-deno-ts/src/components/topbar/SortMenu.tsx index 60de955..002d349 100644 --- a/crates/lanspread-tauri-deno-ts/src/components/topbar/SortMenu.tsx +++ b/crates/lanspread-tauri-deno-ts/src/components/topbar/SortMenu.tsx @@ -5,7 +5,7 @@ import { GameSort } from '../../lib/types'; const OPTIONS: ReadonlyArray<{ key: GameSort; label: string }> = [ { key: 'az', label: 'Name (A–Z)' }, - { key: 'size', label: 'Size (largest)' }, + { key: 'sizeDesc', label: 'Size (largest)' }, { key: 'sizeAsc', label: 'Size (smallest)' }, { key: 'status', label: 'Status' }, ]; diff --git a/crates/lanspread-tauri-deno-ts/src/hooks/useSettings.ts b/crates/lanspread-tauri-deno-ts/src/hooks/useSettings.ts index 3ab4b42..07536e5 100644 --- a/crates/lanspread-tauri-deno-ts/src/hooks/useSettings.ts +++ b/crates/lanspread-tauri-deno-ts/src/hooks/useSettings.ts @@ -17,6 +17,9 @@ export interface UISettings { filter: GameFilter; } +type StoredGameSort = GameSort | 'size'; +type StoredUISettings = Partial & { sort: StoredGameSort }>; + export const ACCENT_OPTIONS = [ { value: '#3b82f6', label: 'Blue' }, { value: '#22d3ee', label: 'Cyan' }, @@ -53,15 +56,19 @@ export const DEFAULT_SETTINGS: UISettings = { filter: 'local', }; -const sanitize = (raw: Partial | undefined): UISettings => ({ +const sanitize = (raw: StoredUISettings | undefined): UISettings => ({ accent: raw?.accent ?? DEFAULT_SETTINGS.accent, bg: raw?.bg ?? DEFAULT_SETTINGS.bg, density: raw?.density ?? DEFAULT_SETTINGS.density, aspect: raw?.aspect ?? DEFAULT_SETTINGS.aspect, - sort: raw?.sort ?? DEFAULT_SETTINGS.sort, + sort: sanitizeSort(raw?.sort), filter: raw?.filter ?? DEFAULT_SETTINGS.filter, }); +const sanitizeSort = (sort: StoredGameSort | undefined): GameSort => ( + sort === 'size' ? 'sizeDesc' : sort ?? DEFAULT_SETTINGS.sort +); + export interface UseSettings { settings: UISettings; set: (key: K, value: UISettings[K]) => void; @@ -82,7 +89,7 @@ export const useSettings = (): UseSettings => { const init = async () => { try { const store = await load(SETTINGS_FILE, SETTINGS_FILE_OPTIONS); - const saved = await store.get>(UI_SETTINGS_KEY); + const saved = await store.get(UI_SETTINGS_KEY); if (!cancelled) { setSettings(sanitize(saved ?? undefined)); } diff --git a/crates/lanspread-tauri-deno-ts/src/lib/gameState.ts b/crates/lanspread-tauri-deno-ts/src/lib/gameState.ts index e5f060f..46329ab 100644 --- a/crates/lanspread-tauri-deno-ts/src/lib/gameState.ts +++ b/crates/lanspread-tauri-deno-ts/src/lib/gameState.ts @@ -213,7 +213,7 @@ export const applyFilterAndSort = ( switch (sort) { case 'az': return [...list].sort((a, b) => a.name.localeCompare(b.name)); - case 'size': + case 'sizeDesc': return [...list].sort((a, b) => b.size - a.size); case 'sizeAsc': return [...list].sort((a, b) => a.size - b.size); diff --git a/crates/lanspread-tauri-deno-ts/src/lib/types.ts b/crates/lanspread-tauri-deno-ts/src/lib/types.ts index 4609fbb..58223e1 100644 --- a/crates/lanspread-tauri-deno-ts/src/lib/types.ts +++ b/crates/lanspread-tauri-deno-ts/src/lib/types.ts @@ -62,7 +62,7 @@ export interface GamesListPayload { export type GameFilter = 'all' | 'local' | 'installed'; /** Library sort order. */ -export type GameSort = 'az' | 'size' | 'sizeAsc' | 'status'; +export type GameSort = 'az' | 'sizeDesc' | 'sizeAsc' | 'status'; /** Visual state of a card. Derived from install/download flags. */ export type DerivedState = 'installed' | 'local' | 'none' | 'busy';