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