|
1 | 1 | <script setup lang="ts">
|
2 |
| -import type { Sponsor } from '@/utils/types' |
| 2 | +import { computed } from 'vue' |
| 3 | +import { storeToRefs } from 'pinia' |
| 4 | +import { useSponsorStore } from '../../store/sponsorStore' |
| 5 | +import type { Sponsor } from '../../store/sponsorStore' |
| 6 | +import Card from '@/components/base/Card.vue' |
3 | 7 |
|
4 |
| -function sponsorLogoUrl(sponsor: Sponsor) { |
5 |
| - return `https://directus.frontend.mu/assets/${sponsor.Sponsor_id.Logo.filename_disk}` |
6 |
| -} |
7 |
| -
|
8 |
| -const { allSponsors } = useMeetups({}) |
| 8 | +const sponsorStore = useSponsorStore() |
| 9 | +const sortedMeetupsByYear = computed(() => sponsorStore.getMeetupsGroupedByYearSorted) |
9 | 10 |
|
10 |
| -const sponsorTypeMap: { [key: string]: string } = { |
11 |
| - lunch: 'Lunch Sponsor', |
12 |
| - venue: 'Venue Sponsor', |
| 11 | +function sponsorLogoUrl(sponsor: Sponsor) { |
| 12 | + if (typeof sponsor.logo === 'string') { |
| 13 | + return `https://directus.frontend.mu/assets/${sponsor.logo}` |
| 14 | + } |
| 15 | + return '' |
13 | 16 | }
|
14 | 17 |
|
15 |
| -function sponsorClassList(sponsor: Sponsor) { |
16 |
| - return [ |
17 |
| - sponsor.Sponsor_id.darkbg ? 'bg-verse-900/90 text-verse-100' : 'bg-white text-verse-800', |
18 |
| - 'p-2 items-center shadow-md relative rounded-lg flex flex-wrap justify-center gap-4 text-xs', |
19 |
| - ] |
| 18 | +function isRecentSponsorship(meetups: { date: string }[]): boolean { |
| 19 | + if (!meetups.length) |
| 20 | + return false |
| 21 | + // Get most recent event date |
| 22 | + const mostRecent = meetups.reduce((max, m) => m.date > max ? m.date : max, '') |
| 23 | + if (!mostRecent) |
| 24 | + return false |
| 25 | + const eventDate = new Date(mostRecent) |
| 26 | + const now = new Date() |
| 27 | + const diffMonths = (now.getFullYear() - eventDate.getFullYear()) * 12 + (now.getMonth() - eventDate.getMonth()) |
| 28 | + return diffMonths <= 6 |
20 | 29 | }
|
21 | 30 | </script>
|
22 | 31 |
|
23 | 32 | <template>
|
24 |
| - <div class="grid lg:grid-cols-7 md:gap-8 md:grid-cols-3 grid-cols-2 gap-4 auto-rows-auto"> |
25 |
| - <!-- <template v-for="sponsor in allSponsors" :key="sponsor.Sponsor_id"> |
26 |
| - <img class="h-16 w-20 md:w-auto object-contain md:object-cover" :src="sponsorLogoUrl(sponsor)" |
27 |
| - :alt="sponsor.Sponsor_id.Name" :title="sponsor.Sponsor_id.Name" :width="sponsor.Sponsor_id.Logo.width" |
28 |
| - :height="sponsor.Sponsor_id.Logo.height"> |
29 |
| - </template> --> |
30 |
| - |
31 |
| - <template |
32 |
| - v-for="sponsor in allSponsors" |
33 |
| - :key="sponsor.Sponsor_id" |
34 |
| - > |
35 |
| - <div :class="sponsorClassList(sponsor)"> |
36 |
| - <NuxtLink |
37 |
| - :to="`/meetup/${sponsor.Events_id}`" |
38 |
| - class="absolute inset-0" |
39 |
| - > |
40 |
| - <span class="sr-only"> |
41 |
| - {{ sponsor.Sponsor_id.Name }} |
42 |
| - </span> |
43 |
| - </NuxtLink> |
44 |
| - <img |
45 |
| - class="w-full object-contain md:object-cover" |
46 |
| - :src="sponsorLogoUrl(sponsor)" |
47 |
| - :alt="sponsor.Sponsor_id.Name" |
48 |
| - :title="sponsor.Sponsor_id.Name" |
49 |
| - :width="sponsor.Sponsor_id.Logo.width" |
50 |
| - :height="sponsor.Sponsor_id.Logo.height" |
51 |
| - > |
52 |
| - |
53 |
| - <!-- <div class="flex flex-col text-md font-bold gap-1 md:gap-4"> |
54 |
| - <div v-for="sponsorType in sponsor.Sponsor_id?.Sponsor_type" :key="sponsorType" |
55 |
| - class="flex flex-col items-center bg-gray-200/10 border-gray-500/10 border-2 p-2 rounded-md"> |
56 |
| - <p class="text-left md:uppercase font-semibold md:font-black opacity-70 cursor-help text-xs md:text-md" |
57 |
| - :title="`${sponsor.Sponsor_id.Name} sponsored the ${sponsorType} for this meetup`"> |
58 |
| - {{ sponsorTypeMap[sponsorType] }} |
59 |
| - </p> |
60 |
| - </div> |
61 |
| - </div> --> |
| 33 | + <div> |
| 34 | + <div v-for="[year, meetups] in sortedMeetupsByYear" :key="year" class="mb-12"> |
| 35 | + <h2 class="text-4xl font-bold text-verse-600 dark:text-verse-100 mb-6 border-b border-verse-200/10 pb-2"> |
| 36 | + {{ year }} |
| 37 | + </h2> |
| 38 | + <div class="grid lg:grid-cols-4 md:grid-cols-2 grid-cols-1 gap-8"> |
| 39 | + <div v-for="item in meetups" :key="`${item.meetup.id}-${item.sponsor.id}`" class="flex flex-col gap-4 bg-white/50 overflow-hidden dark:bg-verse-100/10 dark:backdrop-blur-sm p-4 shadow-lg sm:rounded-lg"> |
| 40 | + <div class="flex flex-col items-center gap-2 flex-1 relative"> |
| 41 | + <img |
| 42 | + :src="sponsorLogoUrl(item.sponsor)" |
| 43 | + :alt="item.sponsor.name" |
| 44 | + class="h-20 max-h-24 w-full object-contain mb-2 rounded-md p-2" |
| 45 | + :class="item.sponsor.darkbg ? 'dark:bg-verse-900 bg-gray-500' : 'bg-white'" |
| 46 | + > |
| 47 | + <div class="font-semibold text-lg text-center sr-only"> |
| 48 | + {{ item.sponsor.name }} |
| 49 | + </div> |
| 50 | + <template v-if="item.sponsor.website && isRecentSponsorship([item.meetup])"> |
| 51 | + <a :href="item.sponsor.website" target="_blank" rel="noopener" class="absolute top-0 left-0 w-full h-full text-blue-600 underline text-xs opacity-0">{{ item.sponsor.website }}</a> |
| 52 | + </template> |
| 53 | + </div> |
| 54 | + <div class="flex flex-col gap-2 mt-2"> |
| 55 | + <div class="bg-verse-100 dark:bg-verse-800 rounded-md p-3 flex flex-col gap-1"> |
| 56 | + <div class="text-sm font-semibold text-verse-700 dark:text-verse-200"> |
| 57 | + <NuxtLink :to="`/meetup/${item.meetup.id}`" class="hover:underline"> |
| 58 | + {{ item.meetup.title }} |
| 59 | + </NuxtLink> |
| 60 | + </div> |
| 61 | + <div class="text-xs text-gray-500 flex gap-2"> |
| 62 | + <span>{{ item.meetup.date }}</span> |
| 63 | + </div> |
| 64 | + </div> |
| 65 | + </div> |
| 66 | + </div> |
62 | 67 | </div>
|
63 |
| - </template> |
| 68 | + </div> |
64 | 69 | </div>
|
65 | 70 | </template>
|
66 | 71 |
|
|
0 commit comments