You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.6 KiB
47 lines
1.6 KiB
import { ExtendedKind } from '@/constants' |
|
import { cardEventBodyBlurb } from '@/lib/card-event-body-blurb' |
|
import { getLongFormArticleMetadataFromEvent } from '@/lib/event-metadata' |
|
import type { Event } from 'nostr-tools' |
|
import { kinds } from 'nostr-tools' |
|
|
|
const DOC_KINDS = new Set<number>([ |
|
kinds.LongFormArticle, |
|
ExtendedKind.WIKI_ARTICLE, |
|
ExtendedKind.WIKI_ARTICLE_MARKDOWN, |
|
ExtendedKind.PUBLICATION, |
|
ExtendedKind.PUBLICATION_CONTENT |
|
]) |
|
|
|
/** |
|
* True if {@link NoteCard} should show a non-empty body in merged NIP-50 search rows. |
|
* Drops indexer stubs / empty shells that only show the “seen on” strip. |
|
*/ |
|
export function mergedSearchNoteHasPreviewBody(ev: Event): boolean { |
|
const k = ev.kind |
|
if (k === kinds.ShortTextNote || k === ExtendedKind.COMMENT) { |
|
if (ev.tags.some((t) => t[0] === 'subject' && String(t[1] ?? '').trim().length > 0)) return true |
|
return Boolean(ev.content?.trim().length) |
|
} |
|
if (k === kinds.Metadata) { |
|
const c = ev.content?.trim() ?? '' |
|
if (c.length < 2) return false |
|
try { |
|
const j = JSON.parse(c) as { |
|
name?: unknown |
|
display_name?: unknown |
|
about?: unknown |
|
nip05?: unknown |
|
} |
|
const pick = (v: unknown) => (typeof v === 'string' ? v.trim() : '') |
|
return Boolean(pick(j.name) || pick(j.display_name) || pick(j.about) || pick(j.nip05)) |
|
} catch { |
|
return c.length >= 2 |
|
} |
|
} |
|
if (DOC_KINDS.has(k)) { |
|
const m = getLongFormArticleMetadataFromEvent(ev) |
|
if (m.title?.trim() || m.summary?.trim() || m.image?.trim() || m.tags.length > 0) return true |
|
return Boolean(cardEventBodyBlurb(ev.content).trim()) |
|
} |
|
return true |
|
}
|
|
|