71 lines
2.0 KiB
TypeScript
Raw Normal View History

2024-10-31 20:14:29 +01:00
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<BlogDetails> {
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') || []
}
}