2
0
forked from jmug/cactoide

fix: creating an event and showing the wrong date

This commit is contained in:
Levente Orban
2025-10-20 21:22:30 +02:00
committed by GitHub
5 changed files with 41 additions and 15 deletions

View File

@@ -15,7 +15,10 @@ export interface CalendarEvent {
* Formats a date and time string for iCal format (UTC) * Formats a date and time string for iCal format (UTC)
*/ */
export const formatDateForICal = (date: string, time: string): string => { export const formatDateForICal = (date: string, time: string): string => {
const eventDate = new Date(`${date}T${time}`); // Parse date and time as local timezone to avoid timezone issues
const [year, month, day] = date.split('-').map(Number);
const [hours, minutes, seconds] = time.split(':').map(Number);
const eventDate = new Date(year, month - 1, day, hours, minutes, seconds || 0);
return eventDate.toISOString().replace(/[-:]/g, '').split('.')[0] + 'Z'; return eventDate.toISOString().replace(/[-:]/g, '').split('.')[0] + 'Z';
}; };

View File

@@ -1,11 +1,14 @@
import type { Event } from './types'; import type { Event } from './types';
export const formatDate = (dateString: string): string => { export const formatDate = (dateString: string): string => {
const date = new Date(dateString); // Parse the date string as local date to avoid timezone issues
const year = date.getFullYear(); // Split the date string and create a Date object in local timezone
const month = String(date.getMonth() + 1).padStart(2, '0'); const [year, month, day] = dateString.split('-').map(Number);
const day = String(date.getDate()).padStart(2, '0'); const date = new Date(year, month - 1, day); // month is 0-indexed in Date constructor
return `${year}/${month}/${day}`; const formattedYear = date.getFullYear();
const formattedMonth = String(date.getMonth() + 1).padStart(2, '0');
const formattedDay = String(date.getDate()).padStart(2, '0');
return `${formattedYear}/${formattedMonth}/${formattedDay}`;
}; };
export const formatTime = (timeString: string): string => { export const formatTime = (timeString: string): string => {
@@ -17,7 +20,10 @@ export const formatTime = (timeString: string): string => {
export const isEventInTimeRange = (event: Event, timeFilter: string): boolean => { export const isEventInTimeRange = (event: Event, timeFilter: string): boolean => {
if (timeFilter === 'any') return true; if (timeFilter === 'any') return true;
const eventDate = new Date(`${event.date}T${event.time}`); // Parse date and time as local timezone to avoid timezone issues
const [year, month, day] = event.date.split('-').map(Number);
const [hours, minutes, seconds] = event.time.split(':').map(Number);
const eventDate = new Date(year, month - 1, day, hours, minutes, seconds || 0);
const now = new Date(); const now = new Date();
// Handle temporal status filters // Handle temporal status filters

View File

@@ -56,7 +56,13 @@ export const actions: Actions = {
}); });
} }
if (new Date(date) < new Date()) { // Check if date is in the past using local timezone
const [year, month, day] = date.split('-').map(Number);
const eventDate = new Date(year, month - 1, day);
const today = new Date();
today.setHours(0, 0, 0, 0);
if (eventDate < today) {
return fail(400, { return fail(400, {
error: 'Date cannot be in the past.', error: 'Date cannot be in the past.',
values: { values: {
@@ -105,7 +111,7 @@ export const actions: Actions = {
type: type, type: type,
attendeeLimit: type === 'limited' ? parseInt(attendeeLimit) : null, attendeeLimit: type === 'limited' ? parseInt(attendeeLimit) : null,
visibility: visibility, visibility: visibility,
userId: userId userId: userId!
}) })
.catch((error) => { .catch((error) => {
console.error('Unexpected error', error); console.error('Unexpected error', error);

View File

@@ -1,11 +1,14 @@
<script lang="ts"> <script lang="ts">
import type { Event, EventType } from '$lib/types'; import type { Event, EventType } from '$lib/types';
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
import type { PageData } from '../$types';
import { formatTime, formatDate, isEventInTimeRange } from '$lib/dateHelpers'; import { formatTime, formatDate, isEventInTimeRange } from '$lib/dateHelpers';
import { t } from '$lib/i18n/i18n.js'; import { t } from '$lib/i18n/i18n.js';
import Fuse from 'fuse.js'; import Fuse from 'fuse.js';
type DiscoverPageData = {
events: Event[];
};
let publicEvents: Event[] = []; let publicEvents: Event[] = [];
let error = ''; let error = '';
let searchQuery = ''; let searchQuery = '';
@@ -16,7 +19,7 @@
let showFilters = false; let showFilters = false;
let fuse: Fuse<Event>; let fuse: Fuse<Event>;
export let data: PageData; export let data: DiscoverPageData;
// Use the server-side data // Use the server-side data
$: publicEvents = data?.events || []; $: publicEvents = data?.events || [];
@@ -67,8 +70,15 @@
// Sort events by date and time // Sort events by date and time
events = events.sort((a, b) => { events = events.sort((a, b) => {
const dateA = new Date(`${a.date}T${a.time}`); // Parse dates as local timezone to avoid timezone issues
const dateB = new Date(`${b.date}T${b.time}`); const parseEventDateTime = (event: Event) => {
const [year, month, day] = event.date.split('-').map(Number);
const [hours, minutes, seconds] = event.time.split(':').map(Number);
return new Date(year, month - 1, day, hours, minutes, seconds || 0);
};
const dateA = parseEventDateTime(a);
const dateB = parseEventDateTime(b);
if (selectedSortOrder === 'asc') { if (selectedSortOrder === 'asc') {
return dateA.getTime() - dateB.getTime(); return dateA.getTime() - dateB.getTime();

View File

@@ -86,8 +86,9 @@ export const actions: Actions = {
}); });
} }
// Check if date is in the past (but allow editing past events for corrections) // Check if date is in the past using local timezone (but allow editing past events for corrections)
const eventDate = new Date(date); const [year, month, day] = date.split('-').map(Number);
const eventDate = new Date(year, month - 1, day);
const today = new Date(); const today = new Date();
today.setHours(0, 0, 0, 0); today.setHours(0, 0, 0, 0);