diff --git a/app/(app)/calendar/[naddr]/page.tsx b/app/(app)/calendar/[naddr]/page.tsx index 0e1bb9d..b04fe12 100644 --- a/app/(app)/calendar/[naddr]/page.tsx +++ b/app/(app)/calendar/[naddr]/page.tsx @@ -15,6 +15,7 @@ import { type NDKKind } from "@nostr-dev-kit/ndk"; import Header from "./_components/Header"; import EventsFromCalendar from "@/containers/EventsTimeline/EventsFromCalendar"; import { add } from "@/lib/server-actions/events/cache"; +import { unixTimeNowInSeconds } from "@/lib/nostr/dates"; export default function EventPage({ params: { naddr }, @@ -61,8 +62,6 @@ export default function EventPage({ ); } - const { tags } = event; - const eventReference = event.encode(); return (
@@ -73,6 +72,10 @@ export default function EventPage({
+ parseInt(getTagValues("start", e.tags) ?? "0") > + unixTimeNowInSeconds() + } empty={() => (

No upcoming events

diff --git a/app/(app)/explore/_components/CalendarCard.tsx b/app/(app)/explore/_components/CalendarCard.tsx index 1e8a0a5..511f716 100644 --- a/app/(app)/explore/_components/CalendarCard.tsx +++ b/app/(app)/explore/_components/CalendarCard.tsx @@ -24,7 +24,7 @@ import { import { Skeleton } from "@/components/ui/skeleton"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { unixTimeNowInSeconds } from "@/lib/nostr/dates"; - +import { uniqBy } from "ramda"; type CalendarCardProps = { calendar: NDKEvent; }; @@ -61,7 +61,9 @@ export default function CalendarCard({ calendar }: CalendarCardProps) { unixTimeNowInSeconds(), ); const sortedEvents = sortEventsByTagNumber(filteredEvents, "start"); - setUpcomingEvents(sortedEvents); + setUpcomingEvents( + uniqBy((e) => getTagValues("name", e.tags), sortedEvents), + ); } }, [events]); diff --git a/containers/EventsTimeline/EventsFromCalendar.tsx b/containers/EventsTimeline/EventsFromCalendar.tsx index 921074e..d41243e 100644 --- a/containers/EventsTimeline/EventsFromCalendar.tsx +++ b/containers/EventsTimeline/EventsFromCalendar.tsx @@ -9,26 +9,26 @@ import CalendarSection, { CalendarSectionLoading } from "./CalendarSection"; import useEvents from "@/lib/hooks/useEvents"; type EventsFromCalendar = { calendar: NDKEvent; + secondaryFilter?: (event: NDKEvent) => Boolean; loader?: () => JSX.Element; empty?: () => JSX.Element; }; export default function EventsFromCalendar({ calendar, + secondaryFilter, loader: Loader, empty: Empty, }: EventsFromCalendar) { const calendarEvents = getTagsValues("a", calendar.tags); - const { ndk } = useNDK(); const [eventsByDay, setEventsByDay] = useState([]); - const [isFetching, setIsFetching] = useState(false); const calendarEventIdentifiers = calendarEvents .filter(Boolean) .map((e) => nip19.decode(e)) .filter(({ type }) => type === "naddr") .map((e) => e.data as nip19.AddressPointer); - const { events } = useEvents({ + const { events, isLoading } = useEvents({ filter: { kinds: calendarEventIdentifiers.map((k) => k.kind), authors: calendarEventIdentifiers.map((k) => k.pubkey), @@ -37,11 +37,16 @@ export default function EventsFromCalendar({ }); useEffect(() => { if (events) { - const grouped = groupEventsByDay(events); - setEventsByDay(grouped); + if (secondaryFilter) { + const grouped = groupEventsByDay(events.filter(secondaryFilter)); + setEventsByDay(grouped); + } else { + const grouped = groupEventsByDay(events); + setEventsByDay(grouped); + } } }, [events]); - if (isFetching) { + if (isLoading) { if (Loader) { return ; }