@@ -295,25 +295,45 @@ export const useVirtualContestSubmissions = (
295
295
) => {
296
296
const PROBLEM_CHUNK_SIZE = 10 ;
297
297
const USER_CHUNK_SIZE = 10 ;
298
- const requestCount =
299
- Math . ceil ( users . length / USER_CHUNK_SIZE ) *
300
- Math . ceil ( problems . length / PROBLEM_CHUNK_SIZE ) ;
301
-
302
- const refreshInterval = enableAutoRefresh
303
- ? Math . max ( 1 , requestCount / 10 ) * 60_000
304
- : 1_000_000_000 ;
298
+ const SEPARATOR = "###" ;
305
299
306
- const userChunks = toChunks ( users , USER_CHUNK_SIZE ) ;
307
- const problemChunks = toChunks ( problems , PROBLEM_CHUNK_SIZE ) ;
308
300
const singleFetch = async ( users : UserId [ ] , problems : ProblemId [ ] ) => {
309
301
const userList = users . join ( "," ) ;
310
302
const problemList = problems . join ( "," ) ;
311
303
const url = `${ ATCODER_API_URL } /v3/users_and_time?users=${ userList } &problems=${ problemList } &from=${ fromSecond } &to=${ toSecond } ` ;
312
304
const submissions = await fetchTypedArray ( url , isSubmission ) ;
313
305
return submissions . filter ( ( submission ) => isValidResult ( submission . result ) ) ;
314
306
} ;
315
-
316
- const fetcher = async ( ) => {
307
+ const serialize = ( users : UserId [ ] , problems : ProblemId [ ] ) => {
308
+ const sortedUsers = Array . from ( users ) ;
309
+ sortedUsers . sort ( ) ;
310
+ const userKey = sortedUsers . join ( "," ) ;
311
+
312
+ const sortedProblems = Array . from ( problems ) ;
313
+ sortedProblems . sort ( ) ;
314
+ const problemKey = sortedProblems . join ( "," ) ;
315
+
316
+ return (
317
+ "useVirtualContestSubmissions" +
318
+ SEPARATOR +
319
+ userKey +
320
+ SEPARATOR +
321
+ problemKey
322
+ ) ;
323
+ } ;
324
+ const deserialize = ( key : string ) => {
325
+ const keys = key . split ( "###" ) ;
326
+ const userKey = keys [ 1 ] ;
327
+ const problemKey = keys [ 2 ] ;
328
+
329
+ const users = userKey . split ( "," ) ;
330
+ const problems = problemKey . split ( "," ) ;
331
+ return { users, problems } ;
332
+ } ;
333
+ const fetcher = async ( key : string ) => {
334
+ const { users, problems } = deserialize ( key ) ;
335
+ const userChunks = toChunks ( users , USER_CHUNK_SIZE ) ;
336
+ const problemChunks = toChunks ( problems , PROBLEM_CHUNK_SIZE ) ;
317
337
const promises = userChunks
318
338
. flatMap ( ( users ) =>
319
339
problemChunks . map ( ( problems ) => ( { users, problems } ) )
@@ -323,13 +343,15 @@ export const useVirtualContestSubmissions = (
323
343
return submissionChunks . flatMap ( ( x ) => x ) ;
324
344
} ;
325
345
326
- return useSWRData (
327
- "useVirtualContestSubmissions" ,
328
- ( ) => ( users . length > 0 ? fetcher ( ) : Promise . resolve ( [ ] ) ) ,
329
- {
330
- refreshInterval,
331
- }
332
- ) ;
346
+ const requestCount =
347
+ Math . ceil ( users . length / USER_CHUNK_SIZE ) *
348
+ Math . ceil ( problems . length / PROBLEM_CHUNK_SIZE ) ;
349
+ const refreshInterval = enableAutoRefresh
350
+ ? Math . max ( 1 , requestCount / 10 ) * 60_000
351
+ : 1_000_000_000 ;
352
+
353
+ const customKey = serialize ( users , problems ) ;
354
+ return useSWRData ( customKey , fetcher , { refreshInterval } ) ;
333
355
} ;
334
356
335
357
export const useRecentSubmissions = ( ) => {
0 commit comments