Two changes that ship together:
- Compact variant of OrganizerCard (tiny avatar + display name on a
single line) used on every feed EventCard so viewers see who's
hosting before they tap into the detail page. Hidden on compact
feed rows (host's own roster — they already know).
- Refactor useOrganizerProfile.ts to route through the centralized
ProfileService. Two bugs the local impl was carrying:
* `displayName` was exposed via a `get` accessor on the returned
object; destructuring it (`const { displayName } = …`) resolved
once at the destructure site, so a kind-0 arriving later never
updated the bound name. Now exposed as `computed<string>`.
* `relayHub.subscribe()` throws synchronously when the hub isn't
connected yet. OrganizerCard mounted during cold start swallowed
the throw silently in onMounted, leaving the user with the
pubkey-truncated fallback forever. ProfileService.getProfile()
awaits the relay-hub connection before issuing the filter.
Bonus: ProfileService's kind-0 cache is shared with chat / market /
nostr-feed, so a profile fetched by any module is immediately
visible to all of them.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace the "Event: <8-char-id>…" placeholder with the actual event
title, sourced from the shared events store, and wrap it in a
RouterLink to the event detail page. Card title truncates so long
names don't push the per-event ticket-count badge out of the row.
Subscribe to the events feed on mount so titles resolve as relay
events stream in — the user can land on My tickets directly from a
purchase flow without having to visit /events first to populate the
store. Falls back to the old short-id label until the event arrives
(or if it's been deleted upstream).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>