@@ -24,27 +24,40 @@ const updateUrl = debounce((updates: { page?: number; filter?: string; sort?: st
2424 ... route .query ,
2525 page: updates .page && updates .page > 1 ? updates .page : undefined ,
2626 q: updates .filter || undefined ,
27- sort: updates .sort && updates .sort !== ' downloads' ? updates .sort : undefined ,
27+ sort: updates .sort && updates .sort !== ' downloads-desc ' ? updates .sort : undefined ,
2828 },
2929 })
3030}, 300 )
3131
32- type SortOption = ' downloads' | ' updated' | ' name-asc' | ' name-desc'
32+ type SortOption =
33+ | ' downloads-desc'
34+ | ' downloads-asc'
35+ | ' updated-desc'
36+ | ' updated-asc'
37+ | ' name-asc'
38+ | ' name-desc'
3339
3440// Filter and sort state (from URL)
3541const filterText = shallowRef (
3642 (Array .isArray (route .query .q ) ? route .query .q [0 ] : route .query .q ) ?? ' ' ,
3743)
38- const sortOption = shallowRef <SortOption >(
39- ((Array .isArray (route .query .sort ) ? route .query .sort [0 ] : route .query .sort ) as SortOption ) ||
40- ' downloads' ,
41- )
44+ const rawSort = (Array .isArray (route .query .sort ) ? route .query .sort [0 ] : route .query .sort ) as
45+ | SortOption
46+ | ' downloads'
47+ | ' updated'
48+ | undefined
49+ const normalizedSort: SortOption =
50+ rawSort === ' downloads'
51+ ? ' downloads-desc'
52+ : rawSort === ' updated'
53+ ? ' updated-desc'
54+ : (rawSort ?? ' downloads-desc' )
55+
56+ const sortOption = shallowRef <SortOption >(normalizedSort )
4257
4358// Track if we've loaded all results (one-way flag, doesn't reset)
4459// Initialize to true if URL already has filter/sort params
45- const hasLoadedAll = shallowRef (
46- Boolean (route .query .q ) || (route .query .sort && route .query .sort !== ' downloads' ),
47- )
60+ const hasLoadedAll = shallowRef (Boolean (route .query .q ) || normalizedSort !== ' downloads-desc' )
4861
4962// Update URL when filter/sort changes (debounced)
5063const debouncedUpdateUrl = debounce ((filter : string , sort : string ) => {
@@ -53,7 +66,7 @@ const debouncedUpdateUrl = debounce((filter: string, sort: string) => {
5366
5467watch ([filterText , sortOption ], ([filter , sort ]) => {
5568 // Once user interacts with filter/sort, load all results
56- if (! hasLoadedAll .value && (filter !== ' ' || sort !== ' downloads' )) {
69+ if (! hasLoadedAll .value && (filter !== ' ' || sort !== ' downloads-desc ' )) {
5770 hasLoadedAll .value = true
5871 }
5972 debouncedUpdateUrl (filter , sort )
@@ -104,20 +117,30 @@ const filteredAndSortedPackages = computed(() => {
104117
105118 // Apply sort
106119 switch (sortOption .value ) {
107- case ' updated' :
120+ case ' updated-desc ' :
108121 pkgs .sort ((a , b ) => {
109122 const dateA = a .package .date || ' '
110123 const dateB = b .package .date || ' '
111124 return dateB .localeCompare (dateA )
112125 })
113126 break
127+ case ' updated-asc' :
128+ pkgs .sort ((a , b ) => {
129+ const dateA = a .package .date || ' '
130+ const dateB = b .package .date || ' '
131+ return dateA .localeCompare (dateB )
132+ })
133+ break
114134 case ' name-asc' :
115135 pkgs .sort ((a , b ) => a .package .name .localeCompare (b .package .name ))
116136 break
117137 case ' name-desc' :
118138 pkgs .sort ((a , b ) => b .package .name .localeCompare (a .package .name ))
119139 break
120- case ' downloads' :
140+ case ' downloads-asc' :
141+ pkgs .sort ((a , b ) => (a .downloads ?.weekly ?? 0 ) - (b .downloads ?.weekly ?? 0 ))
142+ break
143+ case ' downloads-desc' :
121144 default :
122145 pkgs .sort ((a , b ) => (b .downloads ?.weekly ?? 0 ) - (a .downloads ?.weekly ?? 0 ))
123146 break
@@ -158,7 +181,7 @@ function handlePageChange(page: number) {
158181watch (username , () => {
159182 currentPage .value = 1
160183 filterText .value = ' '
161- sortOption .value = ' downloads'
184+ sortOption .value = ' downloads-desc '
162185 hasLoadedAll .value = false
163186})
164187
0 commit comments