71 lines
2.0 KiB
TypeScript
71 lines
2.0 KiB
TypeScript
|
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') || []
|
||
|
}
|
||
|
}
|