81 lines
2.4 KiB
Swift
81 lines
2.4 KiB
Swift
import WidgetKit
|
|
import AppIntents
|
|
|
|
// MARK: - Shared Data Access
|
|
|
|
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?
|
|
}
|