71 lines
3.3 KiB
Scala
71 lines
3.3 KiB
Scala
package com.twitter.home_mixer.functional_component.decorator.urt.builder
|
|
|
|
import com.twitter.home_mixer.model.HomeFeatures.InNetworkFeature
|
|
import com.twitter.home_mixer.model.HomeFeatures.PerspectiveFilteredLikedByUserIdsFeature
|
|
import com.twitter.home_mixer.model.HomeFeatures.SGSValidFollowedByUserIdsFeature
|
|
import com.twitter.home_mixer.model.HomeFeatures.SGSValidLikedByUserIdsFeature
|
|
import com.twitter.home_mixer.model.HomeFeatures.TopicContextFunctionalityTypeFeature
|
|
import com.twitter.home_mixer.model.HomeFeatures.TopicIdSocialContextFeature
|
|
import com.twitter.home_mixer.product.following.model.HomeMixerExternalStrings
|
|
import com.twitter.product_mixer.core.feature.featuremap.FeatureMap
|
|
import com.twitter.product_mixer.core.model.marshalling.response.urt.metadata.FeedbackAction
|
|
import com.twitter.product_mixer.core.model.marshalling.response.urt.metadata.RecWithEducationTopicContextFunctionalityType
|
|
import com.twitter.product_mixer.core.model.marshalling.response.urt.metadata.RecommendationTopicContextFunctionalityType
|
|
import com.twitter.product_mixer.core.model.marshalling.response.urt.metadata.RichBehavior
|
|
import com.twitter.product_mixer.core.model.marshalling.response.urt.metadata.RichFeedbackBehaviorMarkNotInterestedTopic
|
|
import com.twitter.product_mixer.core.product.guice.scope.ProductScoped
|
|
import com.twitter.stringcenter.client.StringCenter
|
|
import javax.inject.Inject
|
|
import javax.inject.Singleton
|
|
|
|
@Singleton
|
|
case class NotInterestedTopicFeedbackActionBuilder @Inject() (
|
|
@ProductScoped stringCenter: StringCenter,
|
|
externalStrings: HomeMixerExternalStrings) {
|
|
|
|
def apply(
|
|
candidateFeatures: FeatureMap
|
|
): Option[FeedbackAction] = {
|
|
val isOutOfNetwork = !candidateFeatures.getOrElse(InNetworkFeature, true)
|
|
val validFollowedByUserIds =
|
|
candidateFeatures.getOrElse(SGSValidFollowedByUserIdsFeature, Nil)
|
|
val validLikedByUserIds =
|
|
candidateFeatures
|
|
.getOrElse(SGSValidLikedByUserIdsFeature, Nil)
|
|
.filter(
|
|
candidateFeatures.getOrElse(PerspectiveFilteredLikedByUserIdsFeature, Nil).toSet.contains)
|
|
|
|
if (isOutOfNetwork && validLikedByUserIds.isEmpty && validFollowedByUserIds.isEmpty) {
|
|
val topicIdSocialContext = candidateFeatures.getOrElse(TopicIdSocialContextFeature, None)
|
|
val topicContextFunctionalityType =
|
|
candidateFeatures.getOrElse(TopicContextFunctionalityTypeFeature, None)
|
|
|
|
(topicIdSocialContext, topicContextFunctionalityType) match {
|
|
case (Some(topicId), Some(topicContextFunctionalityType))
|
|
if topicContextFunctionalityType == RecommendationTopicContextFunctionalityType ||
|
|
topicContextFunctionalityType == RecWithEducationTopicContextFunctionalityType =>
|
|
Some(
|
|
FeedbackAction(
|
|
feedbackType = RichBehavior,
|
|
prompt = None,
|
|
confirmation = None,
|
|
childFeedbackActions = None,
|
|
feedbackUrl = None,
|
|
hasUndoAction = Some(true),
|
|
confirmationDisplayType = None,
|
|
clientEventInfo = None,
|
|
icon = None,
|
|
richBehavior =
|
|
Some(RichFeedbackBehaviorMarkNotInterestedTopic(topicId = topicId.toString)),
|
|
subprompt = None,
|
|
encodedFeedbackRequest = None
|
|
)
|
|
)
|
|
case _ => None
|
|
}
|
|
} else {
|
|
None
|
|
}
|
|
}
|
|
}
|