Persist last visited tab and restore it on launch

This commit is contained in:
Benoit Martins 2025-04-22 16:31:41 +02:00
parent eb41590ed0
commit 49736388cf
3 changed files with 33 additions and 3 deletions

View file

@ -131,6 +131,8 @@ struct LinphoneApp: App {
@ObservedObject private var coreContext = CoreContext.shared
@ObservedObject private var sharedMainViewModel = SharedMainViewModel.shared
@State var index: Int = 0
@State private var contactViewModel: ContactViewModel?
@State private var editContactViewModel: EditContactViewModel?
@State private var historyViewModel: HistoryViewModel?
@ -192,10 +194,12 @@ struct LinphoneApp: App {
meetingsListViewModel: meetingsListViewModel!,
meetingViewModel: meetingViewModel!,
conversationForwardMessageViewModel: conversationForwardMessageViewModel!,
accountProfileViewModel: accountProfileViewModel!
accountProfileViewModel: accountProfileViewModel!,
index: $index
)
.environmentObject(navigationManager)
.onAppear {
index = sharedMainViewModel.indexView
// Link the navigation manager to the AppDelegate
delegate.navigationManager = navigationManager

View file

@ -51,7 +51,7 @@ struct ContentView: View {
@ObservedObject var conversationForwardMessageViewModel: ConversationForwardMessageViewModel
@ObservedObject var accountProfileViewModel: AccountProfileViewModel
@State var index = 0
@Binding var index: Int
@State private var orientation = UIDevice.current.orientation
@State var sideMenuIsOpen: Bool = false
@ -143,6 +143,7 @@ struct ContentView: View {
Button(action: {
self.index = 0
sharedMainViewModel.changeIndexView(indexViewInt: 0)
historyViewModel.displayedCall = nil
conversationViewModel.displayedConversation = nil
meetingViewModel.displayedMeeting = nil
@ -188,6 +189,7 @@ struct ContentView: View {
Button(action: {
self.index = 1
sharedMainViewModel.changeIndexView(indexViewInt: 1)
contactViewModel.indexDisplayedFriend = nil
conversationViewModel.displayedConversation = nil
meetingViewModel.displayedMeeting = nil
@ -237,6 +239,7 @@ struct ContentView: View {
Button(action: {
self.index = 2
sharedMainViewModel.changeIndexView(indexViewInt: 2)
historyViewModel.displayedCall = nil
contactViewModel.indexDisplayedFriend = nil
meetingViewModel.displayedMeeting = nil
@ -263,6 +266,7 @@ struct ContentView: View {
Button(action: {
self.index = 3
sharedMainViewModel.changeIndexView(indexViewInt: 3)
contactViewModel.indexDisplayedFriend = nil
historyViewModel.displayedCall = nil
conversationViewModel.displayedConversation = nil
@ -733,6 +737,7 @@ struct ContentView: View {
Spacer()
Button(action: {
self.index = 0
sharedMainViewModel.changeIndexView(indexViewInt: 0)
historyViewModel.displayedCall = nil
conversationViewModel.displayedConversation = nil
meetingViewModel.displayedMeeting = nil
@ -780,6 +785,7 @@ struct ContentView: View {
Button(action: {
self.index = 1
sharedMainViewModel.changeIndexView(indexViewInt: 1)
contactViewModel.indexDisplayedFriend = nil
conversationViewModel.displayedConversation = nil
meetingViewModel.displayedMeeting = nil
@ -831,6 +837,7 @@ struct ContentView: View {
Button(action: {
self.index = 2
sharedMainViewModel.changeIndexView(indexViewInt: 2)
historyViewModel.displayedCall = nil
contactViewModel.indexDisplayedFriend = nil
meetingViewModel.displayedMeeting = nil
@ -858,6 +865,7 @@ struct ContentView: View {
Spacer()
Button(action: {
self.index = 3
sharedMainViewModel.changeIndexView(indexViewInt: 3)
contactViewModel.indexDisplayedFriend = nil
historyViewModel.displayedCall = nil
conversationViewModel.displayedConversation = nil
@ -1198,6 +1206,7 @@ struct ContentView: View {
contactViewModel.indexDisplayedFriend = nil
historyViewModel.displayedCall = nil
index = 2
sharedMainViewModel.changeIndexView(indexViewInt: 2)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
withAnimation {
self.conversationViewModel.changeDisplayedChatRoom(conversationModel: contactViewModel.displayedConversation!)
@ -1381,6 +1390,7 @@ struct ContentView: View {
.onChange(of: navigationManager.selectedCallId) { newCallId in
if newCallId != nil {
self.index = 2
sharedMainViewModel.changeIndexView(indexViewInt: 2)
}
}
.onReceive(contactLoaded) { _ in
@ -1454,7 +1464,8 @@ class NavigationManager: ObservableObject {
meetingsListViewModel: MeetingsListViewModel(),
meetingViewModel: MeetingViewModel(),
conversationForwardMessageViewModel: ConversationForwardMessageViewModel(),
accountProfileViewModel: AccountProfileViewModel()
accountProfileViewModel: AccountProfileViewModel(),
index: .constant(0)
)
}
// swiftlint:enable type_body_length

View file

@ -27,17 +27,25 @@ class SharedMainViewModel: ObservableObject {
@Published var generalTermsAccepted = false
@Published var displayProfileMode = false
@Published var defaultAvatar: URL?
@Published var indexView: Int = 0
let welcomeViewKey = "welcome_view"
let generalTermsKey = "general_terms"
let displayProfileModeKey = "display_profile_mode"
let defaultAvatarKey = "default_avatar"
let indexViewKey = "index_view"
var maxWidth = 600.0
private init() {
let preferences = UserDefaults.standard
if preferences.object(forKey: indexViewKey) == nil {
preferences.set(indexView, forKey: indexViewKey)
} else {
indexView = preferences.integer(forKey: indexViewKey)
}
if preferences.object(forKey: welcomeViewKey) == nil {
preferences.set(welcomeViewDisplayed, forKey: welcomeViewKey)
} else {
@ -99,4 +107,11 @@ class SharedMainViewModel: ObservableObject {
defaultAvatar = defaultAvatarURL
preferences.set(defaultAvatar, forKey: defaultAvatarKey)
}
func changeIndexView(indexViewInt: Int) {
let preferences = UserDefaults.standard
indexView = indexViewInt
preferences.set(indexView, forKey: indexViewKey)
}
}