commit 3c629621eb393a6e14945ee131fb1e92667f48ed
parent 09f12845c0b9ad39f67820327a1884ef71d50717
Author: William Casarin <jb55@jb55.com>
Date:   Tue,  7 Feb 2023 10:51:08 -0800
Add "Follows You" to profile
Changelog-Added: Add "Follows You" indicator on profile
Diffstat:
4 files changed, 142 insertions(+), 56 deletions(-)
diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj
@@ -142,6 +142,8 @@
 		4CB883AE2976FA9300DC99E7 /* FormatTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB883AD2976FA9300DC99E7 /* FormatTests.swift */; };
 		4CB883B0297705DD00DC99E7 /* ZapButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB883AF297705DD00DC99E7 /* ZapButton.swift */; };
 		4CB883B6297730E400DC99E7 /* LNUrls.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB883B5297730E400DC99E7 /* LNUrls.swift */; };
+		4CB9D4A72992D02B00A9A7E4 /* ProfileNameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB9D4A62992D02B00A9A7E4 /* ProfileNameView.swift */; };
+		4CB9D4A92992D2F400A9A7E4 /* FollowsYou.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB9D4A82992D2F400A9A7E4 /* FollowsYou.swift */; };
 		4CBCA930297DB57F00EC6B2F /* WebsiteLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBCA92F297DB57F00EC6B2F /* WebsiteLink.swift */; };
 		4CC7AAE7297EFA7B00430951 /* Zap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7AAE6297EFA7B00430951 /* Zap.swift */; };
 		4CC7AAEB297F0AEC00430951 /* BuilderEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7AAEA297F0AEC00430951 /* BuilderEventView.swift */; };
@@ -425,6 +427,8 @@
 		4CB883AD2976FA9300DC99E7 /* FormatTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormatTests.swift; sourceTree = "<group>"; };
 		4CB883AF297705DD00DC99E7 /* ZapButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZapButton.swift; sourceTree = "<group>"; };
 		4CB883B5297730E400DC99E7 /* LNUrls.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LNUrls.swift; sourceTree = "<group>"; };
+		4CB9D4A62992D02B00A9A7E4 /* ProfileNameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileNameView.swift; sourceTree = "<group>"; };
+		4CB9D4A82992D2F400A9A7E4 /* FollowsYou.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowsYou.swift; sourceTree = "<group>"; };
 		4CBCA92F297DB57F00EC6B2F /* WebsiteLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebsiteLink.swift; sourceTree = "<group>"; };
 		4CC7AAE6297EFA7B00430951 /* Zap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Zap.swift; sourceTree = "<group>"; };
 		4CC7AAEA297F0AEC00430951 /* BuilderEventView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuilderEventView.swift; sourceTree = "<group>"; };
@@ -640,6 +644,7 @@
 		4C75EFA227FA576C0006080F /* Views */ = {
 			isa = PBXGroup;
 			children = (
+				4CB9D4A52992D01900A9A7E4 /* Profile */,
 				4CAAD8AE29888A9B00060CEA /* Relays */,
 				4CF0ABF42985CD4200D66079 /* Posting */,
 				4CF0ABDF2981A83000D66079 /* Muting */,
@@ -779,6 +784,15 @@
 			path = Reactions;
 			sourceTree = "<group>";
 		};
+		4CB9D4A52992D01900A9A7E4 /* Profile */ = {
+			isa = PBXGroup;
+			children = (
+				4CB9D4A62992D02B00A9A7E4 /* ProfileNameView.swift */,
+				4CB9D4A82992D2F400A9A7E4 /* FollowsYou.swift */,
+			);
+			path = Profile;
+			sourceTree = "<group>";
+		};
 		4CC7AAEE297F11B300430951 /* Events */ = {
 			isa = PBXGroup;
 			children = (
@@ -1242,6 +1256,7 @@
 				4C3AC7A728369BA200E1F516 /* SearchHomeView.swift in Sources */,
 				4CB883B0297705DD00DC99E7 /* ZapButton.swift in Sources */,
 				4C363A922825FCF2006E126D /* ProfileUpdate.swift in Sources */,
+				4CB9D4A92992D2F400A9A7E4 /* FollowsYou.swift in Sources */,
 				4C3BEFDA281DCA1400B3DE84 /* LikeCounter.swift in Sources */,
 				4CB88389296AF99A00DC99E7 /* EventDetailBar.swift in Sources */,
 				4CF0ABDE2981A69500D66079 /* MutelistModel.swift in Sources */,
@@ -1274,6 +1289,7 @@
 				4C75EFBB2804A34C0006080F /* ProofOfWork.swift in Sources */,
 				4C3AC7A52836987600E1F516 /* MainTabView.swift in Sources */,
 				3169CAED294FCCFC00EE4006 /* Constants.swift in Sources */,
+				4CB9D4A72992D02B00A9A7E4 /* ProfileNameView.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/damus/Views/Profile/FollowsYou.swift b/damus/Views/Profile/FollowsYou.swift
@@ -0,0 +1,34 @@
+//
+//  FollowsYou.swift
+//  damus
+//
+//  Created by William Casarin on 2023-02-07.
+//
+
+import SwiftUI
+
+struct FollowsYou: View {
+    @Environment(\.colorScheme) var colorScheme
+
+    var fill_color: Color {
+        colorScheme == .light ? Color("DamusLightGrey") : Color("DamusDarkGrey")
+    }
+    
+    var body: some View {
+        Text("Follows you")
+            .padding([.leading, .trailing], 6.0)
+            .padding([.top, .bottom], 2.0)
+            .foregroundColor(.gray)
+            .background {
+                RoundedRectangle(cornerRadius: 5.0)
+                    .foregroundColor(fill_color)
+            }
+            .font(.footnote)
+    }
+}
+
+struct FollowsYou_Previews: PreviewProvider {
+    static var previews: some View {
+        FollowsYou()
+    }
+}
diff --git a/damus/Views/Profile/ProfileNameView.swift b/damus/Views/Profile/ProfileNameView.swift
@@ -0,0 +1,61 @@
+//
+//  ProfileNameView.swift
+//  damus
+//
+//  Created by William Casarin on 2023-02-07.
+//
+
+import SwiftUI
+
+struct ProfileNameView: View {
+    let pubkey: String
+    let profile: Profile?
+    let follows_you: Bool
+    let damus: DamusState
+    
+    var spacing: CGFloat { 10.0 }
+    
+    var body: some View {
+        Group {
+            if let real_name = profile?.display_name {
+                VStack(alignment: .leading) {
+                    Text(real_name)
+                        .font(.title3.weight(.bold))
+                    HStack(alignment: .center, spacing: spacing) {
+                        ProfileName(pubkey: pubkey, profile: profile, prefix: "@", damus: damus, show_friend_confirmed: true)
+                            .font(.callout)
+                            .foregroundColor(.gray)
+                        
+                        if follows_you {
+                            FollowsYou()
+                        }
+                    }
+                    KeyView(pubkey: pubkey)
+                        .pubkey_context_menu(bech32_pubkey: pubkey)
+                }
+            } else {
+                VStack(alignment: .leading) {
+                    HStack(alignment: .center, spacing: spacing) {
+                        ProfileName(pubkey: pubkey, profile: profile, damus: damus, show_friend_confirmed: true)
+                            .font(.title3.weight(.bold))
+                        if follows_you {
+                            FollowsYou()
+                        }
+                    }
+                    KeyView(pubkey: pubkey)
+                        .pubkey_context_menu(bech32_pubkey: pubkey)
+                }
+            }
+        }
+    }
+}
+
+struct ProfileNameView_Previews: PreviewProvider {
+    static var previews: some View {
+        VStack {
+            ProfileNameView(pubkey: test_event.pubkey, profile: nil, follows_you: true, damus: test_damus_state())
+            
+            ProfileNameView(pubkey: test_event.pubkey, profile: nil, follows_you: false, damus: test_damus_state())
+        }
+    }
+}
diff --git a/damus/Views/ProfileView.swift b/damus/Views/ProfileView.swift
@@ -49,35 +49,6 @@ func follow_btn_enabled_state(_ fs: FollowState) -> Bool {
     }
 }
 
-struct ProfileNameView: View {
-    let pubkey: String
-    let profile: Profile?
-    let damus: DamusState
-    
-    var body: some View {
-        Group {
-            if let real_name = profile?.display_name {
-                VStack(alignment: .leading) {
-                    Text(real_name)
-                        .font(.title3.weight(.bold))
-                    ProfileName(pubkey: pubkey, profile: profile, prefix: "@", damus: damus, show_friend_confirmed: true)
-                        .font(.callout)
-                        .foregroundColor(.gray)
-                    KeyView(pubkey: pubkey)
-                        .pubkey_context_menu(bech32_pubkey: pubkey)
-                }
-            } else {
-                VStack(alignment: .leading) {
-                    ProfileName(pubkey: pubkey, profile: profile, damus: damus, show_friend_confirmed: true)
-                        .font(.title3.weight(.bold))
-                    KeyView(pubkey: pubkey)
-                        .pubkey_context_menu(bech32_pubkey: pubkey)
-                }
-            }
-        }
-    }
-}
-
 struct EditButton: View {
     let damus_state: DamusState
     
@@ -243,6 +214,33 @@ struct ProfileView: View {
         return 0
     }
     
+    func ActionSection(profile_data: Profile?) -> some View {
+        return Group {
+            ActionSheetButton
+            
+            if let profile = profile_data {
+                if let lnurl = profile.lnurl, lnurl != "" {
+                    LNButton(lnurl: lnurl, profile: profile)
+                }
+            }
+            
+            DMButton
+            
+            if profile.pubkey != damus_state.pubkey {
+                FollowButtonView(
+                    target: profile.get_follow_target(),
+                    follows_you: profile.follows(pubkey: damus_state.pubkey),
+                    follow_state: damus_state.contacts.follow_state(profile.pubkey)
+                )
+            } else if damus_state.keypair.privkey != nil {
+                NavigationLink(destination: EditMetadataView(damus_state: damus_state)) {
+                    EditButton(damus_state: damus_state)
+                }
+            }
+            
+        }
+    }
+    
     func NameSection(profile_data: Profile?) -> some View {
         return Group {
             HStack(alignment: .center) {
@@ -256,35 +254,12 @@ struct ProfileView: View {
                 
                 Spacer()
                 
-                Group {
-                    ActionSheetButton
-                    
-                    if let profile = profile_data {
-                        if let lnurl = profile.lnurl, lnurl != "" {
-                            LNButton(lnurl: lnurl, profile: profile)
-                        }
-                    }
-                    
-                    DMButton
-                    
-                    if profile.pubkey != damus_state.pubkey {
-                        FollowButtonView(
-                            target: profile.get_follow_target(),
-                            follows_you: profile.follows(pubkey: damus_state.pubkey),
-                            follow_state: damus_state.contacts.follow_state(profile.pubkey)
-                        )
-                    } else if damus_state.keypair.privkey != nil {
-                        NavigationLink(destination: EditMetadataView(damus_state: damus_state)) {
-                            EditButton(damus_state: damus_state)
-                        }
-                    }
-                    
-                }
-                .offset(y: -15.0) // Increase if set a frame
-                
+                ActionSection(profile_data: profile_data)
+                    .offset(y: -15.0) // Increase if set a frame
             }
             
-            ProfileNameView(pubkey: profile.pubkey, profile: profile_data, damus: damus_state)
+            let follows_you = profile.follows(pubkey: damus_state.pubkey)
+            ProfileNameView(pubkey: profile.pubkey, profile: profile_data, follows_you: follows_you, damus: damus_state)
             //.padding(.bottom)
                 .padding(.top,-(pfp_size/2.0))
         }