import { filterForEventsTaggingId, NDKEvent } from '@nostr-dev-kit/ndk' import { NDKContextType } from 'contexts/NDKContext' import { LoaderFunctionArgs, redirect } from 'react-router-dom' import { toast } from 'react-toastify' import { appRoutes } from 'routes' import { BlogDetails } from 'types' import { getFirstTagValue, getFirstTagValueAsInt, getTagValue, log, LogType } from 'utils' export const blogRouteLoader = (ndkContext: NDKContextType) => async ({ params }: LoaderFunctionArgs) => { const { naddr } = params if (!naddr) { log(true, LogType.Error, 'Required naddr.') return redirect(appRoutes.blogs) } try { const filter = filterForEventsTaggingId(naddr) if (!filter) { log(true, LogType.Error, 'Unable to create filter from blog naddr.') return redirect(appRoutes.blogs) } const event = await ndkContext.fetchEvent(filter) console.log(event) if (event) { const blogDetails = extractBlogDetails(event) console.log(blogDetails) return blogDetails } return null } catch (error) { log( true, LogType.Error, 'An error occurred in fetching blog details from relays', error ) toast.error('An error occurred in fetching mod details from relays') return redirect(appRoutes.blogs) } } function extractBlogDetails(event: NDKEvent): Partial { return { title: getFirstTagValue(event, 'title'), content: event.content, summary: getFirstTagValue(event, 'summary'), image: getFirstTagValue(event, 'image'), nsfw: getFirstTagValue(event, 'nsfw') === 'true', id: event.id, author: event.pubkey, published_at: getFirstTagValueAsInt(event, 'published_at'), edited_at: event.created_at, rTag: getFirstTagValue(event, 'r') || 'N/A', dTag: getFirstTagValue(event, 'd'), aTag: getFirstTagValue(event, 'a'), tTags: getTagValue(event, 't') || [] } }