-
-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathuseCompetitionTabs.ts
More file actions
65 lines (55 loc) · 1.76 KB
/
useCompetitionTabs.ts
File metadata and controls
65 lines (55 loc) · 1.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import { useQuery } from '@tanstack/react-query';
import { useMemo } from 'react';
import { fetchCompetitionTabs } from '@/lib/api';
export interface CompetitionTabLink {
href: string;
text: string;
slug: string;
}
const slugify = (value: string) =>
value
.toLowerCase()
.trim()
.replace(/[^\p{L}\p{N}\s-]/gu, '')
.replace(/\s+/g, '-')
.replace(/-+/g, '-');
const sortTabsByOrder = (tabs: ApiCompetitionTab[]) =>
[...tabs].sort((a, b) => a.display_order - b.display_order);
export const competitionTabsQuery = (competitionId: string) => ({
queryKey: ['competitionTabs', competitionId],
queryFn: async () => fetchCompetitionTabs(competitionId),
});
export const useCompetitionTabs = (competitionId?: string) => {
return useQuery<ApiCompetitionTab[]>({
...competitionTabsQuery(competitionId ?? ''),
networkMode: 'offlineFirst',
staleTime: 60 * 60 * 1000,
gcTime: 24 * 60 * 60 * 1000,
enabled: !!competitionId,
select: (tabs) => sortTabsByOrder(tabs),
});
};
export const useCompetitionTabLinks = (competitionId?: string) => {
const { data, ...query } = useCompetitionTabs(competitionId);
const links = useMemo<CompetitionTabLink[]>(() => {
if (!data || !competitionId) {
return [];
}
const slugCounts = new Map<string, number>();
return data.map((tab) => {
const baseSlug = slugify(tab.name || 'tab');
const currentCount = slugCounts.get(baseSlug) ?? 0;
const slug = currentCount ? `${baseSlug}-${currentCount + 1}` : baseSlug;
slugCounts.set(baseSlug, currentCount + 1);
return {
href: `/competitions/${competitionId}/tabs#${slug}`,
text: tab.name,
slug,
};
});
}, [competitionId, data]);
return {
...query,
data: links,
};
};