[READ-ONLY] a fast, modern browser for the npm registry
at main 111 lines 2.6 kB view raw
1/** 2 * Manages view mode, columns, and pagination preferences for package lists 3 */ 4import type { 5 ColumnConfig, 6 ColumnId, 7 PackageListPreferences, 8 PageSize, 9 PaginationMode, 10 ViewMode, 11} from '#shared/types/preferences' 12import { DEFAULT_COLUMNS, DEFAULT_PREFERENCES } from '#shared/types/preferences' 13 14/** 15 * Composable for managing package list display preferences 16 * Persists to localStorage and provides reactive state 17 * 18 */ 19export function usePackageListPreferences() { 20 const { 21 data: preferences, 22 isHydrated, 23 save, 24 reset, 25 } = usePreferencesProvider<PackageListPreferences>(DEFAULT_PREFERENCES) 26 27 // Computed accessors for common properties 28 const viewMode = computed({ 29 get: () => preferences.value.viewMode, 30 set: (value: ViewMode) => { 31 preferences.value.viewMode = value 32 save() 33 }, 34 }) 35 36 const paginationMode = computed({ 37 get: () => preferences.value.paginationMode, 38 set: (value: PaginationMode) => { 39 preferences.value.paginationMode = value 40 save() 41 }, 42 }) 43 44 const pageSize = computed({ 45 get: () => preferences.value.pageSize, 46 set: (value: PageSize) => { 47 preferences.value.pageSize = value 48 save() 49 }, 50 }) 51 52 const columns = computed({ 53 get: () => preferences.value.columns, 54 set: (value: ColumnConfig[]) => { 55 preferences.value.columns = value 56 save() 57 }, 58 }) 59 60 // Get visible columns only 61 const visibleColumns = computed(() => columns.value.filter(col => col.visible)) 62 63 // Column visibility helpers 64 function setColumnVisibility(columnId: ColumnId, visible: boolean) { 65 const column = columns.value.find(col => col.id === columnId) 66 if (column) { 67 column.visible = visible 68 save() 69 } 70 } 71 72 function toggleColumn(columnId: ColumnId) { 73 const column = columns.value.find(col => col.id === columnId) 74 if (column) { 75 column.visible = !column.visible 76 save() 77 } 78 } 79 80 function resetColumns() { 81 preferences.value.columns = DEFAULT_COLUMNS.map(col => Object.assign({}, col)) 82 save() 83 } 84 85 // Check if column is visible 86 function isColumnVisible(columnId: ColumnId) { 87 return columns.value.find(col => col.id === columnId)?.visible ?? false 88 } 89 90 return { 91 // Raw preferences 92 preferences, 93 isHydrated, 94 95 // Individual properties with setters 96 viewMode, 97 paginationMode, 98 pageSize, 99 columns, 100 visibleColumns, 101 102 // Column helpers 103 setColumnVisibility, 104 toggleColumn, 105 resetColumns, 106 isColumnVisible, 107 108 // Reset all 109 reset, 110 } 111}