diff --git a/SodaLive/Sources/App/AppStep.swift b/SodaLive/Sources/App/AppStep.swift index f5fbc4f..1936942 100644 --- a/SodaLive/Sources/App/AppStep.swift +++ b/SodaLive/Sources/App/AppStep.swift @@ -121,4 +121,8 @@ enum AppStep { case canCoupon case contentAllByTheme(themeId: Int) + + case seriesDetail(seriesId: Int) + + case seriesAll(creatorId: Int) } diff --git a/SodaLive/Sources/Content/Series/GetSeriesListResponse.swift b/SodaLive/Sources/Content/Series/GetSeriesListResponse.swift new file mode 100644 index 0000000..30490a9 --- /dev/null +++ b/SodaLive/Sources/Content/Series/GetSeriesListResponse.swift @@ -0,0 +1,31 @@ +// +// GetSeriesListResponse.swift +// SodaLive +// +// Created by klaus on 4/29/24. +// + +import Foundation + +struct GetSeriesListResponse: Decodable { + let totalCount: Int + let items: [SeriesListItem] +} + +struct SeriesListItem: Decodable { + let seriesId: Int + let title: String + let coverImage: String + let publishedDaysOfWeek: String + let isComplete: Bool + let creator: SeriesListItemCreator + let numberOfContent: Int + let isNew: Bool + let isPopular: Bool +} + +struct SeriesListItemCreator: Decodable { + let creatorId: Int + let nickname: String + let profileImage: String +} diff --git a/SodaLive/Sources/Explorer/Profile/GetCreatorProfileResponse.swift b/SodaLive/Sources/Explorer/Profile/GetCreatorProfileResponse.swift index a4200fa..d8f71c5 100644 --- a/SodaLive/Sources/Explorer/Profile/GetCreatorProfileResponse.swift +++ b/SodaLive/Sources/Explorer/Profile/GetCreatorProfileResponse.swift @@ -17,6 +17,7 @@ struct GetCreatorProfileResponse: Decodable { let communityPostList: [GetCommunityPostListResponse] let cheers: GetCheersResponse let activitySummary: GetCreatorActivitySummary + let seriesList: [SeriesListItem] let isBlock: Bool } diff --git a/SodaLive/Sources/Explorer/Profile/Series/UserProfileSeriesView.swift b/SodaLive/Sources/Explorer/Profile/Series/UserProfileSeriesView.swift new file mode 100644 index 0000000..6ae210f --- /dev/null +++ b/SodaLive/Sources/Explorer/Profile/Series/UserProfileSeriesView.swift @@ -0,0 +1,77 @@ +// +// UserProfileSeriesView.swift +// SodaLive +// +// Created by klaus on 4/29/24. +// + +import SwiftUI + +struct UserProfileSeriesView: View { + let creatorId: Int + let items: [SeriesListItem] + + var body: some View { + VStack(alignment: .leading, spacing: 13.3) { + HStack(spacing: 0) { + Text("시리즈") + .font(.custom(Font.bold.rawValue, size: 18.3)) + .foregroundColor(Color.grayee) + + Spacer() + + Text("전체보기") + .font(.custom(Font.light.rawValue, size: 11.3)) + .foregroundColor(Color.grayee) + .onTapGesture {} + } + + HStack(spacing: 13.3) { + ForEach(0.. 0 || userId == UserDefaults.int(forKey: .userId) { diff --git a/SodaLive/Sources/UI/Component/SeriesItemBadgeView.swift b/SodaLive/Sources/UI/Component/SeriesItemBadgeView.swift new file mode 100644 index 0000000..99b6fdd --- /dev/null +++ b/SodaLive/Sources/UI/Component/SeriesItemBadgeView.swift @@ -0,0 +1,36 @@ +// +// SeriesItemBadgeView.swift +// SodaLive +// +// Created by klaus on 4/29/24. +// + +import SwiftUI + +struct SeriesItemBadgeView: View { + + let title: String + let backgroundColor: Color + + var body: some View { + Text(title) + .font(.custom(Font.medium.rawValue, size: 10.3)) + .foregroundColor(.white) + .padding(.vertical, 3.7) + .padding(.horizontal, 5.3) + .background(backgroundColor) + .cornerRadius(13.3) + } +} + +#Preview("신작") { + SeriesItemBadgeView(title: "신작", backgroundColor: .button) +} + +#Preview("완결") { + SeriesItemBadgeView(title: "완결", backgroundColor: Color(hex: "002abd")) +} + +#Preview("인기") { + SeriesItemBadgeView(title: "인기", backgroundColor: Color(hex: "ec6033")) +} diff --git a/SodaLive/Sources/UI/Component/SeriesListBigItemView.swift b/SodaLive/Sources/UI/Component/SeriesListBigItemView.swift new file mode 100644 index 0000000..1b831df --- /dev/null +++ b/SodaLive/Sources/UI/Component/SeriesListBigItemView.swift @@ -0,0 +1,107 @@ +// +// SeriesListBigItemView.swift +// SodaLive +// +// Created by klaus on 4/29/24. +// + +import SwiftUI + +import Kingfisher + +struct SeriesListBigItemView: View { + + let item: SeriesListItem + + var body: some View { + VStack(alignment: .leading, spacing: 8) { + ZStack { + KFImage(URL(string: item.coverImage)) + .resizable() + .scaledToFill() + .frame(width: 116.7, height: 165, alignment: .center) + .cornerRadius(5) + .clipped() + + LinearGradient( + colors: [Color.black.opacity(0.1), Color.black.opacity(0.8)], + startPoint: .top, + endPoint: .bottom + ) + + VStack(alignment: .leading, spacing: 0) { + HStack(spacing: 3.3) { + if !item.isComplete && item.isNew { + SeriesItemBadgeView(title: "신작", backgroundColor: .button) + } + + if item.isComplete { + SeriesItemBadgeView(title: "완결", backgroundColor: Color(hex: "002abd")) + } + + if item.isPopular { + SeriesItemBadgeView(title: "인기", backgroundColor: Color(hex: "ec6033")) + } + + Spacer() + } + + Spacer() + + HStack { + Spacer() + + SeriesItemBadgeView(title: "총 \(item.numberOfContent)화", backgroundColor: Color.gray33.opacity(0.7)) + } + } + } + .frame(width: 116.7, height: 165, alignment: .center) + + Text(item.title) + .font(.custom(Font.medium.rawValue, size: 12)) + .foregroundColor(Color.grayee) + .lineLimit(2) + + HStack(spacing: 3) { + KFImage(URL(string: item.creator.profileImage)) + .resizable() + .scaledToFill() + .frame(width: 16, height: 16, alignment: .center) + .clipShape(Circle()) + + Text(item.creator.nickname) + .font(.custom(Font.medium.rawValue, size: 10)) + .foregroundColor(Color.gray77) + } + + Text(item.publishedDaysOfWeek) + .font(.custom(Font.medium.rawValue, size: 11)) + .foregroundColor(Color.gray77) + } + .frame(width: 116.7) + .onTapGesture { + AppState.shared + .setAppStep(step: .seriesDetail(seriesId: item.seriesId)) + } + } +} + +#Preview { + SeriesListBigItemView( + item: SeriesListItem( + seriesId: 1, + title: "제목, 관심사,프로필+방장, 참여인원(어딘가..)", + coverImage: "https://test-cf.sodalive.net/profile/default-profile.png", + publishedDaysOfWeek: "매주 수, 토요일", + isComplete: true, + creator: SeriesListItemCreator( + creatorId: 1, + nickname: "creator", + profileImage: "https://test-cf.sodalive.net/profile/default-profile.png" + ), + numberOfContent: 10, + isNew: true, + isPopular: true + ) + ) +}