@@ -48,19 +48,35 @@ export const Component = () => {
48
48
)
49
49
50
50
const data : RouteData = rsshubPopular . data as any
51
- const { isLoading } = rsshubPopular
51
+
52
+ const rsshubAnalytics = useAuthQuery ( Queries . discover . rsshubAnalytics ( ) , {
53
+ staleTime : 1000 * 60 * 60 * 24 , // 1 day
54
+ placeholderData : keepPreviousData ,
55
+ } )
56
+
57
+ const rsshubAnalyticsData : Awaited <
58
+ ReturnType < ( typeof apiClient ) [ "discover" ] [ "rsshub-analytics" ] [ "$get" ] >
59
+ > [ "data" ] = rsshubAnalytics . data as any
60
+
61
+ const isLoading = rsshubPopular . isLoading || rsshubAnalytics . isLoading
52
62
53
63
const keys = useMemo ( ( ) => {
54
- if ( ! data ) {
64
+ if ( ! data || ! rsshubAnalyticsData ) {
55
65
return [ ]
56
66
}
57
67
return Object . keys ( data ) . sort ( ( a , b ) => {
58
- const aname = data [ a ] ! . name
59
- const bname = data [ b ] ! . name
68
+ const aRoutes = Object . keys ( data [ a ] ?. routes ?? { } )
69
+ const aHeat = aRoutes . reduce ( ( acc , route ) => {
70
+ return acc + ( rsshubAnalyticsData ?. [ `/${ a } ${ route } ` ] ?. subscriptionCount ?? 0 )
71
+ } , 0 )
72
+ const bRoutes = Object . keys ( data [ b ] ?. routes ?? { } )
73
+ const bHeat = bRoutes . reduce ( ( acc , route ) => {
74
+ return acc + ( rsshubAnalyticsData ?. [ `/${ b } ${ route } ` ] ?. subscriptionCount ?? 0 )
75
+ } , 0 )
60
76
61
- return aname . toLowerCase ( ) < bname . toLowerCase ( ) ? - 1 : 1
77
+ return bHeat - aHeat
62
78
} )
63
- } , [ data ] )
79
+ } , [ data , rsshubAnalyticsData ] )
64
80
65
81
const [ search , setSearch ] = useState ( "" )
66
82
@@ -113,7 +129,11 @@ export const Component = () => {
113
129
( item ) =>
114
130
item ?. data && (
115
131
< div key = { item . key } className = "mb-4 break-inside-avoid" >
116
- < RecommendationListItem data = { item . data } routePrefix = { item . routePrefix } />
132
+ < RecommendationListItem
133
+ data = { item . data }
134
+ routePrefix = { item . routePrefix }
135
+ rsshubAnalyticsData = { rsshubAnalyticsData }
136
+ />
117
137
</ div >
118
138
) ,
119
139
) }
@@ -141,17 +161,25 @@ export const Component = () => {
141
161
const RecommendationListItem = ( {
142
162
data,
143
163
routePrefix,
164
+ rsshubAnalyticsData,
144
165
} : {
145
166
data : RouteData [ string ]
146
167
routePrefix : string
168
+ rsshubAnalyticsData : Awaited <
169
+ ReturnType < ( typeof apiClient ) [ "discover" ] [ "rsshub-analytics" ] [ "$get" ] >
170
+ > [ "data" ]
147
171
} ) => {
148
172
const { t } = useTranslation ( )
149
173
const { present } = useModalStack ( )
150
174
151
175
const { maintainers, categories, routes } = useMemo ( ( ) => {
152
176
const maintainers = new Set < string > ( )
153
177
const categories = new Set < string > ( )
154
- const routes = Object . keys ( data . routes )
178
+ const routes = Object . keys ( data . routes ) . sort ( ( a , b ) => {
179
+ const aHeat = rsshubAnalyticsData ?. [ `/${ routePrefix } ${ a } ` ] ?. subscriptionCount ?? 0
180
+ const bHeat = rsshubAnalyticsData ?. [ `/${ routePrefix } ${ b } ` ] ?. subscriptionCount ?? 0
181
+ return bHeat - aHeat
182
+ } )
155
183
156
184
for ( const route in data . routes ) {
157
185
const routeData = data . routes [ route ] !
@@ -168,16 +196,7 @@ const RecommendationListItem = ({
168
196
categories : Array . from ( categories ) as unknown as typeof RSSHubCategories ,
169
197
routes,
170
198
}
171
- } , [ data ] )
172
-
173
- const rsshubAnalytics = useAuthQuery ( Queries . discover . rsshubAnalytics ( ) , {
174
- staleTime : 1000 * 60 * 60 * 24 , // 1 day
175
- placeholderData : keepPreviousData ,
176
- } )
177
-
178
- const rsshubAnalyticsData : Awaited <
179
- ReturnType < ( typeof apiClient ) [ "discover" ] [ "rsshub-analytics" ] [ "$get" ] >
180
- > [ "data" ] = rsshubAnalytics . data as any
199
+ } , [ data , rsshubAnalyticsData , routePrefix ] )
181
200
182
201
const follow = useFollow ( )
183
202
0 commit comments