import DynamicSwiftSDK
import SwiftUI
struct SocialLoginView: View {
let client: DynamicClient
@Binding var message: String
var body: some View {
VStack(spacing: 12) {
// Google button (prominent)
Button {
Task {
await handleSocialAuth(provider: .google)
}
} label: {
HStack {
Image("google-logo")
.resizable()
.frame(width: 20, height: 20)
Text("Continue with Google")
.fontWeight(.medium)
}
.frame(maxWidth: .infinity)
.padding()
.background(Color.white)
.foregroundColor(.primary)
.cornerRadius(8)
.overlay(
RoundedRectangle(cornerRadius: 8).stroke(
Color.secondary.opacity(0.3), lineWidth: 1))
}
// Other social providers in a grid
LazyVGrid(
columns: Array(repeating: GridItem(.flexible(), spacing: 12), count: 3),
spacing: 12
) {
ForEach([
ProviderType.github, ProviderType.twitter, ProviderType.apple,
ProviderType.discord, ProviderType.facebook, ProviderType.farcaster,
], id: \.self) { provider in
Button {
Task {
await handleSocialAuth(provider: provider)
}
} label: {
Image(providerImageName(provider))
.resizable()
.frame(width: 24, height: 24)
.frame(width: 48, height: 48)
.background(Color.gray.opacity(0.1))
.cornerRadius(8)
}
}
}
}
}
private func providerImageName(_ provider: ProviderType) -> String {
switch provider {
case .google: return "google-logo"
case .github: return "github-logo"
case .twitter: return "x-logo"
case .apple: return "apple-logo"
case .discord: return "discord-logo"
case .facebook: return "facebook-logo"
case .farcaster: return "farcaster-logo"
default: return "questionmark.circle"
}
}
private func handleSocialAuth(provider: ProviderType) async {
message = "Preparing authentication..."
do {
let user = try await socialLogin(
client: client,
with: provider,
deepLinkUrl: "myapp://"
)
message = "✅ Successfully logged in: \(user.email ?? "Unknown")"
} catch {
message = "❌ Social auth failed: \(error.localizedDescription)"
}
}
}