mirror of
				https://github.com/yattee/yattee.git
				synced 2025-10-31 04:31:54 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
| import Foundation
 | |
| import SwiftUI
 | |
| 
 | |
| final class ImportSettingsSheetViewModel: ObservableObject {
 | |
|     static let shared = ImportSettingsSheetViewModel()
 | |
| 
 | |
|     @Published var selectedInstances = Set<Instance.ID>()
 | |
|     @Published var selectedAccounts = Set<Account.ID>()
 | |
| 
 | |
|     @Published var importableAccounts = Set<Account.ID>()
 | |
|     @Published var importableAccountsPasswords = [Account.ID: String]()
 | |
| 
 | |
|     func toggleInstance(_ instance: Instance, accounts: [Account]) {
 | |
|         if selectedInstances.contains(instance.id) {
 | |
|             selectedInstances.remove(instance.id)
 | |
|         } else {
 | |
|             guard isImportable(instance) else { return }
 | |
|             selectedInstances.insert(instance.id)
 | |
|         }
 | |
| 
 | |
|         removeNonImportableFromSelectedAccounts(accounts: accounts)
 | |
|     }
 | |
| 
 | |
|     func toggleAccount(_ account: Account, accounts: [Account]) {
 | |
|         if selectedAccounts.contains(account.id) {
 | |
|             selectedAccounts.remove(account.id)
 | |
|         } else {
 | |
|             guard isImportable(account.id, accounts: accounts) else { return }
 | |
|             selectedAccounts.insert(account.id)
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     func isSelectedForImport(_ account: Account) -> Bool {
 | |
|         importableAccounts.contains(account.id) && selectedAccounts.contains(account.id)
 | |
|     }
 | |
| 
 | |
|     func isImportable(_ accountID: Account.ID, accounts: [Account]) -> Bool {
 | |
|         guard let account = accounts.first(where: { $0.id == accountID }),
 | |
|               let instanceID = account.instanceID,
 | |
|               AccountsModel.shared.find(accountID) == nil
 | |
|         else { return false }
 | |
| 
 | |
|         return ((account.password != nil && !account.password!.isEmpty) ||
 | |
|             importableAccounts.contains(account.id)) && (
 | |
|             (InstancesModel.shared.find(instanceID) != nil || InstancesModel.shared.findByURLString(account.urlString) != nil) ||
 | |
|                 selectedInstances.contains(instanceID)
 | |
|         )
 | |
|     }
 | |
| 
 | |
|     func isImportable(_ instance: Instance) -> Bool {
 | |
|         !isInstanceAlreadyAdded(instance)
 | |
|     }
 | |
| 
 | |
|     func isInstanceAlreadyAdded(_ instance: Instance) -> Bool {
 | |
|         InstancesModel.shared.find(instance.id) != nil || InstancesModel.shared.findByURLString(instance.apiURLString) != nil
 | |
|     }
 | |
| 
 | |
|     func removeNonImportableFromSelectedAccounts(accounts: [Account]) {
 | |
|         selectedAccounts = Set(selectedAccounts.filter { isImportable($0, accounts: accounts) })
 | |
|     }
 | |
| 
 | |
|     func reset() {
 | |
|         selectedAccounts = []
 | |
|         selectedInstances = []
 | |
|         importableAccounts = []
 | |
|     }
 | |
| 
 | |
|     func reset(_ importer: LocationsSettingsGroupImporter? = nil) {
 | |
|         reset()
 | |
| 
 | |
|         guard let importer else { return }
 | |
| 
 | |
|         selectedInstances = Set(importer.instances.filter { isImportable($0) }.map(\.id))
 | |
|         importableAccounts = Set(importer.accounts.filter { isImportable($0.id, accounts: importer.accounts) }.map(\.id))
 | |
|         selectedAccounts = importableAccounts
 | |
|     }
 | |
| }
 | 
