Files
musadaq-saas/musadaq-app/ios/MusadaqLiveActivity/MusadaqLiveActivityBundle.swift
2026-05-07 15:49:13 +03:00

87 lines
3.7 KiB
Swift

//
// 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))
}
}
}
}