시리즈 상세 추가
This commit is contained in:
195
SodaLive/Sources/Content/Series/Detail/SeriesDetailView.swift
Normal file
195
SodaLive/Sources/Content/Series/Detail/SeriesDetailView.swift
Normal file
@@ -0,0 +1,195 @@
|
||||
//
|
||||
// SeriesDetailView.swift
|
||||
// SodaLive
|
||||
//
|
||||
// Created by klaus on 4/29/24.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import Kingfisher
|
||||
|
||||
struct SeriesDetailView: View {
|
||||
|
||||
@ObservedObject var viewModel = SeriesDetailViewModel()
|
||||
|
||||
let seriesId: Int
|
||||
|
||||
var body: some View {
|
||||
BaseView(isLoading: $viewModel.isLoading) {
|
||||
ZStack(alignment: .top) {
|
||||
Color.gray11.ignoresSafeArea()
|
||||
|
||||
if let seriesDetail = viewModel.seriesDetail {
|
||||
KFImage(URL(string: seriesDetail.coverImage))
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(maxWidth: .infinity)
|
||||
.blur(radius: 25)
|
||||
|
||||
ScrollView(.vertical, showsIndicators: false) {
|
||||
VStack(spacing: 0) {
|
||||
HStack(spacing: 0) {
|
||||
Image("ic_back")
|
||||
.resizable()
|
||||
.frame(width: 20, height: 20)
|
||||
.onTapGesture { AppState.shared.back() }
|
||||
|
||||
Spacer()
|
||||
}
|
||||
.padding(.horizontal, 13.3)
|
||||
.frame(height: 50)
|
||||
|
||||
ZStack {
|
||||
Rectangle()
|
||||
.frame(width: screenSize().width, height: 94)
|
||||
.foregroundColor(Color.gray11)
|
||||
.cornerRadius(21.3, corners: [.topLeft, .topRight])
|
||||
.padding(.top, 94)
|
||||
|
||||
KFImage(URL(string: seriesDetail.coverImage))
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.cornerRadius(5)
|
||||
.frame(width: 133.3, height: 188)
|
||||
|
||||
}
|
||||
|
||||
VStack(alignment: .leading, spacing: 0) {
|
||||
Text(seriesDetail.title)
|
||||
.font(.custom(Font.bold.rawValue, size: 18.3))
|
||||
.foregroundColor(Color.grayee)
|
||||
.padding(.horizontal, 13.3)
|
||||
.padding(.top, 24)
|
||||
|
||||
HStack(spacing: 5.3) {
|
||||
Text(seriesDetail.genre)
|
||||
.font(.custom(Font.medium.rawValue, size: 12))
|
||||
.foregroundColor(Color(hex: "3bac6a"))
|
||||
.padding(.horizontal, 5.3)
|
||||
.padding(.vertical, 3.3)
|
||||
.background(Color(hex: "28312b"))
|
||||
.cornerRadius(2.6)
|
||||
|
||||
if seriesDetail.isAdult {
|
||||
Text("19세")
|
||||
.font(.custom(Font.medium.rawValue, size: 12))
|
||||
.foregroundColor(Color(hex: "f1291c"))
|
||||
.padding(.horizontal, 5.3)
|
||||
.padding(.vertical, 3.3)
|
||||
.background(Color(hex: "312827"))
|
||||
.cornerRadius(2.6)
|
||||
} else {
|
||||
Text("전체연령가")
|
||||
.font(.custom(Font.medium.rawValue, size: 12))
|
||||
.foregroundColor(Color(hex: "d2d2d2"))
|
||||
.padding(.horizontal, 5.3)
|
||||
.padding(.vertical, 3.3)
|
||||
.background(Color(hex: "222222"))
|
||||
.cornerRadius(2.6)
|
||||
}
|
||||
|
||||
Text(seriesDetail.publishedDaysOfWeek)
|
||||
.font(.custom(Font.medium.rawValue, size: 12))
|
||||
.foregroundColor(Color(hex: "909090"))
|
||||
}
|
||||
.padding(.top, 8)
|
||||
.padding(.horizontal, 13.3)
|
||||
|
||||
ScrollView(.horizontal, showsIndicators: false) {
|
||||
HStack(spacing: 5.3) {
|
||||
ForEach(0..<seriesDetail.keywordList.count, id: \.self) {
|
||||
SeriesKeywordChipView(keyword: seriesDetail.keywordList[$0])
|
||||
}
|
||||
}
|
||||
}
|
||||
.padding(.top, 16)
|
||||
.padding(.horizontal, 13.3)
|
||||
|
||||
HStack(spacing: 5.3) {
|
||||
KFImage(URL(string: seriesDetail.creator.profileImage))
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.clipShape(Circle())
|
||||
.frame(width: 26.7, height: 26.7)
|
||||
|
||||
Text(seriesDetail.creator.nickname)
|
||||
.font(.custom(Font.medium.rawValue, size: 12))
|
||||
.foregroundColor(Color(hex: "909090"))
|
||||
|
||||
Spacer()
|
||||
|
||||
if seriesDetail.creator.creatorId != UserDefaults.int(forKey: .userId) {
|
||||
Image(viewModel.isFollow ? "btn_following_big" : "btn_follow_big")
|
||||
.onTapGesture {
|
||||
if viewModel.isFollow {
|
||||
viewModel.unFollow(seriesDetail.creator.creatorId)
|
||||
} else {
|
||||
viewModel.follow(seriesDetail.creator.creatorId)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.padding(.top, 16)
|
||||
.padding(.horizontal, 13.3)
|
||||
|
||||
HStack(spacing: 0) {
|
||||
SeriesDetailTabView(
|
||||
title: "홈",
|
||||
width: screenSize().width / 2,
|
||||
isSelected: viewModel.currentTab == .home
|
||||
) {
|
||||
if viewModel.currentTab != .home {
|
||||
viewModel.currentTab = .home
|
||||
}
|
||||
}
|
||||
|
||||
SeriesDetailTabView(
|
||||
title: "작품소개",
|
||||
width: screenSize().width / 2,
|
||||
isSelected: viewModel.currentTab == .introduction
|
||||
) {
|
||||
if viewModel.currentTab != .introduction {
|
||||
viewModel.currentTab = .introduction
|
||||
}
|
||||
}
|
||||
}
|
||||
.padding(.top, 16)
|
||||
|
||||
Rectangle()
|
||||
.foregroundColor(Color.gray90.opacity(0.5))
|
||||
.frame(height: 1)
|
||||
.frame(maxWidth: .infinity)
|
||||
|
||||
switch(viewModel.currentTab) {
|
||||
case .introduction:
|
||||
SeriesDetailIntroductionView(
|
||||
width: screenSize().width - 26.7,
|
||||
seriesDetail: seriesDetail
|
||||
)
|
||||
|
||||
default:
|
||||
SeriesDetailHomeView(
|
||||
title: seriesDetail.title,
|
||||
seriesId: seriesDetail.seriesId,
|
||||
contentCount: seriesDetail.contentCount,
|
||||
contentList: seriesDetail.contentList
|
||||
)
|
||||
}
|
||||
}
|
||||
.padding(.bottom, 10)
|
||||
.background(Color.gray11)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.onAppear {
|
||||
viewModel.seriesId = seriesId
|
||||
viewModel.getSeriesDetail()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#Preview {
|
||||
SeriesDetailView(seriesId: 0)
|
||||
}
|
||||
Reference in New Issue
Block a user