feat: unify profile context menus and rewrite avatar overlay
- New profileContextMenu(handle:hasStory:onViewProfile:onViewStory:)
modifier in Components/ProfileContextMenu.swift — replaces ad-hoc
.onLongPressGesture rows in FollowListView and StoryStripView with
a consistent system contextMenu (View Story / View Profile / Copy
Username / Share Profile). The NotificationsView and SearchView
callers landed in the previous commit; this one adds the modifier
they were already referencing.
- ProfileView: handle subtitle gains its own contextMenu for Copy
Handle, Copy DID, and View Profile Photo. AvatarOverlay is
rewritten on top of ZoomableImage with pinch-to-zoom, drag-to-
dismiss, and a Nuke Circle processor so the loaded image is
already round when it appears. The .if helper from
ProfileContextMenu lets self vs. non-self avatars pick different
gesture branches without stacking both.
- SettingsView: Handle and DID rows become Menus with a Copy
action, backed by a shared CopiedCheckmarkToast capsule (also used
by ProfileView) and haptic feedback.
- ZoomableImage: only register the double-tap recognizer when the
caller passes onDoubleTap, so the avatar overlay's drag-to-dismiss
doesn't fight a recognizer with no handler.
authored by