
Invite Friends
by dockui
Add an Invite Friends template with this SwiftUI template. Allow users to easily share and invite friends, with a clean user-friendly design.
- Platform
- SwiftUI
- Code
- Native Swift
- Format
- Screen
- Access
- Free
Code Snippet
import SwiftUI
struct Friend: Identifiable {
let id = UUID()
let name: String
let username: String
let avatar: String // SF Symbol name
let mutualFriends: Int
let isOnPlatform: Bool
}
struct InviteMethod: Identifiable {
let id = UUID()
let name: String
let icon: String
let backgroundColor: Color
}
struct InviteFriendsView: View {
@Environment(\.dismiss) private var dismiss
@State private var searchText = ""
@State private var showingShareSheet = false
// Dummy Data
let suggestedFriends = [
Friend(name: "Sarah Wilson", username: "sarahw", avatar: "person.crop.circle.fill", mutualFriends: 12, isOnPlatform: true),
Friend(name: "Mike Chen", username: "mikechen", avatar: "person.crop.circle.fill.badge.checkmark", mutualFriends: 8, isOnPlatform: true),
Friend(name: "Emma Davis", username: "emmad", avatar: "person.crop.circle.fill", mutualFriends: 5, isOnPlatform: false),
Friend(name: "Alex Turner", username: "alexturner", avatar: "person.crop.circle.fill", mutualFriends: 15, isOnPlatform: true)
]
let inviteMethods = [
InviteMethod(name: "Messages", icon: "message.fill", backgroundColor: .green),
InviteMethod(name: "Mail", icon: "envelope.fill", backgroundColor: .blue),
InviteMethod(name: "WhatsApp", icon: "bubble.left.fill", backgroundColor: .mint),
InviteMethod(name: "Copy Link", icon: "link", backgroundColor: .purple)
]
var filteredFriends: [Friend] {
if searchText.isEmpty {
return suggestedFriends
}
return suggestedFriends.filter { friend in
friend.name.localizedCaseInsensitiveContains(searchText) ||
friend.username.localizedCaseInsensitiveContains(searchText)
}
}
var body: some View {
NavigationStack {
ScrollView {
VStack(spacing: 24) {
// Invite Card
inviteCard
// Invite Methods
inviteMethodsGrid
// Suggested Friends
suggestedFriendsSection
}
.padding()
}
.navigationTitle("Invite Friends")
.navigationBarTitleDisplayMode(.large)
.searchable(text: $searchText, prompt: "Search friends")
.toolbar {
ToolbarItem(placement: .topBarTrailing) {
Button("Done") { dismiss() }
}
}
}
}
private var inviteCard: some View {
VStack(spacing: 16) {
// Illustration
Image(systemName: "person.2.circle.fill")
.font(.system(size: 60))
.foregroundStyle(.blue)
.padding()
Text("Invite Friends")
.font(.title2)
.fontWeight(.bold)
Text("Earn 500 points for each friend who joins!")
.font(.subheadline)
.foregroundStyle(.secondary)
.multilineTextAlignment(.center)
Button(action: { showingShareSheet = true }) {
Text("Share Your Invite Link")
.font(.headline)
.foregroundStyle(.white)
.frame(maxWidth: .infinity)
.padding()
.background(Color.blue)
.clipShape(RoundedRectangle(cornerRadius: 15))
}
}
.padding()
.background(Color(.systemBackground))
.clipShape(RoundedRectangle(cornerRadius: 20))
.shadow(color: .black.opacity(0.1), radius: 10)
}
private var inviteMethodsGrid: some View {
VStack(alignment: .leading, spacing: 16) {
Text("Invite Via")
.font(.title3)
.fontWeight(.semibold)
LazyVGrid(columns: [
GridItem(.flexible()),
GridItem(.flexible())
], spacing: 16) {
ForEach(inviteMethods) { method in
InviteMethodCard(method: method)
}
}
}
}
private var suggestedFriendsSection: some View {
VStack(alignment: .leading, spacing: 16) {
Text("Suggested Friends")
.font(.title3)
.fontWeight(.semibold)
ForEach(filteredFriends) { friend in
FriendRow(friend: friend)
}
}
}
}
struct InviteMethodCard: View {
let method: InviteMethod
var body: some View {
Button(action: {}) {
HStack {
Image(systemName: method.icon)
.font(.title2)
.foregroundStyle(.white)
.frame(width: 36, height: 36)
.background(method.backgroundColor)
.clipShape(RoundedRectangle(cornerRadius: 10))
Text(method.name)
.font(.subheadline)
.fontWeight(.medium)
Spacer()
Image(systemName: "chevron.right")
.font(.caption)
.foregroundStyle(.secondary)
}
.padding()
.background(Color(.systemBackground))
.clipShape(RoundedRectangle(cornerRadius: 15))
.shadow(color: .black.opacity(0.1), radius: 5)
}
.buttonStyle(.plain)
}
}
struct FriendRow: View {
let friend: Friend
var body: some View {
HStack(spacing: 16) {
Image(systemName: friend.avatar)
.font(.title2)
.foregroundStyle(.blue)
.frame(width: 44, height: 44)
.background(Color.blue.opacity(0.1))
.clipShape(Circle())
VStack(alignment: .leading, spacing: 4) {
Text(friend.name)
.fontWeight(.medium)
Text("@\(friend.username)")
.font(.caption)
.foregroundStyle(.secondary)
if friend.mutualFriends > 0 {
Text("\(friend.mutualFriends) mutual friends")
.font(.caption)
.foregroundStyle(.secondary)
}
}
Spacer()
Button(action: {}) {
Text(friend.isOnPlatform ? "Add" : "Invite")
.font(.subheadline)
.fontWeight(.medium)
.foregroundStyle(friend.isOnPlatform ? .white : .blue)
.padding(.horizontal, 16)
.padding(.vertical, 8)
.background(
friend.isOnPlatform ?
Color.blue :
Color.blue.opacity(0.1)
)
.clipShape(Capsule())
}
}
.padding()
.background(Color(.systemBackground))
.clipShape(RoundedRectangle(cornerRadius: 15))
.shadow(color: .black.opacity(0.1), radius: 5)
}
}
More Templates
View All TemplatesSimilar Blogs
View All Articles
How to Translate Xcode String Catalogs with AI
Learn how to efficiently translate Xcode string catalogs using AI fast, streamlining localization for your iOS and SwiftUI applications.

How to optimize your SwiftUI app in 2026
Discover top strategies to optimize your SwiftUI app in 2026, enhancing performance, responsiveness, and maintainability with modern concurrency.

SwiftUI: iOS Confirmation Alert (Confirm + Cancel)
SwiftUI iOS confirmation alert with Confirm and Cancel buttons. Beginners guide to building safe actions, destructive deletes, and commit dialogs.

SwiftUI: IOS Haptic Feedback Guide 2026
Add click to vibrate haptic feedback in SwiftUI. Full guide to UIImpactFeedbackgenerator, success, error, selection, and tap vibration patterns with code.
Code copied to clipboard!