add swipe
This commit is contained in:
parent
6583ce38bb
commit
3d24e0afce
@ -14,6 +14,7 @@ struct TopBarView: View {
|
|||||||
@Binding var isSideMenuPresented: Bool
|
@Binding var isSideMenuPresented: Bool
|
||||||
|
|
||||||
@State private var searchText: String = ""
|
@State private var searchText: String = ""
|
||||||
|
@State private var isSearchBarVisible: Bool = false
|
||||||
|
|
||||||
var isHomeTab: Bool {
|
var isHomeTab: Bool {
|
||||||
return title == "Home"
|
return title == "Home"
|
||||||
@ -105,15 +106,34 @@ struct TopBarView: View {
|
|||||||
.padding()
|
.padding()
|
||||||
.frame(height: 50) // Стандартная высота для нав. бара
|
.frame(height: 50) // Стандартная высота для нав. бара
|
||||||
|
|
||||||
if isChatsTab {
|
if isChatsTab && isSearchBarVisible {
|
||||||
searchBar
|
searchBar
|
||||||
.padding(.horizontal)
|
.padding(.horizontal)
|
||||||
.padding(.bottom, 8)
|
.padding(.bottom, 8)
|
||||||
|
.transition(.move(edge: .top).combined(with: .opacity))
|
||||||
}
|
}
|
||||||
|
|
||||||
Divider()
|
Divider()
|
||||||
}
|
}
|
||||||
.background(Color(UIColor.systemBackground))
|
.background(Color(UIColor.systemBackground))
|
||||||
|
.animation(.spring(response: 0.35, dampingFraction: 0.85), value: isSearchBarVisible)
|
||||||
|
.onReceive(NotificationCenter.default.publisher(for: .chatsTabRevealSearchBar)) { _ in
|
||||||
|
guard isChatsTab else { return }
|
||||||
|
withAnimation {
|
||||||
|
isSearchBarVisible = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.onReceive(NotificationCenter.default.publisher(for: .chatsTabHideSearchBar)) { _ in
|
||||||
|
guard isChatsTab else { return }
|
||||||
|
withAnimation {
|
||||||
|
isSearchBarVisible = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.onChange(of: isChatsTab) { isChats in
|
||||||
|
if !isChats {
|
||||||
|
isSearchBarVisible = false
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -115,6 +115,7 @@ struct ChatsTab: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.listStyle(.plain)
|
.listStyle(.plain)
|
||||||
|
.simultaneousGesture(searchBarGesture)
|
||||||
// .safeAreaInset(edge: .top) {
|
// .safeAreaInset(edge: .top) {
|
||||||
// VStack(spacing: 0) {
|
// VStack(spacing: 0) {
|
||||||
// searchBar
|
// searchBar
|
||||||
@ -152,6 +153,21 @@ struct ChatsTab: View {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var searchBarGesture: some Gesture {
|
||||||
|
DragGesture(minimumDistance: 24)
|
||||||
|
.onEnded { value in
|
||||||
|
let verticalTranslation = value.translation.height
|
||||||
|
let horizontalTranslation = value.translation.width
|
||||||
|
guard abs(verticalTranslation) > abs(horizontalTranslation) else { return }
|
||||||
|
|
||||||
|
if verticalTranslation > 24 {
|
||||||
|
NotificationCenter.default.post(name: .chatsTabRevealSearchBar, object: nil)
|
||||||
|
} else if verticalTranslation < -24 {
|
||||||
|
NotificationCenter.default.post(name: .chatsTabHideSearchBar, object: nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private var isSearching: Bool {
|
private var isSearching: Bool {
|
||||||
!searchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
|
!searchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
|
||||||
}
|
}
|
||||||
@ -620,4 +636,6 @@ private struct ChatPlaceholderView: View {
|
|||||||
|
|
||||||
extension Notification.Name {
|
extension Notification.Name {
|
||||||
static let debugRefreshChats = Notification.Name("debugRefreshChats")
|
static let debugRefreshChats = Notification.Name("debugRefreshChats")
|
||||||
|
static let chatsTabRevealSearchBar = Notification.Name("chatsTabRevealSearchBar")
|
||||||
|
static let chatsTabHideSearchBar = Notification.Name("chatsTabHideSearchBar")
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user