From 8ce6a8b88892f76a77944103c800cf1b87a02d27 Mon Sep 17 00:00:00 2001
From: ManUtopiK <emmanuel.salomon@gmail.com>
Date: Tue, 15 Jun 2021 17:36:06 +0200
Subject: [PATCH] Split events in two columns

---
 components/home/HomeNextEvents.vue | 73 ++++++++++++++++++++++++------
 libs/api-forum.js                  |  4 +-
 plugins/i18n.js                    |  9 ++++
 3 files changed, 69 insertions(+), 17 deletions(-)

diff --git a/components/home/HomeNextEvents.vue b/components/home/HomeNextEvents.vue
index 6a006c0e..c02a5a74 100644
--- a/components/home/HomeNextEvents.vue
+++ b/components/home/HomeNextEvents.vue
@@ -1,28 +1,29 @@
 <template>
-  <aside>
-    <h1 class="text-3xl uppercase text-gray-400 font-bold ml-2 mb-2 md:ml-1.5">
-      Événements à venir...
-    </h1>
-
-    <template v-if="!loading">
+  <aside v-if="!loading" class="lg:flex">
+    <div
+      v-for="(column, num) in columns"
+      :key="num"
+      class="flex-1"
+      :class="num === 1 && 'lg:ml-4'"
+    >
       <a
-        v-for="(event, index) in events"
+        v-for="(event, index) in column"
         :key="index"
         :href="`https://forum.monnaie-libre.fr/t/${event.slug}/${event.id}`"
         targe="_blank"
-        class="block dark-hover:bg-gray-700 hover:bg-gray-100 p-2 mt-1 rounded-lg transition-colors"
+        class="block hover:bg-hover-light dark-hover:text-gray-800 p-2 mt-1 rounded-lg transition-colors"
       >
-        <div class="text-sm text-gray-500">
-          {{ $d(Date.parse(event.event.start), 'long') }}
+        <div class="event-date text-sm text-gray-500">
+          {{ prettyDate(event.event.start) }}
         </div>
         <div>{{ event.title }}</div>
       </a>
-    </template>
-
-    <div v-else class="h-80 flex items-center">
-      <span class="loading-state h-12 w-12 scale-150 transform mx-auto" />
     </div>
   </aside>
+
+  <div v-else class="h-80 flex items-center">
+    <span class="loading-state h-12 w-12 scale-150 transform mx-auto" />
+  </div>
 </template>
 
 <script>
@@ -34,12 +35,54 @@ export default {
     return {
       events: [],
       loading: false,
+      cols: 2,
     }
   },
+  computed: {
+    columns() {
+      const columns = []
+      const mid = Math.ceil(this.events.length / this.cols)
+      for (let col = 0; col < this.cols; col++) {
+        columns.push(this.events.slice(col * mid, col * mid + mid))
+      }
+      return columns
+    },
+  },
   async mounted() {
     this.loading = true
-    this.events = await fetchNextEvents()
+    this.events = await fetchNextEvents(`?start=${this.formatDateForParams()}`)
     this.loading = false
   },
+
+  methods: {
+    formatDateForParams(date = new Date()) {
+      const offset = date.getTimezoneOffset()
+      date = new Date(date.getTime() - offset * 60 * 1000)
+      return date.toISOString().split('T')[0]
+    },
+    prettyDate(date) {
+      const formatter = new Intl.DateTimeFormat(
+        this.$i18n.locale,
+        this.$i18n.dateTimeFormats[this.$i18n.locale].full
+      )
+      return formatter
+        .formatToParts(Date.parse(date))
+        .map(({ type, value }) => {
+          switch (type) {
+            case 'literal':
+              return value === ', ' ? ' à ' : value === ':' ? 'h' : value
+            default:
+              return value
+          }
+        })
+        .reduce((string, part) => string + part)
+    },
+  },
 }
 </script>
+
+<style lang="postcss" scoped>
+.event-date:first-letter {
+  text-transform: uppercase;
+}
+</style>
diff --git a/libs/api-forum.js b/libs/api-forum.js
index 9c4b23b4..58f46b2f 100644
--- a/libs/api-forum.js
+++ b/libs/api-forum.js
@@ -26,12 +26,12 @@ export async function fetchCategories() {
  *
  * @return {Array} An array of events
  */
-export async function fetchNextEvents() {
+export async function fetchNextEvents(params) {
   // Caches to avoid fetching each time it's mounted
   if (sessionStorage.getItem('events_forum')) {
     return JSON.parse(sessionStorage.getItem('events_forum'))
   } else {
-    const events = await fetch(`${forumUrl}/calendar.json`)
+    const events = await fetch(`${forumUrl}/calendar.json${params}`)
       .then((response) => response.json())
       .then((data) =>
         data.topic_list.topics.filter(
diff --git a/plugins/i18n.js b/plugins/i18n.js
index e0855415..02153db9 100644
--- a/plugins/i18n.js
+++ b/plugins/i18n.js
@@ -55,6 +55,15 @@ export default {
           hour: 'numeric',
           minute: 'numeric',
         },
+        full: {
+          year: 'numeric',
+          month: 'long',
+          day: 'numeric',
+          weekday: 'long',
+          hour: 'numeric',
+          literal: 'h',
+          minute: 'numeric',
+        },
       },
     },
   },
-- 
GitLab