diff --git a/src/app/components/CalendarEventForm.svelte b/src/app/components/CalendarEventForm.svelte index f1146a0b..42e44ac5 100644 --- a/src/app/components/CalendarEventForm.svelte +++ b/src/app/components/CalendarEventForm.svelte @@ -81,7 +81,7 @@ } const content = initialValues?.content || "" - const editor = makeEditor({submit, uploading, content}) + const editor = makeEditor({url, submit, uploading, content}) let title = $state(initialValues?.title || "") let location = $state(initialValues?.location || "") diff --git a/src/app/components/CalendarEventItem.svelte b/src/app/components/CalendarEventItem.svelte index 7b4baeb4..981cb416 100644 --- a/src/app/components/CalendarEventItem.svelte +++ b/src/app/components/CalendarEventItem.svelte @@ -18,7 +18,7 @@
- Posted by + Posted by
diff --git a/src/app/components/CalendarEventMeta.svelte b/src/app/components/CalendarEventMeta.svelte index da0a887d..f08655e7 100644 --- a/src/app/components/CalendarEventMeta.svelte +++ b/src/app/components/CalendarEventMeta.svelte @@ -6,16 +6,17 @@ type Props = { event: TrustedEvent + url: string } - const {event}: Props = $props() + const {event, url}: Props = $props() const meta = $derived(fromPairs(event.tags) as Record)
- Posted by + Posted by {#if meta.location} diff --git a/src/app/components/ChannelCompose.svelte b/src/app/components/ChannelCompose.svelte index 4a69d06e..82e49f67 100644 --- a/src/app/components/ChannelCompose.svelte +++ b/src/app/components/ChannelCompose.svelte @@ -1,16 +1,18 @@
diff --git a/src/app/components/ChannelMessage.svelte b/src/app/components/ChannelMessage.svelte index a59e79f6..d26b6de6 100644 --- a/src/app/components/ChannelMessage.svelte +++ b/src/app/components/ChannelMessage.svelte @@ -4,8 +4,6 @@ import { thunks, pubkey, - deriveProfile, - deriveProfileDisplay, formatTimestampAsDate, formatTimestampAsTime, thunkIsComplete, @@ -22,15 +20,15 @@ import ChannelMessageEmojiButton from "@app/components/ChannelMessageEmojiButton.svelte" import ChannelMessageMenuButton from "@app/components/ChannelMessageMenuButton.svelte" import ChannelMessageMenuMobile from "@app/components/ChannelMessageMenuMobile.svelte" - import {colors} from "@app/state" + import {colors, deriveAlias, deriveAliasDisplay} from "@app/state" import {publishDelete, publishReaction} from "@app/commands" import {pushModal} from "@app/modal" interface Props { - url: any - room: any + url: string + room: string event: TrustedEvent - replyTo?: any + replyTo?: (event: TrustedEvent) => void showPubkey?: boolean inert?: boolean } @@ -39,16 +37,16 @@ const thunk = $thunks[event.id] const today = formatTimestampAsDate(now()) - const profile = deriveProfile(event.pubkey) - const profileDisplay = deriveProfileDisplay(event.pubkey) + const alias = deriveAlias(event.pubkey, url) + const aliasDisplay = deriveAliasDisplay(event.pubkey, url) const [_, colorValue] = colors[parseInt(hash(event.pubkey)) % colors.length] const hideMenuButton = $derived($thunk && !thunkIsComplete($thunk)) - const reply = () => replyTo(event) + const reply = () => replyTo!(event) const onTap = () => pushModal(ChannelMessageMenuMobile, {url, event, reply}) - const openProfile = () => pushModal(ProfileDetail, {pubkey: event.pubkey}) + const openProfile = () => pushModal(ProfileDetail, {pubkey: event.pubkey, url}) const onReactionClick = (content: string, events: TrustedEvent[]) => { const reaction = events.find(e => e.pubkey === $pubkey) @@ -68,7 +66,10 @@
{#if showPubkey} {:else}
@@ -77,7 +78,7 @@ {#if showPubkey}
{#if formatTimestampAsDate(event.created_at) === today} @@ -90,7 +91,7 @@
{/if}
- + {#if thunk} {/if} diff --git a/src/app/components/Chat.svelte b/src/app/components/Chat.svelte index dfc45dfc..717251df 100644 --- a/src/app/components/Chat.svelte +++ b/src/app/components/Chat.svelte @@ -9,6 +9,7 @@ pubkey, Router, tagPubkey, + loadUsingOutbox, formatTimestampAsDate, inboxRelaySelectionsByPubkey, } from "@welshman/app" @@ -27,17 +28,16 @@ import ChatMessage from "@app/components/ChatMessage.svelte" import ChatCompose from "@app/components/ChannelCompose.svelte" import ChatComposeParent from "@app/components/ChannelComposeParent.svelte" - import {userSettingValues, deriveChat, splitChatId, PLATFORM_NAME} from "@app/state" + import {INDEXER_RELAYS, userSettingValues, deriveChat, splitChatId, PLATFORM_NAME} from "@app/state" import {pushModal} from "@app/modal" import {sendWrapped, prependParent} from "@app/commands" - const { - id, - info, - }: { + type Props = { id: string info?: Snippet - } = $props() + } + + const {id, info}: Props = $props() const chat = deriveChat(id) const pubkeys = splitChatId(id) @@ -107,10 +107,13 @@ onMount(() => { // Don't use loadInboxRelaySelection because we want to force reload - load({ - relays: Router.get().FromPubkeys(others).getUrls(), - filters: [{kinds: [INBOX_RELAYS], authors: others}], - }) + for (const pubkey of others) { + loadUsingOutbox({ + pubkey, + kind: INBOX_RELAYS, + relays: INDEXER_RELAYS, + }) + } const observer = new ResizeObserver(() => { if (dynamicPadding && chatCompose) { diff --git a/src/app/components/ChatItem.svelte b/src/app/components/ChatItem.svelte index a2042bda..52a2a652 100644 --- a/src/app/components/ChatItem.svelte +++ b/src/app/components/ChatItem.svelte @@ -40,7 +40,7 @@
{#if others.length === 0} - + Note to self {:else if others.length === 1} diff --git a/src/app/components/ChatMessage.svelte b/src/app/components/ChatMessage.svelte index 8d1e40e1..b96ba943 100644 --- a/src/app/components/ChatMessage.svelte +++ b/src/app/components/ChatMessage.svelte @@ -2,13 +2,7 @@ import {type Instance} from "tippy.js" import {hash} from "@welshman/lib" import type {TrustedEvent} from "@welshman/util" - import { - thunks, - deriveProfile, - deriveProfileDisplay, - formatTimestampAsTime, - pubkey, - } from "@welshman/app" + import {thunks, formatTimestampAsTime, pubkey} from "@welshman/app" import {isMobile} from "@lib/html" import Icon from "@lib/components/Icon.svelte" import Button from "@lib/components/Button.svelte" @@ -21,7 +15,7 @@ import ProfileDetail from "@app/components/ProfileDetail.svelte" import ChatMessageMenu from "@app/components/ChatMessageMenu.svelte" import ChatMessageMenuMobile from "@app/components/ChatMessageMenuMobile.svelte" - import {colors} from "@app/state" + import {colors, deriveAlias, deriveAliasDisplay} from "@app/state" import {makeDelete, makeReaction, sendWrapped} from "@app/commands" import {pushModal} from "@app/modal" @@ -36,8 +30,8 @@ const thunk = $thunks[event.id] const isOwn = event.pubkey === $pubkey - const profile = deriveProfile(event.pubkey) - const profileDisplay = deriveProfileDisplay(event.pubkey) + const alias = deriveAlias(event.pubkey) + const aliasDisplay = deriveAliasDisplay(event.pubkey) const [_, colorValue] = colors[parseInt(hash(event.pubkey)) % colors.length] const reply = () => replyTo(event) @@ -107,12 +101,12 @@ {#if !isOwn}
diff --git a/src/app/components/Content.svelte b/src/app/components/Content.svelte index dd4ee14b..572ce445 100644 --- a/src/app/components/Content.svelte +++ b/src/app/components/Content.svelte @@ -38,8 +38,8 @@ showEntire?: boolean hideMediaAtDepth?: number expandMode?: string - relays?: string[] depth?: number + url?: string } let { @@ -49,8 +49,8 @@ showEntire = $bindable(false), hideMediaAtDepth = 1, expandMode = "block", - relays = [], depth = 0, + url, }: Props = $props() const fullContent = parse(event) @@ -146,10 +146,10 @@ {/if} {:else if isProfile(parsed)} - + {:else if isEvent(parsed) || isAddress(parsed)} {#if isBlock(i)} - + {:else} + import type {ProfilePointer} from "@welshman/content" import {displayProfile} from "@welshman/util" import {deriveProfile} from "@welshman/app" import Button from "@lib/components/Button.svelte" import ProfileDetail from "@app/components/ProfileDetail.svelte" import {pushModal} from "@app/modal" + import {deriveAlias} from "@app/state" - const {value} = $props() + type Props = { + value: ProfilePointer + url?: string + } - const profile = deriveProfile(value.pubkey) + const {value, url}: Props = $props() - const openProfile = () => pushModal(ProfileDetail, {pubkey: value.pubkey}) + const alias = deriveAlias(value.pubkey, url) + + const openProfile = () => pushModal(ProfileDetail, {pubkey: value.pubkey, url}) diff --git a/src/app/components/ContentQuote.svelte b/src/app/components/ContentQuote.svelte index 2f491671..19f77715 100644 --- a/src/app/components/ContentQuote.svelte +++ b/src/app/components/ContentQuote.svelte @@ -3,6 +3,7 @@ import {goto} from "$app/navigation" import {nthEq} from "@welshman/lib" import {Router, tracker, repository} from "@welshman/app" + import type {TrustedEvent} from "@welshman/util" import {Address, DIRECT_MESSAGE, MESSAGE, THREAD, EVENT_TIME} from "@welshman/util" import {scrollToEvent} from "@lib/html" import Button from "@lib/components/Button.svelte" @@ -12,11 +13,24 @@ import {deriveEvent, entityLink, ROOM} from "@app/state" import {makeThreadPath, makeCalendarPath, makeRoomPath} from "@app/routes" - const {value, event, depth, hideMediaAtDepth, relays = []} = $props() + type Props = { + value: any + hideMediaAtDepth: number + event: TrustedEvent + depth: number + url?: string + } - const {id, identifier, kind, pubkey, relays: relayHints = []} = value + const {value, event, depth, hideMediaAtDepth, url}: Props = $props() + + const {id, identifier, kind, pubkey, relays = []} = value const idOrAddress = id || new Address(kind, pubkey, identifier).toString() - const mergedRelays = [...relays, ...Router.get().Quote(event, idOrAddress, relayHints).getUrls()] + const mergedRelays = Router.get().Quote(event, idOrAddress, relays).getUrls() + + if (url) { + mergedRelays.push(url) + } + const quote = deriveEvent(idOrAddress, mergedRelays) const entity = id ? nip19.neventEncode({id, relays: mergedRelays}) @@ -80,8 +94,8 @@
diff --git a/src/app/components/ProfileCircle.svelte b/src/app/components/ProfileCircle.svelte index db463e36..94304a4a 100644 --- a/src/app/components/ProfileCircle.svelte +++ b/src/app/components/ProfileCircle.svelte @@ -1,10 +1,15 @@ - + diff --git a/src/app/components/ProfileDetail.svelte b/src/app/components/ProfileDetail.svelte index 74a6f790..04e3f7c1 100644 --- a/src/app/components/ProfileDetail.svelte +++ b/src/app/components/ProfileDetail.svelte @@ -5,10 +5,8 @@ session, userFollows, deriveUserWotScore, - deriveProfile, deriveHandleForPubkey, displayHandle, - deriveProfileDisplay, } from "@welshman/app" import Icon from "@lib/components/Icon.svelte" import Link from "@lib/components/Link.svelte" @@ -18,14 +16,19 @@ import ModalFooter from "@lib/components/ModalFooter.svelte" import ProfileInfo from "@app/components/ProfileInfo.svelte" import ChatEnable from "@app/components/ChatEnable.svelte" - import {canDecrypt, pubkeyLink} from "@app/state" + import {canDecrypt, pubkeyLink, deriveAlias, deriveAliasDisplay} from "@app/state" import {pushModal} from "@app/modal" import {makeChatPath} from "@app/routes" - const {pubkey} = $props() + export type Props = { + pubkey: string + url?: string + } - const profile = deriveProfile(pubkey) - const profileDisplay = deriveProfileDisplay(pubkey) + const {pubkey, url}: Props = $props() + + const alias = deriveAlias(pubkey, url) + const aliasDisplay = deriveAliasDisplay(pubkey, url) const handle = deriveHandleForPubkey(pubkey) const score = deriveUserWotScore(pubkey) @@ -43,12 +46,12 @@
- +
- {$profileDisplay} + {$aliasDisplay}
@@ -57,7 +60,7 @@
- + diff --git a/src/app/components/ProfileList.svelte b/src/app/components/ProfileList.svelte index 4129d47a..8fd5e8a0 100644 --- a/src/app/components/ProfileList.svelte +++ b/src/app/components/ProfileList.svelte @@ -5,11 +5,12 @@ interface Props { title: any - subtitle?: string pubkeys: any + subtitle?: string + url?: string } - const {subtitle = "", pubkeys, ...restProps}: Props = $props() + const {subtitle = "", pubkeys, url, ...restProps}: Props = $props()
@@ -23,7 +24,7 @@ {#each pubkeys as pubkey (pubkey)}
- +
{/each} diff --git a/src/app/components/ProfileName.svelte b/src/app/components/ProfileName.svelte index 9be91b1a..cee0f7a7 100644 --- a/src/app/components/ProfileName.svelte +++ b/src/app/components/ProfileName.svelte @@ -1,9 +1,14 @@ -{$profileDisplay} +{$aliasDisplay} diff --git a/src/app/components/ThreadCreate.svelte b/src/app/components/ThreadCreate.svelte index abf60416..17ce3986 100644 --- a/src/app/components/ThreadCreate.svelte +++ b/src/app/components/ThreadCreate.svelte @@ -53,7 +53,7 @@ history.back() } - const editor = makeEditor({submit, uploading, placeholder: "What's on your mind?"}) + const editor = makeEditor({url, submit, uploading, placeholder: "What's on your mind?"}) let title: string = $state("") diff --git a/src/app/components/ThreadItem.svelte b/src/app/components/ThreadItem.svelte index 48b0d625..04805683 100644 --- a/src/app/components/ThreadItem.svelte +++ b/src/app/components/ThreadItem.svelte @@ -8,13 +8,12 @@ import ThreadActions from "@app/components/ThreadActions.svelte" import {makeThreadPath} from "@app/routes" - const { - url, - event, - }: { + type Props = { url: string event: TrustedEvent - } = $props() + } + + const {url, event}: Props = $props() const title = event.tags.find(nthEq(0, "title"))?.[1] @@ -32,10 +31,10 @@ {formatTimestamp(event.created_at)}

{/if} - +
- Posted by + Posted by
diff --git a/src/app/editor/MentionNodeView.ts b/src/app/editor/MentionNodeView.ts index a4a10bc5..20b82f86 100644 --- a/src/app/editor/MentionNodeView.ts +++ b/src/app/editor/MentionNodeView.ts @@ -1,26 +1,28 @@ import type {NodeViewProps} from "@tiptap/core" -import {deriveProfileDisplay} from "@welshman/app" +import {deriveAliasDisplay} from "@app/state" -export const MentionNodeView = ({node}: NodeViewProps) => { - const dom = document.createElement("span") - const display = deriveProfileDisplay(node.attrs.pubkey) +export const makeMentionNodeView = + (url?: string) => + ({node}: NodeViewProps) => { + const dom = document.createElement("span") + const display = deriveAliasDisplay(node.attrs.pubkey, url) - dom.classList.add("tiptap-object") + dom.classList.add("tiptap-object") - const unsubDisplay = display.subscribe($display => { - dom.textContent = "@" + $display - }) + const unsubDisplay = display.subscribe($display => { + dom.textContent = "@" + $display + }) - return { - dom, - destroy: () => { - unsubDisplay() - }, - selectNode() { - dom.classList.add("tiptap-active") - }, - deselectNode() { - dom.classList.remove("tiptap-active") - }, + return { + dom, + destroy: () => { + unsubDisplay() + }, + selectNode() { + dom.classList.add("tiptap-active") + }, + deselectNode() { + dom.classList.remove("tiptap-active") + }, + } } -} diff --git a/src/app/editor/ProfileSuggestion.svelte b/src/app/editor/ProfileSuggestion.svelte index 8aeae37a..518fba5b 100644 --- a/src/app/editor/ProfileSuggestion.svelte +++ b/src/app/editor/ProfileSuggestion.svelte @@ -5,15 +5,20 @@ deriveUserWotScore, deriveHandleForPubkey, displayHandle, - deriveProfileDisplay, } from "@welshman/app" import WotScore from "@lib/components/WotScore.svelte" import ProfileCircle from "@app/components/ProfileCircle.svelte" + import {deriveAliasDisplay} from "@app/state" - const {value} = $props() + type Props = { + value: string + url?: string + } + + const {value, url}: Props = $props() const pubkey = value - const profileDisplay = deriveProfileDisplay(pubkey) + const profileDisplay = deriveAliasDisplay(pubkey) const handle = deriveHandleForPubkey(pubkey) const score = deriveUserWotScore(pubkey) @@ -22,7 +27,7 @@
- +
diff --git a/src/app/editor/index.ts b/src/app/editor/index.ts index ae6e4607..fa220277 100644 --- a/src/app/editor/index.ts +++ b/src/app/editor/index.ts @@ -5,7 +5,7 @@ import type {StampedEvent} from "@welshman/util" import {Router, signer, profileSearch} from "@welshman/app" import {Editor, MentionSuggestion, WelshmanExtension} from "@welshman/editor" import {getSetting, userSettingValues} from "@app/state" -import {MentionNodeView} from "./MentionNodeView" +import {makeMentionNodeView} from "./MentionNodeView" import ProfileSuggestion from "./ProfileSuggestion.svelte" export const getUploadType = () => getSetting<"nip96" | "blossom">("upload_type") @@ -30,6 +30,7 @@ export const makeEditor = ({ charCount, content = "", placeholder = "", + url, submit, uploading, wordCount, @@ -39,6 +40,7 @@ export const makeEditor = ({ charCount?: Writable content?: string placeholder?: string + url?: string submit: () => void uploading?: Writable wordCount?: Writable @@ -76,7 +78,7 @@ export const makeEditor = ({ }, nprofile: { extend: { - addNodeView: () => MentionNodeView, + addNodeView: () => makeMentionNodeView(url), addProseMirrorPlugins() { return [ MentionSuggestion({ @@ -86,7 +88,7 @@ export const makeEditor = ({ createSuggestion: (value: string) => { const target = document.createElement("div") - mount(ProfileSuggestion, {target, props: {value}}) + mount(ProfileSuggestion, {target, props: {value, url}}) return target }, diff --git a/src/app/state.ts b/src/app/state.ts index d6709782..32a33978 100644 --- a/src/app/state.ts +++ b/src/app/state.ts @@ -1,5 +1,5 @@ import twColors from "tailwindcss/colors" -import {get, derived} from "svelte/store" +import {get, derived, writable} from "svelte/store" import * as nip19 from "nostr-tools/nip19" import { remove, @@ -31,6 +31,7 @@ import { GROUPS, THREAD, COMMENT, + PROFILE, getGroupTags, getRelayTagValues, getPubkeyTagValues, @@ -38,10 +39,13 @@ import { displayProfile, readList, getListTags, + readProfile, asDecryptedEvent, normalizeRelayUrl, + displayPubkey, } from "@welshman/util" -import type {TrustedEvent, SignedEvent, PublishedList, List, Filter} from "@welshman/util" +import {LOCAL_RELAY_URL} from "@welshman/relay" +import type {TrustedEvent, Profile, SignedEvent, PublishedList, List, Filter} from "@welshman/util" import {Nip59, decrypt} from "@welshman/signer" import { pubkey, @@ -64,6 +68,8 @@ import { makeOutboxLoader, routerContext, appContext, + deriveProfile, + makeCachedLoader, } from "@welshman/app" import type {Thunk, Relay} from "@welshman/app" import {deriveEvents, deriveEventsMapped, withGetter, synced} from "@welshman/store" @@ -369,6 +375,93 @@ export const alertStatuses = deriveEventsMapped(repository, { }, }) +// Aliases + +export type Alias = { + url: string + pubkey: string + profile: Profile +} + +export const encodeAliasKey = (pubkey: string, url: string) => `${pubkey}:${url}` + +export const decodeAliasKey = (key: string) => { + const [pubkey, url] = key.split(/:(.*)/s) + + return {pubkey, url} +} + +export const aliasesByKey = withGetter(writable(new Map())) + +export const loadAliasByKey = makeCachedLoader({ + name: "aliases", + indexStore: aliasesByKey, + load: (key: string) => { + const {pubkey, url} = decodeAliasKey(key) + + return load({ + relays: [url], + filters: [{kinds: [PROFILE], authors: [pubkey]}], + onEvent: (event: TrustedEvent) => { + const profile = readProfile(event) + + aliasesByKey.update($aliasesByKey => { + $aliasesByKey.set(key, {url, pubkey, profile}) + + return $aliasesByKey + }) + }, + }) + }, +}) + +export const deriveAlias = (pubkey: string, url?: string) => { + const membershipUrls = getMembershipUrls(userMembership.get()) + + // Attempt to load all relevant aliases + for (const $url of [url, ...membershipUrls]) { + if ($url) { + const key = encodeAliasKey(pubkey, $url) + + loadAliasByKey(key) + } + } + + return derived([aliasesByKey, deriveProfile(pubkey)], ([$aliasesByKey, $profile]) => { + // Try to find an alias for the url we were asked about + if (url) { + const alias = $aliasesByKey.get(encodeAliasKey(pubkey, url)) + + if (alias) { + return alias + } + } + + // Fall back to global profiles + if ($profile) { + return { + pubkey, + url: LOCAL_RELAY_URL, + profile: $profile, + } + } + + // Fall back to other aliases we know about + for (const $url of membershipUrls) { + const alias = $aliasesByKey.get(encodeAliasKey(pubkey, $url)) + + if (alias) { + return alias + } + } + }) +} + +export const deriveAliasDisplay = (pubkey: string, url?: string) => + derived(deriveAlias(pubkey, url), $alias => + displayProfile($alias?.profile, displayPubkey(pubkey)), + ) + // Membership export const hasMembershipUrl = (list: List | undefined, url: string) => @@ -470,6 +563,7 @@ export const { name: "chats", store: chats, getKey: chat => chat.id, + load: always(Promise.resolve()), }) export const chatSearch = derived(chats, $chats => diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 3918556b..df6e2422 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -9,7 +9,7 @@ import {bytesToHex, hexToBytes} from "@noble/hashes/utils" import {identity, memoize, sleep, defer, ago, WEEK, TaskQueue} from "@welshman/lib" import type {TrustedEvent, StampedEvent} from "@welshman/util" - import {WRAP} from "@welshman/util" + import {WRAP, PROFILE, getTag} from "@welshman/util" import {Nip46Broker, makeSecret} from "@welshman/signer" import type {Socket} from "@welshman/net" import {request, defaultSocketPolicies, makeSocketPolicyAuth} from "@welshman/net" diff --git a/src/routes/settings/profile/+page.svelte b/src/routes/settings/profile/+page.svelte index 2553635c..ca293ceb 100644 --- a/src/routes/settings/profile/+page.svelte +++ b/src/routes/settings/profile/+page.svelte @@ -2,7 +2,7 @@ import * as nip19 from "nostr-tools/nip19" import {hexToBytes} from "@noble/hashes/utils" import {displayPubkey, displayProfile} from "@welshman/util" - import {pubkey, session, displayNip05, deriveProfile} from "@welshman/app" + import {pubkey, session, displayNip05} from "@welshman/app" import {slideAndFade} from "@lib/transition" import Icon from "@lib/components/Icon.svelte" import FieldInline from "@lib/components/FieldInline.svelte" @@ -13,11 +13,11 @@ import ProfileDelete from "@app/components/ProfileDelete.svelte" import InfoKeys from "@app/components/InfoKeys.svelte" import Alerts from "@app/components/Alerts.svelte" - import {PLATFORM_NAME} from "@app/state" + import {PLATFORM_NAME, deriveAlias} from "@app/state" import {pushModal} from "@app/modal" import {clip} from "@app/toast" - const profile = deriveProfile($pubkey!) + const alias = deriveAlias($pubkey!) const pubkeyDisplay = displayPubkey($pubkey!) @@ -39,16 +39,16 @@
- +
- {displayProfile($profile, pubkeyDisplay)} + {displayProfile($alias?.profile, pubkeyDisplay)}
- {$profile?.nip05 ? displayNip05($profile.nip05) : pubkeyDisplay} + {$alias?.profile?.nip05 ? displayNip05($alias?.profile.nip05) : pubkeyDisplay}
@@ -56,8 +56,8 @@
- {#key $profile?.about} - + {#key $alias?.profile?.about} + {/key}
{#if $session?.email} diff --git a/src/routes/spaces/[relay]/[room]/+page.svelte b/src/routes/spaces/[relay]/[room]/+page.svelte index 002ada7a..988572a5 100644 --- a/src/routes/spaces/[relay]/[room]/+page.svelte +++ b/src/routes/spaces/[relay]/[room]/+page.svelte @@ -311,7 +311,7 @@ {/if}
- +
{#if showScrollButton} diff --git a/src/routes/spaces/[relay]/calendar/[id]/+page.svelte b/src/routes/spaces/[relay]/calendar/[id]/+page.svelte index 223e4f09..dc5d6ca4 100644 --- a/src/routes/spaces/[relay]/calendar/[id]/+page.svelte +++ b/src/routes/spaces/[relay]/calendar/[id]/+page.svelte @@ -81,11 +81,11 @@
- +
- +
@@ -101,9 +101,9 @@
{/if} {#each sortBy(e => e.created_at, $replies).slice(0, showAll ? undefined : 4) as reply (reply.id)} - +
- +
diff --git a/src/routes/spaces/[relay]/threads/[id]/+page.svelte b/src/routes/spaces/[relay]/threads/[id]/+page.svelte index 46d646bf..988d284b 100644 --- a/src/routes/spaces/[relay]/threads/[id]/+page.svelte +++ b/src/routes/spaces/[relay]/threads/[id]/+page.svelte @@ -76,9 +76,9 @@ {#if $event}
- +
- +
@@ -91,9 +91,9 @@
{/if} {#each sortBy(e => -e.created_at, $replies).slice(0, showAll ? undefined : 4) as reply (reply.id)} - +
- +