Invite Friends

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

Similar Blogs

View All Articles
How to Translate Xcode String Catalogs with AI

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.

by dockui
May 4
How to optimize your SwiftUI app in 2026

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.

by dockui
Apr 29
SwiftUI: iOS Confirmation Alert (Confirm + Cancel)

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.

by dockui
Nov 11
SwiftUI: IOS Haptic Feedback Guide 2026

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.

by dockui
Nov 11

Code copied to clipboard!