summaryrefslogtreecommitdiff
path: root/DomainDigWidget
diff options
context:
space:
mode:
Diffstat (limited to 'DomainDigWidget')
-rw-r--r--DomainDigWidget/DomainDigWidgetBundle.swift1
-rw-r--r--DomainDigWidget/SweepLiveActivity.swift96
2 files changed, 97 insertions, 0 deletions
diff --git a/DomainDigWidget/DomainDigWidgetBundle.swift b/DomainDigWidget/DomainDigWidgetBundle.swift
index 483995c..8c12c90 100644
--- a/DomainDigWidget/DomainDigWidgetBundle.swift
+++ b/DomainDigWidget/DomainDigWidgetBundle.swift
@@ -5,5 +5,6 @@ import WidgetKit
struct DomainDigWidgetBundle: WidgetBundle {
var body: some Widget {
DomainDigPortfolioWidget()
+ SweepLiveActivity()
}
}
diff --git a/DomainDigWidget/SweepLiveActivity.swift b/DomainDigWidget/SweepLiveActivity.swift
new file mode 100644
index 0000000..b99a070
--- /dev/null
+++ b/DomainDigWidget/SweepLiveActivity.swift
@@ -0,0 +1,96 @@
+import ActivityKit
+import SwiftUI
+import WidgetKit
+
+struct SweepLiveActivity: Widget {
+ var body: some WidgetConfiguration {
+ ActivityConfiguration(for: SweepActivityAttributes.self) { context in
+ // Lock Screen / banner presentation.
+ SweepActivityBannerView(context: context)
+ .padding()
+ .activityBackgroundTint(Color(.systemBackground).opacity(0.85))
+ } dynamicIsland: { context in
+ DynamicIsland {
+ DynamicIslandExpandedRegion(.leading) {
+ Label(context.attributes.title, systemImage: "arrow.trianglehead.2.clockwise")
+ .font(.caption)
+ .foregroundStyle(.secondary)
+ }
+ DynamicIslandExpandedRegion(.trailing) {
+ Text("\(context.state.completed)/\(context.state.total)")
+ .font(.caption)
+ .monospacedDigit()
+ }
+ DynamicIslandExpandedRegion(.bottom) {
+ VStack(alignment: .leading, spacing: 4) {
+ ProgressView(value: context.state.fractionComplete)
+ .tint(.cyan)
+ if let current = context.state.currentDomain {
+ Text(current)
+ .font(.caption2)
+ .foregroundStyle(.secondary)
+ .lineLimit(1)
+ }
+ }
+ }
+ } compactLeading: {
+ Image(systemName: "arrow.trianglehead.2.clockwise")
+ .foregroundStyle(.cyan)
+ } compactTrailing: {
+ Text("\(context.state.completed)/\(context.state.total)")
+ .font(.caption2)
+ .monospacedDigit()
+ } minimal: {
+ ProgressView(value: context.state.fractionComplete)
+ .progressViewStyle(.circular)
+ .tint(.cyan)
+ }
+ }
+ }
+}
+
+private struct SweepActivityBannerView: View {
+ let context: ActivityViewContext<SweepActivityAttributes>
+
+ var body: some View {
+ VStack(alignment: .leading, spacing: 8) {
+ HStack {
+ Label(context.attributes.title, systemImage: "arrow.trianglehead.2.clockwise")
+ .font(.caption)
+ .fontWeight(.semibold)
+ .foregroundStyle(.secondary)
+ Spacer()
+ Text("\(context.state.completed) of \(context.state.total)")
+ .font(.caption)
+ .monospacedDigit()
+ }
+
+ ProgressView(value: context.state.fractionComplete)
+ .tint(.cyan)
+
+ HStack {
+ if let current = context.state.currentDomain {
+ Text(current)
+ .font(.caption2)
+ .foregroundStyle(.secondary)
+ .lineLimit(1)
+ } else {
+ Text(context.state.completed >= context.state.total ? "Finished" : "Working…")
+ .font(.caption2)
+ .foregroundStyle(.secondary)
+ }
+ Spacer()
+ if context.state.changed > 0 {
+ Text("\(context.state.changed) changed")
+ .font(.caption2)
+ .foregroundStyle(.orange)
+ }
+ if context.state.warnings > 0 {
+ Text("\(context.state.warnings) warnings")
+ .font(.caption2)
+ .foregroundStyle(.red)
+ }
+ }
+ }
+ }
+}