From 615bebc610c53f8cd1bfaf0a509307578168d7f5 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Tue, 13 Dec 2022 16:29:38 +0800 Subject: [PATCH] Filter out the current viewer in the recommended by list --- .../Components/FeedCardNavigationLink.swift | 4 ++-- .../Models/DataModels/Recommendation.swift | 20 +++++++++++++------ .../Views/FeedItem/HomeFeedCardView.swift | 10 ++++++---- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift b/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift index fecbcc478..3d90cbf61 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift @@ -28,7 +28,7 @@ struct MacFeedCardNavigationLink: View { .onAppear { Task { await viewModel.itemAppeared(item: item, dataService: dataService, audioController: audioController) } } - FeedCard(item: item) { + FeedCard(item: item, viewer: dataService.currentViewer) { viewModel.selectedLinkItem = item.objectID } } @@ -58,7 +58,7 @@ struct FeedCardNavigationLink: View { .onAppear { Task { await viewModel.itemAppeared(item: item, dataService: dataService, audioController: audioController) } } - FeedCard(item: item) + FeedCard(item: item, viewer: dataService.currentViewer) } } } diff --git a/apple/OmnivoreKit/Sources/Models/DataModels/Recommendation.swift b/apple/OmnivoreKit/Sources/Models/DataModels/Recommendation.swift index be7b178ae..00d9fefc9 100644 --- a/apple/OmnivoreKit/Sources/Models/DataModels/Recommendation.swift +++ b/apple/OmnivoreKit/Sources/Models/DataModels/Recommendation.swift @@ -2,9 +2,17 @@ import CoreData import Foundation public extension Recommendation { - static func byline(_ set: NSSet) -> String { - Array(set).reduce("") { str, item in - if let recommendation = item as? Recommendation, let userName = recommendation.user?.name { + // Returns the recommendations from other users, filtering out the viewer + // if they have also recommended the page. + static func notViewers(viewer: Viewer?, _ set: NSSet?) -> [Recommendation] { + Array(set ?? []) + .compactMap { $0 as? Recommendation } + .filter { $0.user?.userID != viewer?.userID } + } + + static func byline(_ recommendations: [Recommendation]) -> String { + recommendations.reduce("") { str, recommendation in + if let userName = recommendation.user?.name { if str.isEmpty { return userName } else { @@ -15,9 +23,9 @@ public extension Recommendation { } } - static func groupsLine(_ set: NSSet) -> String { - Array(set).reduce("") { str, item in - if let recommendation = item as? Recommendation, let name = recommendation.name { + static func groupsLine(_ recommendations: [Recommendation]) -> String { + recommendations.reduce("") { str, recommendation in + if let name = recommendation.name { if str.isEmpty { return name } else { diff --git a/apple/OmnivoreKit/Sources/Views/FeedItem/HomeFeedCardView.swift b/apple/OmnivoreKit/Sources/Views/FeedItem/HomeFeedCardView.swift index 513842b49..072eb94bd 100644 --- a/apple/OmnivoreKit/Sources/Views/FeedItem/HomeFeedCardView.swift +++ b/apple/OmnivoreKit/Sources/Views/FeedItem/HomeFeedCardView.swift @@ -3,11 +3,13 @@ import SwiftUI import Utils public struct FeedCard: View { + let viewer: Viewer? let tapHandler: () -> Void @ObservedObject var item: LinkedItem - public init(item: LinkedItem, tapHandler: @escaping () -> Void = {}) { + public init(item: LinkedItem, viewer: Viewer?, tapHandler: @escaping () -> Void = {}) { self.item = item + self.viewer = viewer self.tapHandler = tapHandler } @@ -87,9 +89,9 @@ public struct FeedCard: View { #endif } - if let recommendations = item.recommendations, recommendations.count > 0 { - let byStr = Recommendation.byline(recommendations) - let inStr = Recommendation.groupsLine(recommendations) + if let recs = Recommendation.notViewers(viewer: viewer, item.recommendations), recs.count > 0 { + let byStr = Recommendation.byline(recs) + let inStr = Recommendation.groupsLine(recs) HStack { Image(systemName: "sparkles") Text("Recommended by \(byStr) in \(inStr)")