diff --git a/Features/Backup/BackupView.swift b/Features/Backup/BackupView.swift index e9fbc13..99b8e73 100644 --- a/Features/Backup/BackupView.swift +++ b/Features/Backup/BackupView.swift @@ -40,7 +40,7 @@ struct BackupView: View { .font(.system(size: 11, weight: .medium, design: .monospaced)) .foregroundStyle(AppTheme.ink) .kerning(2) - kisaniLogoMark + KisaniLogoMark(size: 66) } .frame(maxWidth: .infinity) .padding(.top, 16) @@ -135,35 +135,6 @@ struct BackupView: View { // MARK: — Logo mark (drawn in code — no asset dependency) - private var kisaniLogoMark: some View { - VStack(spacing: 0) { - driveRow - AppTheme.ink.frame(height: 1.5) - driveRow - AppTheme.ink.frame(height: 1.5) - driveRow - } - .clipShape(RoundedRectangle(cornerRadius: 11, style: .continuous)) - .overlay( - RoundedRectangle(cornerRadius: 11, style: .continuous) - .strokeBorder(AppTheme.ink, lineWidth: 2.5) - ) - .frame(width: 66, height: 66) - .shadow(color: .black.opacity(0.05), radius: 10, x: 0, y: 2) - } - - private var driveRow: some View { - HStack(spacing: 0) { - Spacer() - Circle() - .fill(AppTheme.ink) - .frame(width: 7, height: 7) - .padding(.trailing, 7) - } - .frame(maxWidth: .infinity) - .frame(height: 18) - .background(AppTheme.surfaceRaised) - } // MARK: — Ring hero diff --git a/Features/Connect/ConnectView.swift b/Features/Connect/ConnectView.swift index 28ab5d5..75b6a3f 100644 --- a/Features/Connect/ConnectView.swift +++ b/Features/Connect/ConnectView.swift @@ -14,39 +14,30 @@ struct ConnectView: View { ScrollView { VStack(spacing: 0) { - // Header - VStack(spacing: 12) { - // "kisani." wordmark + // ── Header — identical treatment to BackupView ── + VStack(spacing: 10) { Text("kisani.") - .font(.system(size: 13, weight: .bold, design: .monospaced)) - .foregroundStyle(AppTheme.inkTertiary) - .kerning(1.2) - .padding(.top, 44) + .font(.system(size: 11, weight: .medium, design: .monospaced)) + .foregroundStyle(AppTheme.ink) + .kerning(2) + .padding(.top, 52) - // NAS logo mark - ZStack { - RoundedRectangle(cornerRadius: 18, style: .continuous) - .fill(AppTheme.ink) - .frame(width: 72, height: 72) + KisaniLogoMark(size: 66) - Image(systemName: "server.rack") - .font(.system(size: 28, weight: .medium)) - .foregroundStyle(AppTheme.inkInverse) - } - .shadow(color: AppTheme.ink.opacity(0.18), radius: 12, x: 0, y: 4) - - // UGreen NAS compatibility badge — reacts to selected protocol UGreenCompatibilityBadge(selectedProtocol: vm.selectedProtocol) + .padding(.top, 4) } - .padding(.bottom, 24) - .padding(.horizontal, AppTheme.hPad) + .frame(maxWidth: .infinity) + .padding(.bottom, 28) - // Protocol picker + // ── Protocol picker ── HStack(spacing: 0) { ForEach(NASProtocol.allCases, id: \.self) { proto in Button { withAnimation(.spring(response: 0.25, dampingFraction: 0.8)) { vm.selectedProtocol = proto + vm.isConnected = false + vm.verifyError = nil } } label: { Text(proto.rawValue) @@ -72,7 +63,7 @@ struct ConnectView: View { .padding(.horizontal, AppTheme.hPad) .padding(.bottom, 20) - // IP field (standalone) + // ── Step 1: Host ── VStack(alignment: .leading, spacing: 8) { HStack(spacing: 12) { Image(systemName: "network") @@ -86,11 +77,12 @@ struct ConnectView: View { .autocorrectionDisabled() .textInputAutocapitalization(.never) .focused($focused, equals: .host) + .submitLabel(.next) + .onSubmit { focused = .username } if !vm.host.isEmpty { Button { vm.host = "" } label: { Image(systemName: "xmark.circle.fill") .foregroundStyle(AppTheme.inkQuaternary) - .font(.system(size: 16)) } } } @@ -108,7 +100,7 @@ struct ConnectView: View { .padding(.horizontal, AppTheme.hPad) .padding(.bottom, 12) - // Credentials card (username + password combined) + // ── Step 1: Credentials card ── VStack(spacing: 0) { HStack(spacing: 12) { Image(systemName: "person") @@ -118,15 +110,15 @@ struct ConnectView: View { TextField("Username", text: $vm.username) .font(AppTheme.body()) .foregroundStyle(AppTheme.ink) - .keyboardType(.emailAddress) .autocorrectionDisabled() .textInputAutocapitalization(.never) .focused($focused, equals: .username) + .submitLabel(.next) + .onSubmit { focused = .password } if !vm.username.isEmpty { Button { vm.username = "" } label: { Image(systemName: "xmark.circle.fill") .foregroundStyle(AppTheme.inkQuaternary) - .font(.system(size: 16)) } } } @@ -153,6 +145,8 @@ struct ConnectView: View { .font(AppTheme.body()) .foregroundStyle(AppTheme.ink) .focused($focused, equals: .password) + .submitLabel(.go) + .onSubmit { Task { await vm.verify() } } Button { showPassword.toggle() } label: { @@ -169,8 +163,8 @@ struct ConnectView: View { .overlay( RoundedRectangle(cornerRadius: AppTheme.radius, style: .continuous) .stroke( - vm.isConnected ? AppTheme.positive.opacity(0.4) : - vm.verifyError != nil ? AppTheme.destructive.opacity(0.4) : + vm.isConnected ? AppTheme.positive.opacity(0.45) : + vm.verifyError != nil ? AppTheme.destructive.opacity(0.45) : Color.clear, lineWidth: 1 ) @@ -181,85 +175,88 @@ struct ConnectView: View { .animation(.spring(response: 0.3, dampingFraction: 0.8), value: vm.isConnected) .animation(.spring(response: 0.3, dampingFraction: 0.8), value: vm.verifyError != nil) - // Path field - Button(action: { if vm.isConnected { vm.showFolderBrowser = true } }) { - HStack(spacing: 12) { - Image(systemName: "folder") - .font(.system(size: 14, weight: .regular)) - .foregroundStyle(vm.isConnected ? AppTheme.inkSecondary : AppTheme.inkQuaternary) - .frame(width: 20) - Text(vm.remotePath == "/" ? "Destination folder" : vm.remotePath) - .font(AppTheme.body()) - .foregroundStyle(vm.remotePath == "/" ? AppTheme.inkTertiary : AppTheme.ink) - .lineLimit(2) - .multilineTextAlignment(.leading) - .frame(maxWidth: .infinity, alignment: .leading) - Image(systemName: "folder.badge.plus") - .font(.system(size: 16)) - .foregroundStyle(vm.isConnected ? AppTheme.inkSecondary : AppTheme.inkQuaternary) + // ── Step 2: Destination folder — slides in after auth ── + if vm.step != .credentials { + Button(action: { vm.showFolderBrowser = true }) { + HStack(spacing: 12) { + Image(systemName: vm.remotePath == "/" ? "folder" : "folder.fill") + .font(.system(size: 14, weight: .regular)) + .foregroundStyle(vm.remotePath == "/" ? AppTheme.inkSecondary : AppTheme.positive) + .frame(width: 20) + Text(vm.remotePath == "/" ? "Select destination folder" : vm.remotePath) + .font(AppTheme.body()) + .foregroundStyle(vm.remotePath == "/" ? AppTheme.inkTertiary : AppTheme.ink) + .lineLimit(2) + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity, alignment: .leading) + Image(systemName: "chevron.right") + .font(.system(size: 12, weight: .medium)) + .foregroundStyle(AppTheme.inkQuaternary) + } + .padding(.horizontal, 16) + .padding(.vertical, 14) + .background(AppTheme.surfaceRaised) + .clipShape(RoundedRectangle(cornerRadius: AppTheme.radius, style: .continuous)) + .overlay( + RoundedRectangle(cornerRadius: AppTheme.radius, style: .continuous) + .stroke( + vm.step == .ready ? AppTheme.positive.opacity(0.45) : Color.clear, + lineWidth: 1 + ) + ) + .shadow(color: AppTheme.cardShadow, radius: 12, x: 0, y: 2) } - .padding(.horizontal, 16) - .padding(.vertical, 14) - .background(AppTheme.surfaceRaised) - .clipShape(RoundedRectangle(cornerRadius: AppTheme.radius, style: .continuous)) - .shadow(color: AppTheme.cardShadow, radius: 12, x: 0, y: 2) + .buttonStyle(ScaleButtonStyle()) + .padding(.horizontal, AppTheme.hPad) + .padding(.bottom, 12) + .transition(.opacity.combined(with: .move(edge: .top))) + .animation(.spring(response: 0.35, dampingFraction: 0.8), value: vm.step) } - .buttonStyle(ScaleButtonStyle()) + + // ── Status message ── + HStack(spacing: 6) { + Image(systemName: vm.statusIsError ? "exclamationmark.circle" : + vm.statusIsPositive ? "checkmark.circle" : "circle.dotted") + .font(.system(size: 13)) + Text(vm.statusMessage) + .font(AppTheme.caption()) + } + .foregroundStyle( + vm.statusIsError ? AppTheme.destructive : + vm.statusIsPositive ? AppTheme.positive : + AppTheme.inkTertiary + ) .padding(.horizontal, AppTheme.hPad) .padding(.bottom, 20) - - // Feedback - Group { - if let error = vm.verifyError { - HStack(spacing: 6) { - Image(systemName: "exclamationmark.circle") - .font(.system(size: 13)) - Text(error) - .font(AppTheme.caption()) - } - .foregroundStyle(AppTheme.destructive) - .padding(.horizontal, AppTheme.hPad) - .transition(.opacity.combined(with: .move(edge: .top))) - } else if vm.isConnected { - HStack(spacing: 6) { - Image(systemName: "checkmark.circle") - .font(.system(size: 13)) - Text("Connected successfully") - .font(AppTheme.caption()) - } - .foregroundStyle(AppTheme.positive) - .padding(.horizontal, AppTheme.hPad) - .transition(.opacity.combined(with: .move(edge: .top))) - } - } + .animation(.spring(response: 0.3, dampingFraction: 0.8), value: vm.step) .animation(.spring(response: 0.3, dampingFraction: 0.8), value: vm.verifyError) - .animation(.spring(response: 0.3, dampingFraction: 0.8), value: vm.isConnected) - .padding(.bottom, 16) - } } .safeAreaInset(edge: .bottom) { VStack(spacing: 0) { Button(action: { - if vm.isConnected { navigateToDashboard = true } - else { Task { await vm.verify() } } + focused = nil + if vm.step == .ready { + navigateToDashboard = true + } else { + Task { await vm.proceed() } + } }) { Group { if vm.isVerifying { ProgressView().tint(.white) } else { - Text(vm.isConnected ? "Continue" : "Connect") + Text(ctaLabel) } } + .frame(maxWidth: .infinity) } - .buttonStyle(PrimaryButtonStyle( - color: vm.isConnected ? AppTheme.positive : AppTheme.ink - )) + .buttonStyle(PrimaryButtonStyle(color: ctaColor)) .padding(.horizontal, AppTheme.hPad) .padding(.top, 12) .padding(.bottom, 32) - .disabled(!vm.canConnect) - .animation(.spring(response: 0.3, dampingFraction: 0.8), value: vm.isConnected) + .disabled(!vm.canProceed) + .animation(.spring(response: 0.3, dampingFraction: 0.8), value: vm.step) } .background(AppTheme.background) } @@ -269,8 +266,30 @@ struct ConnectView: View { .sheet(isPresented: $vm.showFolderBrowser) { if let conn = ConnectionStore.shared.savedConnection { BrowseView(connection: conn, selectedPath: $vm.remotePath, isPickerMode: true) + .onDisappear { + if vm.remotePath != "/", var c = ConnectionStore.shared.savedConnection { + c.remotePath = vm.remotePath + ConnectionStore.shared.savedConnection = c + } + } } } } } + + private var ctaLabel: String { + switch vm.step { + case .credentials: return "Connect" + case .folder: return "Select Destination" + case .ready: return "Get Started" + } + } + + private var ctaColor: Color { + switch vm.step { + case .credentials: return AppTheme.ink + case .folder: return AppTheme.ink + case .ready: return AppTheme.positive + } + } } diff --git a/Features/Connect/ConnectViewModel.swift b/Features/Connect/ConnectViewModel.swift index dea73c2..3d639ae 100644 --- a/Features/Connect/ConnectViewModel.swift +++ b/Features/Connect/ConnectViewModel.swift @@ -1,7 +1,12 @@ import Foundation -enum ConnectField { case host, username, password, folder } -enum FieldState { case idle, valid, invalid } +enum ConnectField { case host, username, password } + +enum ConnectStep: Equatable { + case credentials // not yet authenticated + case folder // authenticated, no destination chosen + case ready // authenticated + valid destination chosen +} @MainActor final class ConnectViewModel: ObservableObject { @@ -17,28 +22,62 @@ final class ConnectViewModel: ObservableObject { init() { if let conn = ConnectionStore.shared.savedConnection { - host = conn.host - username = conn.username - password = conn.password - remotePath = conn.remotePath + host = conn.host + username = conn.username + password = conn.password + remotePath = conn.remotePath selectedProtocol = conn.nasProtocol - isConnected = true + isConnected = true } else { - host = "" - username = "" - password = "" - remotePath = "/" + host = "" + username = "" + password = "" + remotePath = "/" selectedProtocol = .smb - isConnected = false + isConnected = false } } - var fieldState: FieldState { - isConnected ? .valid : (verifyError != nil ? .invalid : .idle) + var step: ConnectStep { + guard isConnected else { return .credentials } + return remotePath == "/" ? .folder : .ready } - var canConnect: Bool { - !host.isEmpty && !username.isEmpty && !password.isEmpty && !isVerifying + var canProceed: Bool { + switch step { + case .credentials: + return !host.trimmingCharacters(in: .whitespaces).isEmpty + && !username.isEmpty + && !password.isEmpty + && !isVerifying + case .folder, .ready: + return true + } + } + + var statusMessage: String { + switch step { + case .credentials: + return verifyError != nil ? verifyError! : "Enter your NAS credentials" + case .folder: + return "Authenticated · select a destination folder" + case .ready: + return "Ready to sync" + } + } + + var statusIsError: Bool { verifyError != nil && step == .credentials } + var statusIsPositive: Bool { step == .folder || step == .ready } + + func proceed() async { + switch step { + case .credentials: + await verify() + case .folder: + showFolderBrowser = true + case .ready: + break // navigation handled in the view + } } func verify() async { @@ -52,7 +91,7 @@ final class ConnectViewModel: ObservableObject { verifyError = nil let connection = NASConnection( - host: host, + host: host.trimmingCharacters(in: .whitespaces), nasProtocol: selectedProtocol, username: username, password: password, @@ -60,8 +99,10 @@ final class ConnectViewModel: ObservableObject { ) do { - try await transfer.connect(to: connection.host, port: connection.port, - username: connection.username, password: connection.password) + try await transfer.connect( + to: connection.host, port: connection.port, + username: connection.username, password: connection.password + ) transfer.disconnect() isConnected = true ConnectionStore.shared.savedConnection = connection diff --git a/Kisani.xcodeproj/project.pbxproj b/Kisani.xcodeproj/project.pbxproj index 407227d..c5f750b 100644 --- a/Kisani.xcodeproj/project.pbxproj +++ b/Kisani.xcodeproj/project.pbxproj @@ -7,581 +7,578 @@ objects = { /* Begin PBXBuildFile section */ - 10062AA91BC883AE597443BD /* URL+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 277DF2E5F4E566C869EC29F3 /* URL+.swift */; }; - 13FCA7D0BB01BFC46A5B725B /* SavedConnections.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1D1C00B125D5CC000988DD0 /* SavedConnections.swift */; }; - 30693CB8EE711577978EF88C /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6CD83D8292EF9EFBE3A9C6C /* Date+.swift */; }; - 32A4A6A2CFB6C810A8C2CE0B /* AppMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67C33F6CACACB9DD50FE3F40 /* AppMenuView.swift */; }; - 36FE83FFC24922EBC28287BB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88E66C22B614E89A7A9E9B35 /* AppDelegate.swift */; }; - 37D808079BDEF32D04847D04 /* MainTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F09160B7B7A06BD900D0D87A /* MainTabView.swift */; }; - 4148416D31C8AC65FEE6394F /* PHAsset+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86FA0D1522E2C4FF7C1CABF3 /* PHAsset+.swift */; }; - 45FFF2DCFE454EFDF642CEB1 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F24C7DD7A503A0D561F3FB /* LoginView.swift */; }; - 512B235FB16DEFBBD9EA4E1C /* NASConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BE4774FFA1074FF5F1FAB2B /* NASConnection.swift */; }; - 57656BC4B5A2E81FE7BF37FD /* PhotoLibraryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46B47E3C76EA718ECF97BBAD /* PhotoLibraryService.swift */; }; - 6500E80B50EEF877C5127A2A /* HistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EEBCD4A838173E557DC3EFC /* HistoryView.swift */; }; - 664E9F44D037A8B41D5A7670 /* MockNASService.swift in Sources */ = {isa = PBXBuildFile; fileRef = BACE1D31086231C97DAD884D /* MockNASService.swift */; }; - 685E8F1B44AE5652E93C58CE /* NASProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7688CD7E9BC5475A3EB01021 /* NASProtocolTests.swift */; }; - 6DED667F0AA66503730640F1 /* FolderRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83C13DD3EB4823AA98D51AF2 /* FolderRow.swift */; }; - 77A3FF7E2E4F506E7F9E5CCD /* FolderSetupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C31F3F5EBCB51002188FA15 /* FolderSetupView.swift */; }; - 7872072DD0E0B8D51C1A12DF /* NASBackupApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B36E23852EF12DC14A2DF2DC /* NASBackupApp.swift */; }; - 7DF923F172E6DFE3DD110DC9 /* LANTriggerSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBE4F65BE653C7C72E096D1 /* LANTriggerSection.swift */; }; - 7FB20CB93FECB2F9CBE67161 /* ConnectViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50191596BF6E84CFAE7904D3 /* ConnectViewModelTests.swift */; }; - 834A766E13EF297273FFEE21 /* LoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A42E8CFCAECFDBF6EDDAC0 /* LoginViewModel.swift */; }; - 84E3EE64F74D00104BF8694B /* BackgroundTaskManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5643379BBA1FD39841F9EA55 /* BackgroundTaskManager.swift */; }; - 8657A3E4C5E377FE34840E9A /* BackupEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 824FADB40473BFC36FE91F0A /* BackupEngine.swift */; }; - 88879238876B1E5A1BE15DF3 /* SMBClient in Frameworks */ = {isa = PBXBuildFile; productRef = 9CEDCE7A5B4B267C66F39ABE /* SMBClient */; }; - 8C1C09CA16A5D71408468BCB /* NASTransferProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 055D92AB46FCDDF9C34B9D62 /* NASTransferProtocol.swift */; }; - 8EB77E535C82274276C1E328 /* KeychainStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC8C588CD91ABA1EFED2F2B /* KeychainStore.swift */; }; - 9444B0EB5AD2936DA837320F /* BackupError.swift in Sources */ = {isa = PBXBuildFile; fileRef = F03F0ED1A914F3392BFE5E4A /* BackupError.swift */; }; - 950B9DB26C77C1E63BCC96F2 /* ThumbnailCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D2C125977BE8DD28FBF7F70 /* ThumbnailCache.swift */; }; - 96CC879835A8CFE5FDD21B85 /* UGreenCompatibilityBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = B55F95367E10145F50BF06E3 /* UGreenCompatibilityBadge.swift */; }; - 9758372DD65F5353C72DE5C5 /* SMBService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEBD92D10D70B957192E271F /* SMBService.swift */; }; - 9A2F717F6A8F4AA85FA636FC /* Citadel in Frameworks */ = {isa = PBXBuildFile; productRef = 7BEB5BEBEB935BC8E2182A7B /* Citadel */; }; - 9CF57AC05F30A51B6B5269DC /* AppTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B33F755DA5850D1FE3F695B /* AppTheme.swift */; }; - A6276840D40211EB446293A9 /* BackupViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC73AD75762D4357D171CDA4 /* BackupViewModel.swift */; }; - A6D143C05EE16594E0D1AA01 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0AABE0AA63B1ACA1DEABB65 /* SceneDelegate.swift */; }; - A79F538803790524284BCAD6 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 0C0E3EBE5A0DBD9D64196501 /* PrivacyInfo.xcprivacy */; }; - B08D787E99C3B2E193A0D694 /* ToggleRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8845003C87961174302AC990 /* ToggleRow.swift */; }; - B50445A9010E20F97E9E6E48 /* ProgressRing.swift in Sources */ = {isa = PBXBuildFile; fileRef = C955FEF6710E3667C7A73A02 /* ProgressRing.swift */; }; - B7DBF1420838AD3397A280B5 /* BackupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55EA454B783C2AEDABFB00A7 /* BackupView.swift */; }; - BC4346F01DAA4DE7D8F260DB /* SFTPService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B67584BB6D705BCB3D40192 /* SFTPService.swift */; }; - BEBDBED4A7D1D786C47DB8EE /* SyncView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A1E7D60A4D778026CC8007F /* SyncView.swift */; }; - C6AAC362F058E7836A91AC30 /* ConnectViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91197DD51221A3277AE318E2 /* ConnectViewModel.swift */; }; - C7DC18C08F2839D8EE6AE0C3 /* GalleryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F928753E2C260E3CF57259DD /* GalleryView.swift */; }; - C8E9BC6070E23992EED8D013 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D17A73A05A6FDF2B89C6B2 /* SettingsView.swift */; }; - CE47E9F2179F86BE0A630D91 /* LANMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5606A4C5894CFC72D555CAE1 /* LANMonitor.swift */; }; - CE84BC18F045AB65CCA30BB4 /* LANMonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F19B5E72ADF230C0C134942B /* LANMonitorTests.swift */; }; - DCE9AF4F0160E323224E3553 /* PhotoLibraryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74E2AF8B56C469E0D94EFE94 /* PhotoLibraryProtocol.swift */; }; - DF719EAD5727B335001DB50A /* ConnectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE318B60576B11E80862664D /* ConnectView.swift */; }; - DFD2252BDCE9EE7ABAE63BF9 /* BackupEngineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 336D155A4D1C895215A4FFF2 /* BackupEngineTests.swift */; }; - E24CEE0D51131D991038205D /* PhotoPermissionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC72ED4015671C51066AC3E /* PhotoPermissionView.swift */; }; - E830DB3078A8873382A77B63 /* BackupResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AEFE4959C08B94AE9584A11 /* BackupResult.swift */; }; - ED0D2A1D05B5898BCCE9EA0A /* ButtonStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA0969FC7D7E0EE313E29D55 /* ButtonStyles.swift */; }; - F9219423E73718D8AB604EB1 /* ConnectionStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87319355D902007618A91AE /* ConnectionStore.swift */; }; - FA646815F98D36CAB180072A /* BrowseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D947C8F8945A2AB081BBD0EF /* BrowseView.swift */; }; - FDC18499CC21A58C2F6F1BDB /* BackupJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47E762898E351192399FC739 /* BackupJob.swift */; }; + 01610BD782FA7F00787E8CB5 /* NASConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAF503BCE3AEDC25F4D35083 /* NASConnection.swift */; }; + 0555485F0FD9D1D724B98B0D /* PhotoLibraryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35D2B8E1C4BBB260BC1EBA2B /* PhotoLibraryProtocol.swift */; }; + 06C876CCC3F66517F663B410 /* BrowseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6004FE7B107CC60894EDC434 /* BrowseView.swift */; }; + 0E446A91CD30C2905B8E215F /* BackupManifest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 966927456571CE45600BEF75 /* BackupManifest.swift */; }; + 0E4948C8E3326DF859341942 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F052EE8B0A757532E4BCBCCD /* LoginView.swift */; }; + 0F80FDE64AF87518C6563CEC /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 354D31602CFEC56D0D219F41 /* SceneDelegate.swift */; }; + 0FCDDB2EAE2937413C4290BC /* HistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B70F1C01E131F5F2798200E2 /* HistoryView.swift */; }; + 1157E530A5E3EC4563D20C32 /* PHAsset+.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF9C30190F5E5E7264F4FE56 /* PHAsset+.swift */; }; + 1717F8AD78324520FFE4C966 /* SyncView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90F628AC04DC05FDCBAE52D9 /* SyncView.swift */; }; + 17DBE498E2505814F5F40D6E /* AppMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E956B8562EDB9259034CF8FF /* AppMenuView.swift */; }; + 19CB72B2DCA08EC8C8EB3103 /* UGreenCompatibilityBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B4A0DF226AB4C5EE9E0D16 /* UGreenCompatibilityBadge.swift */; }; + 1AEF3190A6F5D3AB43CC521D /* BackupEngineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35A5F6ABBD052F931949B2FA /* BackupEngineTests.swift */; }; + 20F9E76FDA60BA806980E44A /* ToggleRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 674029116718AB4525AD9450 /* ToggleRow.swift */; }; + 24B0F2FC039AF5898BF3ADAE /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57448AD7D80B10985B8A222B /* Date+.swift */; }; + 280D31F6A61529FB13A06EA4 /* SMBClient in Frameworks */ = {isa = PBXBuildFile; productRef = BD0A57EC048DFE706E440152 /* SMBClient */; }; + 28C259C9EB7F49F4C2043375 /* SMBService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E4F11D9683F64A06B855649 /* SMBService.swift */; }; + 2A4AB2DCBEE3B17B4454AADA /* ProgressRing.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA38966CDE15FCE36BEA5DC5 /* ProgressRing.swift */; }; + 3165724C02C31367688DC9A1 /* FolderRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F13BE4A26BEF38CE3043CBB5 /* FolderRow.swift */; }; + 3C588AE6212D742D71A67A4C /* BackupStatusService.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC516E4CBDFA09B6D04937D6 /* BackupStatusService.swift */; }; + 405026F5EC0DD0D4CC636F0F /* BackupStatusSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EDEAE39E0AFC06D0C169589 /* BackupStatusSnapshot.swift */; }; + 42BF90A0F061C3183D5FD5D4 /* BackupJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFC3DC5AA3C7B7258C9155A /* BackupJob.swift */; }; + 42CB7416A94CFEBC290D0E49 /* LANMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D008AD85FA9B690DAFECCC34 /* LANMonitor.swift */; }; + 482C3D381C1489818E276225 /* URL+.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2FABB55A4E874EE203CE585 /* URL+.swift */; }; + 48A1C445346B6E84BB4955D3 /* BackupResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = E987653F4F7129568656EFDE /* BackupResult.swift */; }; + 526A705B348CD4C8AC96576D /* KeychainStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AA5C090CF766ED8E3AF77D1 /* KeychainStore.swift */; }; + 52D01C4B07CBCEB957E6A48D /* ThumbnailCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF29317285580DD2246F54F /* ThumbnailCache.swift */; }; + 5861495375343105B577CFEF /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371184164F77DD3B847A75C7 /* SettingsView.swift */; }; + 600B0282353CDE47AA5B9069 /* NASProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8635AB32FC433B6ECA98B2D /* NASProtocolTests.swift */; }; + 6328A1448CA2F792C509AFC6 /* BackupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05A63232F3A6456E16E36215 /* BackupView.swift */; }; + 67149DE0D19696D9327AEBAB /* BackupError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FC512EA2DC2B02D7F7007FC /* BackupError.swift */; }; + 6A0D1B9133CBA5CBE403AB6A /* NASBackupApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B68D1C6752070B3B79B20F9 /* NASBackupApp.swift */; }; + 6D7C0DABECF5694E95B1F2F9 /* NASTransferProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD82911A480B86E0BB67B9DB /* NASTransferProtocol.swift */; }; + 76076BB7BC1BE9E689E21C02 /* SavedConnections.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBBDD83322981C31F4DE00FF /* SavedConnections.swift */; }; + 78CAA3AC3A1EBF11EB406179 /* ConnectViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 248BF8DA762BB74955255511 /* ConnectViewModelTests.swift */; }; + 7B5455CACF500933808724E2 /* BackupViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CD95417C6B22E6FB7BECC4D /* BackupViewModel.swift */; }; + 80473488B5E80D3A4AA67145 /* ButtonStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4512EE2A2DE276DB46690E06 /* ButtonStyles.swift */; }; + 8396FBC62585481DD422DBB9 /* PhotoPermissionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5FFBBC0D0A57B7476BAFBCF /* PhotoPermissionView.swift */; }; + 8CA733E7E328A54503A06728 /* ConnectionStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 101678CDEDFF343DCC880C2F /* ConnectionStore.swift */; }; + 957976696AD0F01A7BA054DE /* BackgroundTaskManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AC6E57C1203C70B43C3A789 /* BackgroundTaskManager.swift */; }; + 97E28F8EF7418C7D7A4797B1 /* AppTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = E309F9924060F6C3C2FE36D4 /* AppTheme.swift */; }; + A12ED84B089F39AF5A26F246 /* PhotoLibraryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDB76E9F93340DD33C5572DB /* PhotoLibraryService.swift */; }; + A30DD79EAA22C33F029FE4E4 /* LANTriggerSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D7C31A6C73BBF5B8CBDCF2 /* LANTriggerSection.swift */; }; + A43FF80A5C7FC09E07294B60 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 628B4A8E8DDB28CDF5AE4284 /* AppDelegate.swift */; }; + A6163CF76A0CA95AF1946EAB /* LANMonitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1088EF7C38547B982CA1F220 /* LANMonitorTests.swift */; }; + AB40CD596E319D655BA8C661 /* Citadel in Frameworks */ = {isa = PBXBuildFile; productRef = 4CAC5FEFFD728C36D8C6E8B5 /* Citadel */; }; + BF0ACADF8A3BF24F6171BAE8 /* ConnectViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF7C3E36ACFD6096DE0677A /* ConnectViewModel.swift */; }; + C0709000E6CAE98224DE4D98 /* BackupEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75FEBDDA82656772FE30609D /* BackupEngine.swift */; }; + C172F81135C5C7EDBED90E98 /* MainTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3306187119851CE3E989408 /* MainTabView.swift */; }; + D18F0F1DCFEB945F2AD6DC20 /* ConnectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C29AB7B029DBC37E189C81D6 /* ConnectView.swift */; }; + D2EB2844309ECB331955F2A9 /* SFTPService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF029B56DE72F2D5D7977D95 /* SFTPService.swift */; }; + D7C3444EF261573E590725E9 /* MockNASService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B1138B91494A6B3BF4515C0 /* MockNASService.swift */; }; + E6E8A98506D79BB36771FA16 /* GalleryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AB509370FEEE38EA8732FDE /* GalleryView.swift */; }; + EAD70575AAC91030698676E1 /* KisaniLogoMark.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0987D44494F1385E8D4876F /* KisaniLogoMark.swift */; }; + EE8AE9228AC7BA87E0985BDF /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = A1DAA26CE0A4DFFDD90370F2 /* PrivacyInfo.xcprivacy */; }; + F5ED0D561D6F61180B4672FA /* LoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F26ACA8ED4D03984F5A9C7D /* LoginViewModel.swift */; }; + FFC6FD2A10B12C5536CC8BFF /* FolderSetupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22BF6D1FB493F75096805690 /* FolderSetupView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 2F6BE82D286218B2DC8D8B98 /* PBXContainerItemProxy */ = { + C418679965788B155A9DA28E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 82D1639F1555985B1BEE4547 /* Project object */; + containerPortal = EB854A10E75C45315CA7D403 /* Project object */; proxyType = 1; - remoteGlobalIDString = 32316B985B8906FE4CB97730; + remoteGlobalIDString = 009689A0ADEB4878A288991E; remoteInfo = NASBackup; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 055D92AB46FCDDF9C34B9D62 /* NASTransferProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NASTransferProtocol.swift; sourceTree = ""; }; - 0C0E3EBE5A0DBD9D64196501 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; - 277DF2E5F4E566C869EC29F3 /* URL+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+.swift"; sourceTree = ""; }; - 2B33F755DA5850D1FE3F695B /* AppTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTheme.swift; sourceTree = ""; }; - 2BE4774FFA1074FF5F1FAB2B /* NASConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NASConnection.swift; sourceTree = ""; }; - 336D155A4D1C895215A4FFF2 /* BackupEngineTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupEngineTests.swift; sourceTree = ""; }; - 3C31F3F5EBCB51002188FA15 /* FolderSetupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FolderSetupView.swift; sourceTree = ""; }; - 46B47E3C76EA718ECF97BBAD /* PhotoLibraryService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoLibraryService.swift; sourceTree = ""; }; - 47E762898E351192399FC739 /* BackupJob.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupJob.swift; sourceTree = ""; }; - 4AEFE4959C08B94AE9584A11 /* BackupResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupResult.swift; sourceTree = ""; }; - 4B67584BB6D705BCB3D40192 /* SFTPService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SFTPService.swift; sourceTree = ""; }; - 4CBE4F65BE653C7C72E096D1 /* LANTriggerSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LANTriggerSection.swift; sourceTree = ""; }; - 4EC8C588CD91ABA1EFED2F2B /* KeychainStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainStore.swift; sourceTree = ""; }; - 50191596BF6E84CFAE7904D3 /* ConnectViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectViewModelTests.swift; sourceTree = ""; }; - 55EA454B783C2AEDABFB00A7 /* BackupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupView.swift; sourceTree = ""; }; - 5606A4C5894CFC72D555CAE1 /* LANMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LANMonitor.swift; sourceTree = ""; }; - 5643379BBA1FD39841F9EA55 /* BackgroundTaskManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundTaskManager.swift; sourceTree = ""; }; - 67C33F6CACACB9DD50FE3F40 /* AppMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppMenuView.swift; sourceTree = ""; }; - 6A1E7D60A4D778026CC8007F /* SyncView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncView.swift; sourceTree = ""; }; - 6EEBCD4A838173E557DC3EFC /* HistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryView.swift; sourceTree = ""; }; - 74E2AF8B56C469E0D94EFE94 /* PhotoLibraryProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoLibraryProtocol.swift; sourceTree = ""; }; - 7688CD7E9BC5475A3EB01021 /* NASProtocolTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NASProtocolTests.swift; sourceTree = ""; }; - 7AC72ED4015671C51066AC3E /* PhotoPermissionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoPermissionView.swift; sourceTree = ""; }; - 824FADB40473BFC36FE91F0A /* BackupEngine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupEngine.swift; sourceTree = ""; }; - 83C13DD3EB4823AA98D51AF2 /* FolderRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FolderRow.swift; sourceTree = ""; }; - 86FA0D1522E2C4FF7C1CABF3 /* PHAsset+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PHAsset+.swift"; sourceTree = ""; }; - 8845003C87961174302AC990 /* ToggleRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToggleRow.swift; sourceTree = ""; }; - 88E66C22B614E89A7A9E9B35 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 8D2C125977BE8DD28FBF7F70 /* ThumbnailCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThumbnailCache.swift; sourceTree = ""; }; - 91197DD51221A3277AE318E2 /* ConnectViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectViewModel.swift; sourceTree = ""; }; - 97D17A73A05A6FDF2B89C6B2 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; - A8F24C7DD7A503A0D561F3FB /* LoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginView.swift; sourceTree = ""; }; - AC73AD75762D4357D171CDA4 /* BackupViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupViewModel.swift; sourceTree = ""; }; - B36E23852EF12DC14A2DF2DC /* NASBackupApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NASBackupApp.swift; sourceTree = ""; }; - B55F95367E10145F50BF06E3 /* UGreenCompatibilityBadge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UGreenCompatibilityBadge.swift; sourceTree = ""; }; - BACE1D31086231C97DAD884D /* MockNASService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockNASService.swift; sourceTree = ""; }; - C755BFDD42D46A3FB490A4BB /* Kisani.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Kisani.app; sourceTree = BUILT_PRODUCTS_DIR; }; - C955FEF6710E3667C7A73A02 /* ProgressRing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressRing.swift; sourceTree = ""; }; - CA0969FC7D7E0EE313E29D55 /* ButtonStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonStyles.swift; sourceTree = ""; }; - D1D1C00B125D5CC000988DD0 /* SavedConnections.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SavedConnections.swift; sourceTree = ""; }; - D87319355D902007618A91AE /* ConnectionStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionStore.swift; sourceTree = ""; }; - D947C8F8945A2AB081BBD0EF /* BrowseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseView.swift; sourceTree = ""; }; - DEBD92D10D70B957192E271F /* SMBService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SMBService.swift; sourceTree = ""; }; - E3A1E9181F350DA9F091D019 /* KisaniTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = KisaniTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - EE318B60576B11E80862664D /* ConnectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectView.swift; sourceTree = ""; }; - F03F0ED1A914F3392BFE5E4A /* BackupError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupError.swift; sourceTree = ""; }; - F09160B7B7A06BD900D0D87A /* MainTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabView.swift; sourceTree = ""; }; - F0AABE0AA63B1ACA1DEABB65 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; - F19B5E72ADF230C0C134942B /* LANMonitorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LANMonitorTests.swift; sourceTree = ""; }; - F1A42E8CFCAECFDBF6EDDAC0 /* LoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewModel.swift; sourceTree = ""; }; - F5CE897758E9CD5BB8B80F63 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - F6CD83D8292EF9EFBE3A9C6C /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; - F928753E2C260E3CF57259DD /* GalleryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GalleryView.swift; sourceTree = ""; }; + 05A63232F3A6456E16E36215 /* BackupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupView.swift; sourceTree = ""; }; + 0B68D1C6752070B3B79B20F9 /* NASBackupApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NASBackupApp.swift; sourceTree = ""; }; + 101678CDEDFF343DCC880C2F /* ConnectionStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionStore.swift; sourceTree = ""; }; + 1088EF7C38547B982CA1F220 /* LANMonitorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LANMonitorTests.swift; sourceTree = ""; }; + 1AB509370FEEE38EA8732FDE /* GalleryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GalleryView.swift; sourceTree = ""; }; + 1AF29317285580DD2246F54F /* ThumbnailCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThumbnailCache.swift; sourceTree = ""; }; + 22BF6D1FB493F75096805690 /* FolderSetupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FolderSetupView.swift; sourceTree = ""; }; + 248BF8DA762BB74955255511 /* ConnectViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectViewModelTests.swift; sourceTree = ""; }; + 2B1138B91494A6B3BF4515C0 /* MockNASService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockNASService.swift; sourceTree = ""; }; + 2EDEAE39E0AFC06D0C169589 /* BackupStatusSnapshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupStatusSnapshot.swift; sourceTree = ""; }; + 2FC512EA2DC2B02D7F7007FC /* BackupError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupError.swift; sourceTree = ""; }; + 354D31602CFEC56D0D219F41 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 35A5F6ABBD052F931949B2FA /* BackupEngineTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupEngineTests.swift; sourceTree = ""; }; + 35D2B8E1C4BBB260BC1EBA2B /* PhotoLibraryProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoLibraryProtocol.swift; sourceTree = ""; }; + 371184164F77DD3B847A75C7 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; + 3CD95417C6B22E6FB7BECC4D /* BackupViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupViewModel.swift; sourceTree = ""; }; + 3E4F11D9683F64A06B855649 /* SMBService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SMBService.swift; sourceTree = ""; }; + 3F26ACA8ED4D03984F5A9C7D /* LoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewModel.swift; sourceTree = ""; }; + 4512EE2A2DE276DB46690E06 /* ButtonStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonStyles.swift; sourceTree = ""; }; + 57448AD7D80B10985B8A222B /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; + 5AA5C090CF766ED8E3AF77D1 /* KeychainStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainStore.swift; sourceTree = ""; }; + 6004FE7B107CC60894EDC434 /* BrowseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseView.swift; sourceTree = ""; }; + 628B4A8E8DDB28CDF5AE4284 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 63B4A0DF226AB4C5EE9E0D16 /* UGreenCompatibilityBadge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UGreenCompatibilityBadge.swift; sourceTree = ""; }; + 674029116718AB4525AD9450 /* ToggleRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToggleRow.swift; sourceTree = ""; }; + 75FEBDDA82656772FE30609D /* BackupEngine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupEngine.swift; sourceTree = ""; }; + 7CB4973526D01E34E3470056 /* NASBackupTests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = NASBackupTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 84D7C31A6C73BBF5B8CBDCF2 /* LANTriggerSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LANTriggerSection.swift; sourceTree = ""; }; + 86B66D4FB8A7E26BEE807C44 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 8AC6E57C1203C70B43C3A789 /* BackgroundTaskManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundTaskManager.swift; sourceTree = ""; }; + 90F628AC04DC05FDCBAE52D9 /* SyncView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncView.swift; sourceTree = ""; }; + 966927456571CE45600BEF75 /* BackupManifest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupManifest.swift; sourceTree = ""; }; + 9EF7C3E36ACFD6096DE0677A /* ConnectViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectViewModel.swift; sourceTree = ""; }; + A1DAA26CE0A4DFFDD90370F2 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; + B3306187119851CE3E989408 /* MainTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabView.swift; sourceTree = ""; }; + B70F1C01E131F5F2798200E2 /* HistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryView.swift; sourceTree = ""; }; + BBBDD83322981C31F4DE00FF /* SavedConnections.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SavedConnections.swift; sourceTree = ""; }; + C29AB7B029DBC37E189C81D6 /* ConnectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectView.swift; sourceTree = ""; }; + C2FABB55A4E874EE203CE585 /* URL+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+.swift"; sourceTree = ""; }; + C5FFBBC0D0A57B7476BAFBCF /* PhotoPermissionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoPermissionView.swift; sourceTree = ""; }; + D008AD85FA9B690DAFECCC34 /* LANMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LANMonitor.swift; sourceTree = ""; }; + D8635AB32FC433B6ECA98B2D /* NASProtocolTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NASProtocolTests.swift; sourceTree = ""; }; + DA38966CDE15FCE36BEA5DC5 /* ProgressRing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressRing.swift; sourceTree = ""; }; + DAF503BCE3AEDC25F4D35083 /* NASConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NASConnection.swift; sourceTree = ""; }; + DEFC3DC5AA3C7B7258C9155A /* BackupJob.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupJob.swift; sourceTree = ""; }; + E309F9924060F6C3C2FE36D4 /* AppTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTheme.swift; sourceTree = ""; }; + E956B8562EDB9259034CF8FF /* AppMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppMenuView.swift; sourceTree = ""; }; + E987653F4F7129568656EFDE /* BackupResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupResult.swift; sourceTree = ""; }; + ED5F358675A200A5C0FF2289 /* NASBackup.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = NASBackup.app; sourceTree = BUILT_PRODUCTS_DIR; }; + EF029B56DE72F2D5D7977D95 /* SFTPService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SFTPService.swift; sourceTree = ""; }; + F052EE8B0A757532E4BCBCCD /* LoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginView.swift; sourceTree = ""; }; + F0987D44494F1385E8D4876F /* KisaniLogoMark.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KisaniLogoMark.swift; sourceTree = ""; }; + F13BE4A26BEF38CE3043CBB5 /* FolderRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FolderRow.swift; sourceTree = ""; }; + FC516E4CBDFA09B6D04937D6 /* BackupStatusService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupStatusService.swift; sourceTree = ""; }; + FD82911A480B86E0BB67B9DB /* NASTransferProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NASTransferProtocol.swift; sourceTree = ""; }; + FDB76E9F93340DD33C5572DB /* PhotoLibraryService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoLibraryService.swift; sourceTree = ""; }; + FF9C30190F5E5E7264F4FE56 /* PHAsset+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PHAsset+.swift"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - BC332B29F6F9E065FF85AED8 /* Frameworks */ = { + CAB1D82AC61CB4FA60FB441F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 88879238876B1E5A1BE15DF3 /* SMBClient in Frameworks */, - 9A2F717F6A8F4AA85FA636FC /* Citadel in Frameworks */, + 280D31F6A61529FB13A06EA4 /* SMBClient in Frameworks */, + AB40CD596E319D655BA8C661 /* Citadel in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0A801C860EB4C4B22FD4D073 /* Features */ = { + 0249E5AE961D3E9E44EC1BDC /* Features */ = { isa = PBXGroup; children = ( - F09160B7B7A06BD900D0D87A /* MainTabView.swift */, - 803154EA96E2431367806BAF /* Backup */, - 8B6D2A627469C6FA0E1FC2C9 /* Browse */, - 1AD5A741A7466C3510901C60 /* Connect */, - 88D0BD5235374F2A264A0C96 /* History */, - FDF5327105186A6456CF0B08 /* Login */, - 611BB6A8B01D82432C0A32EC /* Onboarding */, - 147B04CA2B7A7723CCD13E93 /* Settings */, - DFE38DFA4C8F1E08CBCC8626 /* Sync */, + B3306187119851CE3E989408 /* MainTabView.swift */, + 83A91D2ECF05467B5800F46E /* Backup */, + C000AF6601D322BFE2F5DE42 /* Browse */, + 25A7433A6E00E5019A36BA8E /* Connect */, + F145A2D2BCDAFE4537180FD5 /* History */, + C2062FFAEB8AF56E0B8E8906 /* Login */, + DFE941C42BE71BAFA32DE115 /* Onboarding */, + 2DFF15D4DA35D2D9EAF115BC /* Settings */, + DF138AC1221E5F0431BE48B9 /* Sync */, ); path = Features; sourceTree = ""; }; - 0A81FA8FFA5273F1D6E01775 = { + 19316D8458AC7C866CAFF836 /* Components */ = { isa = PBXGroup; children = ( - 957299C0794188A819B70A3D /* App */, - C607CAC118F78B0703491238 /* Core */, - 0A801C860EB4C4B22FD4D073 /* Features */, - ADFBF8F90DF8352BD2833A66 /* Services */, - 31C8DD8F9077E2B6C67A99BA /* Shared */, - D7CC50C0264BFFC23DA2C868 /* Tests */, - 8308FE572D56B8045F17F6A0 /* Products */, - ); - sourceTree = ""; - }; - 0B27021136C1E85D5B8CFF97 /* Persistence */ = { - isa = PBXGroup; - children = ( - D87319355D902007618A91AE /* ConnectionStore.swift */, - 4EC8C588CD91ABA1EFED2F2B /* KeychainStore.swift */, - D1D1C00B125D5CC000988DD0 /* SavedConnections.swift */, - ); - path = Persistence; - sourceTree = ""; - }; - 147B04CA2B7A7723CCD13E93 /* Settings */ = { - isa = PBXGroup; - children = ( - 4CBE4F65BE653C7C72E096D1 /* LANTriggerSection.swift */, - 97D17A73A05A6FDF2B89C6B2 /* SettingsView.swift */, - ); - path = Settings; - sourceTree = ""; - }; - 185383972A68402ADF89D64C /* Extensions */ = { - isa = PBXGroup; - children = ( - F6CD83D8292EF9EFBE3A9C6C /* Date+.swift */, - 86FA0D1522E2C4FF7C1CABF3 /* PHAsset+.swift */, - 277DF2E5F4E566C869EC29F3 /* URL+.swift */, - ); - path = Extensions; - sourceTree = ""; - }; - 1AD5A741A7466C3510901C60 /* Connect */ = { - isa = PBXGroup; - children = ( - EE318B60576B11E80862664D /* ConnectView.swift */, - 91197DD51221A3277AE318E2 /* ConnectViewModel.swift */, - ); - path = Connect; - sourceTree = ""; - }; - 31C8DD8F9077E2B6C67A99BA /* Shared */ = { - isa = PBXGroup; - children = ( - 3E7F8DE77B7CDC7009B54D63 /* Components */, - 185383972A68402ADF89D64C /* Extensions */, - 0B27021136C1E85D5B8CFF97 /* Persistence */, - C874CB05A914EE933FCFD5C2 /* Theme */, - ); - path = Shared; - sourceTree = ""; - }; - 3E7F8DE77B7CDC7009B54D63 /* Components */ = { - isa = PBXGroup; - children = ( - CA0969FC7D7E0EE313E29D55 /* ButtonStyles.swift */, - 83C13DD3EB4823AA98D51AF2 /* FolderRow.swift */, - C955FEF6710E3667C7A73A02 /* ProgressRing.swift */, - 8845003C87961174302AC990 /* ToggleRow.swift */, - B55F95367E10145F50BF06E3 /* UGreenCompatibilityBadge.swift */, + 4512EE2A2DE276DB46690E06 /* ButtonStyles.swift */, + F13BE4A26BEF38CE3043CBB5 /* FolderRow.swift */, + F0987D44494F1385E8D4876F /* KisaniLogoMark.swift */, + DA38966CDE15FCE36BEA5DC5 /* ProgressRing.swift */, + 674029116718AB4525AD9450 /* ToggleRow.swift */, + 63B4A0DF226AB4C5EE9E0D16 /* UGreenCompatibilityBadge.swift */, ); path = Components; sourceTree = ""; }; - 611BB6A8B01D82432C0A32EC /* Onboarding */ = { + 25A7433A6E00E5019A36BA8E /* Connect */ = { isa = PBXGroup; children = ( - 3C31F3F5EBCB51002188FA15 /* FolderSetupView.swift */, - 7AC72ED4015671C51066AC3E /* PhotoPermissionView.swift */, + C29AB7B029DBC37E189C81D6 /* ConnectView.swift */, + 9EF7C3E36ACFD6096DE0677A /* ConnectViewModel.swift */, ); - path = Onboarding; + path = Connect; sourceTree = ""; }; - 803154EA96E2431367806BAF /* Backup */ = { + 268927E8286DEAD093401904 /* Errors */ = { isa = PBXGroup; children = ( - 67C33F6CACACB9DD50FE3F40 /* AppMenuView.swift */, - 55EA454B783C2AEDABFB00A7 /* BackupView.swift */, - AC73AD75762D4357D171CDA4 /* BackupViewModel.swift */, - ); - path = Backup; - sourceTree = ""; - }; - 814AF232F5D5D0A188D5C304 /* Protocols */ = { - isa = PBXGroup; - children = ( - 055D92AB46FCDDF9C34B9D62 /* NASTransferProtocol.swift */, - 74E2AF8B56C469E0D94EFE94 /* PhotoLibraryProtocol.swift */, - ); - path = Protocols; - sourceTree = ""; - }; - 8308FE572D56B8045F17F6A0 /* Products */ = { - isa = PBXGroup; - children = ( - C755BFDD42D46A3FB490A4BB /* Kisani.app */, - E3A1E9181F350DA9F091D019 /* KisaniTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 88D0BD5235374F2A264A0C96 /* History */ = { - isa = PBXGroup; - children = ( - 6EEBCD4A838173E557DC3EFC /* HistoryView.swift */, - ); - path = History; - sourceTree = ""; - }; - 8B6D2A627469C6FA0E1FC2C9 /* Browse */ = { - isa = PBXGroup; - children = ( - D947C8F8945A2AB081BBD0EF /* BrowseView.swift */, - F928753E2C260E3CF57259DD /* GalleryView.swift */, - ); - path = Browse; - sourceTree = ""; - }; - 957299C0794188A819B70A3D /* App */ = { - isa = PBXGroup; - children = ( - 88E66C22B614E89A7A9E9B35 /* AppDelegate.swift */, - F5CE897758E9CD5BB8B80F63 /* Info.plist */, - B36E23852EF12DC14A2DF2DC /* NASBackupApp.swift */, - 0C0E3EBE5A0DBD9D64196501 /* PrivacyInfo.xcprivacy */, - F0AABE0AA63B1ACA1DEABB65 /* SceneDelegate.swift */, - ); - path = App; - sourceTree = ""; - }; - ADFBF8F90DF8352BD2833A66 /* Services */ = { - isa = PBXGroup; - children = ( - 5643379BBA1FD39841F9EA55 /* BackgroundTaskManager.swift */, - 824FADB40473BFC36FE91F0A /* BackupEngine.swift */, - 5606A4C5894CFC72D555CAE1 /* LANMonitor.swift */, - 46B47E3C76EA718ECF97BBAD /* PhotoLibraryService.swift */, - 4B67584BB6D705BCB3D40192 /* SFTPService.swift */, - DEBD92D10D70B957192E271F /* SMBService.swift */, - 8D2C125977BE8DD28FBF7F70 /* ThumbnailCache.swift */, - ); - path = Services; - sourceTree = ""; - }; - C560F307C8BE37F60E1105D0 /* Errors */ = { - isa = PBXGroup; - children = ( - F03F0ED1A914F3392BFE5E4A /* BackupError.swift */, + 2FC512EA2DC2B02D7F7007FC /* BackupError.swift */, ); path = Errors; sourceTree = ""; }; - C607CAC118F78B0703491238 /* Core */ = { + 280AD4D16E72BE14F791797C /* Extensions */ = { isa = PBXGroup; children = ( - C560F307C8BE37F60E1105D0 /* Errors */, - F75092ACBEF36F32816506F7 /* Models */, - 814AF232F5D5D0A188D5C304 /* Protocols */, + 57448AD7D80B10985B8A222B /* Date+.swift */, + FF9C30190F5E5E7264F4FE56 /* PHAsset+.swift */, + C2FABB55A4E874EE203CE585 /* URL+.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 2DFF15D4DA35D2D9EAF115BC /* Settings */ = { + isa = PBXGroup; + children = ( + 84D7C31A6C73BBF5B8CBDCF2 /* LANTriggerSection.swift */, + 371184164F77DD3B847A75C7 /* SettingsView.swift */, + ); + path = Settings; + sourceTree = ""; + }; + 359BAEE04BDA0271CDF0DA68 /* Core */ = { + isa = PBXGroup; + children = ( + 268927E8286DEAD093401904 /* Errors */, + 4FF0E966D7AC90E780037C6E /* Models */, + C3F5D1978FD6DE2A6AC1FE1D /* Protocols */, ); path = Core; sourceTree = ""; }; - C874CB05A914EE933FCFD5C2 /* Theme */ = { + 3CEC1323F459F87A75F5DAEA /* Theme */ = { isa = PBXGroup; children = ( - 2B33F755DA5850D1FE3F695B /* AppTheme.swift */, + E309F9924060F6C3C2FE36D4 /* AppTheme.swift */, ); path = Theme; sourceTree = ""; }; - D7CC50C0264BFFC23DA2C868 /* Tests */ = { + 4FF0E966D7AC90E780037C6E /* Models */ = { isa = PBXGroup; children = ( - 336D155A4D1C895215A4FFF2 /* BackupEngineTests.swift */, - 50191596BF6E84CFAE7904D3 /* ConnectViewModelTests.swift */, - F19B5E72ADF230C0C134942B /* LANMonitorTests.swift */, - BACE1D31086231C97DAD884D /* MockNASService.swift */, - 7688CD7E9BC5475A3EB01021 /* NASProtocolTests.swift */, - ); - path = Tests; - sourceTree = ""; - }; - DFE38DFA4C8F1E08CBCC8626 /* Sync */ = { - isa = PBXGroup; - children = ( - 6A1E7D60A4D778026CC8007F /* SyncView.swift */, - ); - path = Sync; - sourceTree = ""; - }; - F75092ACBEF36F32816506F7 /* Models */ = { - isa = PBXGroup; - children = ( - 47E762898E351192399FC739 /* BackupJob.swift */, - 4AEFE4959C08B94AE9584A11 /* BackupResult.swift */, - 2BE4774FFA1074FF5F1FAB2B /* NASConnection.swift */, + DEFC3DC5AA3C7B7258C9155A /* BackupJob.swift */, + 966927456571CE45600BEF75 /* BackupManifest.swift */, + E987653F4F7129568656EFDE /* BackupResult.swift */, + 2EDEAE39E0AFC06D0C169589 /* BackupStatusSnapshot.swift */, + DAF503BCE3AEDC25F4D35083 /* NASConnection.swift */, ); path = Models; sourceTree = ""; }; - FDF5327105186A6456CF0B08 /* Login */ = { + 5C5F3DAEDF1D5405A8D0FEA8 /* Services */ = { isa = PBXGroup; children = ( - A8F24C7DD7A503A0D561F3FB /* LoginView.swift */, - F1A42E8CFCAECFDBF6EDDAC0 /* LoginViewModel.swift */, + 8AC6E57C1203C70B43C3A789 /* BackgroundTaskManager.swift */, + 75FEBDDA82656772FE30609D /* BackupEngine.swift */, + FC516E4CBDFA09B6D04937D6 /* BackupStatusService.swift */, + D008AD85FA9B690DAFECCC34 /* LANMonitor.swift */, + FDB76E9F93340DD33C5572DB /* PhotoLibraryService.swift */, + EF029B56DE72F2D5D7977D95 /* SFTPService.swift */, + 3E4F11D9683F64A06B855649 /* SMBService.swift */, + 1AF29317285580DD2246F54F /* ThumbnailCache.swift */, + ); + path = Services; + sourceTree = ""; + }; + 72EBBA8341BF98FE9F9AED07 /* Tests */ = { + isa = PBXGroup; + children = ( + 35A5F6ABBD052F931949B2FA /* BackupEngineTests.swift */, + 248BF8DA762BB74955255511 /* ConnectViewModelTests.swift */, + 1088EF7C38547B982CA1F220 /* LANMonitorTests.swift */, + 2B1138B91494A6B3BF4515C0 /* MockNASService.swift */, + D8635AB32FC433B6ECA98B2D /* NASProtocolTests.swift */, + ); + path = Tests; + sourceTree = ""; + }; + 7DF4163A2D08ADAF23306969 /* Shared */ = { + isa = PBXGroup; + children = ( + 19316D8458AC7C866CAFF836 /* Components */, + 280AD4D16E72BE14F791797C /* Extensions */, + C37C40B215589DC9C71A70C6 /* Persistence */, + 3CEC1323F459F87A75F5DAEA /* Theme */, + ); + path = Shared; + sourceTree = ""; + }; + 83A91D2ECF05467B5800F46E /* Backup */ = { + isa = PBXGroup; + children = ( + E956B8562EDB9259034CF8FF /* AppMenuView.swift */, + 05A63232F3A6456E16E36215 /* BackupView.swift */, + 3CD95417C6B22E6FB7BECC4D /* BackupViewModel.swift */, + ); + path = Backup; + sourceTree = ""; + }; + A69C81A7E45ED0749759C9FB = { + isa = PBXGroup; + children = ( + A954F0D30CF5667558DE5ED9 /* App */, + 359BAEE04BDA0271CDF0DA68 /* Core */, + 0249E5AE961D3E9E44EC1BDC /* Features */, + 5C5F3DAEDF1D5405A8D0FEA8 /* Services */, + 7DF4163A2D08ADAF23306969 /* Shared */, + 72EBBA8341BF98FE9F9AED07 /* Tests */, + C2A7E64D46FCD1F11ECFCCC1 /* Products */, + ); + sourceTree = ""; + }; + A954F0D30CF5667558DE5ED9 /* App */ = { + isa = PBXGroup; + children = ( + 628B4A8E8DDB28CDF5AE4284 /* AppDelegate.swift */, + 86B66D4FB8A7E26BEE807C44 /* Info.plist */, + 0B68D1C6752070B3B79B20F9 /* NASBackupApp.swift */, + A1DAA26CE0A4DFFDD90370F2 /* PrivacyInfo.xcprivacy */, + 354D31602CFEC56D0D219F41 /* SceneDelegate.swift */, + ); + path = App; + sourceTree = ""; + }; + C000AF6601D322BFE2F5DE42 /* Browse */ = { + isa = PBXGroup; + children = ( + 6004FE7B107CC60894EDC434 /* BrowseView.swift */, + 1AB509370FEEE38EA8732FDE /* GalleryView.swift */, + ); + path = Browse; + sourceTree = ""; + }; + C2062FFAEB8AF56E0B8E8906 /* Login */ = { + isa = PBXGroup; + children = ( + F052EE8B0A757532E4BCBCCD /* LoginView.swift */, + 3F26ACA8ED4D03984F5A9C7D /* LoginViewModel.swift */, ); path = Login; sourceTree = ""; }; + C2A7E64D46FCD1F11ECFCCC1 /* Products */ = { + isa = PBXGroup; + children = ( + ED5F358675A200A5C0FF2289 /* NASBackup.app */, + 7CB4973526D01E34E3470056 /* NASBackupTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + C37C40B215589DC9C71A70C6 /* Persistence */ = { + isa = PBXGroup; + children = ( + 101678CDEDFF343DCC880C2F /* ConnectionStore.swift */, + 5AA5C090CF766ED8E3AF77D1 /* KeychainStore.swift */, + BBBDD83322981C31F4DE00FF /* SavedConnections.swift */, + ); + path = Persistence; + sourceTree = ""; + }; + C3F5D1978FD6DE2A6AC1FE1D /* Protocols */ = { + isa = PBXGroup; + children = ( + FD82911A480B86E0BB67B9DB /* NASTransferProtocol.swift */, + 35D2B8E1C4BBB260BC1EBA2B /* PhotoLibraryProtocol.swift */, + ); + path = Protocols; + sourceTree = ""; + }; + DF138AC1221E5F0431BE48B9 /* Sync */ = { + isa = PBXGroup; + children = ( + 90F628AC04DC05FDCBAE52D9 /* SyncView.swift */, + ); + path = Sync; + sourceTree = ""; + }; + DFE941C42BE71BAFA32DE115 /* Onboarding */ = { + isa = PBXGroup; + children = ( + 22BF6D1FB493F75096805690 /* FolderSetupView.swift */, + C5FFBBC0D0A57B7476BAFBCF /* PhotoPermissionView.swift */, + ); + path = Onboarding; + sourceTree = ""; + }; + F145A2D2BCDAFE4537180FD5 /* History */ = { + isa = PBXGroup; + children = ( + B70F1C01E131F5F2798200E2 /* HistoryView.swift */, + ); + path = History; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 32316B985B8906FE4CB97730 /* Kisani */ = { + 009689A0ADEB4878A288991E /* NASBackup */ = { isa = PBXNativeTarget; - buildConfigurationList = F29F169757D793211107ABA5 /* Build configuration list for PBXNativeTarget "Kisani" */; + buildConfigurationList = E4B2AED4FEFB06AD726A74D4 /* Build configuration list for PBXNativeTarget "NASBackup" */; buildPhases = ( - E6D3CCCB60977A7DABFE7F19 /* Sources */, - 6DB4B780F7FFCAAC2B48E78F /* Resources */, - BC332B29F6F9E065FF85AED8 /* Frameworks */, + 8543F072FE50F0E1E143ABA8 /* Sources */, + 230142F2B6E618F3E55B80EB /* Resources */, + CAB1D82AC61CB4FA60FB441F /* Frameworks */, ); buildRules = ( ); dependencies = ( ); - name = Kisani; + name = NASBackup; packageProductDependencies = ( - 9CEDCE7A5B4B267C66F39ABE /* SMBClient */, - 7BEB5BEBEB935BC8E2182A7B /* Citadel */, + BD0A57EC048DFE706E440152 /* SMBClient */, + 4CAC5FEFFD728C36D8C6E8B5 /* Citadel */, ); productName = NASBackup; - productReference = C755BFDD42D46A3FB490A4BB /* Kisani.app */; + productReference = ED5F358675A200A5C0FF2289 /* NASBackup.app */; productType = "com.apple.product-type.application"; }; - 88E89D71F1D8FA18A6A64BBF /* KisaniTests */ = { + 3362521ADE965E6BA3383045 /* NASBackupTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 3B812FFDA55D20BD7BC79D06 /* Build configuration list for PBXNativeTarget "KisaniTests" */; + buildConfigurationList = 76686B0A9FCB653EC3D1DE73 /* Build configuration list for PBXNativeTarget "NASBackupTests" */; buildPhases = ( - E2CED6E8ED76A743BB9C913F /* Sources */, + D2E3ABAB6DDAF50DB4BCD871 /* Sources */, ); buildRules = ( ); dependencies = ( - EA438E47054B868AA6F6727D /* PBXTargetDependency */, + 92F906944D743CEB19575A94 /* PBXTargetDependency */, ); - name = KisaniTests; + name = NASBackupTests; packageProductDependencies = ( ); productName = NASBackupTests; - productReference = E3A1E9181F350DA9F091D019 /* KisaniTests.xctest */; + productReference = 7CB4973526D01E34E3470056 /* NASBackupTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 82D1639F1555985B1BEE4547 /* Project object */ = { + EB854A10E75C45315CA7D403 /* Project object */ = { isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; LastUpgradeCheck = 1500; TargetAttributes = { - 32316B985B8906FE4CB97730 = { + 009689A0ADEB4878A288991E = { + DevelopmentTeam = ""; ProvisioningStyle = Automatic; }; - 88E89D71F1D8FA18A6A64BBF = { + 3362521ADE965E6BA3383045 = { DevelopmentTeam = ""; ProvisioningStyle = Automatic; }; }; }; - buildConfigurationList = 1A69DB656166247B44D9B8F9 /* Build configuration list for PBXProject "Kisani" */; + buildConfigurationList = DB1A9C1808BCF36E15D6B908 /* Build configuration list for PBXProject "Kisani" */; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( Base, en, ); - mainGroup = 0A81FA8FFA5273F1D6E01775; + mainGroup = A69C81A7E45ED0749759C9FB; minimizedProjectReferenceProxies = 1; packageReferences = ( - F0C68F8974ED417596605807 /* XCRemoteSwiftPackageReference "Citadel" */, - 79C37A3DFFC979C89EC4893A /* XCRemoteSwiftPackageReference "SMBClient" */, + 8E0FD8717A1EFA754500D0DF /* XCRemoteSwiftPackageReference "Citadel" */, + 60FD4E69F981965B9A32FCCA /* XCRemoteSwiftPackageReference "SMBClient" */, ); preferredProjectObjectVersion = 77; - productRefGroup = 8308FE572D56B8045F17F6A0 /* Products */; + productRefGroup = C2A7E64D46FCD1F11ECFCCC1 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 32316B985B8906FE4CB97730 /* Kisani */, - 88E89D71F1D8FA18A6A64BBF /* KisaniTests */, + 009689A0ADEB4878A288991E /* NASBackup */, + 3362521ADE965E6BA3383045 /* NASBackupTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 6DB4B780F7FFCAAC2B48E78F /* Resources */ = { + 230142F2B6E618F3E55B80EB /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - A79F538803790524284BCAD6 /* PrivacyInfo.xcprivacy in Resources */, + EE8AE9228AC7BA87E0985BDF /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - E2CED6E8ED76A743BB9C913F /* Sources */ = { + 8543F072FE50F0E1E143ABA8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DFD2252BDCE9EE7ABAE63BF9 /* BackupEngineTests.swift in Sources */, - 7FB20CB93FECB2F9CBE67161 /* ConnectViewModelTests.swift in Sources */, - CE84BC18F045AB65CCA30BB4 /* LANMonitorTests.swift in Sources */, - 664E9F44D037A8B41D5A7670 /* MockNASService.swift in Sources */, - 685E8F1B44AE5652E93C58CE /* NASProtocolTests.swift in Sources */, + A43FF80A5C7FC09E07294B60 /* AppDelegate.swift in Sources */, + 17DBE498E2505814F5F40D6E /* AppMenuView.swift in Sources */, + 97E28F8EF7418C7D7A4797B1 /* AppTheme.swift in Sources */, + 957976696AD0F01A7BA054DE /* BackgroundTaskManager.swift in Sources */, + C0709000E6CAE98224DE4D98 /* BackupEngine.swift in Sources */, + 67149DE0D19696D9327AEBAB /* BackupError.swift in Sources */, + 42BF90A0F061C3183D5FD5D4 /* BackupJob.swift in Sources */, + 0E446A91CD30C2905B8E215F /* BackupManifest.swift in Sources */, + 48A1C445346B6E84BB4955D3 /* BackupResult.swift in Sources */, + 3C588AE6212D742D71A67A4C /* BackupStatusService.swift in Sources */, + 405026F5EC0DD0D4CC636F0F /* BackupStatusSnapshot.swift in Sources */, + 6328A1448CA2F792C509AFC6 /* BackupView.swift in Sources */, + 7B5455CACF500933808724E2 /* BackupViewModel.swift in Sources */, + 06C876CCC3F66517F663B410 /* BrowseView.swift in Sources */, + 80473488B5E80D3A4AA67145 /* ButtonStyles.swift in Sources */, + D18F0F1DCFEB945F2AD6DC20 /* ConnectView.swift in Sources */, + BF0ACADF8A3BF24F6171BAE8 /* ConnectViewModel.swift in Sources */, + 8CA733E7E328A54503A06728 /* ConnectionStore.swift in Sources */, + 24B0F2FC039AF5898BF3ADAE /* Date+.swift in Sources */, + 3165724C02C31367688DC9A1 /* FolderRow.swift in Sources */, + FFC6FD2A10B12C5536CC8BFF /* FolderSetupView.swift in Sources */, + E6E8A98506D79BB36771FA16 /* GalleryView.swift in Sources */, + 0FCDDB2EAE2937413C4290BC /* HistoryView.swift in Sources */, + 526A705B348CD4C8AC96576D /* KeychainStore.swift in Sources */, + EAD70575AAC91030698676E1 /* KisaniLogoMark.swift in Sources */, + 42CB7416A94CFEBC290D0E49 /* LANMonitor.swift in Sources */, + A30DD79EAA22C33F029FE4E4 /* LANTriggerSection.swift in Sources */, + 0E4948C8E3326DF859341942 /* LoginView.swift in Sources */, + F5ED0D561D6F61180B4672FA /* LoginViewModel.swift in Sources */, + C172F81135C5C7EDBED90E98 /* MainTabView.swift in Sources */, + 6A0D1B9133CBA5CBE403AB6A /* NASBackupApp.swift in Sources */, + 01610BD782FA7F00787E8CB5 /* NASConnection.swift in Sources */, + 6D7C0DABECF5694E95B1F2F9 /* NASTransferProtocol.swift in Sources */, + 1157E530A5E3EC4563D20C32 /* PHAsset+.swift in Sources */, + 0555485F0FD9D1D724B98B0D /* PhotoLibraryProtocol.swift in Sources */, + A12ED84B089F39AF5A26F246 /* PhotoLibraryService.swift in Sources */, + 8396FBC62585481DD422DBB9 /* PhotoPermissionView.swift in Sources */, + 2A4AB2DCBEE3B17B4454AADA /* ProgressRing.swift in Sources */, + D2EB2844309ECB331955F2A9 /* SFTPService.swift in Sources */, + 28C259C9EB7F49F4C2043375 /* SMBService.swift in Sources */, + 76076BB7BC1BE9E689E21C02 /* SavedConnections.swift in Sources */, + 0F80FDE64AF87518C6563CEC /* SceneDelegate.swift in Sources */, + 5861495375343105B577CFEF /* SettingsView.swift in Sources */, + 1717F8AD78324520FFE4C966 /* SyncView.swift in Sources */, + 52D01C4B07CBCEB957E6A48D /* ThumbnailCache.swift in Sources */, + 20F9E76FDA60BA806980E44A /* ToggleRow.swift in Sources */, + 19CB72B2DCA08EC8C8EB3103 /* UGreenCompatibilityBadge.swift in Sources */, + 482C3D381C1489818E276225 /* URL+.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - E6D3CCCB60977A7DABFE7F19 /* Sources */ = { + D2E3ABAB6DDAF50DB4BCD871 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 36FE83FFC24922EBC28287BB /* AppDelegate.swift in Sources */, - 32A4A6A2CFB6C810A8C2CE0B /* AppMenuView.swift in Sources */, - 9CF57AC05F30A51B6B5269DC /* AppTheme.swift in Sources */, - 84E3EE64F74D00104BF8694B /* BackgroundTaskManager.swift in Sources */, - 8657A3E4C5E377FE34840E9A /* BackupEngine.swift in Sources */, - 9444B0EB5AD2936DA837320F /* BackupError.swift in Sources */, - FDC18499CC21A58C2F6F1BDB /* BackupJob.swift in Sources */, - E830DB3078A8873382A77B63 /* BackupResult.swift in Sources */, - B7DBF1420838AD3397A280B5 /* BackupView.swift in Sources */, - A6276840D40211EB446293A9 /* BackupViewModel.swift in Sources */, - FA646815F98D36CAB180072A /* BrowseView.swift in Sources */, - ED0D2A1D05B5898BCCE9EA0A /* ButtonStyles.swift in Sources */, - DF719EAD5727B335001DB50A /* ConnectView.swift in Sources */, - C6AAC362F058E7836A91AC30 /* ConnectViewModel.swift in Sources */, - F9219423E73718D8AB604EB1 /* ConnectionStore.swift in Sources */, - 30693CB8EE711577978EF88C /* Date+.swift in Sources */, - 6DED667F0AA66503730640F1 /* FolderRow.swift in Sources */, - 77A3FF7E2E4F506E7F9E5CCD /* FolderSetupView.swift in Sources */, - C7DC18C08F2839D8EE6AE0C3 /* GalleryView.swift in Sources */, - 6500E80B50EEF877C5127A2A /* HistoryView.swift in Sources */, - 8EB77E535C82274276C1E328 /* KeychainStore.swift in Sources */, - CE47E9F2179F86BE0A630D91 /* LANMonitor.swift in Sources */, - 7DF923F172E6DFE3DD110DC9 /* LANTriggerSection.swift in Sources */, - 45FFF2DCFE454EFDF642CEB1 /* LoginView.swift in Sources */, - 834A766E13EF297273FFEE21 /* LoginViewModel.swift in Sources */, - 37D808079BDEF32D04847D04 /* MainTabView.swift in Sources */, - 7872072DD0E0B8D51C1A12DF /* NASBackupApp.swift in Sources */, - 512B235FB16DEFBBD9EA4E1C /* NASConnection.swift in Sources */, - 8C1C09CA16A5D71408468BCB /* NASTransferProtocol.swift in Sources */, - 4148416D31C8AC65FEE6394F /* PHAsset+.swift in Sources */, - DCE9AF4F0160E323224E3553 /* PhotoLibraryProtocol.swift in Sources */, - 57656BC4B5A2E81FE7BF37FD /* PhotoLibraryService.swift in Sources */, - E24CEE0D51131D991038205D /* PhotoPermissionView.swift in Sources */, - B50445A9010E20F97E9E6E48 /* ProgressRing.swift in Sources */, - BC4346F01DAA4DE7D8F260DB /* SFTPService.swift in Sources */, - 9758372DD65F5353C72DE5C5 /* SMBService.swift in Sources */, - 13FCA7D0BB01BFC46A5B725B /* SavedConnections.swift in Sources */, - A6D143C05EE16594E0D1AA01 /* SceneDelegate.swift in Sources */, - C8E9BC6070E23992EED8D013 /* SettingsView.swift in Sources */, - BEBDBED4A7D1D786C47DB8EE /* SyncView.swift in Sources */, - 950B9DB26C77C1E63BCC96F2 /* ThumbnailCache.swift in Sources */, - B08D787E99C3B2E193A0D694 /* ToggleRow.swift in Sources */, - 96CC879835A8CFE5FDD21B85 /* UGreenCompatibilityBadge.swift in Sources */, - 10062AA91BC883AE597443BD /* URL+.swift in Sources */, + 1AEF3190A6F5D3AB43CC521D /* BackupEngineTests.swift in Sources */, + 78CAA3AC3A1EBF11EB406179 /* ConnectViewModelTests.swift in Sources */, + A6163CF76A0CA95AF1946EAB /* LANMonitorTests.swift in Sources */, + D7C3444EF261573E590725E9 /* MockNASService.swift in Sources */, + 600B0282353CDE47AA5B9069 /* NASProtocolTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - EA438E47054B868AA6F6727D /* PBXTargetDependency */ = { + 92F906944D743CEB19575A94 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 32316B985B8906FE4CB97730 /* Kisani */; - targetProxy = 2F6BE82D286218B2DC8D8B98 /* PBXContainerItemProxy */; + target = 009689A0ADEB4878A288991E /* NASBackup */; + targetProxy = C418679965788B155A9DA28E /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 53DABEDF383DBBE47A3A3FD7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_NAME = KisaniTests; - SDKROOT = iphoneos; - SWIFT_VERSION = 5.9; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Kisani.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Kisani"; - }; - name = Release; - }; - 5496D0713D70962E349CB0C8 /* Debug */ = { + 1076B226DBC2ED8C7D1A690B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = NASBackup.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; - DEVELOPMENT_TEAM = K8BLMMR883; INFOPLIST_FILE = App/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_NAME = Kisani; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = Debug; + name = Release; }; - 7215384C2378F778AC60259A /* Debug */ = { + 2555748A1A56FDD9FF7225B5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; @@ -591,15 +588,31 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - PRODUCT_NAME = KisaniTests; SDKROOT = iphoneos; SWIFT_VERSION = 5.9; TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Kisani.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Kisani"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/NASBackup.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/NASBackup"; }; name = Debug; }; - AAEAFE599F3F20DB264D4528 /* Debug */ = { + 4A6DFA084F194BABD38643FD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + SDKROOT = iphoneos; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/NASBackup.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/NASBackup"; + }; + name = Release; + }; + 8CEFC624549DA4B33DB4AB8D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -667,25 +680,7 @@ }; name = Debug; }; - B8D4CA897A51789EE55978D2 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = NASBackup.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - DEVELOPMENT_TEAM = K8BLMMR883; - INFOPLIST_FILE = App/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_NAME = Kisani; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - E3742B60227DB65518D87A80 /* Release */ = { + 90B8B32B174B11C3A6F7C4A2 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -746,32 +741,48 @@ }; name = Release; }; + F3E46209BAFCC1A383B039AC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = NASBackup.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; + INFOPLIST_FILE = App/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 1A69DB656166247B44D9B8F9 /* Build configuration list for PBXProject "Kisani" */ = { + 76686B0A9FCB653EC3D1DE73 /* Build configuration list for PBXNativeTarget "NASBackupTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - AAEAFE599F3F20DB264D4528 /* Debug */, - E3742B60227DB65518D87A80 /* Release */, + 2555748A1A56FDD9FF7225B5 /* Debug */, + 4A6DFA084F194BABD38643FD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; - 3B812FFDA55D20BD7BC79D06 /* Build configuration list for PBXNativeTarget "KisaniTests" */ = { + DB1A9C1808BCF36E15D6B908 /* Build configuration list for PBXProject "Kisani" */ = { isa = XCConfigurationList; buildConfigurations = ( - 7215384C2378F778AC60259A /* Debug */, - 53DABEDF383DBBE47A3A3FD7 /* Release */, + 8CEFC624549DA4B33DB4AB8D /* Debug */, + 90B8B32B174B11C3A6F7C4A2 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; - F29F169757D793211107ABA5 /* Build configuration list for PBXNativeTarget "Kisani" */ = { + E4B2AED4FEFB06AD726A74D4 /* Build configuration list for PBXNativeTarget "NASBackup" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5496D0713D70962E349CB0C8 /* Debug */, - B8D4CA897A51789EE55978D2 /* Release */, + F3E46209BAFCC1A383B039AC /* Debug */, + 1076B226DBC2ED8C7D1A690B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; @@ -779,7 +790,7 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 79C37A3DFFC979C89EC4893A /* XCRemoteSwiftPackageReference "SMBClient" */ = { + 60FD4E69F981965B9A32FCCA /* XCRemoteSwiftPackageReference "SMBClient" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/kishikawakatsumi/SMBClient"; requirement = { @@ -787,7 +798,7 @@ minimumVersion = 0.3.0; }; }; - F0C68F8974ED417596605807 /* XCRemoteSwiftPackageReference "Citadel" */ = { + 8E0FD8717A1EFA754500D0DF /* XCRemoteSwiftPackageReference "Citadel" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/orlandos-nl/Citadel"; requirement = { @@ -798,17 +809,17 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 7BEB5BEBEB935BC8E2182A7B /* Citadel */ = { + 4CAC5FEFFD728C36D8C6E8B5 /* Citadel */ = { isa = XCSwiftPackageProductDependency; - package = F0C68F8974ED417596605807 /* XCRemoteSwiftPackageReference "Citadel" */; + package = 8E0FD8717A1EFA754500D0DF /* XCRemoteSwiftPackageReference "Citadel" */; productName = Citadel; }; - 9CEDCE7A5B4B267C66F39ABE /* SMBClient */ = { + BD0A57EC048DFE706E440152 /* SMBClient */ = { isa = XCSwiftPackageProductDependency; - package = 79C37A3DFFC979C89EC4893A /* XCRemoteSwiftPackageReference "SMBClient" */; + package = 60FD4E69F981965B9A32FCCA /* XCRemoteSwiftPackageReference "SMBClient" */; productName = SMBClient; }; /* End XCSwiftPackageProductDependency section */ }; - rootObject = 82D1639F1555985B1BEE4547 /* Project object */; + rootObject = EB854A10E75C45315CA7D403 /* Project object */; } diff --git a/Shared/Components/KisaniLogoMark.swift b/Shared/Components/KisaniLogoMark.swift new file mode 100644 index 0000000..c7d518c --- /dev/null +++ b/Shared/Components/KisaniLogoMark.swift @@ -0,0 +1,35 @@ +import SwiftUI + +struct KisaniLogoMark: View { + var size: CGFloat = 66 + + var body: some View { + VStack(spacing: 0) { + driveRow + AppTheme.ink.frame(height: 1.5) + driveRow + AppTheme.ink.frame(height: 1.5) + driveRow + } + .clipShape(RoundedRectangle(cornerRadius: size * 0.167, style: .continuous)) + .overlay( + RoundedRectangle(cornerRadius: size * 0.167, style: .continuous) + .strokeBorder(AppTheme.ink, lineWidth: 2.5) + ) + .frame(width: size, height: size) + .shadow(color: .black.opacity(0.05), radius: 10, x: 0, y: 2) + } + + private var driveRow: some View { + HStack(spacing: 0) { + Spacer() + Circle() + .fill(AppTheme.ink) + .frame(width: size * 0.106, height: size * 0.106) + .padding(.trailing, size * 0.106) + } + .frame(maxWidth: .infinity) + .frame(height: size * 0.273) + .background(AppTheme.surfaceRaised) + } +} diff --git a/project.yml b/project.yml index b65ad69..584c77c 100644 --- a/project.yml +++ b/project.yml @@ -1,4 +1,4 @@ -name: NASBackup +name: Kisani options: bundleIdPrefix: com.albert deploymentTarget: