import Foundation struct HomeRecommendationResponse: Decodable { let lives: [HomeLiveItem] let banners: [RecommendationBannerResponse] let recentlyActiveCreators: [HomeActiveCreatorItem] let recentDebutCreators: [HomeCreatorItem] let firstAudioContents: [HomeFirstAudioContentItem] let aiCharacters: [HomeAiCharacterItem] let genreCreators: [HomeGenreCreatorGroupItem] let cheerCreators: [HomeCreatorItem] let popularCommunityPosts: [HomePopularCommunityPostItem] } struct HomeLiveItem: Decodable, Hashable { let roomId: Int let creatorNickname: String let creatorProfileImage: String } struct RecommendationBannerResponse: Decodable, Hashable { let imageUrl: String let eventItem: EventItem? let creatorId: Int? let seriesId: Int? let link: String? } struct HomeActiveCreatorItem: Decodable, Hashable { let creatorId: Int let creatorNickname: String let creatorProfileImage: String let activityType: RecommendedActivityType let activityAt: String let targetId: Int? } enum HomeActiveCreatorTapDestination: Equatable { case live(Int) case creator(Int) case content(Int) case communityPost(Int) } extension HomeActiveCreatorItem { var activeCreatorTapDestination: HomeActiveCreatorTapDestination? { switch activityType { case .live: if let targetId { return .live(targetId) } return creatorId > 0 ? .creator(creatorId) : nil case .liveReplay, .audio: return targetId.map(HomeActiveCreatorTapDestination.content) case .community: return targetId.map(HomeActiveCreatorTapDestination.communityPost) case .unknown: return nil } } } struct HomeCreatorItem: Decodable, Hashable { let creatorId: Int let creatorNickname: String let creatorProfileImage: String } struct HomeFirstAudioContentItem: Decodable, Hashable { let contentId: Int let creatorId: Int let creatorNickname: String let creatorProfileImage: String let title: String let price: Int let coverImage: String? let isPointAvailable: Bool } struct HomeAiCharacterItem: Decodable, Hashable { let characterId: Int let creatorId: Int let name: String let description: String let profileImage: String? let totalChatCount: Int let originalWorkTitle: String? } struct HomeGenreCreatorGroupItem: Decodable, Hashable { let genreName: String let creators: [HomeCreatorItem] } struct HomePopularCommunityPostItem: Decodable, Hashable { let postId: Int let creatorId: Int let creatorNickname: String let creatorProfileImage: String? let content: String let imageUrl: String? let audioUrl: String? let price: Int let existOrdered: Bool let likeCount: Int let commentCount: Int let createdAt: String let isLiked: Bool func relativeCreatedAtText(now: Date = Date()) -> String { DateParser.relativeTimeText(fromUTC: createdAt, fallback: createdAt, now: now) } }