Skip to content

Commit c425745

Browse files
committed
Merge branch 'main' of https://github.com/ericahan22/Wat2Do
2 parents e789f56 + 6548954 commit c425745

File tree

7 files changed

+70
-31
lines changed

7 files changed

+70
-31
lines changed

backend/apps/core/auth.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,17 @@
1818
class JwtAuthBackend(BaseBackend):
1919
def authenticate(self, request, **kwargs):
2020
if 'Authorization' not in request.headers:
21-
logger.warning("JWT auth: Missing Authorization header on %s %s", request.method, request.path)
21+
logger.warning(f"JWT auth: Missing Authorization header on {request.method} {request.path}")
2222
return None
2323

2424
try:
2525
auth_header = request.headers.get('Authorization')
2626
if not auth_header.startswith('Bearer '):
27-
logger.warning("JWT auth: Authorization header not Bearer on %s %s", request.method, request.path)
27+
logger.warning(f"JWT auth: Authorization header not Bearer on {request.method} {request.path}")
2828
return None
2929

3030
logger.debug(
31-
"JWT auth: attempting Clerk auth (aud=%s) on %s %s",
32-
CLERK_AUTHORIZED_PARTIES,
33-
request.method,
34-
request.path,
31+
f"JWT auth: attempting Clerk auth (aud={CLERK_AUTHORIZED_PARTIES}) on {request.method} {request.path}"
3532
)
3633
request_state = authenticate_request(
3734
request,
@@ -42,7 +39,7 @@ def authenticate(self, request, **kwargs):
4239
)
4340
if not request_state.is_signed_in:
4441
request.error_message = request_state.message
45-
logger.warning("JWT auth: Clerk rejected token: %s", request_state.message)
42+
logger.warning(f"JWT auth: Clerk rejected token: {request_state.message}")
4643
return None
4744
print(request_state.payload, 'request_state.payload')
4845
# Ideally at this point user object must be fetched from DB and returned, but we will just return a dummy

backend/scraping/instagram_feed.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -532,10 +532,7 @@ def check_post_limit():
532532
logger.error(f"Traceback: {traceback.format_exc()}")
533533

534534
logger.debug(
535-
"Feed processing completed. reason=%s, posts_processed=%d, events_added=%d",
536-
termination_reason,
537-
posts_processed,
538-
events_added,
535+
f"Feed processing completed. reason={termination_reason}, posts_processed={posts_processed}, events_added={events_added}"
539536
)
540537
logger.info("\n------------------------- Summary -------------------------")
541538
logger.info(f"Added {events_added} event(s) to Supabase")

frontend/src/features/events/components/EventsCalendar.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {
2020
DollarSign,
2121
} from "lucide-react";
2222
import "@/shared/styles/calendar.css";
23-
import { formatEventTimeRange, removeTimezoneInfo, formatPrettyDate } from "@/shared/lib/dateUtils";
23+
import { formatEventTimeRange, removeTimezoneInfo, formatEventDate } from "@/shared/lib/dateUtils";
2424
import { getClubTypeColor } from "@/shared/lib/clubTypeColors";
2525
import { Event } from "@/features/events";
2626
import { Tabs, TabsList, TabsTrigger } from "@/shared/components/ui/tabs";
@@ -103,7 +103,7 @@ const EventPopup: React.FC<{
103103
<div className="space-y-2 text-sm text-gray-600 dark:text-gray-400">
104104
<div className="flex items-center gap-2">
105105
<CalendarIcon className="h-4 w-4 flex-shrink-0" />
106-
<span>{formatPrettyDate(event.dtstart_utc)}</span>
106+
<span>{formatEventDate(event.dtstart_utc, event.dtend_utc)}</span>
107107
</div>
108108

109109
<div className="flex items-center gap-2">

frontend/src/features/events/components/EventsGrid.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import { Event, EVENTS_PER_PAGE } from "@/features/events";
2929
import { memo, useState, useMemo, useEffect } from "react";
3030
import {
3131
formatEventTimeRange,
32-
formatPrettyDate,
32+
formatEventDate,
3333
getDateCategory,
3434
} from "@/shared/lib/dateUtils";
3535
import { getEventStatus, isEventNew } from "@/shared/lib/eventUtils";
@@ -138,7 +138,7 @@ const EventsGrid = memo(
138138
};
139139

140140
paginatedData.forEach((event) => {
141-
const category = getDateCategory(event.dtstart_utc);
141+
const category = getDateCategory(event.dtstart_utc, event.dtend_utc);
142142
groups[category].push(event);
143143
});
144144

@@ -221,7 +221,7 @@ const EventsGrid = memo(
221221
<div className="flex items-center space-x-2 text-xs text-gray-600 dark:text-gray-400">
222222
<Calendar className="h-3.5 w-3.5 flex-shrink-0" />
223223
<span className="truncate">
224-
{formatPrettyDate(event.dtstart_utc)}
224+
{formatEventDate(event.dtstart_utc, event.dtend_utc)}
225225
</span>
226226
</div>
227227

frontend/src/features/events/pages/EventDetailPage.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { Button } from "@/shared/components/ui/button";
1414
import { Badge } from "@/shared/components/ui/badge";
1515
import { SEOHead } from "@/shared/components/SEOHead";
1616
import { API_BASE_URL } from "@/shared/constants/api";
17-
import { formatEventTimeRange, formatPrettyDate } from "@/shared/lib/dateUtils";
17+
import { formatEventTimeRange, formatEventDate } from "@/shared/lib/dateUtils";
1818
import { getEventStatus, isEventNew } from "@/shared/lib/eventUtils";
1919
import { Event } from "@/features/events/types/events";
2020
import BadgeMask from "@/shared/components/ui/badge-mask";
@@ -131,7 +131,7 @@ function EventDetailPage() {
131131
title={`${event.title} - Event Details`}
132132
description={
133133
event.description ||
134-
`Join us for ${event.title} on ${formatPrettyDate(event.dtstart_utc)}`
134+
`Join us for ${event.title} on ${formatEventDate(event.dtstart_utc, event.dtend_utc)}`
135135
}
136136
url={`/event/${event.id}`}
137137
keywords={[
@@ -207,7 +207,7 @@ function EventDetailPage() {
207207
<Calendar className="h-5 w-5 text-blue-600 dark:text-blue-400 flex-shrink-0" />
208208
<div>
209209
<p className="font-semibold text-gray-900 dark:text-white">
210-
{formatPrettyDate(event.dtstart_utc)}
210+
{formatEventDate(event.dtstart_utc, event.dtend_utc)}
211211
</p>
212212
<p className="text-sm text-gray-600 dark:text-gray-400">
213213
{formatEventTimeRange(event.dtstart_utc, event.dtend_utc)}

frontend/src/features/events/pages/EventsPage.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useCallback } from "react";
1+
import { useCallback, useMemo } from "react";
22
import { useSearchParams } from "react-router-dom";
33
import {
44
useEvents,
@@ -19,12 +19,16 @@ import {
1919
import { Calendar, History, LayoutGrid, Sparkles } from "lucide-react";
2020
import SearchInput from "@/features/search/components/SearchInput";
2121
import NumberFlow from "@number-flow/react";
22-
import { LAST_UPDATED } from "@/data/staticData";
22+
import { LAST_UPDATED, RECOMMENDED_FILTERS } from "@/data/staticData";
2323

2424
function EventsPage() {
2525
const [searchParams, setSearchParams] = useSearchParams();
2626
const view = (searchParams.get("view") as "grid" | "calendar") || "grid";
27-
const placeholder = searchParams.get("placeholder") || "Free food";
27+
const randomFilter = useMemo(() =>
28+
RECOMMENDED_FILTERS[Math.floor(Math.random() * RECOMMENDED_FILTERS.length)][2],
29+
[]
30+
);
31+
const placeholder = searchParams.get("placeholder") || randomFilter;
2832

2933
const handleViewChange = useCallback(
3034
(newView: "grid" | "calendar") => {
@@ -90,7 +94,7 @@ function EventsPage() {
9094
suffix={` ${getEventTypeText()} events`}
9195
/>
9296
</h1>
93-
<p>Updated {formatRelativeDateTime(LAST_UPDATED)}</p>
97+
<p className="text-gray-600 dark:text-gray-400">Updated {formatRelativeDateTime(LAST_UPDATED)}</p>
9498
</div>
9599

96100
<div className="flex flex-col gap-4">

frontend/src/shared/lib/dateUtils.ts

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,37 @@ export const formatPrettyDate = (dateString: string): string => {
2626
}
2727
}
2828

29+
/**
30+
* Format event date(s) in short format
31+
* Single day: "Friday Oct 31"
32+
* Multiple days: "Fri Oct 31 to Mon Nov 3"
33+
*/
34+
export const formatEventDate = (startDateString: string, endDateString?: string | null): string => {
35+
try {
36+
const startDate = new Date(removeTimezoneInfo(startDateString));
37+
38+
// If no end date or end date is the same day as start date
39+
if (!endDateString) {
40+
return format(startDate, "EEEE MMM d");
41+
}
42+
43+
const endDate = new Date(removeTimezoneInfo(endDateString));
44+
45+
// Check if events are on the same day (ignoring time)
46+
const startDateOnly = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate());
47+
const endDateOnly = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate());
48+
49+
if (startDateOnly.getTime() === endDateOnly.getTime()) {
50+
return format(startDate, "EEEE MMM d");
51+
}
52+
53+
// Multi-day event
54+
return `${format(startDate, "EEE MMM d")} to ${format(endDate, "EEE MMM d")}`;
55+
} catch {
56+
return startDateString; // Return original string if parsing fails
57+
}
58+
}
59+
2960
/**
3061
* Format a time string to a prettier format (e.g., "3pm" or "3:30pm")
3162
*/
@@ -94,10 +125,13 @@ export const formatDtstartToMidnight = (dtstart: string): string => {
94125

95126
/**
96127
* Get date category for event grouping (today, tomorrow, later this week, later this month, later, past)
128+
* For multi-day events, checks if today falls within the event's date range
97129
*/
98-
export const getDateCategory = (dateString: string): 'today' | 'tomorrow' | 'later this week' | 'later this month' | 'later' | 'past' => {
130+
export const getDateCategory = (startDateString: string, endDateString?: string | null): 'today' | 'tomorrow' | 'later this week' | 'later this month' | 'later' | 'past' => {
99131
try {
100-
const eventDate = new Date(removeTimezoneInfo(dateString));
132+
const eventStartDate = new Date(removeTimezoneInfo(startDateString));
133+
const eventEndDate = endDateString ? new Date(removeTimezoneInfo(endDateString)) : null;
134+
101135
const today = new Date();
102136
const tomorrow = new Date(today);
103137
tomorrow.setDate(today.getDate() + 1);
@@ -111,21 +145,28 @@ export const getDateCategory = (dateString: string): 'today' | 'tomorrow' | 'lat
111145
const endOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);
112146

113147
// Reset time to start of day for comparison
114-
const eventDateOnly = new Date(eventDate.getFullYear(), eventDate.getMonth(), eventDate.getDate());
148+
const eventStartDateOnly = new Date(eventStartDate.getFullYear(), eventStartDate.getMonth(), eventStartDate.getDate());
149+
const eventEndDateOnly = eventEndDate ? new Date(eventEndDate.getFullYear(), eventEndDate.getMonth(), eventEndDate.getDate()) : eventStartDateOnly;
115150
const todayOnly = new Date(today.getFullYear(), today.getMonth(), today.getDate());
116151
const tomorrowOnly = new Date(tomorrow.getFullYear(), tomorrow.getMonth(), tomorrow.getDate());
117152
const endOfWeekOnly = new Date(endOfWeek.getFullYear(), endOfWeek.getMonth(), endOfWeek.getDate());
118153
const endOfMonthOnly = new Date(endOfMonth.getFullYear(), endOfMonth.getMonth(), endOfMonth.getDate());
119154

120-
if (eventDateOnly.getTime() === todayOnly.getTime()) {
155+
// Check if today falls within the event's date range (for multi-day events)
156+
const todayTime = todayOnly.getTime();
157+
const isHappeningToday = todayTime >= eventStartDateOnly.getTime() && todayTime <= eventEndDateOnly.getTime();
158+
const isHappeningTomorrow = tomorrowOnly.getTime() >= eventStartDateOnly.getTime() && tomorrowOnly.getTime() <= eventEndDateOnly.getTime();
159+
160+
if (isHappeningToday) {
121161
return 'today';
122-
} else if (eventDateOnly.getTime() === tomorrowOnly.getTime()) {
162+
} else if (isHappeningTomorrow || eventStartDateOnly.getTime() === tomorrowOnly.getTime()) {
123163
return 'tomorrow';
124-
} else if (eventDateOnly.getTime() < todayOnly.getTime()) {
164+
} else if (eventEndDateOnly.getTime() < todayOnly.getTime()) {
165+
// Event has completely ended
125166
return 'past';
126-
} else if (eventDateOnly.getTime() <= endOfWeekOnly.getTime()) {
167+
} else if (eventStartDateOnly.getTime() <= endOfWeekOnly.getTime()) {
127168
return 'later this week';
128-
} else if (eventDateOnly.getTime() <= endOfMonthOnly.getTime()) {
169+
} else if (eventStartDateOnly.getTime() <= endOfMonthOnly.getTime()) {
129170
return 'later this month';
130171
} else {
131172
return 'later';

0 commit comments

Comments
 (0)