add a telegram-style bottom tab bar to the main screen

- Replace the sidebar-based MainChatView with MainTabView: a custom
  bottom bar with Контакты / Звонки / Чаты / Настройки that looks the
  same on iOS and macOS, and open chats via push navigation.
- Put the search field above the chat and contact lists (searchable on
  iOS, an inline field on macOS) and add an aggregated call-history
  screen backed by model.callHistoryMessages.
- Embed SettingsView as a tab, update verify.sh guards, and keep CI on
  deterministic unit tests while the UI tests stay runnable manually.
This commit is contained in:
wt
2026-08-30 01:39:54 +07:00
parent 6ed5cb3ce9
commit efe3986ba5
11 changed files with 539 additions and 332 deletions
+11 -3
View File
@@ -282,7 +282,7 @@ if test -f Sources/Shared/Persistence/ChatArchive.swift; then
echo "The legacy JSON ChatArchive actor must stay removed"
exit 1
fi
grep -q '@Query' Sources/Shared/UI/MainChatView.swift || {
grep -q '@Query' Sources/Shared/UI/MainTabView.swift || {
echo "Chat list must be SwiftData @Query-driven"
exit 1
}
@@ -378,7 +378,7 @@ grep -q 'Удалить чат' Sources/Shared/UI/GroupInfoView.swift || {
echo "Group info must offer deleting the chat"
exit 1
}
grep -q 'pendingGroupDeletion' Sources/Shared/UI/MainChatView.swift || {
grep -q 'pendingGroupDeletion' Sources/Shared/UI/MainTabView.swift || {
echo "Chat list must offer deleting group chats"
exit 1
}
@@ -410,6 +410,14 @@ grep -q 'biometricUnlockAvailable' Sources/Shared/Models/AppModel.swift || {
echo "Biometric availability must be cached off the view body"
exit 1
}
grep -q 'Звонки' Sources/Shared/UI/MainTabView.swift || {
echo "The main screen must offer the Calls tab"
exit 1
}
grep -q 'Настройки' Sources/Shared/UI/MainTabView.swift || {
echo "The main screen must offer the Settings tab"
exit 1
}
grep -q 'case .background:' Sources/App/LumaApp.swift || {
echo "The app lock must trigger on background only, not on inactive"
exit 1
@@ -770,7 +778,7 @@ grep -q 'failedDrafts' Sources/Shared/UI/AttachmentPreviewView.swift || {
echo "Failed media drafts must remain available for retry"
exit 1
}
grep -q 'rosterContactJIDs' Sources/Shared/UI/MainChatView.swift || {
grep -q 'rosterContactJIDs' Sources/Shared/UI/MainTabView.swift || {
echo "Prosody roster contacts screen is missing"
exit 1
}