diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationMappers.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationMappers.kt index f78daf20..9e902cce 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationMappers.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationMappers.kt @@ -1,6 +1,124 @@ package kr.co.vividnext.sodalive.v2.main.home.model import androidx.annotation.StringRes +import kr.co.vividnext.sodalive.v2.main.home.data.HomeActiveCreatorItem +import kr.co.vividnext.sodalive.v2.main.home.data.HomeAiCharacterItem +import kr.co.vividnext.sodalive.v2.main.home.data.HomeBannerItem +import kr.co.vividnext.sodalive.v2.main.home.data.HomeCreatorItem +import kr.co.vividnext.sodalive.v2.main.home.data.HomeFirstAudioContentItem +import kr.co.vividnext.sodalive.v2.main.home.data.HomeGenreCreatorGroupItem +import kr.co.vividnext.sodalive.v2.main.home.data.HomeLiveItem +import kr.co.vividnext.sodalive.v2.main.home.data.HomePopularCommunityPostItem +import kr.co.vividnext.sodalive.v2.main.home.data.HomeRecommendationResponse +import kr.co.vividnext.sodalive.v2.widget.AudioContentTag +import kr.co.vividnext.sodalive.v2.widget.characterchatthumbnail.CharacterChatThumbnailItem +import kr.co.vividnext.sodalive.v2.widget.feed.FeedItem @StringRes fun String.toRecommendedActivityTypeLabelRes(): Int? = RecommendedActivityType.from(this)?.labelResId + +fun HomeRecommendationResponse.toContent(): HomeRecommendationUiState.Content = HomeRecommendationUiState.Content( + lives = HomeRecommendationLiveSection(lives.map { it.toUiModel() }), + banners = HomeRecommendationBannerSection(banners.map { it.toUiModel() }), + recentlyActiveCreators = HomeRecommendationRecentlyActiveCreatorSection(recentlyActiveCreators.map { it.toUiModel() }), + recentDebutCreators = HomeRecommendationRecentDebutCreatorSection(recentDebutCreators.map { it.toUiModel() }), + firstAudioContents = HomeRecommendationFirstAudioContentSection(firstAudioContents.map { it.toUiModel() }), + aiCharacters = HomeRecommendationAiCharacterSection(aiCharacters.map { it.toUiModel() }), + genreCreators = HomeRecommendationGenreCreatorSection(genreCreators.map { it.toUiModel() }), + cheerCreators = HomeRecommendationCheerCreatorSection(cheerCreators.map { it.toUiModel() }), + popularCommunityPosts = HomeRecommendationPopularCommunityPostSection(popularCommunityPosts.map { it.toUiModel() }) +) + +fun HomeLiveItem.toUiModel(): HomeRecommendationLiveUiModel = HomeRecommendationLiveUiModel( + liveId = liveId, + creatorId = creatorId, + imageUrl = imageUrl, + title = title, + creatorNickname = creatorNickname, + beginDateTime = beginDateTime +) + +fun HomeBannerItem.toUiModel(): HomeRecommendationBannerUiModel = HomeRecommendationBannerUiModel( + bannerId = bannerId, + imageUrl = imageUrl, + type = type, + linkUrl = linkUrl, + targetId = targetId +) + +fun HomeActiveCreatorItem.toUiModel(): HomeRecommendationRecentlyActiveCreatorUiModel { + val recommendedActivityType = RecommendedActivityType.from(activityType) + return HomeRecommendationRecentlyActiveCreatorUiModel( + creatorId = creatorId, + nickname = nickname, + profileImage = profileImage, + title = title, + activityType = recommendedActivityType, + activityLabelResId = recommendedActivityType?.labelResId, + activityAt = activityAt + ) +} + +fun HomeCreatorItem.toUiModel(): HomeRecommendationCreatorUiModel = HomeRecommendationCreatorUiModel( + creatorId = creatorId, + nickname = nickname, + profileImage = profileImage +) + +fun HomeFirstAudioContentItem.toUiModel(): HomeRecommendationFirstAudioContentUiModel = + HomeRecommendationFirstAudioContentUiModel( + contentId = contentId, + creatorId = creatorId, + creatorNickname = creatorNickname, + creatorProfileImage = creatorProfileImage, + title = title, + price = price, + coverImage = coverImage, + releaseDate = releaseDate, + tags = buildSet { + add(AudioContentTag.First) + if (isPointAvailable) add(AudioContentTag.Point) + if (price == 0) add(AudioContentTag.Free) + } + ) + +fun HomeAiCharacterItem.toUiModel(): HomeRecommendationAiCharacterUiModel = HomeRecommendationAiCharacterUiModel( + item = CharacterChatThumbnailItem( + characterId = characterId, + imageUrl = profileImage.orEmpty(), + characterName = name, + characterDescription = description, + chatMessageCount = totalChatCount, + hasOriginal = originalWorkTitle != null, + originalTitle = originalWorkTitle.orEmpty() + ) +) + +fun HomeGenreCreatorGroupItem.toUiModel(): HomeRecommendationGenreCreatorGroupUiModel = + HomeRecommendationGenreCreatorGroupUiModel( + genre = genre, + creators = creators.map { it.toUiModel() } + ) + +fun HomePopularCommunityPostItem.toUiModel(): HomeRecommendationPopularCommunityPostUiModel = + HomeRecommendationPopularCommunityPostUiModel( + item = FeedItem.Community( + feedId = postId.toString(), + creatorId = creatorId.toString(), + creatorName = creatorNickname, + creatorImageUrl = creatorProfileImage.orEmpty(), + postId = postId.toString(), + bodyText = content, + keywordText = "", + createdAtText = createdAt, + commentCount = commentCount.toInt(), + likeCount = likeCount.toInt() + ), + paidStatus = toPaidStatus() + ) + +fun HomePopularCommunityPostItem.toPaidStatus(): HomeRecommendationPaidStatus = when { + price == 0 -> HomeRecommendationPaidStatus.Free + existOrdered -> HomeRecommendationPaidStatus.Purchased + else -> HomeRecommendationPaidStatus.Paid(price) +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiModels.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiModels.kt new file mode 100644 index 00000000..3bf8170d --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiModels.kt @@ -0,0 +1,112 @@ +package kr.co.vividnext.sodalive.v2.main.home.model + +import kr.co.vividnext.sodalive.v2.widget.AudioContentTag +import kr.co.vividnext.sodalive.v2.widget.characterchatthumbnail.CharacterChatThumbnailItem +import kr.co.vividnext.sodalive.v2.widget.feed.FeedItem + +data class HomeRecommendationLiveSection( + val items: List +) + +data class HomeRecommendationBannerSection( + val items: List +) + +data class HomeRecommendationRecentlyActiveCreatorSection( + val items: List +) + +data class HomeRecommendationRecentDebutCreatorSection( + val items: List +) + +data class HomeRecommendationFirstAudioContentSection( + val items: List +) + +data class HomeRecommendationAiCharacterSection( + val items: List +) + +data class HomeRecommendationGenreCreatorSection( + val groups: List +) + +data class HomeRecommendationCheerCreatorSection( + val items: List, + val isFollowCompleted: Boolean = false +) + +data class HomeRecommendationPopularCommunityPostSection( + val items: List +) + +data class HomeRecommendationLiveUiModel( + val liveId: Long, + val creatorId: Long, + val imageUrl: String?, + val title: String, + val creatorNickname: String, + val beginDateTime: String? +) + +data class HomeRecommendationBannerUiModel( + val bannerId: String?, + val imageUrl: String?, + val type: String?, + val linkUrl: String?, + val targetId: Long? +) + +data class HomeRecommendationRecentlyActiveCreatorUiModel( + val creatorId: Long, + val nickname: String, + val profileImage: String?, + val title: String?, + val activityType: RecommendedActivityType?, + val activityLabelResId: Int?, + val activityAt: String? +) + +data class HomeRecommendationCreatorUiModel( + val creatorId: Long, + val nickname: String, + val profileImage: String? +) + +data class HomeRecommendationFirstAudioContentUiModel( + val contentId: Long, + val creatorId: Long, + val creatorNickname: String, + val creatorProfileImage: String?, + val title: String, + val price: Int, + val coverImage: String?, + val releaseDate: String, + val tags: Set +) + +data class HomeRecommendationAiCharacterUiModel( + val item: CharacterChatThumbnailItem +) + +data class HomeRecommendationGenreCreatorGroupUiModel( + val genre: String, + val creators: List, + val isFollowCompleted: Boolean = false +) + +data class HomeRecommendationPopularCommunityPostUiModel( + val item: FeedItem.Community, + val paidStatus: HomeRecommendationPaidStatus +) + +sealed interface HomeRecommendationPaidStatus { + data object Free : HomeRecommendationPaidStatus + + data object Purchased : HomeRecommendationPaidStatus + + data class Paid( + val price: Int + ) : HomeRecommendationPaidStatus +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiState.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiState.kt new file mode 100644 index 00000000..b79645be --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiState.kt @@ -0,0 +1,35 @@ +package kr.co.vividnext.sodalive.v2.main.home.model + +sealed interface HomeRecommendationUiState { + data object Loading : HomeRecommendationUiState + + data class Content( + val lives: HomeRecommendationLiveSection, + val banners: HomeRecommendationBannerSection, + val recentlyActiveCreators: HomeRecommendationRecentlyActiveCreatorSection, + val recentDebutCreators: HomeRecommendationRecentDebutCreatorSection, + val firstAudioContents: HomeRecommendationFirstAudioContentSection, + val aiCharacters: HomeRecommendationAiCharacterSection, + val genreCreators: HomeRecommendationGenreCreatorSection, + val cheerCreators: HomeRecommendationCheerCreatorSection, + val popularCommunityPosts: HomeRecommendationPopularCommunityPostSection + ) : HomeRecommendationUiState { + val isEmpty: Boolean = listOf( + lives.items, + banners.items, + recentlyActiveCreators.items, + recentDebutCreators.items, + firstAudioContents.items, + aiCharacters.items, + genreCreators.groups, + cheerCreators.items, + popularCommunityPosts.items + ).all { it.isEmpty() } + } + + data object Empty : HomeRecommendationUiState + + data class Error( + val message: String? = null + ) : HomeRecommendationUiState +}