GradientFollowButton.swift (2671B)
1 // 2 // GradientFollowButton.swift 3 // damus 4 // 5 // Created by klabo on 7/18/23. 6 // 7 8 import SwiftUI 9 10 struct GradientFollowButton: View { 11 12 let target: FollowTarget 13 let follows_you: Bool 14 15 @State var follow_state: FollowState 16 17 private let grayTextColor = Color(#colorLiteral(red: 0.1450980392, green: 0.1607843137, blue: 0.1764705882, alpha: 1)) 18 private let grayBorder = Color(#colorLiteral(red: 0.8666666667, green: 0.8823529412, blue: 0.8901960784, alpha: 1)) 19 20 var body: some View { 21 22 Button(action: { 23 follow_state = perform_follow_btn_action(follow_state, target: target) 24 }) { 25 let followButtonText = follow_btn_txt(follow_state, follows_you: follows_you) 26 Text(followButtonText) 27 .foregroundColor(follow_state == .unfollows ? .white : grayTextColor) 28 .font(.callout) 29 .fontWeight(.medium) 30 .padding([.top, .bottom], 10) 31 .padding([.leading, .trailing], 12) 32 .background(follow_state == .unfollows ? PinkGradient : GrayGradient) 33 .cornerRadius(12) 34 .overlay( 35 RoundedRectangle(cornerRadius: 12) 36 .stroke(grayBorder, lineWidth: follow_state == .unfollows ? 0 : 1) 37 ) 38 } 39 .onReceive(handle_notify(.followed)) { ref in 40 guard target.follow_ref == ref else { return } 41 self.follow_state = .follows 42 } 43 .onReceive(handle_notify(.unfollowed)) { ref in 44 guard target.follow_ref == ref else { return } 45 self.follow_state = .unfollows 46 } 47 } 48 } 49 50 struct GradientFollowButtonPreviews: View { 51 let target: FollowTarget = .pubkey(.empty) 52 var body: some View { 53 VStack { 54 Text(verbatim: "Unfollows") 55 GradientFollowButton(target: target, follows_you: false, follow_state: .unfollows) 56 57 Text(verbatim: "Following") 58 GradientFollowButton(target: target, follows_you: false, follow_state: .following) 59 60 Text(verbatim: "Follows") 61 GradientFollowButton(target: target, follows_you: false, follow_state: .follows) 62 63 Text(verbatim: "Follows") 64 GradientFollowButton(target: target, follows_you: true, follow_state: .follows) 65 66 Text(verbatim: "Unfollowing") 67 GradientFollowButton(target: target, follows_you: false, follow_state: .unfollowing) 68 } 69 } 70 } 71 72 struct GradientButton_Previews: PreviewProvider { 73 static var previews: some View { 74 GradientFollowButtonPreviews() 75 } 76 }