Update: 2026-05-07 15:49:13
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
//
|
||||
// MusadaqLiveActivityBundle.swift
|
||||
// MusadaqLiveActivity
|
||||
//
|
||||
// Created by Hamza Aleghwairyeen on 07/05/2026.
|
||||
//
|
||||
|
||||
import WidgetKit
|
||||
import SwiftUI
|
||||
import ActivityKit
|
||||
|
||||
// ─── 1. Data Model ───────────────────────────────────
|
||||
struct InvoiceBatchAttributes: ActivityAttributes {
|
||||
public struct ContentState: Codable, Hashable {
|
||||
var current: Int
|
||||
var total: Int
|
||||
var isDone: Bool
|
||||
}
|
||||
var companyName: String
|
||||
}
|
||||
|
||||
// ─── 2. Bundle ───────────────────────────────────────
|
||||
@main
|
||||
struct MusadaqLiveActivityBundle: WidgetBundle {
|
||||
var body: some Widget {
|
||||
MusadaqLiveActivityLiveActivity()
|
||||
}
|
||||
}
|
||||
|
||||
// ─── 3. Widget ───────────────────────────────────────
|
||||
struct MusadaqLiveActivityLiveActivity: Widget {
|
||||
var body: some WidgetConfiguration {
|
||||
ActivityConfiguration(for: InvoiceBatchAttributes.self) { context in
|
||||
// Lock Screen UI
|
||||
ZStack {
|
||||
Color(red: 0.043, green: 0.098, blue: 0.161) // #0B1929
|
||||
HStack(spacing: 12) {
|
||||
Image(systemName: context.state.isDone
|
||||
? "checkmark.doc.fill" : "arrow.up.doc.fill")
|
||||
.foregroundColor(Color(red: 0.831, green: 0.659, blue: 0.263)) // #D4A843
|
||||
.font(.title2)
|
||||
VStack(alignment: .leading, spacing: 4) {
|
||||
Text(context.state.isDone ? "✅ تم الرفع بنجاح" : "مُصادَق — جارٍ الرفع...")
|
||||
.font(.caption.bold())
|
||||
.foregroundColor(.white)
|
||||
ProgressView(
|
||||
value: Double(context.state.current),
|
||||
total: Double(context.state.total)
|
||||
)
|
||||
.tint(Color(red: 0.831, green: 0.659, blue: 0.263))
|
||||
Text("\(context.state.current) / \(context.state.total) فاتورة — \(context.attributes.companyName)")
|
||||
.font(.caption2)
|
||||
.foregroundColor(.gray)
|
||||
}
|
||||
}
|
||||
.padding()
|
||||
}
|
||||
} dynamicIsland: { context in
|
||||
DynamicIsland {
|
||||
DynamicIslandExpandedRegion(.leading) {
|
||||
Image(systemName: "arrow.up.doc.fill")
|
||||
.foregroundColor(Color(red: 0.831, green: 0.659, blue: 0.263))
|
||||
}
|
||||
DynamicIslandExpandedRegion(.trailing) {
|
||||
Text("\(context.state.current)/\(context.state.total)")
|
||||
.font(.caption.bold()).foregroundColor(.white)
|
||||
}
|
||||
DynamicIslandExpandedRegion(.bottom) {
|
||||
ProgressView(value: Double(context.state.current),
|
||||
total: Double(context.state.total))
|
||||
.tint(Color(red: 0.831, green: 0.659, blue: 0.263))
|
||||
}
|
||||
} compactLeading: {
|
||||
Image(systemName: "arrow.up.doc.fill")
|
||||
.foregroundColor(Color(red: 0.831, green: 0.659, blue: 0.263))
|
||||
.font(.caption)
|
||||
} compactTrailing: {
|
||||
Text("\(context.state.current)/\(context.state.total)")
|
||||
.font(.caption2.bold()).foregroundColor(.white)
|
||||
} minimal: {
|
||||
Image(systemName: "arrow.up.doc.fill")
|
||||
.foregroundColor(Color(red: 0.831, green: 0.659, blue: 0.263))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user