Files
Archive/sing-box/clients/apple/WidgetExtension/ServiceToggleControl.swift
2024-11-27 19:38:23 +01:00

59 lines
1.6 KiB
Swift

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 {
static var title: LocalizedStringResource = "Toggle sing-box"
@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()
}
}