damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

commit 54d6161acd9ef754fccaa179beb1881baee6b625
parent b1fd84fd75a2846c1512962c86a7da8fb0045aee
Author: SanjaySiddharth <mjsanjaysiddharth1999@gmail.com>
Date:   Thu, 13 Mar 2025 21:48:00 +0530

Show additional information on top of blurred images

Changelog-Changed: Added additional information on top of blurred images
Closes: https://github.com/damus-io/damus/issues/2854
Signed-off-by: SanjaySiddharth <mjsanjaysiddharth1999@gmail.com>

Diffstat:
Mdamus/Util/URIParsing.swift | 6+++---
Mdamus/Views/Events/Longform/LongformPreview.swift | 5+----
Mdamus/Views/NoteContentView.swift | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
3 files changed, 65 insertions(+), 13 deletions(-)

diff --git a/damus/Util/URIParsing.swift b/damus/Util/URIParsing.swift @@ -35,11 +35,11 @@ func remove_nostr_uri_prefix(_ s: String) -> String { return uri } -func abbreviateURL(_ url: URL) -> String { +func abbreviateURL(_ url: URL, maxLength: Int = MAX_CHAR_URL) -> String { let urlString = url.absoluteString - if urlString.count > MAX_CHAR_URL { - return String(urlString.prefix(MAX_CHAR_URL)) + "..." + if urlString.count > maxLength { + return String(urlString.prefix(maxLength)) + "…" } return urlString } diff --git a/damus/Views/Events/Longform/LongformPreview.swift b/damus/Views/Events/Longform/LongformPreview.swift @@ -122,10 +122,7 @@ struct LongformPreviewBody: View { } else if blur_images || (blur_images && !state.settings.media_previews) { ZStack { titleImage(url: url) - Blur() - .onTapGesture { - blur_images = false - } + BlurOverlayView(blur_images: $blur_images, artifacts: nil, size: nil, damus_state: nil, parentView: .longFormView) } } } diff --git a/damus/Views/NoteContentView.swift b/damus/Views/NoteContentView.swift @@ -23,6 +23,7 @@ struct Blur: UIViewRepresentable { } } + struct NoteContentView: View { let damus_state: DamusState @@ -166,10 +167,7 @@ struct NoteContentView: View { ImageCarousel(state: damus_state, evid: event.id, urls: artifacts.media) { dismiss in fullscreen_preview(dismiss: dismiss) } - Blur() - .onTapGesture { - blur_images = false - } + BlurOverlayView(blur_images: $blur_images, artifacts: artifacts, size: size, damus_state: damus_state, parentView: .noteContentView) } } } @@ -384,6 +382,64 @@ func lookup_cached_preview_size(previews: PreviewCache, evid: NoteId) -> CGFloat return height } +struct BlurOverlayView: View { + @Binding var blur_images: Bool + let artifacts: NoteArtifactsSeparated? + let size: EventViewKind? + let damus_state: DamusState? + let parentView: ParentViewType + var body: some View { + ZStack { + + Color.black + .opacity(0.54) + + Blur() + + VStack(alignment: .center) { + Image(systemName: "eye.slash") + .foregroundStyle(.white) + .bold() + .padding(EdgeInsets(top: 5, leading: 10, bottom: 0, trailing: 10)) + Text(NSLocalizedString("Media from someone you \n don't follow", comment: "Label on the image blur mask")) + .multilineTextAlignment(.center) + .foregroundStyle(Color.white) + .font(.title2) + .padding(EdgeInsets(top: 5, leading: 10, bottom: 0, trailing: 10)) + Button(NSLocalizedString("Tap to load", comment: "Label for button that allows user to dismiss media content warning and unblur the image")) { + blur_images = false + } + .buttonStyle(.bordered) + .fontWeight(.bold) + .foregroundStyle(.white) + .padding(EdgeInsets(top: 5, leading: 10, bottom: 0, trailing: 10)) + + if parentView == .noteContentView, + let artifacts = artifacts, + let size = size, + let damus_state = damus_state + { + switch artifacts.media[0] { + case .image(let url), .video(let url): + Text(abbreviateURL(url, maxLength: 30)) + .font(eventviewsize_to_font(size, font_size: damus_state.settings.font_size * 0.8)) + .foregroundStyle(.white) + .multilineTextAlignment(.center) + .padding(EdgeInsets(top: 20, leading: 10, bottom: 5, trailing: 10)) + } + } + } + } + .onTapGesture { + blur_images = false + } + } + + enum ParentViewType { + case noteContentView, longFormView + } +} + struct NoteContentView_Previews: PreviewProvider { static var previews: some View { let state = test_damus_state @@ -401,7 +457,7 @@ struct NoteContentView_Previews: PreviewProvider { .previewDisplayName("Super short note") VStack { - NoteContentView(damus_state: state, event: test_encoded_note_with_image!, blur_images: false, size: .normal, options: []) + NoteContentView(damus_state: state, event: test_encoded_note_with_image!, blur_images: true, size: .normal, options: []) } .previewDisplayName("Note with image") @@ -434,4 +490,3 @@ func separate_images(ev: NostrEvent, keypair: Keypair) -> [MediaUrl]? { let mediaUrls = urlBlocks.map { MediaUrl.image($0) } return mediaUrls.isEmpty ? nil : mediaUrls } -