69 lines
1.6 KiB
Swift
69 lines
1.6 KiB
Swift
|
|
import SwiftUI
|
|
import Foundation
|
|
import AsyncDNSResolver
|
|
|
|
struct BlockedCount: View {
|
|
|
|
@Environment(\.scenePhase)
|
|
private var scenePhase
|
|
|
|
@EnvironmentObject
|
|
private var viewModel: ViewModel
|
|
|
|
@State private var txtRecord: String = "…"
|
|
|
|
private static let startIndex = 44
|
|
|
|
private static let formatter: NumberFormatter = {
|
|
let formatter = NumberFormatter()
|
|
formatter.numberStyle = .decimal
|
|
|
|
return formatter
|
|
}()
|
|
|
|
var body: some View {
|
|
Text(txtRecord)
|
|
.onAppear {
|
|
fetchTxtRecord()
|
|
}
|
|
.onChange(of: viewModel.blocklist) { _ in
|
|
fetchTxtRecord()
|
|
}
|
|
.onChange(of: scenePhase) { newPhase in
|
|
if newPhase == .active {
|
|
fetchTxtRecord()
|
|
}
|
|
}
|
|
}
|
|
|
|
private func fetchTxtRecord() {
|
|
Task {
|
|
do {
|
|
let resolver = try AsyncDNSResolver()
|
|
|
|
let records = try await resolver.queryTXT(name: "stats.invalid")
|
|
|
|
let text = records.map { $0.txt }.joined()
|
|
|
|
if let number = text.split(separator: " ").first,
|
|
let intValue = Int(number),
|
|
let formatted = Self.formatter.string(for: intValue)
|
|
{
|
|
txtRecord = formatted
|
|
}
|
|
else {
|
|
txtRecord = NSLocalizedString("Error", comment: "")
|
|
}
|
|
}
|
|
catch {
|
|
txtRecord = NSLocalizedString("Error", comment: "")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
BlockedCount()
|
|
.environmentObject(ViewModel())
|
|
}
|