import SwiftUI enum ServiceStatus { case pending case operational case degraded case outage var description: String { switch self { case .pending: return "Fetching service status" case .operational: return "No issues detected" case .degraded: return "Performance degraded" case .outage: return "Service disruption" } } var color: Color { switch self { case .pending: return .gray case .operational: return .green case .degraded: return .orange case .outage: return .red } } } struct HomeView: View { @State private var isEnabled = false @State private var selectedBlocklist: BlocklistOption = .secure @State private var serviceStatus: ServiceStatus = .operational private let falsePositiveURL = URL(string: "https://www.sr2.uk/contact")! private let statusURL = URL(string: "https://status.sr2.uk/")! private let tosURL = URL(string: "https://www.sr2.uk/terms")! private let privacyPolicyURL = URL(string: "https://www.sr2.uk/privacy")! var body: some View { NavigationStack { List { // Main toggle section Section { HStack { VStack(alignment: .leading, spacing: 4) { Text("DNS Protection") .font(.headline) Text(isEnabled ? "Active" : "Inactive") .font(.caption) .foregroundStyle(isEnabled ? .green : .secondary) } Spacer() Toggle("", isOn: $isEnabled) .labelsHidden() .tint(.green) } .padding(.vertical, 4) } // Blocklist selection Section { ForEach(BlocklistOption.allCases) { option in BlocklistRow( option: option, isSelected: selectedBlocklist == option ) .contentShape(Rectangle()) .onTapGesture { guard option.enabled else { return } withAnimation(.spring(duration: 0.3)) { selectedBlocklist = option } } .opacity(option.enabled ? 1 : 0.6) } } header: { Text("Blocklist") } footer: { Text("Select the level of protection for your DNS queries") } // Status section if isEnabled { Section { HStack { Label("Status", systemImage: "checkmark.circle.fill") .foregroundStyle(.green) Spacer() Text("Connected") .foregroundStyle(.secondary) } HStack { Label("Server", systemImage: "server.rack") Spacer() Text(selectedBlocklist.server) .foregroundStyle(.secondary) .font(.system(.body, design: .monospaced)) } HStack { Label("IPv4", systemImage: "globe") Spacer() Text(selectedBlocklist.ipv4) .foregroundStyle(.secondary) .font(.system(.body, design: .monospaced)) } HStack { Label("IPv6", systemImage: "globe") Spacer() Text(selectedBlocklist.ipv6) .foregroundStyle(.secondary) .font(.system(.body, design: .monospaced)) } HStack { Label("Domains in blocklist", systemImage: "xmark.shield.fill") Spacer() BlockedCount() .foregroundStyle(.secondary) } } header: { Text("Connection Details") } } // Support section Section { Link(destination: falsePositiveURL) { HStack { Label { Text("Report False Positive") } icon: { Image(systemName: "exclamationmark.bubble") .foregroundStyle(.orange) } Spacer() Image(systemName: "arrow.up.right.square") .font(.caption) .foregroundStyle(.secondary) } }.foregroundStyle(.primary) } footer: { Text("Submit incorrectly blocked domains for review") } // Service status section Section { Link(destination: statusURL) { HStack(spacing: 12) { Circle() .fill(serviceStatus.color) .frame(width: 12, height: 12) VStack(alignment: .leading, spacing: 4) { Text("Service Status") .font(.headline) Text(serviceStatus.description) .font(.caption) .foregroundStyle(.secondary) } Spacer() Image(systemName: "arrow.up.right.square") .font(.caption) .foregroundStyle(.secondary) } .padding(.vertical, 4) }.foregroundStyle(.primary) Link(destination: tosURL) { HStack(spacing: 12) { Image(systemName: "doc.text") Text("Terms of Service") Spacer() Image(systemName: "arrow.up.right.square") .font(.caption) .foregroundStyle(.secondary) } }.foregroundStyle(.primary) Link(destination: privacyPolicyURL) { HStack(spacing: 12) { Image(systemName: "doc.text") Text("Privacy Policy") Spacer() Image(systemName: "arrow.up.right.square") .font(.caption) .foregroundStyle(.secondary) } }.foregroundStyle(.primary) } } .navigationTitle("SR2® Cloud DNS") .animation(.default, value: isEnabled) } } } #Preview { HomeView() }