Skip to content

Commit a9962ec

Browse files
committed
add sponsor pinia store with helpers
1 parent 5180394 commit a9962ec

File tree

3 files changed

+153
-7
lines changed

3 files changed

+153
-7
lines changed

packages/frontendmu-nuxt/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"embla-carousel-vue": "^8.1.8",
2828
"lucide-vue-next": "^0.378.0",
2929
"nuxt": "^3.12.4",
30+
"pinia": "^3.0.2",
3031
"radix-vue": "^1.9.2",
3132
"shadcn-nuxt": "^0.10.4",
3233
"tailwind-merge": "^2.4.0",
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import { defineStore } from 'pinia'
2+
import sponsorsRaw from '../../frontendmu-data/data/sponsors-raw.json'
3+
4+
// Type definitions
5+
export interface SponsorMeetup {
6+
id: string | number
7+
title: string
8+
date: string
9+
location?: string
10+
venue?: string
11+
description?: string
12+
}
13+
14+
export interface Sponsor {
15+
id: string
16+
name: string
17+
logo: string
18+
website?: string
19+
description?: string
20+
sponsor_type?: string[]
21+
darkbg?: boolean
22+
meetups: SponsorMeetup[]
23+
}
24+
25+
function getYear(date: string) {
26+
if (!date)
27+
return undefined
28+
return date.slice(0, 4)
29+
}
30+
31+
export const useSponsorStore = defineStore('sponsor', {
32+
state: () => ({
33+
sponsors: sponsorsRaw as unknown as Sponsor[],
34+
}),
35+
getters: {
36+
// 1. Get sponsors for a given eventId
37+
getSponsorByEventId: state => (eventId: string | number) => {
38+
return state.sponsors.filter(sponsor =>
39+
sponsor.meetups.some(meetup => String(meetup.id) === String(eventId)),
40+
)
41+
},
42+
// 2. Get sponsors sorted by most recent event date
43+
getSponsorsSortedByDate: (state) => {
44+
return [...state.sponsors].sort((a, b) => {
45+
const aLatest = a.meetups.reduce((max, m) => m.date > max ? m.date : max, '')
46+
const bLatest = b.meetups.reduce((max, m) => m.date > max ? m.date : max, '')
47+
return bLatest.localeCompare(aLatest)
48+
})
49+
},
50+
// 3. Get sponsors with most events
51+
getSponsorsMostEvents: (state) => {
52+
return [...state.sponsors].sort((a, b) => b.meetups.length - a.meetups.length)
53+
},
54+
// 4. Group sponsors' events by year
55+
getSponsorsEventsGroupedByYear: (state) => {
56+
const grouped: Record<string, { sponsor: Sponsor, meetups: SponsorMeetup[] }[]> = {}
57+
for (const sponsor of state.sponsors) {
58+
for (const meetup of sponsor.meetups) {
59+
const year = getYear(meetup.date)
60+
if (!year)
61+
continue
62+
if (!grouped[year])
63+
grouped[year] = []
64+
let sponsorYear = grouped[year].find(entry => entry.sponsor.id === sponsor.id)
65+
if (!sponsorYear) {
66+
sponsorYear = { sponsor, meetups: [] }
67+
grouped[year].push(sponsorYear)
68+
}
69+
sponsorYear.meetups.push(meetup)
70+
}
71+
}
72+
return grouped
73+
},
74+
// 5. Get sponsors for a specific year
75+
getSponsorsForYear: state => (year: string) => {
76+
return state.sponsors.filter(sponsor =>
77+
sponsor.meetups.some(meetup => getYear(meetup.date) === year),
78+
)
79+
},
80+
// 6. Get sponsors for the current year
81+
getSponsorsForCurrentYear(): Sponsor[] {
82+
const year = new Date().getFullYear().toString()
83+
return this.getSponsorsForYear(year)
84+
},
85+
},
86+
})

pnpm-lock.yaml

Lines changed: 66 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)