diff --git a/packages/app/src/Element/Embed/Mention.tsx b/packages/app/src/Element/Embed/Mention.tsx index a54ec56c..3739917b 100644 --- a/packages/app/src/Element/Embed/Mention.tsx +++ b/packages/app/src/Element/Embed/Mention.tsx @@ -1,21 +1,16 @@ -import { useMemo } from "react"; import { Link } from "react-router-dom"; import { HexKey } from "@snort/system"; import { useUserProfile } from "@snort/system-react"; import { profileLink } from "SnortUtils"; -import { getDisplayName } from "Element/User/ProfileImage"; +import DisplayName from "../User/DisplayName"; export default function Mention({ pubkey, relays }: { pubkey: HexKey; relays?: Array | string }) { const user = useUserProfile(pubkey); - const name = useMemo(() => { - return getDisplayName(user, pubkey); - }, [user, pubkey]); - return ( e.stopPropagation()}> - @{name} + @ ); } diff --git a/packages/app/src/Element/Embed/PubkeyList.tsx b/packages/app/src/Element/Embed/PubkeyList.tsx index d604563d..d3ce0ba8 100644 --- a/packages/app/src/Element/Embed/PubkeyList.tsx +++ b/packages/app/src/Element/Embed/PubkeyList.tsx @@ -7,7 +7,7 @@ import FollowListBase from "Element/User/FollowListBase"; import AsyncButton from "Element/AsyncButton"; import { useWallet } from "Wallet"; import { Toastore } from "Toaster"; -import { getDisplayName } from "Element/User/ProfileImage"; +import { getDisplayName } from "Element/User/DisplayName"; import { UserCache } from "Cache"; import useLogin from "Hooks/useLogin"; import useEventPublisher from "Hooks/useEventPublisher"; diff --git a/packages/app/src/Element/Event/NoteFooter.tsx b/packages/app/src/Element/Event/NoteFooter.tsx index eed07d57..f5e4617e 100644 --- a/packages/app/src/Element/Event/NoteFooter.tsx +++ b/packages/app/src/Element/Event/NoteFooter.tsx @@ -18,7 +18,7 @@ import { useInteractionCache } from "Hooks/useInteractionCache"; import { ZapPoolController } from "ZapPoolController"; import { System } from "index"; import { Zapper, ZapTarget } from "Zapper"; -import { getDisplayName } from "../User/ProfileImage"; +import { getDisplayName } from "Element/User/DisplayName"; import { useNoteCreator } from "State/NoteCreator"; import messages from "../messages"; diff --git a/packages/app/src/Element/Event/NoteReaction.tsx b/packages/app/src/Element/Event/NoteReaction.tsx index a398c335..923a51a2 100644 --- a/packages/app/src/Element/Event/NoteReaction.tsx +++ b/packages/app/src/Element/Event/NoteReaction.tsx @@ -4,7 +4,7 @@ import { useMemo } from "react"; import { EventKind, NostrEvent, TaggedNostrEvent, NostrPrefix, EventExt } from "@snort/system"; import Note from "Element/Event/Note"; -import { getDisplayName } from "Element/User/ProfileImage"; +import { getDisplayName } from "Element/User/DisplayName"; import { eventLink, hexToBech32 } from "SnortUtils"; import useModeration from "Hooks/useModeration"; import FormattedMessage from "Element/FormattedMessage"; diff --git a/packages/app/src/Element/User/Avatar.tsx b/packages/app/src/Element/User/Avatar.tsx index 2fd201fe..d7c0b736 100644 --- a/packages/app/src/Element/User/Avatar.tsx +++ b/packages/app/src/Element/User/Avatar.tsx @@ -4,7 +4,7 @@ import { CSSProperties, ReactNode, useEffect, useState } from "react"; import type { UserMetadata } from "@snort/system"; import useImgProxy from "Hooks/useImgProxy"; -import { getDisplayName } from "Element/User/ProfileImage"; +import { getDisplayName } from "Element/User/DisplayName"; import { defaultAvatar } from "SnortUtils"; interface AvatarProps { diff --git a/packages/app/src/Element/User/DisplayName.css b/packages/app/src/Element/User/DisplayName.css new file mode 100644 index 00000000..a68803c4 --- /dev/null +++ b/packages/app/src/Element/User/DisplayName.css @@ -0,0 +1,3 @@ +.placeholder { + color: var(--gray-light); +} diff --git a/packages/app/src/Element/User/DisplayName.tsx b/packages/app/src/Element/User/DisplayName.tsx new file mode 100644 index 00000000..0b132a02 --- /dev/null +++ b/packages/app/src/Element/User/DisplayName.tsx @@ -0,0 +1,39 @@ +import "./DisplayName.css"; + +import React, { useMemo } from "react"; +import { HexKey, UserMetadata, NostrPrefix } from "@snort/system"; +import AnimalName from "Element/User/AnimalName"; +import { hexToBech32 } from "SnortUtils"; + +interface DisplayNameProps { + pubkey: HexKey; + user: UserMetadata | undefined; +} + +export function getDisplayName(user: UserMetadata | undefined, pubkey: HexKey): string { + return getDisplayNameOrPlaceHolder(user, pubkey)[0]; +} + +export function getDisplayNameOrPlaceHolder(user: UserMetadata | undefined, pubkey: HexKey): [string, boolean] { + let name = hexToBech32(NostrPrefix.PublicKey, pubkey).substring(0, 12); + let isPlaceHolder = false; + + if (user?.display_name) { + name = user.display_name; + } else if (user?.name) { + name = user.name; + } else if (pubkey && process.env.ANIMAL_NAME_PLACEHOLDERS) { + name = AnimalName(pubkey); + isPlaceHolder = true; + } + + return [name.trim(), isPlaceHolder]; +} + +const DisplayName = ({ pubkey, user }: DisplayNameProps) => { + const [name, isPlaceHolder] = useMemo(() => getDisplayNameOrPlaceHolder(user, pubkey), [user, pubkey]); + + return {name}; +}; + +export default DisplayName; diff --git a/packages/app/src/Element/User/ProfileImage.css b/packages/app/src/Element/User/ProfileImage.css index f35555b1..ec37206c 100644 --- a/packages/app/src/Element/User/ProfileImage.css +++ b/packages/app/src/Element/User/ProfileImage.css @@ -32,7 +32,3 @@ a.pfp { .pfp a { text-decoration: none; } - -.placeholder { - color: var(--gray-medium); -} diff --git a/packages/app/src/Element/User/ProfileImage.tsx b/packages/app/src/Element/User/ProfileImage.tsx index 3486932e..7fc6d6b1 100644 --- a/packages/app/src/Element/User/ProfileImage.tsx +++ b/packages/app/src/Element/User/ProfileImage.tsx @@ -1,16 +1,16 @@ import "./ProfileImage.css"; -import React, { ReactNode, useMemo } from "react"; +import React, { ReactNode } from "react"; import { Link } from "react-router-dom"; -import { HexKey, NostrPrefix, UserMetadata } from "@snort/system"; +import { HexKey, UserMetadata } from "@snort/system"; import { useUserProfile } from "@snort/system-react"; -import { hexToBech32, profileLink } from "SnortUtils"; +import { profileLink } from "SnortUtils"; import Avatar from "Element/User/Avatar"; import Nip05 from "Element/User/Nip05"; import useLogin from "Hooks/useLogin"; import Icon from "Icons/Icon"; -import AnimalName from "./AnimalName"; +import DisplayName from "./DisplayName"; export interface ProfileImageProps { pubkey: HexKey; @@ -50,10 +50,6 @@ export default function ProfileImage({ const { follows } = useLogin(); const doesFollow = follows.item.includes(pubkey); - const [name, isPlaceHolder] = useMemo(() => { - return overrideUsername ? [overrideUsername, false] : getDisplayNameOrPlaceHolder(user, pubkey); - }, [user, pubkey, overrideUsername]); - function handleClick(e: React.MouseEvent) { if (link === "") { e.preventDefault(); @@ -87,7 +83,7 @@ export default function ProfileImage({ {showUsername && (
-
{name.trim()}
+ {overrideUsername ? overrideUsername : } {nip05 && }
{subHeader}
@@ -114,27 +110,3 @@ export default function ProfileImage({ ); } } - -export function getDisplayNameOrPlaceHolder(user: UserMetadata | undefined, pubkey: HexKey): [string, boolean] { - let name = hexToBech32(NostrPrefix.PublicKey, pubkey).substring(0, 12); - let isPlaceHolder = false; - if (typeof user?.display_name === "string" && user.display_name.length > 0) { - name = user.display_name; - } else if (typeof user?.name === "string" && user.name.length > 0) { - name = user.name; - } else if (pubkey && process.env.ANIMAL_NAME_PLACEHOLDERS) { - name = AnimalName(pubkey); - isPlaceHolder = true; - } - return [name, isPlaceHolder]; -} - -export function getDisplayName(user: UserMetadata | undefined, pubkey: HexKey): string { - let name = hexToBech32(NostrPrefix.PublicKey, pubkey).substring(0, 12); - if (typeof user?.display_name === "string" && user.display_name.length > 0) { - name = user.display_name; - } else if (typeof user?.name === "string" && user.name.length > 0) { - name = user.name; - } - return name; -} diff --git a/packages/app/src/Notifications.ts b/packages/app/src/Notifications.ts index 4da9df5a..814d55af 100644 --- a/packages/app/src/Notifications.ts +++ b/packages/app/src/Notifications.ts @@ -1,5 +1,5 @@ import { TaggedNostrEvent, EventKind, MetadataCache } from "@snort/system"; -import { getDisplayName } from "Element/User/ProfileImage"; +import { getDisplayName } from "Element/User/DisplayName"; import { MentionRegex } from "Const"; import { defaultAvatar, tagFilterOfTextRepost, unwrap } from "SnortUtils"; import { UserCache } from "Cache"; diff --git a/packages/app/src/Pages/MessagesPage.tsx b/packages/app/src/Pages/MessagesPage.tsx index e3c69585..a5c609a2 100644 --- a/packages/app/src/Pages/MessagesPage.tsx +++ b/packages/app/src/Pages/MessagesPage.tsx @@ -7,7 +7,7 @@ import { NostrLink, NostrPrefix, TLVEntryType, UserMetadata, decodeTLV } from "@ import { useUserProfile, useUserSearch } from "@snort/system-react"; import UnreadCount from "Element/UnreadCount"; -import ProfileImage, { getDisplayName } from "Element/User/ProfileImage"; +import ProfileImage from "Element/User/ProfileImage"; import { appendDedupe, debounce, parseId } from "SnortUtils"; import NoteToSelf from "Element/User/NoteToSelf"; import useModeration from "Hooks/useModeration"; @@ -25,6 +25,7 @@ import { useEventFeed } from "Feed/EventFeed"; import { LoginSession, LoginStore } from "Login"; import { Nip28ChatSystem } from "chat/nip28"; import { ChatParticipantProfile } from "Element/Chat/ChatParticipant"; +import { getDisplayName } from "../Element/User/DisplayName"; const TwoCol = 768; const ThreeCol = 1500; diff --git a/packages/app/src/Pages/Notifications.tsx b/packages/app/src/Pages/Notifications.tsx index 3e0325a5..d03b8a90 100644 --- a/packages/app/src/Pages/Notifications.tsx +++ b/packages/app/src/Pages/Notifications.tsx @@ -12,13 +12,14 @@ import { markNotificationsRead } from "Login"; import { Notifications, UserCache } from "Cache"; import { dedupe, findTag, orderDescending } from "SnortUtils"; import Icon from "Icons/Icon"; -import ProfileImage, { getDisplayName } from "Element/User/ProfileImage"; +import ProfileImage from "Element/User/ProfileImage"; import useModeration from "Hooks/useModeration"; import { useEventFeed } from "Feed/EventFeed"; import Text from "Element/Text"; import { formatShort } from "Number"; import { LiveEvent } from "Element/LiveEvent"; import ProfilePreview from "Element/User/ProfilePreview"; +import { getDisplayName } from "../Element/User/DisplayName"; function notificationContext(ev: TaggedNostrEvent) { switch (ev.kind) { diff --git a/packages/app/src/ZapPoolController.ts b/packages/app/src/ZapPoolController.ts index 99a290d4..6667e76e 100644 --- a/packages/app/src/ZapPoolController.ts +++ b/packages/app/src/ZapPoolController.ts @@ -1,5 +1,5 @@ import { UserCache } from "Cache"; -import { getDisplayName } from "Element/User/ProfileImage"; +import { getDisplayName } from "Element/User/DisplayName"; import { LNURL, ExternalStore, unixNow } from "@snort/shared"; import { Toastore } from "Toaster"; import { LNWallet, WalletInvoiceState, Wallets } from "Wallet";