mirror of
https://github.com/neon443/NearFuture.git
synced 2026-03-11 06:49:12 +00:00
icloud settings device icons dynamic now
This commit is contained in:
@@ -24,6 +24,7 @@
|
|||||||
A979F6102D270AF90094C0B3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A979F60F2D270AF80094C0B3 /* Assets.xcassets */; };
|
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, ); }; };
|
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 */; };
|
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 */; };
|
A9FC7EEA2D2823920020D75B /* NearFutureWidgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9FC7EE92D28238A0020D75B /* NearFutureWidgets.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
@@ -85,6 +86,7 @@
|
|||||||
A979F6112D270AF90094C0B3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
A979F6112D270AF90094C0B3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
A980FC302D920097006A778F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
A980FC302D920097006A778F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
A980FC372D93FB2B006A778F /* NearFutureTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NearFutureTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
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 = "<group>"; };
|
||||||
A9C05E412D2805D7007DC497 /* NearFutureWidgetsExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NearFutureWidgetsExtension.entitlements; sourceTree = "<group>"; };
|
A9C05E412D2805D7007DC497 /* NearFutureWidgetsExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NearFutureWidgetsExtension.entitlements; sourceTree = "<group>"; };
|
||||||
A9FC7EE92D28238A0020D75B /* NearFutureWidgets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NearFutureWidgets.swift; sourceTree = "<group>"; };
|
A9FC7EE92D28238A0020D75B /* NearFutureWidgets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NearFutureWidgets.swift; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
@@ -150,6 +152,7 @@
|
|||||||
A920C2C02D2403CA00E4F9B1 /* ContentView.swift */,
|
A920C2C02D2403CA00E4F9B1 /* ContentView.swift */,
|
||||||
A93BC0932D2B18A3002E8BBD /* StatsView.swift */,
|
A93BC0932D2B18A3002E8BBD /* StatsView.swift */,
|
||||||
A920C2B42D2401A100E4F9B1 /* SettingsView.swift */,
|
A920C2B42D2401A100E4F9B1 /* SettingsView.swift */,
|
||||||
|
A985104D2DB256430013D5FF /* iCloudSettingsView.swift */,
|
||||||
A980FC302D920097006A778F /* Info.plist */,
|
A980FC302D920097006A778F /* Info.plist */,
|
||||||
A920C2872D24011400E4F9B1 /* NearFutureApp.swift */,
|
A920C2872D24011400E4F9B1 /* NearFutureApp.swift */,
|
||||||
A920C28B2D24011400E4F9B1 /* Item.swift */,
|
A920C28B2D24011400E4F9B1 /* Item.swift */,
|
||||||
@@ -353,6 +356,7 @@
|
|||||||
A920C2882D24011400E4F9B1 /* NearFutureApp.swift in Sources */,
|
A920C2882D24011400E4F9B1 /* NearFutureApp.swift in Sources */,
|
||||||
A93BC0942D2B18A3002E8BBD /* StatsView.swift in Sources */,
|
A93BC0942D2B18A3002E8BBD /* StatsView.swift in Sources */,
|
||||||
A979F57F2D26B1300094C0B3 /* EditEventView.swift in Sources */,
|
A979F57F2D26B1300094C0B3 /* EditEventView.swift in Sources */,
|
||||||
|
A985104E2DB256430013D5FF /* iCloudSettingsView.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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 {
|
#Preview {
|
||||||
SettingsView(
|
SettingsView(
|
||||||
viewModel: EventViewModel()
|
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 {
|
func test() -> Void {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
192
NearFuture/iCloudSettingsView.swift
Normal file
192
NearFuture/iCloudSettingsView.swift
Normal file
@@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user