11import { createClient } from 'newt-client-js'
22import { Query } from 'newt-client-js/dist/types/types'
3- import { ISponsor } from '~/types/sponsors'
3+ import { sponsors as fallbackSponsors } from '~/utils/newt.constants'
4+ import { ISponsor , Rank } from '~/types/sponsors'
5+
6+ type SponsorGroups = Record < Rank , ISponsor [ ] >
7+
8+ const sponsorRanks : Rank [ ] = [
9+ 'platinum' ,
10+ 'gold' ,
11+ 'silver' ,
12+ 'bronze' ,
13+ 'specialMedia' ,
14+ 'media' ,
15+ 'streaming' ,
16+ 'dinner' ,
17+ ]
18+
19+ function createEmptySponsorGroups ( ) : SponsorGroups {
20+ return sponsorRanks . reduce ( ( groups , rank ) => {
21+ groups [ rank ] = [ ]
22+ return groups
23+ } , { } as SponsorGroups )
24+ }
25+
26+ function normalizeSponsorGroups ( groups ?: Partial < Record < Rank , ISponsor [ ] > > ) : SponsorGroups {
27+ const normalized = createEmptySponsorGroups ( )
28+
29+ for ( const rank of sponsorRanks ) {
30+ normalized [ rank ] = groups ?. [ rank ] ?? [ ]
31+ }
32+
33+ return normalized
34+ }
35+
36+ function fallbackSponsorGroups ( ) : SponsorGroups {
37+ return normalizeSponsorGroups ( fallbackSponsors )
38+ }
439
540export function useCMS < T > ( options : { modelUid : string } ) {
641 const runtimeConfig = useRuntimeConfig ( )
7- const client = createClient ( {
8- spaceUid : runtimeConfig . newtSpaceUid ,
9- token : runtimeConfig . newtCdnToken ,
10- apiType : 'cdn' ,
11- } )
42+ const hasCredentials = Boolean ( runtimeConfig . newtSpaceUid && runtimeConfig . newtCdnToken )
43+ const client = hasCredentials
44+ ? createClient ( {
45+ spaceUid : runtimeConfig . newtSpaceUid ,
46+ token : runtimeConfig . newtCdnToken ,
47+ apiType : 'cdn' ,
48+ } )
49+ : null
1250 const appUid = 'vuefes-2022'
1351
14- const fetchContent = ( query ?: Query ) =>
15- client . getContents < T > ( { appUid, ...options , query } ) . then ( ( contents ) => {
16- return contents . items
17- } )
52+ const fetchContent = async ( query ?: Query ) => {
53+ if ( ! client ) {
54+ return [ ]
55+ }
56+
57+ const contents = await client . getContents < T > ( { appUid, ...options , query } )
58+
59+ return contents . items
60+ }
1861
1962 return {
2063 fetchContent,
2164 }
2265}
2366
2467export function useSponsorsCMS ( ) {
25- const runtimeConfig = useRuntimeConfig ( )
26- const client = createClient ( {
27- spaceUid : runtimeConfig . newtSpaceUid ,
28- token : runtimeConfig . newtCdnToken ,
29- apiType : 'cdn' ,
30- } )
31- const appUid = 'vuefes-2022'
32-
3368 const options = { modelUid : 'sponsor' }
3469 const { fetchContent : getContents } = useCMS < ISponsor > ( options )
35- const fetchContent = ( ) =>
36- getContents ( { appUid, ...options } ) . then ( ( sponsors ) => {
37- return sponsors
38- . sort ( ( first , second ) => {
39- return first . order > second . order ? 1 : - 1
40- } )
41- . reduce ( groupBy ( 'rank' ) , { } )
42- } )
43-
44- const fetchContentByName = ( name : string ) =>
45- getContents ( { name_en : name } ) . then ( ( sponsor ) => {
46- return sponsor [ 0 ]
47- } )
70+
71+ const fetchContent = async ( ) => {
72+ try {
73+ const sponsors = await getContents ( )
74+
75+ if ( sponsors . length === 0 ) {
76+ return fallbackSponsorGroups ( )
77+ }
78+
79+ return normalizeSponsorGroups (
80+ sponsors
81+ . sort ( ( first , second ) => {
82+ return first . order > second . order ? 1 : - 1
83+ } )
84+ . reduce ( groupBy ( 'rank' ) , { } as Partial < Record < Rank , ISponsor [ ] > > ) ,
85+ )
86+ } catch {
87+ return fallbackSponsorGroups ( )
88+ }
89+ }
90+
91+ const fetchContentByName = async ( name : string ) => {
92+ try {
93+ const sponsor = await getContents ( { name_en : name } )
94+
95+ return sponsor [ 0 ] ?? findSponsorByName ( name )
96+ } catch {
97+ return findSponsorByName ( name )
98+ }
99+ }
48100
49101 return {
50102 fetchContent,
@@ -63,3 +115,13 @@ function groupBy<T extends Record<string, any>, P extends keyof T & string>(grou
63115 return acc
64116 }
65117}
118+
119+ function findSponsorByName ( name : string ) : ISponsor | undefined {
120+ for ( const rank of sponsorRanks ) {
121+ const sponsor = fallbackSponsors [ rank ] ?. find ( ( entry ) => entry . name_en === name )
122+
123+ if ( sponsor ) {
124+ return sponsor
125+ }
126+ }
127+ }
0 commit comments