mirror of
https://github.com/dergigi/boris.git
synced 2025-12-17 06:34:24 +01:00
- Fix getNpubFallbackDisplay to return names without @ prefix - Update all call sites to consistently add @ when rendering mentions - Fix incomplete error handling in getNpubFallbackDisplay catch block - Add nprofile support to addLoadingClassToProfileLinks - Extract shared isProfileInCacheOrStore utility to eliminate duplicate loading state checks - Update ResolvedMention and NostrMentionLink to use shared utility This ensures consistent @ prefix handling across all profile display contexts and eliminates code duplication for profile loading state detection.
58 lines
1.7 KiB
TypeScript
58 lines
1.7 KiB
TypeScript
import React, { useMemo } from 'react'
|
|
import { Link } from 'react-router-dom'
|
|
import { useEventModel } from 'applesauce-react/hooks'
|
|
import { Hooks } from 'applesauce-react'
|
|
import { Models, Helpers } from 'applesauce-core'
|
|
import { decode, npubEncode } from 'nostr-tools/nip19'
|
|
import { getProfileDisplayName } from '../utils/nostrUriResolver'
|
|
import { isProfileInCacheOrStore } from '../utils/profileLoadingUtils'
|
|
|
|
const { getPubkeyFromDecodeResult } = Helpers
|
|
|
|
interface ResolvedMentionProps {
|
|
encoded?: string
|
|
}
|
|
|
|
const ResolvedMention: React.FC<ResolvedMentionProps> = ({ encoded }) => {
|
|
if (!encoded) return null
|
|
let pubkey: string | undefined
|
|
try {
|
|
pubkey = getPubkeyFromDecodeResult(decode(encoded))
|
|
} catch {
|
|
// ignore; will fallback to showing the encoded value
|
|
}
|
|
|
|
const eventStore = Hooks.useEventStore()
|
|
const profile = pubkey ? useEventModel(Models.ProfileModel, [pubkey]) : undefined
|
|
|
|
// Check if profile is in cache or eventStore
|
|
const isInCacheOrStore = useMemo(() => {
|
|
if (!pubkey) return false
|
|
return isProfileInCacheOrStore(pubkey, eventStore)
|
|
}, [pubkey, eventStore])
|
|
|
|
// Show loading if profile doesn't exist and not in cache/store
|
|
const isLoading = !profile && pubkey && !isInCacheOrStore
|
|
|
|
const display = pubkey ? getProfileDisplayName(profile, pubkey) : encoded
|
|
const npub = pubkey ? npubEncode(pubkey) : undefined
|
|
|
|
if (npub) {
|
|
const className = isLoading ? 'nostr-mention profile-loading' : 'nostr-mention'
|
|
return (
|
|
<Link
|
|
to={`/p/${npub}`}
|
|
className={className}
|
|
>
|
|
@{display}
|
|
</Link>
|
|
)
|
|
}
|
|
|
|
return <span className="nostr-mention">{encoded}</span>
|
|
}
|
|
|
|
export default ResolvedMention
|
|
|
|
|