iOS client for Grain grain.social
ios photography atproto
7
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: add haptic feedback on follow/unfollow

Medium impact on follow, light on unfollow. Also fixes glass effect
flash in light mode story viewer with preferredColorScheme(.dark).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

+4
+3
Grain/ViewModels/ProfileDetailViewModel.swift
··· 1 1 import Foundation 2 + import UIKit 2 3 3 4 @Observable 4 5 @MainActor ··· 185 186 186 187 if let followUri { 187 188 // Optimistic unfollow 189 + UIImpactFeedbackGenerator(style: .light).impactOccurred() 188 190 profile?.viewer?.following = nil 189 191 profile?.followersCount = max((prevCount ?? 1) - 1, 0) 190 192 ··· 197 199 } 198 200 } else { 199 201 // Optimistic follow — preserve existing block/mute state 202 + UIImpactFeedbackGenerator(style: .medium).impactOccurred() 200 203 profile?.viewer?.following = "pending" 201 204 profile?.followersCount = (prevCount ?? 0) + 1 202 205
+1
Grain/Views/Components/SuggestedFollowsView.swift
··· 80 80 } 81 81 82 82 private func followUser(_ item: SuggestedItem) { 83 + UIImpactFeedbackGenerator(style: .medium).impactOccurred() 83 84 followingInProgress.insert(item.did) 84 85 Task { 85 86 guard let authContext = await auth.authContext() else { return }