feat: complete widget support
This commit is contained in:
@@ -1,11 +1,80 @@
|
||||
import WidgetKit
|
||||
import AppIntents
|
||||
|
||||
struct ConfigurationAppIntent: WidgetConfigurationIntent {
|
||||
static var title: LocalizedStringResource { "Configuration" }
|
||||
static var description: IntentDescription { "This is an example widget." }
|
||||
// MARK: - Shared Data Access
|
||||
|
||||
// An example configurable parameter.
|
||||
@Parameter(title: "Favorite Emoji", default: "😃")
|
||||
var favoriteEmoji: String
|
||||
struct SharedDeviceData {
|
||||
static let appGroupIdentifier = "group.abunchofknowitalls.remotewol-upsnap"
|
||||
|
||||
static var sharedDefaults: UserDefaults? {
|
||||
UserDefaults(suiteName: appGroupIdentifier)
|
||||
}
|
||||
|
||||
static func getDevices() -> [DeviceInfo] {
|
||||
guard let defaults = sharedDefaults,
|
||||
let jsonString = defaults.string(forKey: "devices"),
|
||||
let data = jsonString.data(using: .utf8),
|
||||
let devices = try? JSONDecoder().decode([DeviceInfo].self, from: data) else {
|
||||
return []
|
||||
}
|
||||
return devices
|
||||
}
|
||||
|
||||
static func getDevice(id: String) -> DeviceInfo? {
|
||||
return getDevices().first { $0.id == id }
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Device Model
|
||||
|
||||
struct DeviceInfo: Codable, Hashable, Identifiable {
|
||||
let id: String
|
||||
let name: String
|
||||
let mac: String
|
||||
let ip: String
|
||||
let status: String
|
||||
}
|
||||
|
||||
// MARK: - Device Entity for AppIntents
|
||||
|
||||
struct DeviceEntity: AppEntity {
|
||||
static var typeDisplayRepresentation: TypeDisplayRepresentation = "Device"
|
||||
static var defaultQuery = DeviceQuery()
|
||||
|
||||
var id: String
|
||||
var name: String
|
||||
var mac: String
|
||||
|
||||
var displayRepresentation: DisplayRepresentation {
|
||||
DisplayRepresentation(title: "\(name)", subtitle: "\(mac)")
|
||||
}
|
||||
}
|
||||
|
||||
struct DeviceQuery: EntityQuery {
|
||||
func entities(for identifiers: [String]) async throws -> [DeviceEntity] {
|
||||
let devices = SharedDeviceData.getDevices()
|
||||
return devices
|
||||
.filter { identifiers.contains($0.id) }
|
||||
.map { DeviceEntity(id: $0.id, name: $0.name, mac: $0.mac) }
|
||||
}
|
||||
|
||||
func suggestedEntities() async throws -> [DeviceEntity] {
|
||||
let devices = SharedDeviceData.getDevices()
|
||||
return devices.map { DeviceEntity(id: $0.id, name: $0.name, mac: $0.mac) }
|
||||
}
|
||||
|
||||
func defaultResult() async -> DeviceEntity? {
|
||||
let devices = SharedDeviceData.getDevices()
|
||||
return devices.first.map { DeviceEntity(id: $0.id, name: $0.name, mac: $0.mac) }
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Widget Configuration Intent
|
||||
|
||||
struct ConfigurationAppIntent: WidgetConfigurationIntent {
|
||||
static var title: LocalizedStringResource { "Device Control" }
|
||||
static var description: IntentDescription { "Select a device to control from your home screen." }
|
||||
|
||||
@Parameter(title: "Device")
|
||||
var device: DeviceEntity?
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user