2023-10-28 11:07:50 -04:00
|
|
|
"use client";
|
|
|
|
import { useState, useEffect } from "react";
|
|
|
|
import { NDKEvent } from "@nostr-dev-kit/ndk";
|
2023-10-31 10:26:17 -04:00
|
|
|
import { getTagsValues } from "@/lib/nostr/utils";
|
2023-10-28 11:07:50 -04:00
|
|
|
import { groupEventsByDay } from ".";
|
|
|
|
import { useNDK } from "@/app/_providers/ndk";
|
|
|
|
import { nip19 } from "nostr-tools";
|
|
|
|
import CalendarSection, { CalendarSectionLoading } from "./CalendarSection";
|
2023-11-01 16:54:16 -04:00
|
|
|
import useEvents from "@/lib/hooks/useEvents";
|
2023-10-28 11:07:50 -04:00
|
|
|
type EventsFromCalendar = {
|
|
|
|
calendar: NDKEvent;
|
2023-11-02 16:11:46 -04:00
|
|
|
secondaryFilter?: (event: NDKEvent) => Boolean;
|
2023-10-28 11:07:50 -04:00
|
|
|
loader?: () => JSX.Element;
|
|
|
|
empty?: () => JSX.Element;
|
|
|
|
};
|
|
|
|
|
|
|
|
export default function EventsFromCalendar({
|
|
|
|
calendar,
|
2023-11-02 16:11:46 -04:00
|
|
|
secondaryFilter,
|
2023-10-28 11:07:50 -04:00
|
|
|
loader: Loader,
|
|
|
|
empty: Empty,
|
|
|
|
}: EventsFromCalendar) {
|
2023-10-31 10:26:17 -04:00
|
|
|
const calendarEvents = getTagsValues("a", calendar.tags);
|
2023-11-01 16:54:16 -04:00
|
|
|
const [eventsByDay, setEventsByDay] = useState<NDKEvent[][]>([]);
|
2023-10-31 10:26:17 -04:00
|
|
|
|
2023-10-28 11:07:50 -04:00
|
|
|
const calendarEventIdentifiers = calendarEvents
|
2023-10-31 10:26:17 -04:00
|
|
|
.filter(Boolean)
|
2023-11-03 09:14:20 -04:00
|
|
|
.map((e) => {
|
|
|
|
if (nip19.BECH32_REGEX.test(e) && e.includes(":")) {
|
|
|
|
const [kind, pubkey, identifier] = e.split(":") as [
|
|
|
|
string,
|
|
|
|
string,
|
|
|
|
string,
|
|
|
|
];
|
|
|
|
return {
|
|
|
|
type: "naddr",
|
|
|
|
data: {
|
|
|
|
kind,
|
|
|
|
pubkey,
|
|
|
|
identifier,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
} else {
|
|
|
|
return nip19.decode(e);
|
|
|
|
}
|
|
|
|
})
|
2023-10-28 11:07:50 -04:00
|
|
|
.filter(({ type }) => type === "naddr")
|
|
|
|
.map((e) => e.data as nip19.AddressPointer);
|
2023-11-02 16:11:46 -04:00
|
|
|
const { events, isLoading } = useEvents({
|
2023-11-01 16:54:16 -04:00
|
|
|
filter: {
|
|
|
|
kinds: calendarEventIdentifiers.map((k) => k.kind),
|
|
|
|
authors: calendarEventIdentifiers.map((k) => k.pubkey),
|
|
|
|
["#d"]: calendarEventIdentifiers.map((k) => k.identifier),
|
|
|
|
},
|
|
|
|
});
|
2023-10-28 11:07:50 -04:00
|
|
|
useEffect(() => {
|
2023-11-01 16:54:16 -04:00
|
|
|
if (events) {
|
2023-11-02 16:11:46 -04:00
|
|
|
if (secondaryFilter) {
|
|
|
|
const grouped = groupEventsByDay(events.filter(secondaryFilter));
|
2023-11-02 18:29:58 -04:00
|
|
|
console.log("rouped events", grouped);
|
2023-11-02 16:11:46 -04:00
|
|
|
setEventsByDay(grouped);
|
|
|
|
} else {
|
|
|
|
const grouped = groupEventsByDay(events);
|
|
|
|
setEventsByDay(grouped);
|
|
|
|
}
|
2023-11-01 16:54:16 -04:00
|
|
|
}
|
|
|
|
}, [events]);
|
2023-11-02 16:11:46 -04:00
|
|
|
if (isLoading) {
|
2023-10-28 11:07:50 -04:00
|
|
|
if (Loader) {
|
|
|
|
return <Loader />;
|
|
|
|
}
|
|
|
|
return <CalendarSectionLoading />;
|
|
|
|
}
|
|
|
|
if (Empty && eventsByDay.length === 0) {
|
|
|
|
return <Empty />;
|
|
|
|
}
|
|
|
|
return (
|
|
|
|
<>
|
|
|
|
{eventsByDay.map((e) => (
|
|
|
|
<CalendarSection events={e} />
|
|
|
|
))}
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
}
|