From 6d8b322688fc33ce7d93ce2ee63fcd749afbdfbb Mon Sep 17 00:00:00 2001 From: cheykrym Date: Wed, 22 Oct 2025 03:44:25 +0300 Subject: [PATCH] fix open in settings --- yobble/Views/Tab/ChatsTab.swift | 36 ------------------- yobble/Views/Tab/MainView.swift | 61 ++++++++++++++++++++++++++++----- 2 files changed, 52 insertions(+), 45 deletions(-) diff --git a/yobble/Views/Tab/ChatsTab.swift b/yobble/Views/Tab/ChatsTab.swift index b0b5978..b71710d 100644 --- a/yobble/Views/Tab/ChatsTab.swift +++ b/yobble/Views/Tab/ChatsTab.swift @@ -12,7 +12,6 @@ import UIKit struct ChatsTab: View { @ObservedObject private var loginViewModel: LoginViewModel - @Binding private var pendingNavigation: ChatNavigationTarget? @Binding var searchRevealProgress: CGFloat @Binding var searchText: String private let searchService = SearchService() @@ -41,12 +40,10 @@ struct ChatsTab: View { init( loginViewModel: LoginViewModel, - pendingNavigation: Binding, searchRevealProgress: Binding, searchText: Binding ) { self._loginViewModel = ObservedObject(wrappedValue: loginViewModel) - self._pendingNavigation = pendingNavigation self._searchRevealProgress = searchRevealProgress self._searchText = searchText } @@ -100,13 +97,6 @@ struct ChatsTab: View { globalSearchTask?.cancel() globalSearchTask = nil } - .onChange(of: pendingNavigation?.id) { _ in - guard let target = pendingNavigation else { return } - handleNavigationTarget(target.chat) - DispatchQueue.main.async { - pendingNavigation = nil - } - } } @ViewBuilder @@ -552,30 +542,6 @@ private extension ChatsTab { #endif } - func handleNavigationTarget(_ chatItem: PrivateChatListItem) { - dismissKeyboard() - if !searchText.isEmpty { - searchText = "" - } - if searchRevealProgress > 0 { - withAnimation(.spring(response: 0.35, dampingFraction: 0.75)) { - searchRevealProgress = 0 - } - } - - let existingChat = viewModel.chats.first(where: { $0.chatId == chatItem.chatId }) - pendingChatItem = existingChat ?? chatItem - selectedChatId = chatItem.chatId - isPendingChatActive = true - - if existingChat == nil { - if loginViewModel.chatLoadingState != .loading { - loginViewModel.chatLoadingState = .loading - } - viewModel.refresh() - } - } - func handleSearchQueryChange(_ query: String) { let trimmed = query.trimmingCharacters(in: .whitespacesAndNewlines) @@ -1195,12 +1161,10 @@ struct ChatsTab_Previews: PreviewProvider { @State private var progress: CGFloat = 1 @State private var searchText: String = "" @StateObject private var loginViewModel = LoginViewModel() - @State private var pendingNavigation: ChatNavigationTarget? var body: some View { ChatsTab( loginViewModel: loginViewModel, - pendingNavigation: $pendingNavigation, searchRevealProgress: $progress, searchText: $searchText ) diff --git a/yobble/Views/Tab/MainView.swift b/yobble/Views/Tab/MainView.swift index b281fd5..64caf70 100644 --- a/yobble/Views/Tab/MainView.swift +++ b/yobble/Views/Tab/MainView.swift @@ -17,6 +17,8 @@ struct MainView: View { @State private var chatSearchRevealProgress: CGFloat = 0 @State private var chatSearchText: String = "" @State private var isSettingsPresented = false + @State private var deepLinkChatItem: PrivateChatListItem? + @State private var isDeepLinkChatActive = false private var tabTitle: String { switch selectedTab { @@ -34,12 +36,6 @@ struct MainView: View { var body: some View { NavigationView { - let pendingNavigationBinding: Binding = AppConfig.PRESENT_CHAT_AS_SHEET - ? .constant(nil) - : Binding( - get: { messageCenter.pendingNavigation }, - set: { messageCenter.pendingNavigation = $0 } - ) ZStack(alignment: .top) { ZStack(alignment: .leading) { // Выравниваем ZStack по левому краю // Основной контент @@ -64,7 +60,6 @@ struct MainView: View { ChatsTab( loginViewModel: viewModel, - pendingNavigation: pendingNavigationBinding, searchRevealProgress: $chatSearchRevealProgress, searchText: $chatSearchText ) @@ -104,6 +99,8 @@ struct MainView: View { .offset(x: -menuWidth + menuOffset) // Новая логика смещения .ignoresSafeArea(edges: .vertical) } + + deepLinkNavigationLink } .gesture( DragGesture() @@ -147,12 +144,25 @@ struct MainView: View { } .onChange(of: messageCenter.pendingNavigation?.id) { _ in guard !AppConfig.PRESENT_CHAT_AS_SHEET, - messageCenter.pendingNavigation != nil else { return } + let target = messageCenter.pendingNavigation else { return } withAnimation(.easeInOut) { - selectedTab = 2 isSideMenuPresented = false menuOffset = 0 } + if !chatSearchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + chatSearchText = "" + } + if chatSearchRevealProgress > 0 { + withAnimation(.spring(response: 0.35, dampingFraction: 0.75)) { + chatSearchRevealProgress = 0 + } + } + deepLinkChatItem = target.chat + isDeepLinkChatActive = true + NotificationCenter.default.post(name: .chatsShouldRefresh, object: nil) + DispatchQueue.main.async { + messageCenter.pendingNavigation = nil + } } .onChange(of: selectedTab) { newValue in if newValue != 3 { @@ -162,6 +172,39 @@ struct MainView: View { } } +private extension MainView { + var deepLinkNavigationLink: some View { + NavigationLink( + destination: deepLinkChatDestination, + isActive: Binding( + get: { isDeepLinkChatActive && deepLinkChatItem != nil }, + set: { newValue in + if !newValue { + isDeepLinkChatActive = false + deepLinkChatItem = nil + } + } + ) + ) { + EmptyView() + } + .hidden() + } + + @ViewBuilder + var deepLinkChatDestination: some View { + if let chatItem = deepLinkChatItem { + PrivateChatView( + chat: chatItem, + currentUserId: messageCenter.currentUserId + ) + .id(chatItem.chatId) + } else { + EmptyView() + } + } +} + struct MainView_Previews: PreviewProvider { static var previews: some View { let mockViewModel = LoginViewModel()