flockstr/containers/EventsTimeline/EventsFromCalendar.tsx

96 lines
2.7 KiB
TypeScript
Raw Normal View History

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;
loader?: () => JSX.Element;
empty?: () => JSX.Element;
};
export default function EventsFromCalendar({
calendar,
loader: Loader,
empty: Empty,
}: EventsFromCalendar) {
2023-10-31 10:26:17 -04:00
const calendarEvents = getTagsValues("a", calendar.tags);
2023-10-28 11:07:50 -04:00
const { ndk } = useNDK();
2023-11-01 16:54:16 -04:00
const [eventsByDay, setEventsByDay] = useState<NDKEvent[][]>([]);
2023-10-28 11:07:50 -04:00
const [isFetching, setIsFetching] = useState(false);
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-10-28 11:07:50 -04:00
.map((e) => nip19.decode(e))
.filter(({ type }) => type === "naddr")
.map((e) => e.data as nip19.AddressPointer);
2023-11-01 16:54:16 -04:00
const { events } = useEvents({
filter: {
kinds: calendarEventIdentifiers.map((k) => k.kind),
authors: calendarEventIdentifiers.map((k) => k.pubkey),
["#d"]: calendarEventIdentifiers.map((k) => k.identifier),
},
});
// async function handleFetchEvents(data: nip19.AddressPointer[]) {
// if (!ndk) return;
// setIsFetching(true);
// const events: NDKEvent[] = [];
// const promiseArray = [];
// for (const info of data) {
// console.log("INFO", info);
// const calendarEventPromise = ndk
// .fetchEvent({
// authors: [info.pubkey],
// ["#d"]: [info.identifier],
// kinds: [info.kind],
// })
// .then((e) => e && events.push(e))
// .catch((err) => console.log("err"));
// promiseArray.push(calendarEventPromise);
// }
// await Promise.all(promiseArray);
// setEvents(events);
// setIsFetching(false);
// }
2023-10-28 11:07:50 -04:00
2023-11-01 16:54:16 -04:00
// useEffect(() => {
// if (
// !ndk ||
// calendarEventIdentifiers.length === 0 ||
// isFetching ||
// events.length
// )
// return;
// handleFetchEvents(calendarEventIdentifiers);
// }, [ndk, calendarEventIdentifiers]);
2023-10-28 11:07:50 -04:00
useEffect(() => {
2023-11-01 16:54:16 -04:00
if (events) {
const grouped = groupEventsByDay(events);
console.log("Runnign group", events, " to", grouped);
setEventsByDay(grouped);
}
}, [events]);
console.log(eventsByDay);
2023-10-28 11:07:50 -04:00
if (isFetching) {
if (Loader) {
return <Loader />;
}
return <CalendarSectionLoading />;
}
if (Empty && eventsByDay.length === 0) {
return <Empty />;
}
return (
<>
{eventsByDay.map((e) => (
<CalendarSection events={e} />
))}
</>
);
}