forked from coracle/flotilla
9df8cee501
Adopts the rewritten welshman API: the removed @welshman/util helpers (Profile/List/Room/Handler/Encryptable) are now Reader/Builder classes in @welshman/domain, and @welshman/app dropped its global singletons for an App instance + app.use(Plugin) registry. - src/app/welshman.ts is now the app bootstrap + session-state module (one shared App instance, multi-account sessions/login, app-wide reactive views) rather than a compat shim re-exporting the old globals. - Rewrote ~100 callers to use app.use(Plugin) directly (thunks, profiles, relays, rooms, zaps, tags, wot, feeds, sync); thunk helpers are now thunk methods. - Added @welshman/domain dependency. - Resolved residual gaps (storage hydration via plugin.onItem/wrapManager/Plaintext, relay-list mutators, search-relay list, outbox #d filter). Best-effort: no toolchain/linking available, so this is not build- or type-checked. Remaining judgment calls are flagged with TODO(welshman-migration). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BsMjvv7krpZeHK1Njeneru
75 lines
2.3 KiB
Svelte
75 lines
2.3 KiB
Svelte
<script lang="ts">
|
|
import * as nip19 from "nostr-tools/nip19"
|
|
import {removeUndefined} from "@welshman/lib"
|
|
import {displayPubkey, displayNip05} from "@welshman/util"
|
|
import {Handles, Profiles} from "@welshman/app"
|
|
import {app} from "@app/welshman"
|
|
import Icon from "@lib/components/Icon.svelte"
|
|
import Button from "@lib/components/Button.svelte"
|
|
import ProfileCircle from "@app/components/ProfileCircle.svelte"
|
|
import WotScore from "@app/components/WotScore.svelte"
|
|
import ProfileDetail from "@app/components/ProfileDetail.svelte"
|
|
import {pushModal} from "@app/modal"
|
|
import {clip} from "@app/toast"
|
|
import Copy from "@assets/icons/copy.svg?dataurl"
|
|
|
|
type Props = {
|
|
pubkey: string
|
|
url?: string
|
|
showPubkey?: boolean
|
|
avatarSize?: number
|
|
inert?: boolean
|
|
}
|
|
|
|
const {pubkey, url, showPubkey, inert, avatarSize = 10}: Props = $props()
|
|
|
|
const relays = removeUndefined([url])
|
|
const profileDisplay = app.use(Profiles).display(pubkey, relays).$
|
|
const handle = app.use(Handles).forPubkey(pubkey).$
|
|
|
|
const openProfile = () => {
|
|
pushModal(ProfileDetail, {pubkey, url})
|
|
}
|
|
|
|
const copyPubkey = () => clip(nip19.npubEncode(pubkey))
|
|
</script>
|
|
|
|
<div class="flex max-w-full items-start gap-3">
|
|
{#if inert}
|
|
<span class="py-1">
|
|
<ProfileCircle {pubkey} size={avatarSize} />
|
|
</span>
|
|
{:else}
|
|
<Button onclick={openProfile} class="py-1">
|
|
<ProfileCircle {pubkey} size={avatarSize} />
|
|
</Button>
|
|
{/if}
|
|
<div class="flex min-w-0 flex-col">
|
|
<div class="flex items-center gap-2">
|
|
{#if inert}
|
|
<span class="text-bold overflow-hidden text-ellipsis">
|
|
{$profileDisplay}
|
|
</span>
|
|
{:else}
|
|
<Button onclick={openProfile} class="text-bold overflow-hidden text-ellipsis">
|
|
{$profileDisplay}
|
|
</Button>
|
|
{/if}
|
|
<WotScore {pubkey} />
|
|
</div>
|
|
{#if $handle}
|
|
<div class="overflow-hidden text-ellipsis text-sm opacity-75">
|
|
{displayNip05($handle?.nip05)}
|
|
</div>
|
|
{/if}
|
|
{#if showPubkey}
|
|
<div class="flex items-center gap-1 overflow-hidden text-ellipsis text-xs opacity-60">
|
|
{displayPubkey(pubkey)}
|
|
<Button onclick={copyPubkey} class="pt-1">
|
|
<Icon size={3} icon={Copy} />
|
|
</Button>
|
|
</div>
|
|
{/if}
|
|
</div>
|
|
</div>
|