Add iOS 18 control widget

This commit is contained in:
世界
2024-10-06 21:41:10 +08:00
parent 9dadf5f648
commit 7e67e68670
12 changed files with 306 additions and 150 deletions
@@ -0,0 +1,61 @@
import AppIntents
import Library
import SwiftUI
import WidgetKit
struct ServiceToggleControl: ControlWidget {
var body: some ControlWidgetConfiguration {
StaticControlConfiguration(
kind: ExtensionProfile.controlKind,
provider: Provider()
) { value in
ControlWidgetToggle(
"sing-box",
isOn: value,
action: ToggleServiceIntent()
) { isOn in
Label(isOn ? "Running" : "Stopped", systemImage: "shippingbox.fill")
}
.tint(.init(red: CGFloat(Double(69) / 255), green: CGFloat(Double(90) / 255), blue: CGFloat(Double(100) / 255)))
}
.displayName("Toggle")
.description("Start or stop sing-box service.")
}
}
extension ServiceToggleControl {
struct Provider: ControlValueProvider {
var previewValue: Bool {
false
}
func currentValue() async throws -> Bool {
guard let extensionProfile = try await (ExtensionProfile.load()) else {
return false
}
return extensionProfile.status.isStarted
}
}
}
struct ToggleServiceIntent: SetValueIntent, LiveActivityIntent {
static var title: LocalizedStringResource = "Toggle sing-box"
static var description =
IntentDescription("Toggle sing-box service")
@Parameter(title: "Running")
var value: Bool
func perform() async throws -> some IntentResult {
guard let extensionProfile = try await (ExtensionProfile.load()) else {
return .result()
}
if value {
try await extensionProfile.start()
} else {
try await extensionProfile.stop()
}
return .result()
}
}