struct InviteView: View {
@State private var inviteCode: String?
@State private var inviteLink: String?
@State private var remainingInvites: Int = 0
@State private var isLoading = true
var body: some View {
VStack(spacing: 20) {
if isLoading {
ProgressView("Loading invite info...")
} else {
VStack(spacing: 16) {
Text("Invite Friends")
.font(.title2)
.fontWeight(.bold)
Text("You have \(remainingInvites) invites remaining")
.foregroundColor(.secondary)
if let code = inviteCode {
VStack {
Text("Your Invite Code")
.font(.headline)
Text(code)
.font(.title)
.fontWeight(.bold)
.padding()
.background(Color.gray.opacity(0.1))
.cornerRadius(8)
}
}
if let link = inviteLink {
ShareLink(
item: URL(string: link)!,
message: Text("Join me on this amazing app!")
) {
Label("Share Invite Link", systemImage: "square.and.arrow.up")
.frame(maxWidth: .infinity)
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(8)
}
}
}
}
}
.padding()
.onAppear {
loadInviteInfo()
}
}
private func loadInviteInfo() async {
let cm = ContactsService.shared
async let code = cm.invites.code
async let link = cm.invites.link
async let remaining = cm.invites.remaining()
let (inviteCode, inviteLink, remainingCount) = await (code, link, remaining)
DispatchQueue.main.async {
self.inviteCode = inviteCode
self.inviteLink = inviteLink
self.remainingInvites = remainingCount
self.isLoading = false
}
}
}