scroll to top while tap tap
This commit is contained in:
parent
198b51bd91
commit
1c9f249289
@ -32,6 +32,7 @@ struct ChatsTab: View {
|
||||
@State private var isPendingChatActive: Bool = false
|
||||
|
||||
private let searchRevealDistance: CGFloat = 90
|
||||
private let scrollToTopAnchorId = "ChatsListTopAnchor"
|
||||
|
||||
private var currentUserId: String? {
|
||||
let userId = loginViewModel.userId
|
||||
@ -109,6 +110,7 @@ struct ChatsTab: View {
|
||||
}
|
||||
|
||||
private var chatList: some View {
|
||||
ScrollViewReader { proxy in
|
||||
ZStack {
|
||||
List {
|
||||
// VStack(spacing: 0) {
|
||||
@ -144,8 +146,10 @@ struct ChatsTab: View {
|
||||
.listRowInsets(EdgeInsets(top: 24, leading: 16, bottom: 24, trailing: 16))
|
||||
.listRowSeparator(.hidden)
|
||||
} else {
|
||||
let firstLocalChatId = localSearchResults.first?.chatId
|
||||
ForEach(localSearchResults) { chat in
|
||||
chatRowItem(for: chat)
|
||||
.id(chat.chatId == firstLocalChatId ? scrollToTopAnchorId : chat.chatId)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -161,8 +165,10 @@ struct ChatsTab: View {
|
||||
emptyState
|
||||
} else {
|
||||
|
||||
let firstChatId = viewModel.chats.first?.chatId
|
||||
ForEach(viewModel.chats) { chat in
|
||||
chatRowItem(for: chat)
|
||||
.id(chat.chatId == firstChatId ? scrollToTopAnchorId : chat.chatId)
|
||||
}
|
||||
|
||||
if viewModel.isLoadingMore {
|
||||
@ -175,6 +181,9 @@ struct ChatsTab: View {
|
||||
.modifier(ScrollDismissesKeyboardModifier())
|
||||
.simultaneousGesture(searchBarGesture)
|
||||
.simultaneousGesture(tapToDismissKeyboardGesture)
|
||||
.onReceive(NotificationCenter.default.publisher(for: .chatsShouldScrollToTop)) { _ in
|
||||
scrollChatsToTop(using: proxy)
|
||||
}
|
||||
// .safeAreaInset(edge: .top) {
|
||||
// VStack(spacing: 0) {
|
||||
// searchBar
|
||||
@ -189,6 +198,7 @@ struct ChatsTab: View {
|
||||
pendingChatNavigationLink
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var pendingChatNavigationLink: some View {
|
||||
NavigationLink(
|
||||
@ -217,6 +227,14 @@ struct ChatsTab: View {
|
||||
}
|
||||
}
|
||||
|
||||
private func scrollChatsToTop(using proxy: ScrollViewProxy) {
|
||||
DispatchQueue.main.async {
|
||||
withAnimation(.spring(response: 0.35, dampingFraction: 0.75)) {
|
||||
proxy.scrollTo(scrollToTopAnchorId, anchor: .top)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var searchBarGesture: some Gesture {
|
||||
DragGesture(minimumDistance: 10, coordinateSpace: .local)
|
||||
.onChanged { value in
|
||||
@ -319,8 +337,10 @@ struct ChatsTab: View {
|
||||
if globalSearchResults.isEmpty {
|
||||
globalSearchEmptyRow
|
||||
} else {
|
||||
let firstGlobalUserId = globalSearchResults.first?.id
|
||||
ForEach(globalSearchResults) { user in
|
||||
globalSearchRow(for: user)
|
||||
.id(user.id == firstGlobalUserId ? AnyHashable(scrollToTopAnchorId) : AnyHashable(user.id))
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1181,4 +1201,5 @@ extension Notification.Name {
|
||||
static let debugRefreshChats = Notification.Name("debugRefreshChats")
|
||||
static let chatsShouldRefresh = Notification.Name("chatsShouldRefresh")
|
||||
static let chatsReloadCompleted = Notification.Name("chatsReloadCompleted")
|
||||
static let chatsShouldScrollToTop = Notification.Name("chatsShouldScrollToTop")
|
||||
}
|
||||
|
||||
@ -14,7 +14,7 @@ struct CustomTabBar: View {
|
||||
}
|
||||
|
||||
TabBarButton(systemName: "bubble.left.and.bubble.right.fill", text: NSLocalizedString("Чаты", comment: ""), isSelected: selectedTab == 2) {
|
||||
selectedTab = 2
|
||||
handleChatsTabTap()
|
||||
}
|
||||
|
||||
TabBarButton(systemName: "gearshape.fill", text: NSLocalizedString("Настройки", comment: ""), isSelected: selectedTab == 5) {
|
||||
@ -34,7 +34,7 @@ struct CustomTabBar: View {
|
||||
}
|
||||
|
||||
TabBarButton(systemName: "bubble.left.and.bubble.right.fill", text: NSLocalizedString("Чаты", comment: ""), isSelected: selectedTab == 2) {
|
||||
selectedTab = 2
|
||||
handleChatsTabTap()
|
||||
}
|
||||
|
||||
TabBarButton(systemName: "person.crop.square", text: NSLocalizedString("Лицо", comment: ""), isSelected: selectedTab == 3) {
|
||||
@ -93,3 +93,13 @@ struct CreateButton: View {
|
||||
.offset(y: -3)
|
||||
}
|
||||
}
|
||||
|
||||
private extension CustomTabBar {
|
||||
func handleChatsTabTap() {
|
||||
if selectedTab == 2 {
|
||||
NotificationCenter.default.post(name: .chatsShouldScrollToTop, object: nil)
|
||||
} else {
|
||||
selectedTab = 2
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user