From 88d551225e3d1452148f0b7767be7ccf2ac77187 Mon Sep 17 00:00:00 2001 From: Zomatree Date: Mon, 18 Nov 2024 04:20:20 +0000 Subject: [PATCH] fix: dont scroll channel while dragging sidebar --- .../Messagable/MessageableChannel.swift | 5 ++++- Revolt/Pages/Home/Home.swift | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Revolt/Pages/Channel/Messagable/MessageableChannel.swift b/Revolt/Pages/Channel/Messagable/MessageableChannel.swift index c4b26e9..6deb65f 100644 --- a/Revolt/Pages/Channel/Messagable/MessageableChannel.swift +++ b/Revolt/Pages/Channel/Messagable/MessageableChannel.swift @@ -114,6 +114,8 @@ struct MessageableChannelView: View { var toggleSidebar: () -> () + @Binding var disableScroll: Bool + @FocusState var focused: Bool var isCompactMode: Bool { @@ -395,6 +397,7 @@ struct MessageableChannelView: View { .environment(\.defaultMinListRowHeight, 0) //.gesture(TapGesture().onEnded { focused = false }, isEnabled: focused) .scrollDismissesKeyboard(.never) + .scrollDisabled(disableScroll) } .defaultScrollAnchor(.bottom) .scrollDismissesKeyboard(.never) @@ -454,6 +457,6 @@ struct MessageableChannelView: View { @Previewable @StateObject var viewState = ViewState.preview() let messages = Binding($viewState.channelMessages["0"])! - return MessageableChannelView(viewModel: .init(viewState: viewState, channel: viewState.channels["0"]!, server: viewState.servers[""], messages: messages), toggleSidebar: {}) + return MessageableChannelView(viewModel: .init(viewState: viewState, channel: viewState.channels["0"]!, server: viewState.servers[""], messages: messages), toggleSidebar: {}, disableScroll: .constant(false)) .applyPreviewModifiers(withState: viewState) } diff --git a/Revolt/Pages/Home/Home.swift b/Revolt/Pages/Home/Home.swift index ac62df1..3fd677b 100644 --- a/Revolt/Pages/Home/Home.swift +++ b/Revolt/Pages/Home/Home.swift @@ -12,6 +12,7 @@ struct MaybeChannelView: View { @Binding var currentChannel: ChannelSelection @Binding var currentSelection: MainSelection var toggleSidebar: () -> () + @Binding var disableScroll: Bool var body: some View { switch currentChannel { @@ -26,7 +27,8 @@ struct MaybeChannelView: View { server: currentSelection.id.map { viewState.servers[$0]! }, messages: messages ), - toggleSidebar: toggleSidebar + toggleSidebar: toggleSidebar, + disableScroll: $disableScroll ) } else { @@ -62,6 +64,7 @@ struct HomeRewritten: View { @State var offset = CGFloat.zero @State var forceOpen: Bool = false @State var calculatedSize = CGFloat.zero + @State var disableScroll = false func toggleSidebar() { withAnimation { @@ -89,7 +92,7 @@ struct HomeRewritten: View { } .frame(maxWidth: 300) - MaybeChannelView(currentChannel: $currentChannel, currentSelection: $currentSelection, toggleSidebar: toggleSidebar) + MaybeChannelView(currentChannel: $currentChannel, currentSelection: $currentSelection, toggleSidebar: toggleSidebar, disableScroll: $disableScroll) .frame(maxWidth: .infinity) } } else { @@ -119,7 +122,7 @@ struct HomeRewritten: View { .frame(width: geo.size.width) .ignoresSafeArea(.all) - MaybeChannelView(currentChannel: $currentChannel, currentSelection: $currentSelection, toggleSidebar: toggleSidebar) + MaybeChannelView(currentChannel: $currentChannel, currentSelection: $currentSelection, toggleSidebar: toggleSidebar, disableScroll: $disableScroll) .disabled(offset != 0.0) .offset(x: offset) .frame(width: geo.size.width) @@ -134,6 +137,10 @@ struct HomeRewritten: View { .simultaneousGesture( DragGesture(minimumDistance: 50.0) .onChanged({ g in + if g.translation.width >= 50 { + disableScroll = true + } + if offset > snapSide { forceOpen = true } else if offset <= snapSide { @@ -145,6 +152,8 @@ struct HomeRewritten: View { } }) .onEnded({ v in + disableScroll = false + withAnimation(.easeInOut) { if forceOpen { forceOpen = false @@ -153,7 +162,8 @@ struct HomeRewritten: View { offset = .zero } } - }) + }), + including: .all ) } .task { calculatedSize = sidebarWidth }