From 88bb9dfaab0736d07221b07f3ed8a8366b87a7ef Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Fri, 18 Apr 2025 15:36:34 +0530 Subject: [PATCH] icloud settings device icons dynamic now --- NearFuture.xcodeproj/project.pbxproj | 4 + NearFuture/SettingsView.swift | 159 ---------------------- NearFuture/iCloudSettingsView.swift | 192 +++++++++++++++++++++++++++ 3 files changed, 196 insertions(+), 159 deletions(-) create mode 100644 NearFuture/iCloudSettingsView.swift diff --git a/NearFuture.xcodeproj/project.pbxproj b/NearFuture.xcodeproj/project.pbxproj index 7121396..4570e2c 100644 --- a/NearFuture.xcodeproj/project.pbxproj +++ b/NearFuture.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ A979F6102D270AF90094C0B3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A979F60F2D270AF80094C0B3 /* Assets.xcassets */; }; A979F6142D270AF90094C0B3 /* NearFutureWidgetsExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = A979F6022D270AF00094C0B3 /* NearFutureWidgetsExtension.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; A979F6182D2714310094C0B3 /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = A920C28B2D24011400E4F9B1 /* Item.swift */; }; + A985104E2DB256430013D5FF /* iCloudSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A985104D2DB256430013D5FF /* iCloudSettingsView.swift */; }; A9FC7EEA2D2823920020D75B /* NearFutureWidgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9FC7EE92D28238A0020D75B /* NearFutureWidgets.swift */; }; /* End PBXBuildFile section */ @@ -85,6 +86,7 @@ A979F6112D270AF90094C0B3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; A980FC302D920097006A778F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; A980FC372D93FB2B006A778F /* NearFutureTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NearFutureTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + A985104D2DB256430013D5FF /* iCloudSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iCloudSettingsView.swift; sourceTree = ""; }; A9C05E412D2805D7007DC497 /* NearFutureWidgetsExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NearFutureWidgetsExtension.entitlements; sourceTree = ""; }; A9FC7EE92D28238A0020D75B /* NearFutureWidgets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NearFutureWidgets.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -150,6 +152,7 @@ A920C2C02D2403CA00E4F9B1 /* ContentView.swift */, A93BC0932D2B18A3002E8BBD /* StatsView.swift */, A920C2B42D2401A100E4F9B1 /* SettingsView.swift */, + A985104D2DB256430013D5FF /* iCloudSettingsView.swift */, A980FC302D920097006A778F /* Info.plist */, A920C2872D24011400E4F9B1 /* NearFutureApp.swift */, A920C28B2D24011400E4F9B1 /* Item.swift */, @@ -353,6 +356,7 @@ A920C2882D24011400E4F9B1 /* NearFutureApp.swift in Sources */, A93BC0942D2B18A3002E8BBD /* StatsView.swift in Sources */, A979F57F2D26B1300094C0B3 /* EditEventView.swift in Sources */, + A985104E2DB256430013D5FF /* iCloudSettingsView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/NearFuture/SettingsView.swift b/NearFuture/SettingsView.swift index ba0128c..99b7054 100644 --- a/NearFuture/SettingsView.swift +++ b/NearFuture/SettingsView.swift @@ -140,171 +140,12 @@ struct SettingsView: View { } } -struct iCloudSettingsView: View { - @State var viewModel: EventViewModel - @State var showPushAlert: Bool = false - @State var showPullAlert: Bool = false - - @Binding var hasUbiquitous: Bool - @Binding var lastSyncWasSuccessful: Bool - @Binding var lastSyncWasNormalAgo: Bool - @Binding var localCountEqualToiCloud: Bool - @Binding var icloudCountEqualToLocal: Bool - - var updateStatus: () -> Void - - var body: some View { - List { - HStack { - Spacer() - VStack { - ZStack { - Image(systemName: "icloud") - .resizable() - .scaledToFit() - .frame(width: 75, height: 75) - .symbolRenderingMode(.multicolor) - Text("\(viewModel.icloudEventCount)") - .font(.title2) - } - HStack { - Button(role: .destructive) { - showPushAlert.toggle() - } label: { - Image(systemName: "arrow.up") - .resizable() - .scaledToFit() - .frame(width: 30, height: 40) - } - .buttonStyle(BorderedButtonStyle()) - .alert("Warning", isPresented: $showPushAlert) { - Button("OK", role: .destructive) { - viewModel.replaceiCloudWithLocalData() - viewModel.sync() - updateStatus() - } - Button("Cancel", role: .cancel) {} - } message: { - Text("This will replace Events stored in iCloud with Events stored locally.") - } - - Button() { - viewModel.sync() - updateStatus() - } label: { - Image(systemName: "arrow.triangle.2.circlepath") - .resizable() - .scaledToFit() - .frame(width: 30, height: 40) - .foregroundStyle(Color.accentColor) - } - .buttonStyle(BorderedButtonStyle()) - - Button(role: .destructive) { - showPullAlert.toggle() - } label: { - Image(systemName: "arrow.down") - .resizable() - .scaledToFit() - .frame(width: 30, height: 40) - } - .buttonStyle(BorderedButtonStyle()) - .alert("Warning", isPresented: $showPullAlert) { - Button("OK", role: .destructive) { - viewModel.replaceLocalWithiCloudData() - viewModel.sync() - updateStatus() - } - Button("Cancel", role: .cancel) {} - } message: { - Text("This will replace Events stored locally with Events stored in iCloud.") - } - } - ZStack { - Image(systemName: "iphone.gen3") - .resizable() - .scaledToFit() - .frame(width: 75, height: 75) - .symbolRenderingMode(.monochrome) - Text("\(viewModel.localEventCount)") - .font(.headline) - } - } - Spacer() - } - .onAppear { - viewModel.sync() - updateStatus() - } - - HStack { - Circle() - .frame(width: 20, height: 20) - .foregroundStyle(hasUbiquitous ? .green : .red) - Text("iCloud Key Value Store:") - Text("\(hasUbiquitous ? "" : "Not ")Working") - .bold() - } - - HStack { - Circle() - .frame(width: 20, height: 20) - .foregroundStyle(lastSyncWasSuccessful ? .green : .red) - Text("Sync Status:") - Text("\(viewModel.syncStatus)") - .bold() - } - - HStack { - Circle() - .frame(width: 20, height: 20) - .foregroundStyle(lastSyncWasNormalAgo ? .green : .red) - Text("Last Sync:") - Text("\(viewModel.lastSync?.formatted() ?? "Never")") - .bold() - } - - HStack { - Circle() - .frame(width: 20, height: 20) - .foregroundStyle(localCountEqualToiCloud ? .green : .red) - Text("\(viewModel.localEventCount)") - .bold() - Text("Local Events") - } - - HStack { - Circle() - .frame(width: 20, height: 20) - .foregroundStyle(icloudCountEqualToLocal ? .green : .red) - Text("\(viewModel.icloudEventCount)") - .bold() - Text("Events in iCloud") - } - } - .navigationTitle("iCloud") - .navigationBarTitleDisplayMode(.inline) - } -} - #Preview { SettingsView( viewModel: EventViewModel() ) } -#Preview("iCloudSettingsView") { - iCloudSettingsView( - viewModel: EventViewModel(), - hasUbiquitous: .constant(true), - lastSyncWasSuccessful: .constant(true), - lastSyncWasNormalAgo: .constant(true), - localCountEqualToiCloud: .constant(true), - icloudCountEqualToLocal: .constant(true), - updateStatus: test - ) -} - func test() -> Void { } diff --git a/NearFuture/iCloudSettingsView.swift b/NearFuture/iCloudSettingsView.swift new file mode 100644 index 0000000..42d70b7 --- /dev/null +++ b/NearFuture/iCloudSettingsView.swift @@ -0,0 +1,192 @@ +// +// iCloudSettingsView.swift +// NearFuture +// +// Created by neon443 on 18/04/2025. +// + +import SwiftUI + +struct iCloudSettingsView: View { + @State var viewModel: EventViewModel + @State var showPushAlert: Bool = false + @State var showPullAlert: Bool = false + + @Binding var hasUbiquitous: Bool + @Binding var lastSyncWasSuccessful: Bool + @Binding var lastSyncWasNormalAgo: Bool + @Binding var localCountEqualToiCloud: Bool + @Binding var icloudCountEqualToLocal: Bool + + let asi = ProcessInfo().isiOSAppOnMac + let model = UIDevice().model + var device: (sf: String, label: String) { + if asi { + return (sf: "laptopcomputer", label: "Computer") + } else if model == "iPhone" { + return (sf: model.lowercased(), label: model) + } else if model == "iPad" { + return (sf: model.lowercased(), label: model) + } + return (sf: "iphone", label: "iPhone") + } + + var updateStatus: () -> Void + + var body: some View { + List { + HStack { + Spacer() + VStack { + ZStack { + Image(systemName: "icloud") + .resizable() + .scaledToFit() + .frame(width: 75, height: 55) + .symbolRenderingMode(.multicolor) + Text("\(viewModel.icloudEventCount)") + .font(.title2) + .monospaced() + .bold() + } + Text("iCloud") + HStack { + Button(role: .destructive) { + showPushAlert.toggle() + } label: { + Image(systemName: "arrow.up") + .resizable() + .scaledToFit() + .frame(width: 30, height: 40) + } + .buttonStyle(BorderedButtonStyle()) + .alert("Warning", isPresented: $showPushAlert) { + Button("OK", role: .destructive) { + viewModel.replaceiCloudWithLocalData() + viewModel.sync() + updateStatus() + } + Button("Cancel", role: .cancel) {} + } message: { + Text("This will replace Events stored in iCloud with Events stored locally.") + } + + Button() { + viewModel.sync() + updateStatus() + } label: { + Image(systemName: "arrow.triangle.2.circlepath") + .resizable() + .scaledToFit() + .frame(width: 30, height: 40) + .foregroundStyle(Color.accentColor) + } + .buttonStyle(BorderedButtonStyle()) + + Button(role: .destructive) { + showPullAlert.toggle() + } label: { + Image(systemName: "arrow.down") + .resizable() + .scaledToFit() + .frame(width: 30, height: 40) + } + .buttonStyle(BorderedButtonStyle()) + .alert("Warning", isPresented: $showPullAlert) { + Button("OK", role: .destructive) { + viewModel.replaceLocalWithiCloudData() + viewModel.sync() + updateStatus() + } + Button("Cancel", role: .cancel) {} + } message: { + Text("This will replace Events stored locally with Events stored in iCloud.") + } + } + ZStack { + Image(systemName: device.sf) + .resizable() + .scaledToFit() + .frame(width: 75, height: 75) + .symbolRenderingMode(.monochrome) + Text("\(viewModel.localEventCount)") + .font(.title2) + .monospaced() + .bold() + } + Text(device.label) + } + Spacer() + } + .listRowSeparator(.hidden) + .onAppear { + viewModel.sync() + updateStatus() + } + + HStack { + Circle() + .frame(width: 20, height: 20) + .foregroundStyle(hasUbiquitous ? .green : .red) + Text("iCloud") + Spacer() + Text("\(hasUbiquitous ? "" : "Not ")Working") + .bold() + } + + HStack { + Circle() + .frame(width: 20, height: 20) + .foregroundStyle(lastSyncWasSuccessful ? .green : .red) + Text("Sync Status") + Spacer() + Text("\(viewModel.syncStatus)") + .bold() + } + + HStack { + Circle() + .frame(width: 20, height: 20) + .foregroundStyle(lastSyncWasNormalAgo ? .green : .red) + Text("Last Sync") + Spacer() + Text("\(viewModel.lastSync?.formatted() ?? "Never")") + .bold() + } + + HStack { + Circle() + .frame(width: 20, height: 20) + .foregroundStyle(localCountEqualToiCloud ? .green : .red) + Text("Local Events") + Spacer() + Text("\(viewModel.localEventCount)") + .bold() + } + + HStack { + Circle() + .frame(width: 20, height: 20) + .foregroundStyle(icloudCountEqualToLocal ? .green : .red) + Text("Events in iCloud") + Spacer() + Text("\(viewModel.icloudEventCount)") + .bold() + } + } + .navigationTitle("iCloud") + .navigationBarTitleDisplayMode(.inline) + } +} + +#Preview("iCloudSettingsView") { + iCloudSettingsView( + viewModel: EventViewModel(), + hasUbiquitous: .constant(true), + lastSyncWasSuccessful: .constant(true), + lastSyncWasNormalAgo: .constant(true), + localCountEqualToiCloud: .constant(true), + icloudCountEqualToLocal: .constant(true), + updateStatus: test + ) +}