Skip activities with invalid dates in calendar view

Prevents RangeError from format() on activities with unparseable
start timestamps.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Padreug 2026-04-20 12:42:47 +02:00
commit 8a3ff14568
3 changed files with 20 additions and 3 deletions

View file

@ -37,6 +37,7 @@ const calendarDays = computed(() => {
const activityDayMap = computed(() => {
const map = new Map<string, Activity[]>()
for (const activity of props.activities) {
if (!activity.startDate || isNaN(activity.startDate.getTime())) continue
const key = format(activity.startDate, 'yyyy-MM-dd')
if (!map.has(key)) map.set(key, [])
map.get(key)!.push(activity)

View file

@ -56,7 +56,7 @@ export const activitiesModule = createModulePlugin({
component: () => import('./views/ActivitiesFavoritesPage.vue'),
meta: {
title: 'Favorites',
requiresAuth: true,
requiresAuth: false,
},
},
{

View file

@ -1,7 +1,9 @@
<script setup lang="ts">
import { computed } from 'vue'
import { computed, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { Heart } from 'lucide-vue-next'
import { Button } from '@/components/ui/button'
import { toast } from 'vue-sonner'
import { useAuth } from '@/composables/useAuthService'
import { useBookmarks } from '../composables/useBookmarks'
import { useActivitiesStore } from '../stores/activities'
@ -20,6 +22,17 @@ const favoriteActivities = computed(() => {
function handleSelect(activity: Activity) {
router.push({ name: 'activity-detail', params: { id: activity.id } })
}
onMounted(() => {
if (!isAuthenticated.value) {
toast.info('Log in to save favorites', {
action: {
label: 'Log in',
onClick: () => router.push('/login'),
},
})
}
})
</script>
<template>
@ -29,7 +42,10 @@ function handleSelect(activity: Activity) {
<!-- Not authenticated -->
<div v-if="!isAuthenticated" class="flex flex-col items-center justify-center py-16 text-center">
<Heart class="w-16 h-16 text-muted-foreground/30 mb-4" />
<p class="text-muted-foreground">Log in to save your favorite activities</p>
<p class="text-muted-foreground mb-3">Log in to save your favorite activities</p>
<Button variant="outline" size="sm" @click="router.push('/login')">
Log in
</Button>
</div>
<!-- Loading -->