Онлайн-статусы, исправление навигации и UI чатов

- Реализован PacketOnlineSubscribe (0x04) для подписки на статус собеседника
- Онлайн-статус загружается из результатов поиска (PacketSearch) при каждом хэндшейке
- Toolbar capsule показывает online/offline/typing вместо @username
- Зелёная точка онлайн-индикатора на аватаре в списке чатов (bottom-left, как в Android)
- Убрана точка с аватара в toolbar (статус отображается текстом)
- Исправлен баг двойного тапа при входе в чат (программная навигация вместо NavigationLink)
- DialogRepository.updateUserInfo теперь принимает и сохраняет online-статус
- Очистка requestedUserInfoKeys при реконнекте для обновления статусов
- Добавлено логирование результатов поиска и отправки пакетов

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-06 04:00:57 +05:00
parent 003c262378
commit 6bef51e235
16 changed files with 769 additions and 405 deletions

View File

@@ -38,16 +38,16 @@ struct AvatarView: View {
}
}
.frame(width: size, height: size)
.overlay(alignment: .bottomTrailing) {
.overlay(alignment: .bottomLeading) {
if isOnline {
Circle()
.fill(RosettaColors.online)
.fill(Color(hex: 0x4CD964))
.frame(width: badgeSize, height: badgeSize)
.overlay {
Circle()
.stroke(RosettaColors.Adaptive.background, lineWidth: 2)
.stroke(RosettaColors.Adaptive.background, lineWidth: size * 0.05)
}
.offset(x: 1, y: 1)
.offset(x: -1, y: 1)
}
}
.accessibilityLabel(isSavedMessages ? "Saved Messages" : initials)

View File

@@ -0,0 +1,28 @@
import SwiftUI
/// Re-enables the iOS interactive swipe-back gesture when
/// `.navigationBarBackButtonHidden(true)` is used in SwiftUI.
struct SwipeBackGestureEnabler: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIViewController {
SwipeBackController()
}
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
private final class SwipeBackController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if let nav = navigationController {
nav.interactivePopGestureRecognizer?.isEnabled = true
nav.interactivePopGestureRecognizer?.delegate = nil
}
}
}
}
extension View {
/// Restores the swipe-back gesture after hiding the default back button.
func enableSwipeBack() -> some View {
background(SwipeBackGestureEnabler())
}
}