damus

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

commit 1ecfb0487ef59a865f37278339717ef47c597b9c
parent 8ffa8446b61cbc0382cc56e7db6cad0fc85fcaa1
Author: Joel Klabo <joelklabo@gmail.com>
Date:   Wed, 18 Jan 2023 12:52:07 -0800

Swipe to Dismiss Images

Closes: #343

Diffstat:
Mdamus.xcodeproj/project.pbxproj | 16++++++++++++++--
Mdamus/Components/ImageCarousel.swift | 3+++
Adamus/Modifiers/SwipeToDismiss.swift | 34++++++++++++++++++++++++++++++++++
Mdamus/Views/ProfileZoomView.swift | 3+++
4 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj @@ -147,8 +147,8 @@ 4CEE2AF9280B2EAC00AB5EEF /* PowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE2AF8280B2EAC00AB5EEF /* PowView.swift */; }; 4CEE2B02280B39E800AB5EEF /* EventActionBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE2B01280B39E800AB5EEF /* EventActionBar.swift */; }; 4FE60CDD295E1C5E00105A1F /* Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FE60CDC295E1C5E00105A1F /* Wallet.swift */; }; - 647D9A8D2968520300A295DE /* SideMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647D9A8C2968520300A295DE /* SideMenuView.swift */; }; 6439E014296790CF0020672B /* ProfileZoomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6439E013296790CF0020672B /* ProfileZoomView.swift */; }; + 647D9A8D2968520300A295DE /* SideMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647D9A8C2968520300A295DE /* SideMenuView.swift */; }; 64FBD06F296255C400D9D3B2 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64FBD06E296255C400D9D3B2 /* Theme.swift */; }; 6C7DE41F2955169800E66263 /* Vault in Frameworks */ = {isa = PBXBuildFile; productRef = 6C7DE41E2955169800E66263 /* Vault */; }; 7C45AE6D297352F90031D7BC /* SVGKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7C45AE6C297352F90031D7BC /* SVGKit */; }; @@ -160,6 +160,7 @@ DD597CBD2963D85A00C64D32 /* MarkdownTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD597CBC2963D85A00C64D32 /* MarkdownTests.swift */; }; E990020F2955F837003BBC5A /* EditMetadataView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E990020E2955F837003BBC5A /* EditMetadataView.swift */; }; E9E4ED0B295867B900DD7078 /* ThreadV2View.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9E4ED0A295867B900DD7078 /* ThreadV2View.swift */; }; + F7F0BA25297892BD009531F3 /* SwipeToDismiss.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F0BA24297892BD009531F3 /* SwipeToDismiss.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -356,8 +357,8 @@ 4CEE2AF8280B2EAC00AB5EEF /* PowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PowView.swift; sourceTree = "<group>"; }; 4CEE2B01280B39E800AB5EEF /* EventActionBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventActionBar.swift; sourceTree = "<group>"; }; 4FE60CDC295E1C5E00105A1F /* Wallet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Wallet.swift; sourceTree = "<group>"; }; - 647D9A8C2968520300A295DE /* SideMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SideMenuView.swift; sourceTree = "<group>"; }; 6439E013296790CF0020672B /* ProfileZoomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileZoomView.swift; sourceTree = "<group>"; }; + 647D9A8C2968520300A295DE /* SideMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SideMenuView.swift; sourceTree = "<group>"; }; 64FBD06E296255C400D9D3B2 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = "<group>"; }; 7C45AE70297353390031D7BC /* KFImageModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KFImageModel.swift; sourceTree = "<group>"; }; 9609F057296E220800069BF3 /* BannerImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BannerImageView.swift; sourceTree = "<group>"; }; @@ -366,6 +367,7 @@ DD597CBC2963D85A00C64D32 /* MarkdownTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarkdownTests.swift; sourceTree = "<group>"; }; E990020E2955F837003BBC5A /* EditMetadataView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditMetadataView.swift; sourceTree = "<group>"; }; E9E4ED0A295867B900DD7078 /* ThreadV2View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadV2View.swift; sourceTree = "<group>"; }; + F7F0BA24297892BD009531F3 /* SwipeToDismiss.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwipeToDismiss.swift; sourceTree = "<group>"; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -652,6 +654,7 @@ 4CE6DEE527F7A08100C66700 /* damus */ = { isa = PBXGroup; children = ( + F7F0BA23297892AE009531F3 /* Modifiers */, 4C4A3A5A288A1B2200453788 /* damus.entitlements */, 4CE4F9DF285287A000C00DD9 /* Components */, 4C7FF7D628233637009601DB /* Util */, @@ -710,6 +713,14 @@ name = Frameworks; sourceTree = "<group>"; }; + F7F0BA23297892AE009531F3 /* Modifiers */ = { + isa = PBXGroup; + children = ( + F7F0BA24297892BD009531F3 /* SwipeToDismiss.swift */, + ); + path = Modifiers; + sourceTree = "<group>"; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -895,6 +906,7 @@ 4C75EFA627FF87A20006080F /* Nostr.swift in Sources */, 4CE4F9DE2852768D00C00DD9 /* ConfigView.swift in Sources */, 4C285C8E28399BFE008A31F1 /* SaveKeysView.swift in Sources */, + F7F0BA25297892BD009531F3 /* SwipeToDismiss.swift in Sources */, 4CB8838F296F781C00DC99E7 /* ReactionsView.swift in Sources */, 4C649844285A952100EAE2B3 /* LocalUserConfig.swift in Sources */, 4C75EFB328049D640006080F /* NostrEvent.swift in Sources */, diff --git a/damus/Components/ImageCarousel.swift b/damus/Components/ImageCarousel.swift @@ -179,6 +179,9 @@ struct ImageView: View { .offset(x: offset.width + offsetState.width, y: offset.height + offsetState.height) .gesture(SimultaneousGesture(zoomGesture, dragGesture)) .gesture(doubleTapGesture) + .modifier(SwipeToDismissModifier(onDismiss: { + presentationMode.wrappedValue.dismiss() + })) }.padding(.bottom, 50) // Ensure carousel appears beneath } diff --git a/damus/Modifiers/SwipeToDismiss.swift b/damus/Modifiers/SwipeToDismiss.swift @@ -0,0 +1,34 @@ +// +// SwipeToDismiss.swift +// damus +// +// Created by Joel Klabo on 1/18/23. +// + +import SwiftUI + +struct SwipeToDismissModifier: ViewModifier { + var onDismiss: () -> Void + @State private var offset: CGSize = .zero + + func body(content: Content) -> some View { + content + .offset(y: offset.height) + .animation(.interactiveSpring(), value: offset) + .simultaneousGesture( + DragGesture() + .onChanged { gesture in + if gesture.translation.width < 50 { + offset = gesture.translation + } + } + .onEnded { _ in + if abs(offset.height) > 100 { + onDismiss() + } else { + offset = .zero + } + } + ) + } +} diff --git a/damus/Views/ProfileZoomView.swift b/damus/Views/ProfileZoomView.swift @@ -78,6 +78,9 @@ struct ProfileZoomView: View { .offset(x: offset.width + offsetState.width, y: offset.height + offsetState.height) .gesture(SimultaneousGesture(zoomGesture, dragGesture)) .gesture(doubleTapGesture) + .modifier(SwipeToDismissModifier(onDismiss: { + presentationMode.wrappedValue.dismiss() + })) } }