Switch to SwiftUI TabView

This commit is contained in:
Selim Mustafaev 2025-04-19 17:43:38 +03:00
parent 180866c31b
commit e7a9f25845
24 changed files with 209 additions and 404 deletions

View File

@ -9,7 +9,6 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
7A06E0AC2C7065AC005731AC /* SettingsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A06E0AB2C7065AB005731AC /* SettingsScreen.swift */; }; 7A06E0AC2C7065AC005731AC /* SettingsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A06E0AB2C7065AB005731AC /* SettingsScreen.swift */; };
7A06E0AE2C7065C7005731AC /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A06E0AD2C7065C7005731AC /* SettingsViewModel.swift */; }; 7A06E0AE2C7065C7005731AC /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A06E0AD2C7065C7005731AC /* SettingsViewModel.swift */; };
7A06E0B02C7065D8005731AC /* SettingsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A06E0AF2C7065D8005731AC /* SettingsCoordinator.swift */; };
7A06E0B32C707E13005731AC /* SettingsServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A06E0B22C707E13005731AC /* SettingsServiceProtocol.swift */; }; 7A06E0B32C707E13005731AC /* SettingsServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A06E0B22C707E13005731AC /* SettingsServiceProtocol.swift */; };
7A06E0B52C707E2B005731AC /* SettingsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A06E0B42C707E2B005731AC /* SettingsService.swift */; }; 7A06E0B52C707E2B005731AC /* SettingsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A06E0B42C707E2B005731AC /* SettingsService.swift */; };
7A10226C2C551EC500B84627 /* LocationEditScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A10226B2C551EC500B84627 /* LocationEditScreen.swift */; }; 7A10226C2C551EC500B84627 /* LocationEditScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A10226B2C551EC500B84627 /* LocationEditScreen.swift */; };
@ -23,11 +22,8 @@
7A11470823FDE7E500B424AF /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7A11470623FDE7E500B424AF /* Main.storyboard */; }; 7A11470823FDE7E500B424AF /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7A11470623FDE7E500B424AF /* Main.storyboard */; };
7A11470A23FDE7E600B424AF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A11470923FDE7E600B424AF /* Assets.xcassets */; }; 7A11470A23FDE7E600B424AF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A11470923FDE7E600B424AF /* Assets.xcassets */; };
7A11470D23FDE7E600B424AF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7A11470B23FDE7E600B424AF /* LaunchScreen.storyboard */; }; 7A11470D23FDE7E600B424AF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7A11470B23FDE7E600B424AF /* LaunchScreen.storyboard */; };
7A11471623FDEB2A00B424AF /* MainSplitController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11471523FDEB2A00B424AF /* MainSplitController.swift */; };
7A123C742D9DC40A00781F24 /* RecordScreenOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A123C732D9DC40A00781F24 /* RecordScreenOutput.swift */; };
7A131FD32D37B75500DC7755 /* HistoryScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A131FD22D37B75500DC7755 /* HistoryScreen.swift */; }; 7A131FD32D37B75500DC7755 /* HistoryScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A131FD22D37B75500DC7755 /* HistoryScreen.swift */; };
7A131FD52D37B76A00DC7755 /* HistoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A131FD42D37B76A00DC7755 /* HistoryViewModel.swift */; }; 7A131FD52D37B76A00DC7755 /* HistoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A131FD42D37B76A00DC7755 /* HistoryViewModel.swift */; };
7A131FD72D37B77E00DC7755 /* HistoryCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A131FD62D37B77E00DC7755 /* HistoryCoordinator.swift */; };
7A1441662C297EDE00E79018 /* NotesScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1441652C297EDE00E79018 /* NotesScreen.swift */; }; 7A1441662C297EDE00E79018 /* NotesScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1441652C297EDE00E79018 /* NotesScreen.swift */; };
7A1441682C297EFD00E79018 /* NotesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1441672C297EFD00E79018 /* NotesViewModel.swift */; }; 7A1441682C297EFD00E79018 /* NotesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1441672C297EFD00E79018 /* NotesViewModel.swift */; };
7A14416E2C297F7C00E79018 /* Coordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A14416D2C297F7C00E79018 /* Coordinator.swift */; }; 7A14416E2C297F7C00E79018 /* Coordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A14416D2C297F7C00E79018 /* Coordinator.swift */; };
@ -57,7 +53,6 @@
7A589E0F2D6B6E8E00EF3FBE /* NumberEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A589E0E2D6B6E8E00EF3FBE /* NumberEditView.swift */; }; 7A589E0F2D6B6E8E00EF3FBE /* NumberEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A589E0E2D6B6E8E00EF3FBE /* NumberEditView.swift */; };
7A5911EE2D63226F00EC51BA /* SearchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A5911ED2D63226F00EC51BA /* SearchScreen.swift */; }; 7A5911EE2D63226F00EC51BA /* SearchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A5911ED2D63226F00EC51BA /* SearchScreen.swift */; };
7A5911F02D63266B00EC51BA /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A5911EF2D63266B00EC51BA /* SearchViewModel.swift */; }; 7A5911F02D63266B00EC51BA /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A5911EF2D63266B00EC51BA /* SearchViewModel.swift */; };
7A5911F22D63268400EC51BA /* SearchCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A5911F12D63268400EC51BA /* SearchCoordinator.swift */; };
7A599C362C18AC7F00D47C18 /* ApiError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A599C352C18AC7F00D47C18 /* ApiError.swift */; }; 7A599C362C18AC7F00D47C18 /* ApiError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A599C352C18AC7F00D47C18 /* ApiError.swift */; };
7A599C392C18B22900D47C18 /* FbRefreshTokenModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A599C382C18B22900D47C18 /* FbRefreshTokenModel.swift */; }; 7A599C392C18B22900D47C18 /* FbRefreshTokenModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A599C382C18B22900D47C18 /* FbRefreshTokenModel.swift */; };
7A599C3B2C18B36A00D47C18 /* FbVerifyTokenModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A599C3A2C18B36A00D47C18 /* FbVerifyTokenModel.swift */; }; 7A599C3B2C18B36A00D47C18 /* FbVerifyTokenModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A599C3A2C18B36A00D47C18 /* FbVerifyTokenModel.swift */; };
@ -124,7 +119,6 @@
7A95197D2D80B43D00E69883 /* AudioRecordError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A95197C2D80B43D00E69883 /* AudioRecordError.swift */; }; 7A95197D2D80B43D00E69883 /* AudioRecordError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A95197C2D80B43D00E69883 /* AudioRecordError.swift */; };
7A9519802D80B6C100E69883 /* RecordsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A95197F2D80B6C100E69883 /* RecordsScreen.swift */; }; 7A9519802D80B6C100E69883 /* RecordsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A95197F2D80B6C100E69883 /* RecordsScreen.swift */; };
7A9519822D80B6E500E69883 /* RecordsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9519812D80B6E500E69883 /* RecordsViewModel.swift */; }; 7A9519822D80B6E500E69883 /* RecordsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9519812D80B6E500E69883 /* RecordsViewModel.swift */; };
7A9519842D80B72B00E69883 /* RecordsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A9519832D80B72B00E69883 /* RecordsCoordinator.swift */; };
7A961C6C2C4C3C8600CE2211 /* TextRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A961C6B2C4C3C8600CE2211 /* TextRowView.swift */; }; 7A961C6C2C4C3C8600CE2211 /* TextRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A961C6B2C4C3C8600CE2211 /* TextRowView.swift */; };
7A961C6E2C4C3C9E00CE2211 /* LinkRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A961C6D2C4C3C9E00CE2211 /* LinkRowView.swift */; }; 7A961C6E2C4C3C9E00CE2211 /* LinkRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A961C6D2C4C3C9E00CE2211 /* LinkRowView.swift */; };
7A96AE2F246B2BCD00297C33 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A96AE2E246B2BCD00297C33 /* WebKit.framework */; }; 7A96AE2F246B2BCD00297C33 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A96AE2E246B2BCD00297C33 /* WebKit.framework */; };
@ -167,13 +161,12 @@
7ABDA80D2D8721B10083C715 /* Substrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ABDA80C2D8721B10083C715 /* Substrings.swift */; }; 7ABDA80D2D8721B10083C715 /* Substrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ABDA80C2D8721B10083C715 /* Substrings.swift */; };
7ABDA80F2D8723F90083C715 /* StorageService+AudioRecords.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ABDA80E2D8723F90083C715 /* StorageService+AudioRecords.swift */; }; 7ABDA80F2D8723F90083C715 /* StorageService+AudioRecords.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ABDA80E2D8723F90083C715 /* StorageService+AudioRecords.swift */; };
7AC3554A2969652F00889457 /* SwiftEntryKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AC355492969652F00889457 /* SwiftEntryKit */; }; 7AC3554A2969652F00889457 /* SwiftEntryKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AC355492969652F00889457 /* SwiftEntryKit */; };
7AC3554C29696A1C00889457 /* MainTabController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC3554B29696A1C00889457 /* MainTabController.swift */; };
7AC3554E29696C4500889457 /* DummyNewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC3554D29696C4500889457 /* DummyNewController.swift */; };
7AC3555029696D5A00889457 /* NewNumberController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC3554F29696D5A00889457 /* NewNumberController.swift */; }; 7AC3555029696D5A00889457 /* NewNumberController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC3554F29696D5A00889457 /* NewNumberController.swift */; };
7AC3555229696E3F00889457 /* UIView+layout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC3555129696E3F00889457 /* UIView+layout.swift */; }; 7AC3555229696E3F00889457 /* UIView+layout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC3555129696E3F00889457 /* UIView+layout.swift */; };
7AC35554296973E100889457 /* ACButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC35553296973E100889457 /* ACButton.swift */; }; 7AC35554296973E100889457 /* ACButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC35553296973E100889457 /* ACButton.swift */; };
7AC355592969746600889457 /* UIControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC355582969746600889457 /* UIControl.swift */; }; 7AC355592969746600889457 /* UIControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC355582969746600889457 /* UIControl.swift */; };
7AC3555B296995B200889457 /* UIEdgeInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC3555A296995B200889457 /* UIEdgeInsets.swift */; }; 7AC3555B296995B200889457 /* UIEdgeInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC3555A296995B200889457 /* UIEdgeInsets.swift */; };
7AC44B822DB390B900ADC026 /* MainTabScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC44B812DB390B900ADC026 /* MainTabScreen.swift */; };
7AC76D7B270083AE0084DB27 /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC76D7A270083AE0084DB27 /* TextView.swift */; }; 7AC76D7B270083AE0084DB27 /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC76D7A270083AE0084DB27 /* TextView.swift */; };
7AC8B2762D6A01C700190706 /* UISearchTextField+Dumb.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC8B2752D6A01C700190706 /* UISearchTextField+Dumb.swift */; }; 7AC8B2762D6A01C700190706 /* UISearchTextField+Dumb.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC8B2752D6A01C700190706 /* UISearchTextField+Dumb.swift */; };
7ACBB91E2CB9B155005A5168 /* Mockable in Frameworks */ = {isa = PBXBuildFile; productRef = 7ACBB91D2CB9B155005A5168 /* Mockable */; }; 7ACBB91E2CB9B155005A5168 /* Mockable in Frameworks */ = {isa = PBXBuildFile; productRef = 7ACBB91D2CB9B155005A5168 /* Mockable */; };
@ -274,7 +267,6 @@
7A0516192414FF0900FC55AC /* DateSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateSection.swift; sourceTree = "<group>"; }; 7A0516192414FF0900FC55AC /* DateSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateSection.swift; sourceTree = "<group>"; };
7A06E0AB2C7065AB005731AC /* SettingsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreen.swift; sourceTree = "<group>"; }; 7A06E0AB2C7065AB005731AC /* SettingsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreen.swift; sourceTree = "<group>"; };
7A06E0AD2C7065C7005731AC /* SettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewModel.swift; sourceTree = "<group>"; }; 7A06E0AD2C7065C7005731AC /* SettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewModel.swift; sourceTree = "<group>"; };
7A06E0AF2C7065D8005731AC /* SettingsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsCoordinator.swift; sourceTree = "<group>"; };
7A06E0B22C707E13005731AC /* SettingsServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsServiceProtocol.swift; sourceTree = "<group>"; }; 7A06E0B22C707E13005731AC /* SettingsServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsServiceProtocol.swift; sourceTree = "<group>"; };
7A06E0B42C707E2B005731AC /* SettingsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsService.swift; sourceTree = "<group>"; }; 7A06E0B42C707E2B005731AC /* SettingsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsService.swift; sourceTree = "<group>"; };
7A10226B2C551EC500B84627 /* LocationEditScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationEditScreen.swift; sourceTree = "<group>"; }; 7A10226B2C551EC500B84627 /* LocationEditScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationEditScreen.swift; sourceTree = "<group>"; };
@ -290,15 +282,12 @@
7A11470923FDE7E600B424AF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 7A11470923FDE7E600B424AF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
7A11470C23FDE7E600B424AF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 7A11470C23FDE7E600B424AF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
7A11470E23FDE7E600B424AF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 7A11470E23FDE7E600B424AF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
7A11471523FDEB2A00B424AF /* MainSplitController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainSplitController.swift; sourceTree = "<group>"; };
7A11474323FF06CA00B424AF /* ApiService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiService.swift; sourceTree = "<group>"; }; 7A11474323FF06CA00B424AF /* ApiService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiService.swift; sourceTree = "<group>"; };
7A11474623FF2AA500B424AF /* User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = "<group>"; }; 7A11474623FF2AA500B424AF /* User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = "<group>"; };
7A11474823FF2B2D00B424AF /* Response.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Response.swift; sourceTree = "<group>"; }; 7A11474823FF2B2D00B424AF /* Response.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Response.swift; sourceTree = "<group>"; };
7A11474D23FFEE8800B424AF /* SVProgressHUD.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SVProgressHUD.framework; path = Carthage/Build/iOS/SVProgressHUD.framework; sourceTree = "<group>"; }; 7A11474D23FFEE8800B424AF /* SVProgressHUD.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SVProgressHUD.framework; path = Carthage/Build/iOS/SVProgressHUD.framework; sourceTree = "<group>"; };
7A123C732D9DC40A00781F24 /* RecordScreenOutput.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordScreenOutput.swift; sourceTree = "<group>"; };
7A131FD22D37B75500DC7755 /* HistoryScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryScreen.swift; sourceTree = "<group>"; }; 7A131FD22D37B75500DC7755 /* HistoryScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryScreen.swift; sourceTree = "<group>"; };
7A131FD42D37B76A00DC7755 /* HistoryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryViewModel.swift; sourceTree = "<group>"; }; 7A131FD42D37B76A00DC7755 /* HistoryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryViewModel.swift; sourceTree = "<group>"; };
7A131FD62D37B77E00DC7755 /* HistoryCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryCoordinator.swift; sourceTree = "<group>"; };
7A1441652C297EDE00E79018 /* NotesScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotesScreen.swift; sourceTree = "<group>"; }; 7A1441652C297EDE00E79018 /* NotesScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotesScreen.swift; sourceTree = "<group>"; };
7A1441672C297EFD00E79018 /* NotesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotesViewModel.swift; sourceTree = "<group>"; }; 7A1441672C297EFD00E79018 /* NotesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotesViewModel.swift; sourceTree = "<group>"; };
7A14416D2C297F7C00E79018 /* Coordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Coordinator.swift; sourceTree = "<group>"; }; 7A14416D2C297F7C00E79018 /* Coordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Coordinator.swift; sourceTree = "<group>"; };
@ -333,7 +322,6 @@
7A589E0E2D6B6E8E00EF3FBE /* NumberEditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumberEditView.swift; sourceTree = "<group>"; }; 7A589E0E2D6B6E8E00EF3FBE /* NumberEditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumberEditView.swift; sourceTree = "<group>"; };
7A5911ED2D63226F00EC51BA /* SearchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchScreen.swift; sourceTree = "<group>"; }; 7A5911ED2D63226F00EC51BA /* SearchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchScreen.swift; sourceTree = "<group>"; };
7A5911EF2D63266B00EC51BA /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = "<group>"; }; 7A5911EF2D63266B00EC51BA /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = "<group>"; };
7A5911F12D63268400EC51BA /* SearchCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchCoordinator.swift; sourceTree = "<group>"; };
7A599C352C18AC7F00D47C18 /* ApiError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiError.swift; sourceTree = "<group>"; }; 7A599C352C18AC7F00D47C18 /* ApiError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiError.swift; sourceTree = "<group>"; };
7A599C382C18B22900D47C18 /* FbRefreshTokenModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FbRefreshTokenModel.swift; sourceTree = "<group>"; }; 7A599C382C18B22900D47C18 /* FbRefreshTokenModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FbRefreshTokenModel.swift; sourceTree = "<group>"; };
7A599C3A2C18B36A00D47C18 /* FbVerifyTokenModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FbVerifyTokenModel.swift; sourceTree = "<group>"; }; 7A599C3A2C18B36A00D47C18 /* FbVerifyTokenModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FbVerifyTokenModel.swift; sourceTree = "<group>"; };
@ -402,7 +390,6 @@
7A95197C2D80B43D00E69883 /* AudioRecordError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecordError.swift; sourceTree = "<group>"; }; 7A95197C2D80B43D00E69883 /* AudioRecordError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecordError.swift; sourceTree = "<group>"; };
7A95197F2D80B6C100E69883 /* RecordsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordsScreen.swift; sourceTree = "<group>"; }; 7A95197F2D80B6C100E69883 /* RecordsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordsScreen.swift; sourceTree = "<group>"; };
7A9519812D80B6E500E69883 /* RecordsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordsViewModel.swift; sourceTree = "<group>"; }; 7A9519812D80B6E500E69883 /* RecordsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordsViewModel.swift; sourceTree = "<group>"; };
7A9519832D80B72B00E69883 /* RecordsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordsCoordinator.swift; sourceTree = "<group>"; };
7A961C6B2C4C3C8600CE2211 /* TextRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextRowView.swift; sourceTree = "<group>"; }; 7A961C6B2C4C3C8600CE2211 /* TextRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextRowView.swift; sourceTree = "<group>"; };
7A961C6D2C4C3C9E00CE2211 /* LinkRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkRowView.swift; sourceTree = "<group>"; }; 7A961C6D2C4C3C9E00CE2211 /* LinkRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkRowView.swift; sourceTree = "<group>"; };
7A96AE2E246B2BCD00297C33 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/WebKit.framework; sourceTree = DEVELOPER_DIR; }; 7A96AE2E246B2BCD00297C33 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/WebKit.framework; sourceTree = DEVELOPER_DIR; };
@ -445,13 +432,12 @@
7ABDA80A2D8715DC0083C715 /* VehicleRecordError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleRecordError.swift; sourceTree = "<group>"; }; 7ABDA80A2D8715DC0083C715 /* VehicleRecordError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleRecordError.swift; sourceTree = "<group>"; };
7ABDA80C2D8721B10083C715 /* Substrings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Substrings.swift; sourceTree = "<group>"; }; 7ABDA80C2D8721B10083C715 /* Substrings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Substrings.swift; sourceTree = "<group>"; };
7ABDA80E2D8723F90083C715 /* StorageService+AudioRecords.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StorageService+AudioRecords.swift"; sourceTree = "<group>"; }; 7ABDA80E2D8723F90083C715 /* StorageService+AudioRecords.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StorageService+AudioRecords.swift"; sourceTree = "<group>"; };
7AC3554B29696A1C00889457 /* MainTabController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabController.swift; sourceTree = "<group>"; };
7AC3554D29696C4500889457 /* DummyNewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DummyNewController.swift; sourceTree = "<group>"; };
7AC3554F29696D5A00889457 /* NewNumberController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewNumberController.swift; sourceTree = "<group>"; }; 7AC3554F29696D5A00889457 /* NewNumberController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewNumberController.swift; sourceTree = "<group>"; };
7AC3555129696E3F00889457 /* UIView+layout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+layout.swift"; sourceTree = "<group>"; }; 7AC3555129696E3F00889457 /* UIView+layout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+layout.swift"; sourceTree = "<group>"; };
7AC35553296973E100889457 /* ACButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ACButton.swift; sourceTree = "<group>"; }; 7AC35553296973E100889457 /* ACButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ACButton.swift; sourceTree = "<group>"; };
7AC355582969746600889457 /* UIControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIControl.swift; sourceTree = "<group>"; }; 7AC355582969746600889457 /* UIControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIControl.swift; sourceTree = "<group>"; };
7AC3555A296995B200889457 /* UIEdgeInsets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIEdgeInsets.swift; sourceTree = "<group>"; }; 7AC3555A296995B200889457 /* UIEdgeInsets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIEdgeInsets.swift; sourceTree = "<group>"; };
7AC44B812DB390B900ADC026 /* MainTabScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabScreen.swift; sourceTree = "<group>"; };
7AC76D7A270083AE0084DB27 /* TextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = "<group>"; }; 7AC76D7A270083AE0084DB27 /* TextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = "<group>"; };
7AC8B2752D6A01C700190706 /* UISearchTextField+Dumb.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISearchTextField+Dumb.swift"; sourceTree = "<group>"; }; 7AC8B2752D6A01C700190706 /* UISearchTextField+Dumb.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISearchTextField+Dumb.swift"; sourceTree = "<group>"; };
7ADF6C92250B954900F237B2 /* Navigation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Navigation.swift; sourceTree = "<group>"; }; 7ADF6C92250B954900F237B2 /* Navigation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Navigation.swift; sourceTree = "<group>"; };
@ -552,7 +538,6 @@
children = ( children = (
7A06E0AB2C7065AB005731AC /* SettingsScreen.swift */, 7A06E0AB2C7065AB005731AC /* SettingsScreen.swift */,
7A06E0AD2C7065C7005731AC /* SettingsViewModel.swift */, 7A06E0AD2C7065C7005731AC /* SettingsViewModel.swift */,
7A06E0AF2C7065D8005731AC /* SettingsCoordinator.swift */,
); );
path = SettingsScreen; path = SettingsScreen;
sourceTree = "<group>"; sourceTree = "<group>";
@ -637,9 +622,6 @@
7A11471423FDEAF800B424AF /* Controllers */ = { 7A11471423FDEAF800B424AF /* Controllers */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
7A11471523FDEB2A00B424AF /* MainSplitController.swift */,
7AC3554B29696A1C00889457 /* MainTabController.swift */,
7AC3554D29696C4500889457 /* DummyNewController.swift */,
7AC3554F29696D5A00889457 /* NewNumberController.swift */, 7AC3554F29696D5A00889457 /* NewNumberController.swift */,
); );
path = Controllers; path = Controllers;
@ -696,7 +678,6 @@
children = ( children = (
7A131FD22D37B75500DC7755 /* HistoryScreen.swift */, 7A131FD22D37B75500DC7755 /* HistoryScreen.swift */,
7A131FD42D37B76A00DC7755 /* HistoryViewModel.swift */, 7A131FD42D37B76A00DC7755 /* HistoryViewModel.swift */,
7A131FD62D37B77E00DC7755 /* HistoryCoordinator.swift */,
7A4955812D58CCF900912E66 /* HistoryFilter.swift */, 7A4955812D58CCF900912E66 /* HistoryFilter.swift */,
); );
path = HistoryScreen; path = HistoryScreen;
@ -705,6 +686,7 @@
7A1441632C297E9800E79018 /* Screens */ = { 7A1441632C297E9800E79018 /* Screens */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
7AC44B802DB390A500ADC026 /* MainTabScreen */,
7ADFC9552DAD026C001A43E3 /* GoogleAuthScreen */, 7ADFC9552DAD026C001A43E3 /* GoogleAuthScreen */,
7A386A3E2DABDBFF0051676A /* MapScreen */, 7A386A3E2DABDBFF0051676A /* MapScreen */,
7AF231912DA1C26C00AE5EB3 /* AuthScreen */, 7AF231912DA1C26C00AE5EB3 /* AuthScreen */,
@ -809,7 +791,6 @@
children = ( children = (
7A5911ED2D63226F00EC51BA /* SearchScreen.swift */, 7A5911ED2D63226F00EC51BA /* SearchScreen.swift */,
7A5911EF2D63266B00EC51BA /* SearchViewModel.swift */, 7A5911EF2D63266B00EC51BA /* SearchViewModel.swift */,
7A5911F12D63268400EC51BA /* SearchCoordinator.swift */,
); );
path = SearchScreen; path = SearchScreen;
sourceTree = "<group>"; sourceTree = "<group>";
@ -973,8 +954,6 @@
7A6C65202D99930C001240C2 /* AudioRecordView */, 7A6C65202D99930C001240C2 /* AudioRecordView */,
7A95197F2D80B6C100E69883 /* RecordsScreen.swift */, 7A95197F2D80B6C100E69883 /* RecordsScreen.swift */,
7A9519812D80B6E500E69883 /* RecordsViewModel.swift */, 7A9519812D80B6E500E69883 /* RecordsViewModel.swift */,
7A9519832D80B72B00E69883 /* RecordsCoordinator.swift */,
7A123C732D9DC40A00781F24 /* RecordScreenOutput.swift */,
); );
path = RecordsScreen; path = RecordsScreen;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1101,6 +1080,14 @@
path = Extensions; path = Extensions;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
7AC44B802DB390A500ADC026 /* MainTabScreen */ = {
isa = PBXGroup;
children = (
7AC44B812DB390B900ADC026 /* MainTabScreen.swift */,
);
path = MainTabScreen;
sourceTree = "<group>";
};
7ADFC9552DAD026C001A43E3 /* GoogleAuthScreen */ = { 7ADFC9552DAD026C001A43E3 /* GoogleAuthScreen */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -1424,10 +1411,8 @@
7A3399AB299063370087DF98 /* SearchControllerExt.swift in Sources */, 7A3399AB299063370087DF98 /* SearchControllerExt.swift in Sources */,
7A14416E2C297F7C00E79018 /* Coordinator.swift in Sources */, 7A14416E2C297F7C00E79018 /* Coordinator.swift in Sources */,
7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */, 7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */,
7AC3554C29696A1C00889457 /* MainTabController.swift in Sources */,
7A1441682C297EFD00E79018 /* NotesViewModel.swift in Sources */, 7A1441682C297EFD00E79018 /* NotesViewModel.swift in Sources */,
7AFBE8C02C3024E5003C491D /* ACHud.swift in Sources */, 7AFBE8C02C3024E5003C491D /* ACHud.swift in Sources */,
7A9519842D80B72B00E69883 /* RecordsCoordinator.swift in Sources */,
7AAAFADA2C4D1AFE0050410D /* Zoomable.swift in Sources */, 7AAAFADA2C4D1AFE0050410D /* Zoomable.swift in Sources */,
7ADFC9572DAD0288001A43E3 /* GoogleAuthScreen.swift in Sources */, 7ADFC9572DAD0288001A43E3 /* GoogleAuthScreen.swift in Sources */,
7AC8B2762D6A01C700190706 /* UISearchTextField+Dumb.swift in Sources */, 7AC8B2762D6A01C700190706 /* UISearchTextField+Dumb.swift in Sources */,
@ -1451,7 +1436,7 @@
7A961C6E2C4C3C9E00CE2211 /* LinkRowView.swift in Sources */, 7A961C6E2C4C3C9E00CE2211 /* LinkRowView.swift in Sources */,
7A8A2209248D10EC0073DFD9 /* ResizeImage.swift in Sources */, 7A8A2209248D10EC0073DFD9 /* ResizeImage.swift in Sources */,
7ADF6CA12512244400F237B2 /* MapExt.swift in Sources */, 7ADF6CA12512244400F237B2 /* MapExt.swift in Sources */,
7AC3554E29696C4500889457 /* DummyNewController.swift in Sources */, 7AC44B822DB390B900ADC026 /* MainTabScreen.swift in Sources */,
7A7158122C444A6400852088 /* AdsViewModel.swift in Sources */, 7A7158122C444A6400852088 /* AdsViewModel.swift in Sources */,
7AF231952DA1C29300AE5EB3 /* AuthViewModel.swift in Sources */, 7AF231952DA1C29300AE5EB3 /* AuthViewModel.swift in Sources */,
7AB4E4662D58A16C0006D052 /* GenericError.swift in Sources */, 7AB4E4662D58A16C0006D052 /* GenericError.swift in Sources */,
@ -1470,12 +1455,10 @@
7A2C96122C3B155B00AE46B5 /* NoteAlertModifier.swift in Sources */, 7A2C96122C3B155B00AE46B5 /* NoteAlertModifier.swift in Sources */,
7AE24C5F251F1B4E00758E39 /* Buttons.swift in Sources */, 7AE24C5F251F1B4E00758E39 /* Buttons.swift in Sources */,
7AF231972DA1C30000AE5EB3 /* AuthCoordinator.swift in Sources */, 7AF231972DA1C30000AE5EB3 /* AuthCoordinator.swift in Sources */,
7A5911F22D63268400EC51BA /* SearchCoordinator.swift in Sources */,
7A7DADAC2D99738300F52F6C /* AudioRecordView.swift in Sources */, 7A7DADAC2D99738300F52F6C /* AudioRecordView.swift in Sources */,
7A1090EC24A4E3E100B4F0B2 /* CellProgressView.swift in Sources */, 7A1090EC24A4E3E100B4F0B2 /* CellProgressView.swift in Sources */,
7AB9FE2A2D08CF35005DE374 /* EventsScreenMode.swift in Sources */, 7AB9FE2A2D08CF35005DE374 /* EventsScreenMode.swift in Sources */,
7AB490292D6B1217002F39C6 /* ACKeyboardView.swift in Sources */, 7AB490292D6B1217002F39C6 /* ACKeyboardView.swift in Sources */,
7A11471623FDEB2A00B424AF /* MainSplitController.swift in Sources */,
7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */, 7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */,
7A1022722C554A1300B84627 /* CustomHostingController.swift in Sources */, 7A1022722C554A1300B84627 /* CustomHostingController.swift in Sources */,
7A1022792C557ED600B84627 /* LocationPickerViewModel.swift in Sources */, 7A1022792C557ED600B84627 /* LocationPickerViewModel.swift in Sources */,
@ -1498,14 +1481,12 @@
7AC3555B296995B200889457 /* UIEdgeInsets.swift in Sources */, 7AC3555B296995B200889457 /* UIEdgeInsets.swift in Sources */,
7A06E0AC2C7065AC005731AC /* SettingsScreen.swift in Sources */, 7A06E0AC2C7065AC005731AC /* SettingsScreen.swift in Sources */,
7AF231992DA27C1B00AE5EB3 /* ACButtonView.swift in Sources */, 7AF231992DA27C1B00AE5EB3 /* ACButtonView.swift in Sources */,
7A131FD72D37B77E00DC7755 /* HistoryCoordinator.swift in Sources */,
7A7158002C43EA6900852088 /* OwnersScreen.swift in Sources */, 7A7158002C43EA6900852088 /* OwnersScreen.swift in Sources */,
7A4955822D58CCF900912E66 /* HistoryFilter.swift in Sources */, 7A4955822D58CCF900912E66 /* HistoryFilter.swift in Sources */,
7A4322912CB2CC8A00085CF6 /* FiltersScreen.swift in Sources */, 7A4322912CB2CC8A00085CF6 /* FiltersScreen.swift in Sources */,
7ABD1B472D044A3200B43213 /* GalleryScreen.swift in Sources */, 7ABD1B472D044A3200B43213 /* GalleryScreen.swift in Sources */,
7A71580C2C44453200852088 /* AdsScreen.swift in Sources */, 7A71580C2C44453200852088 /* AdsScreen.swift in Sources */,
7AADD4452DB2D4D60027FD7B /* MapInput.swift in Sources */, 7AADD4452DB2D4D60027FD7B /* MapInput.swift in Sources */,
7A06E0B02C7065D8005731AC /* SettingsCoordinator.swift in Sources */,
7A91894F29A2BD8700519C74 /* GestureRecognizers.swift in Sources */, 7A91894F29A2BD8700519C74 /* GestureRecognizers.swift in Sources */,
7AFBE8CC2C3085C6003C491D /* ACProgressView.swift in Sources */, 7AFBE8CC2C3085C6003C491D /* ACProgressView.swift in Sources */,
7A131FD32D37B75500DC7755 /* HistoryScreen.swift in Sources */, 7A131FD32D37B75500DC7755 /* HistoryScreen.swift in Sources */,
@ -1517,7 +1498,6 @@
7A17CE4C2A2E850200626A6E /* UISegmentedControl.swift in Sources */, 7A17CE4C2A2E850200626A6E /* UISegmentedControl.swift in Sources */,
7A9519802D80B6C100E69883 /* RecordsScreen.swift in Sources */, 7A9519802D80B6C100E69883 /* RecordsScreen.swift in Sources */,
7A131FD52D37B76A00DC7755 /* HistoryViewModel.swift in Sources */, 7A131FD52D37B76A00DC7755 /* HistoryViewModel.swift in Sources */,
7A123C742D9DC40A00781F24 /* RecordScreenOutput.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };

View File

@ -3,34 +3,6 @@
<device id="retina4_7" orientation="portrait" appearance="dark"/> <device id="retina4_7" orientation="portrait" appearance="dark"/>
<dependencies> <dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23721"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23721"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<scenes> <scenes/>
<!--Main Tab Controller-->
<scene sceneID="YhQ-kn-py3">
<objects>
<tabBarController id="s9R-9a-TOT" customClass="MainTabController" customModule="AutoCat" customModuleProvider="target" sceneMemberID="viewController">
<tabBar key="tabBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="7gI-Jq-j4q">
<rect key="frame" x="0.0" y="0.0" width="414" height="49"/>
<autoresizingMask key="autoresizingMask"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</tabBar>
</tabBarController>
<placeholder placeholderIdentifier="IBFirstResponder" id="AJs-8F-Qbu" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1018" y="143"/>
</scene>
<!--Main Split Controller-->
<scene sceneID="10H-jh-3eN">
<objects>
<splitViewController storyboardIdentifier="MainSplitController" id="q8g-Bu-ZOb" customClass="MainSplitController" customModule="AutoCat" customModuleProvider="target" sceneMemberID="viewController">
<connections>
<segue destination="s9R-9a-TOT" kind="relationship" relationship="masterViewController" id="Qf1-ZB-fOc"/>
</connections>
</splitViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="zgS-sH-9QV" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="199" y="143"/>
</scene>
</scenes>
</document> </document>

View File

@ -1,6 +0,0 @@
import UIKit
/// Dummy controller for detecting tap on "plus" tab
class DummyNewController: UIViewController {
}

View File

@ -1,64 +0,0 @@
import UIKit
class MainSplitController: UISplitViewController, UISplitViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.preferredDisplayMode = .oneBesideSecondary
self.delegate = self
}
func splitViewController(_ splitViewController: UISplitViewController, showDetail vc: UIViewController, sender: Any?) -> Bool {
if self.isCollapsed {
let tabController = self.viewControllers.first as? UITabBarController
let selectedNavController = tabController?.selectedViewController
var vcToPush = vc
if let nav = vc as? UINavigationController {
vcToPush = nav.topViewController!
}
vcToPush.hidesBottomBarWhenPushed = true
selectedNavController?.show(vcToPush, sender: self)
return true
}
return false
}
func splitViewController(_ splitViewController: UISplitViewController, separateSecondaryFrom primaryViewController: UIViewController) -> UIViewController?
{
let tabController = splitViewController.viewControllers.first as? UITabBarController
let selectedNavController = tabController?.selectedViewController as? UINavigationController
// if selectedNavController?.viewControllers.count ?? 0 > 1 && selectedNavController?.viewControllers[1] is ReportController {
// if let controllers = selectedNavController?.popToRootViewController(animated: false) {
// let nav = UINavigationController()
// nav.setViewControllers(controllers, animated: true)
// return nav
// }
// }
return nil
}
func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool
{
guard let detailNav = secondaryViewController as? UINavigationController,
let detail = detailNav.viewControllers.first
else
{
return false
}
if let tabController = primaryViewController as? UITabBarController {
let selectedNavController = tabController.selectedViewController as? UINavigationController
detail.hidesBottomBarWhenPushed = true
selectedNavController?.setNavigationBarHidden(false, animated: false)
selectedNavController?.pushViewController(detail, animated: false)
return true
}
return false
}
}

View File

@ -1,123 +0,0 @@
import UIKit
import SwiftEntryKit
import AutoCatCore
class MainTabController: UITabBarController, UITabBarControllerDelegate {
var settingsCoordinator: SettingsCoordinator?
var historyViewModel: HistoryViewModel?
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
if #available(iOS 18, *) {
// Setting the horizontal size class will force the tab bar
// to be displayed at the bottom.
traitOverrides.horizontalSizeClass = .compact
}
viewControllers = []
addHistoryTab()
addRecordsTab()
#if !targetEnvironment(macCatalyst)
addDummyTab()
#endif
addSearchTab()
addSettings()
}
func addHistoryTab() {
let coordinator = HistoryCoordinator()
let (controller, viewModel) = coordinator.start()
controller.tabBarItem = UITabBarItem(title: NSLocalizedString("History", comment: ""),
image: UIImage(systemName: "clock.arrow.circlepath"), tag: 0)
viewControllers = [controller]
historyViewModel = viewModel
}
func addRecordsTab() {
let coordinator = RecordsCoordinator()
let controller = coordinator.start(output: self)
controller.tabBarItem = UITabBarItem(title: NSLocalizedString("Records", comment: ""),
image: UIImage(named: "record"), tag: 0)
viewControllers?.append(controller)
}
func addDummyTab() {
let controller = DummyNewController()
controller.tabBarItem = UITabBarItem(title: "", image: UIImage(systemName: "plus"), tag: 0)
viewControllers?.append(controller)
}
func addSearchTab() {
let coordinator = SearchCoordinator()
let controller = coordinator.start()
controller.tabBarItem = UITabBarItem(title: NSLocalizedString("Search", comment: ""),
image: UIImage(systemName: "magnifyingglass"), tag: 0)
viewControllers?.append(controller)
}
func addSettings() {
let coordinator = SettingsCoordinator(tabController: self)
settingsCoordinator = coordinator
let controller = coordinator.start()
controller.tabBarItem = UITabBarItem(title: NSLocalizedString("Settings", comment: ""),
image: UIImage(systemName: "gear"), tag: 0)
viewControllers?.append(controller)
}
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
if viewController is DummyNewController {
showCheckPuller()
return false
} else {
return true
}
}
func showCheckPuller() {
guard let historyViewModel else {
return
}
var attributes = EKAttributes.bottomToast
attributes.displayDuration = .infinity
attributes.entryBackground = .color(color: .init(.secondarySystemBackground))
attributes.screenBackground = .color(color: EKColor(UIColor(white: 0, alpha: 0.7)))
attributes.roundCorners = .top(radius: 24)
attributes.screenInteraction = .dismiss
attributes.scroll = .disabled
attributes.entryInteraction = .absorbTouches
attributes.entranceAnimation = .init(translate: .init(duration: 0.2))
attributes.exitAnimation = .init(translate: .init(duration: 0.2))
let newNumberController = NewNumberController()
newNumberController.onCheck = { number in
SwiftEntryKit.dismiss {
self.selectedIndex = 0
Task { await historyViewModel.checkNewNumber(number) }
}
}
SwiftEntryKit.display(entry: newNumberController, using: attributes)
// User probably just saw a vehicle and is about to start entering plate number
// Requesting current location ASAP while we still close to initial location
let locationService = ServiceContainer.shared.resolve(LocationServiceProtocol.self)
Task { try? await locationService.requestCurrentLocation() }
}
}
extension MainTabController: RecordScreenOutput {
func checkRecord(number: String, event: VehicleEventDto?) {
selectedIndex = 0
Task { await historyViewModel?.checkRecord(number: number, event: event) }
}
}

View File

@ -87,9 +87,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
if settingsService.user.token.isEmpty { if settingsService.user.token.isEmpty {
let coordinator = AuthCoordinator(window: self.window) let coordinator = AuthCoordinator(window: self.window)
self.window?.rootViewController = coordinator.start() self.window?.rootViewController = coordinator.start()
//self.window?.rootViewController = storyboard.instantiateViewController(identifier: "AuthController")
} else { } else {
self.window?.rootViewController = storyboard.instantiateViewController(identifier: "MainSplitController") //self.window?.rootViewController = storyboard.instantiateViewController(identifier: "MainSplitController")
self.window?.rootViewController = UIHostingController(rootView: MainTabScreen())
if let number { if let number {
Task { await openReport(with: number) } Task { await openReport(with: number) }
} }

View File

@ -37,7 +37,6 @@ final class AuthCoordinator {
func openMainScreen() { func openMainScreen() {
let storyboard = UIStoryboard(name: "Main", bundle: nil) window?.rootViewController = UIHostingController(rootView: MainTabScreen())
window?.rootViewController = storyboard.instantiateViewController(identifier: "MainSplitController")
} }
} }

View File

@ -124,5 +124,6 @@ struct FiltersScreen: View {
.task { .task {
await viewModel.loadData() await viewModel.loadData()
} }
.toolbar(.hidden, for: .tabBar)
} }
} }

View File

@ -1,30 +0,0 @@
//
// HistoryCoordinator.swift
// AutoCat
//
// Created by Selim Mustafaev on 15.01.2025.
// Copyright © 2025 Selim Mustafaev. All rights reserved.
//
import UIKit
import SwiftUI
import AutoCatCore
@MainActor
final class HistoryCoordinator {
func start() -> (UIViewController, HistoryViewModel) {
let resolver = ServiceContainer.shared
let viewModel = HistoryViewModel(
apiService: resolver.resolve(ApiServiceProtocol.self),
storageService: resolver.resolve(StorageServiceProtocol.self),
vehicleService: resolver.resolve(VehicleServiceProtocol.self)
)
let view = HistoryScreen(viewModel: viewModel)
let controller = UIHostingController(rootView: view)
return (controller, viewModel)
}
}

View File

@ -15,6 +15,21 @@ struct HistoryScreen: View {
@State var filterSheetPresented = false @State var filterSheetPresented = false
@State var exportSheetPresented = false @State var exportSheetPresented = false
init() {
let resolver = ServiceContainer.shared
self.viewModel = HistoryViewModel(
apiService: resolver.resolve(ApiServiceProtocol.self),
storageService: resolver.resolve(StorageServiceProtocol.self),
vehicleService: resolver.resolve(VehicleServiceProtocol.self)
)
}
init(viewModel: HistoryViewModel) {
self.viewModel = viewModel
}
var body: some View { var body: some View {
NavigationStack { NavigationStack {
List { List {

View File

@ -129,7 +129,8 @@ final class HistoryViewModel: ACHudContainer {
if errors.isEmpty { if errors.isEmpty {
hud = nil hud = nil
if !vehicle.unrecognized { if !vehicle.unrecognized {
vehicleToOpen = vehicle // TODO: Fix programmatic navigation
//vehicleToOpen = vehicle
} }
} else { } else {
showErrors(errors) showErrors(errors)

View File

@ -0,0 +1,121 @@
//
// MainTabScreen.swift
// AutoCat
//
// Created by Selim Mustafaev on 19.04.2025.
// Copyright © 2025 Selim Mustafaev. All rights reserved.
//
import SwiftUI
import UIKit
import SwiftEntryKit
import AutoCatCore
struct MainTabScreen: View {
@State private var selection = 0
let historyViewModel: HistoryViewModel
let recordsViewModel: RecordsViewModel
init() {
let resolver = ServiceContainer.shared
historyViewModel = HistoryViewModel(
apiService: resolver.resolve(ApiServiceProtocol.self),
storageService: resolver.resolve(StorageServiceProtocol.self),
vehicleService: resolver.resolve(VehicleServiceProtocol.self)
)
recordsViewModel = RecordsViewModel(
recordService: resolver.resolve(VehicleRecordServiceProtocol.self),
storageService: resolver.resolve(StorageServiceProtocol.self),
recordPlayer: resolver.resolve(RecordPlayerServiceProtocol.self)
)
recordsViewModel.onCheckRecord = checkRecord
}
var body: some View {
TabView(selection: $selection) {
HistoryScreen(viewModel: historyViewModel)
.tabItem {
Label("History", systemImage: "clock.arrow.circlepath")
}
.tag(0)
RecordsScreen(viewModel: recordsViewModel)
.tabItem {
Label("Records", image: "record")
}
.tag(1)
#if os(iOS)
Text("")
.tabItem {
Label("", systemImage: "plus")
}
.tag(2)
#endif
SearchScreen()
.tabItem {
Label("Search", systemImage: "magnifyingglass")
}
.tag(3)
SettingsScreen()
.tabItem {
Label("Settings", systemImage: "gear")
}
.tag(4)
}
#if os(iOS)
.onChange(of: selection) { oldValue, newValue in
if newValue == 2 {
self.selection = oldValue
showCheckPuller()
}
}
#endif
}
func showCheckPuller() {
var attributes = EKAttributes.bottomToast
attributes.displayDuration = .infinity
attributes.entryBackground = .color(color: .init(.secondarySystemBackground))
attributes.screenBackground = .color(color: EKColor(UIColor(white: 0, alpha: 0.7)))
attributes.roundCorners = .top(radius: 24)
attributes.screenInteraction = .dismiss
attributes.scroll = .disabled
attributes.entryInteraction = .absorbTouches
attributes.entranceAnimation = .init(translate: .init(duration: 0.2))
attributes.exitAnimation = .init(translate: .init(duration: 0.2))
let newNumberController = NewNumberController()
newNumberController.onCheck = { number in
SwiftEntryKit.dismiss {
selection = 0
Task { await historyViewModel.checkNewNumber(number) }
}
}
SwiftEntryKit.display(entry: newNumberController, using: attributes)
// User probably just saw a vehicle and is about to start entering plate number
// Requesting current location ASAP while we still close to initial location
let locationService = ServiceContainer.shared.resolve(LocationServiceProtocol.self)
Task { try? await locationService.requestCurrentLocation() }
}
func checkRecord(number: String, event: VehicleEventDto?) {
selection = 0
Task { await historyViewModel.checkRecord(number: number, event: event) }
}
}
#Preview {
MainTabScreen()
}

View File

@ -48,5 +48,6 @@ struct MapScreen: View {
await viewModel.reloadMarkers() await viewModel.reloadMarkers()
} }
} }
.toolbar(.hidden, for: .tabBar)
} }
} }

View File

@ -1,15 +0,0 @@
//
// RecordScreenOutput.swift
// AutoCat
//
// Created by Selim Mustafaev on 02.04.2025.
// Copyright © 2025 Selim Mustafaev. All rights reserved.
//
import AutoCatCore
@MainActor
protocol RecordScreenOutput: AnyObject {
func checkRecord(number: String, event: VehicleEventDto?)
}

View File

@ -1,30 +0,0 @@
//
// RecordsCoordinator.swift
// AutoCat
//
// Created by Selim Mustafaev on 11.03.2025.
// Copyright © 2025 Selim Mustafaev. All rights reserved.
//
import UIKit
import SwiftUI
import AutoCatCore
@MainActor
final class RecordsCoordinator {
func start(output: RecordScreenOutput?) -> UIViewController {
let resolver = ServiceContainer.shared
let viewModel = RecordsViewModel(
recordService: resolver.resolve(VehicleRecordServiceProtocol.self),
storageService: resolver.resolve(StorageServiceProtocol.self),
recordPlayer: resolver.resolve(RecordPlayerServiceProtocol.self)
)
viewModel.output = output
let view = RecordsScreen(viewModel: viewModel)
return UIHostingController(rootView: view)
}
}

View File

@ -17,6 +17,21 @@ struct RecordsScreen: View {
@State var numberText = "" @State var numberText = ""
@State var selectedRecordId: String = "" @State var selectedRecordId: String = ""
init() {
let resolver = ServiceContainer.shared
self.viewModel = RecordsViewModel(
recordService: resolver.resolve(VehicleRecordServiceProtocol.self),
storageService: resolver.resolve(StorageServiceProtocol.self),
recordPlayer: resolver.resolve(RecordPlayerServiceProtocol.self)
)
}
init(viewModel: RecordsViewModel) {
self.viewModel = viewModel
}
var body: some View { var body: some View {
NavigationStack { NavigationStack {
List { List {

View File

@ -16,7 +16,8 @@ final class RecordsViewModel: ACHudContainer {
let recordService: VehicleRecordServiceProtocol let recordService: VehicleRecordServiceProtocol
let storageService: StorageServiceProtocol let storageService: StorageServiceProtocol
let recordPlayer: RecordPlayerServiceProtocol let recordPlayer: RecordPlayerServiceProtocol
weak var output: RecordScreenOutput?
var onCheckRecord: ((String, VehicleEventDto?) -> Void)?
var hud: ACHud? var hud: ACHud?
var showRecordingAlert: Bool = false var showRecordingAlert: Bool = false
@ -116,6 +117,6 @@ final class RecordsViewModel: ACHudContainer {
return return
} }
output?.checkRecord(number: number, event: record.event) onCheckRecord?(number, record.event)
} }
} }

View File

@ -146,6 +146,7 @@ struct ReportScreen: View {
GalleryScreen(photos: viewModel.vehicle.photos) GalleryScreen(photos: viewModel.vehicle.photos)
} }
} }
.toolbar(.hidden, for: .tabBar)
} }
@ViewBuilder @ViewBuilder

View File

@ -1,27 +0,0 @@
//
// SearchCoordinator.swift
// AutoCat
//
// Created by Selim Mustafaev on 17.02.2025.
// Copyright © 2025 Selim Mustafaev. All rights reserved.
//
import UIKit
import SwiftUI
import AutoCatCore
@MainActor
final class SearchCoordinator {
func start() -> UIViewController {
let resolver = ServiceContainer.shared
let viewModel = SearchViewModel(
apiService: resolver.resolve(ApiServiceProtocol.self),
vehicleService: resolver.resolve(VehicleServiceProtocol.self)
)
let view = SearchScreen(viewModel: viewModel)
return UIHostingController(rootView: view)
}
}

View File

@ -20,6 +20,15 @@ struct SearchScreen: View {
@State var viewModel: SearchViewModel @State var viewModel: SearchViewModel
init() {
let resolver = ServiceContainer.shared
self.viewModel = SearchViewModel(
apiService: resolver.resolve(ApiServiceProtocol.self),
vehicleService: resolver.resolve(VehicleServiceProtocol.self)
)
}
var body: some View { var body: some View {
NavigationStack { NavigationStack {
List { List {

View File

@ -1,38 +0,0 @@
//
// SettingsCoordinator.swift
// AutoCat
//
// Created by Selim Mustafaev on 17.08.2024.
// Copyright © 2024 Selim Mustafaev. All rights reserved.
//
import UIKit
import SwiftUI
import AutoCatCore
@MainActor
class SettingsCoordinator {
weak var tabController: UITabBarController?
init(tabController: UITabBarController) {
self.tabController = tabController
}
func start() -> UIViewController {
let viewModel = SettingsViewModel(settingsService: ServiceContainer.shared.resolve(SettingsServiceProtocol.self))
viewModel.coordinator = self
return UIHostingController(rootView: SettingsScreen(viewModel: viewModel))
}
func openAuthScreen() {
guard let window = tabController?.tabBar.window else {
return
}
let coordinator = AuthCoordinator(window: window)
window.rootViewController = coordinator.start()
}
}

View File

@ -15,6 +15,12 @@ struct SettingsScreen: View {
@State var googleSheetOpened = false @State var googleSheetOpened = false
@State var googleLoginSheetOpened = false @State var googleLoginSheetOpened = false
init() {
self.viewModel = SettingsViewModel(
settingsService: ServiceContainer.shared.resolve(SettingsServiceProtocol.self)
)
}
var body: some View { var body: some View {
NavigationStack { NavigationStack {
Form { Form {

View File

@ -6,6 +6,7 @@
// Copyright © 2024 Selim Mustafaev. All rights reserved. // Copyright © 2024 Selim Mustafaev. All rights reserved.
// //
import UIKit
import SwiftUI import SwiftUI
import AutoCatCore import AutoCatCore
@ -13,7 +14,6 @@ import AutoCatCore
@Observable @Observable
class SettingsViewModel { class SettingsViewModel {
weak var coordinator: SettingsCoordinator?
var settingService: SettingsServiceProtocol var settingService: SettingsServiceProtocol
var autocatEmail: String { var autocatEmail: String {
@ -49,7 +49,19 @@ class SettingsViewModel {
func signOut() { func signOut() {
settingService.user.token = "" settingService.user.token = ""
coordinator?.openAuthScreen()
let window = UIApplication.shared
.connectedScenes
.filter({$0.activationState == .foregroundActive})
.map({$0 as? UIWindowScene})
.compactMap({$0})
.first?.windows
.filter({$0.isKeyWindow}).first
if let window {
let coordinator = AuthCoordinator(window: window)
window.rootViewController = coordinator.start()
}
} }
func googleSignout() { func googleSignout() {

View File

@ -55,9 +55,11 @@ public final class SettingsService: SettingsServiceProtocol {
public var userData: Data? { public var userData: Data? {
didSet { didSet {
if let userData {
set(value: userData, for: .user) set(value: userData, for: .user)
} }
} }
}
public var recognizeAlternativeOrder: Bool = false { public var recognizeAlternativeOrder: Bool = false {
didSet { didSet {