diff --git a/packages/common/src/api/tan-query/events/useAllRemixContests.ts b/packages/common/src/api/tan-query/events/useAllRemixContests.ts index 22c2e41e101..94ffd86ce34 100644 --- a/packages/common/src/api/tan-query/events/useAllRemixContests.ts +++ b/packages/common/src/api/tan-query/events/useAllRemixContests.ts @@ -19,7 +19,11 @@ import { QUERY_KEYS } from '../queryKeys' import { QueryKey, QueryOptions } from '../types' import { useCurrentUserId } from '../users/account/useCurrentUserId' -import { getEventIdsByEntityIdQueryKey, getEventQueryKey } from './utils' +import { + dedupeContestTrackIds, + getEventIdsByEntityIdQueryKey, + getEventQueryKey +} from './utils' const DEFAULT_PAGE_SIZE = 25 @@ -132,7 +136,7 @@ export const useAllRemixContests = ( }) .filter(removeNullable) }, - select: (data) => data.pages.flat(), + select: (data) => dedupeContestTrackIds(data.pages.flat()), ...options }) } diff --git a/packages/common/src/api/tan-query/events/useUserRemixContests.ts b/packages/common/src/api/tan-query/events/useUserRemixContests.ts index 39fa0b67985..7a50bc1f79a 100644 --- a/packages/common/src/api/tan-query/events/useUserRemixContests.ts +++ b/packages/common/src/api/tan-query/events/useUserRemixContests.ts @@ -19,7 +19,11 @@ import { QUERY_KEYS } from '../queryKeys' import { QueryKey, QueryOptions } from '../types' import { useCurrentUserId } from '../users/account/useCurrentUserId' -import { getEventIdsByEntityIdQueryKey, getEventQueryKey } from './utils' +import { + dedupeContestTrackIds, + getEventIdsByEntityIdQueryKey, + getEventQueryKey +} from './utils' const DEFAULT_PAGE_SIZE = 25 @@ -137,7 +141,7 @@ export const useUserRemixContests = ( }) .filter(removeNullable) }, - select: (data) => data.pages.flat(), + select: (data) => dedupeContestTrackIds(data.pages.flat()), enabled: options?.enabled !== false && !!userId, ...options }) diff --git a/packages/common/src/api/tan-query/events/utils.test.ts b/packages/common/src/api/tan-query/events/utils.test.ts new file mode 100644 index 00000000000..1263d27d89e --- /dev/null +++ b/packages/common/src/api/tan-query/events/utils.test.ts @@ -0,0 +1,18 @@ +import { describe, expect, it } from 'vitest' + +import { dedupeContestTrackIds } from './utils' + +describe('dedupeContestTrackIds', () => { + it('keeps the first occurrence of each track id in order', () => { + expect(dedupeContestTrackIds([1, 2, 1, 3, 2, 4])).toEqual([1, 2, 3, 4]) + }) + + it('dedupes track ids that repeat across paginated results', () => { + const firstPage = [10, 11, 12] + const secondPage = [12, 13, 10] + + expect(dedupeContestTrackIds([...firstPage, ...secondPage])).toEqual([ + 10, 11, 12, 13 + ]) + }) +}) diff --git a/packages/common/src/api/tan-query/events/utils.ts b/packages/common/src/api/tan-query/events/utils.ts index b2b95683da5..3413781c0d9 100644 --- a/packages/common/src/api/tan-query/events/utils.ts +++ b/packages/common/src/api/tan-query/events/utils.ts @@ -29,3 +29,12 @@ export const getEventListQueryKey = ({ pageSize }: { pageSize?: number }) => { export const getEventIdsByEntityIdQueryKey = ( args?: EventIdsByEntityIdOptions ) => [QUERY_KEYS.eventsByEntityId, args] as unknown as QueryKey + +export const dedupeContestTrackIds = (trackIds: ID[]) => { + const seenTrackIds = new Set() + return trackIds.filter((trackId) => { + if (seenTrackIds.has(trackId)) return false + seenTrackIds.add(trackId) + return true + }) +}