From 7d0c47288509824158a9c3d8347c6ed3fd21facf Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Wed, 14 Feb 2024 15:49:13 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20-=20=EC=88=8F=ED=94=8C,=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=20=EB=8B=A4=EC=8B=9C=20=EB=93=A3=EA=B8=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ic_card_can_gray.imageset/Contents.json | 21 ++++ .../ic_card_can_gray.png | Bin 0 -> 552 bytes .../Contents.json | 21 ++++ .../ic_card_time_small_gray.png | Bin 0 -> 543 bytes .../ic_short_play.imageset/Contents.json | 21 ++++ .../ic_short_play.imageset/ic_short_play.png | Bin 0 -> 1375 bytes .../ic_thumb_play_blue.imageset/Contents.json | 21 ++++ .../ic_thumb_play_blue.png | Bin 0 -> 3001 bytes SodaLive/Sources/App/AppStep.swift | 2 + .../All/ByTheme/ContentAllByThemeView.swift | 111 ++++++++++++++++++ .../ByTheme/ContentAllByThemeViewModel.swift | 96 +++++++++++++++ .../ByTheme/GetContentByThemeResponse.swift | 14 +++ SodaLive/Sources/Content/ContentApi.swift | 15 ++- .../Sources/Content/ContentRepository.swift | 4 + .../Content/Main/ContentMainView.swift | 53 ++++++++- .../Main/Order/ContentMainMyStashView.swift | 1 + SodaLive/Sources/ContentView.swift | 3 + 17 files changed, 380 insertions(+), 3 deletions(-) create mode 100644 SodaLive/Resources/Assets.xcassets/ic_card_can_gray.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_card_can_gray.imageset/ic_card_can_gray.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_card_time_small_gray.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_card_time_small_gray.imageset/ic_card_time_small_gray.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_short_play.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_short_play.imageset/ic_short_play.png create mode 100644 SodaLive/Resources/Assets.xcassets/ic_thumb_play_blue.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_thumb_play_blue.imageset/ic_thumb_play_blue.png create mode 100644 SodaLive/Sources/Content/All/ByTheme/ContentAllByThemeView.swift create mode 100644 SodaLive/Sources/Content/All/ByTheme/ContentAllByThemeViewModel.swift create mode 100644 SodaLive/Sources/Content/All/ByTheme/GetContentByThemeResponse.swift diff --git a/SodaLive/Resources/Assets.xcassets/ic_card_can_gray.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_card_can_gray.imageset/Contents.json new file mode 100644 index 0000000..a46aebb --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_card_can_gray.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_card_can_gray.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_card_can_gray.imageset/ic_card_can_gray.png b/SodaLive/Resources/Assets.xcassets/ic_card_can_gray.imageset/ic_card_can_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd88891d20d5ba207bf4700e56bb41cdb381a6b GIT binary patch literal 552 zcmV+@0@wYCP)^1cn8G3CISp0cC@3KUkE z*bvE2n#bTh-$PK7Yae_752Y=z(kWf#*mi}(JTHw6z%lzYD??`K0l(dq?OR-0bk(rf zfx4N2!yv~V7)t{zg1=F9S_vkFcfE>M4Z1I6rcSJhvxb@&>T&qww?(mfFjn(I44roj z5f?20BR18&6AEhr>0Rj9H^SJY$)4#P!q8aqLY|R5S-%a&7!z4+Si-frVF?$WoUrRClI3BCatu6JsF#5TnM0000XqccdL6c4px&W?pk*`X?L&;g%P3wis@a1g4UOUM6N_sIPW@B;k3{{@*?yO zMciDxjz~I6cI41M>Vjj_0kOI7NW}C-SBClAHT|EU`4zXp(_jx*6z1DtLpkYihzT}h z-#gq!AKWGc^E>_rZlj7@OR%WZc`Mk%1nww;`9;yY5?M93nR4^{m|ueV`)CF_y+SiJ z7OhYKecp=p!jks_wV=_Eb5z8|t&OMI)FEIXCOz`YV?|qC2Uzx0HJ6>Ty6F($nSo@% zX~vFE;e5OV=$hNx>-kgwonPMqII2R|zC4%b0&NFKFW3;Y56pvIh>F&r7#RV-#6uoB zWw1FBpSkvzRt`hNE0d}`h$LJ0{~5P+$DeZ4pTHRLs8e1%2VqhKeA7S-DCL?B@2?{Z h&6&Ex3$oJY_ydHuF8&X-8S?-D002ovPDHLkV1jQz>(T%K literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/ic_short_play.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_short_play.imageset/Contents.json new file mode 100644 index 0000000..fe3aec7 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_short_play.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_short_play.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_short_play.imageset/ic_short_play.png b/SodaLive/Resources/Assets.xcassets/ic_short_play.imageset/ic_short_play.png new file mode 100644 index 0000000000000000000000000000000000000000..51b75d6217ed2276381a8312dc4ae2831be45eb9 GIT binary patch literal 1375 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 Void) case canCoupon + + case contentAllByTheme(themeId: Int) } diff --git a/SodaLive/Sources/Content/All/ByTheme/ContentAllByThemeView.swift b/SodaLive/Sources/Content/All/ByTheme/ContentAllByThemeView.swift new file mode 100644 index 0000000..e49ff33 --- /dev/null +++ b/SodaLive/Sources/Content/All/ByTheme/ContentAllByThemeView.swift @@ -0,0 +1,111 @@ +// +// ContentAllByThemeView.swift +// SodaLive +// +// Created by klaus on 2/14/24. +// + +import SwiftUI + +struct ContentAllByThemeView: View { + @StateObject var viewModel = ContentAllByThemeViewModel() + + let themeId: Int + + let columns = [ + GridItem(.flexible(), alignment: .top), + GridItem(.flexible(), alignment: .top), + GridItem(.flexible(), alignment: .top) + ] + + var body: some View { + NavigationView { + BaseView(isLoading: $viewModel.isLoading) { + VStack(alignment: .leading, spacing: 0) { + DetailNavigationBar(title: viewModel.theme) + + HStack(spacing: 13.3) { + Spacer() + + Text("최신순") + .font(.custom(Font.medium.rawValue, size: 13.3)) + .foregroundColor( + Color(hex: "e2e2e2") + .opacity(viewModel.sort == .NEWEST ? 1 : 0.5) + ) + .onTapGesture { + if viewModel.sort != .NEWEST { + viewModel.sort = .NEWEST + } + } + + Text("높은 가격순") + .font(.custom(Font.medium.rawValue, size: 13.3)) + .foregroundColor( + Color(hex: "e2e2e2") + .opacity(viewModel.sort == .PRICE_HIGH ? 1 : 0.5) + ) + .onTapGesture { + if viewModel.sort != .PRICE_HIGH { + viewModel.sort = .PRICE_HIGH + } + } + + Text("낮은 가격순") + .font(.custom(Font.medium.rawValue, size: 13.3)) + .foregroundColor( + Color(hex: "e2e2e2") + .opacity(viewModel.sort == .PRICE_LOW ? 1 : 0.5) + ) + .onTapGesture { + if viewModel.sort != .PRICE_LOW { + viewModel.sort = .PRICE_LOW + } + } + } + .padding(.vertical, 13.3) + .padding(.horizontal, 20) + .background(Color(hex: "161616")) + .padding(.top, 13.3) + + HStack(spacing: 0) { + Text("전체") + .font(.custom(Font.medium.rawValue, size: 13.3)) + .foregroundColor(Color(hex: "e2e2e2")) + + Text("\(viewModel.totalCount)") + .font(.custom(Font.medium.rawValue, size: 13.3)) + .foregroundColor(Color(hex: "ff5c49")) + .padding(.leading, 8) + + Text("개") + .font(.custom(Font.medium.rawValue, size: 13.3)) + .foregroundColor(Color(hex: "e2e2e2")) + .padding(.leading, 2) + + Spacer() + } + .padding(.vertical, 13.3) + .padding(.horizontal, 20) + + ScrollView(.vertical, showsIndicators: false) { + LazyVGrid(columns: columns, spacing: 13.3) { + ForEach(0..() + + @Published var errorMessage = "" + @Published var isShowPopup = false + @Published var isLoading = false + + @Published var theme = "" + @Published var totalCount = 0 + @Published var sort = Sort.NEWEST { + didSet { + page = 1 + isLast = false + getContentList() + } + } + + @Published var contentList: [GetAudioContentMainItem] = [] + + var themeId = 0 + var page = 1 + var isLast = false + private let pageSize = 10 + + func getContentList() { + if (!isLast && !isLoading) { + isLoading = true + + repository.getAudioContentByTheme( + themeId: themeId, + page: page, + size: pageSize, + sort: sort + ) + .sink { result in + switch result { + case .finished: + DEBUG_LOG("finish") + case .failure(let error): + ERROR_LOG(error.localizedDescription) + } + } receiveValue: { [unowned self] response in + let responseData = response.data + + do { + let jsonDecoder = JSONDecoder() + let decoded = try jsonDecoder.decode(ApiResponse.self, from: responseData) + + if let data = decoded.data, decoded.success { + if page == 1 { + self.contentList.removeAll() + } + + if !data.items.isEmpty { + page += 1 + self.theme = data.theme + self.totalCount = data.totalCount + self.contentList.append(contentsOf: data.items) + } else { + isLast = true + } + } else { + if let message = decoded.message { + self.errorMessage = message + } else { + self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." + } + + self.isShowPopup = true + } + } catch { + self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." + self.isShowPopup = true + } + + self.isLoading = false + } + .store(in: &subscription) + } + } +} diff --git a/SodaLive/Sources/Content/All/ByTheme/GetContentByThemeResponse.swift b/SodaLive/Sources/Content/All/ByTheme/GetContentByThemeResponse.swift new file mode 100644 index 0000000..5953501 --- /dev/null +++ b/SodaLive/Sources/Content/All/ByTheme/GetContentByThemeResponse.swift @@ -0,0 +1,14 @@ +// +// GetContentByThemeResponse.swift +// SodaLive +// +// Created by klaus on 2/14/24. +// + +import Foundation + +struct GetContentByThemeResponse: Decodable { + let theme: String + let totalCount: Int + let items: [GetAudioContentMainItem] +} diff --git a/SodaLive/Sources/Content/ContentApi.swift b/SodaLive/Sources/Content/ContentApi.swift index d3ac20b..de343ff 100644 --- a/SodaLive/Sources/Content/ContentApi.swift +++ b/SodaLive/Sources/Content/ContentApi.swift @@ -36,6 +36,7 @@ enum ContentApi { case getContentRankingSortType case pinContent(contentId: Int) case unpinContent(contentId: Int) + case getAudioContentByTheme(themeId: Int, page: Int, size: Int, sort: ContentAllByThemeViewModel.Sort) } extension ContentApi: TargetType { @@ -125,6 +126,9 @@ extension ContentApi: TargetType { case .unpinContent(let contentId): return "/audio-content/unpin-at-the-top/\(contentId)" + + case .getAudioContentByTheme(let themeId, _, _, _): + return "/audio-content/theme/\(themeId)/content" } } @@ -136,7 +140,7 @@ extension ContentApi: TargetType { .getContentRankingSortType: return .get - case .getMainBannerList, .getMainOrderList, .getNewContentUploadCreatorList, .getCurationList: + case .getMainBannerList, .getMainOrderList, .getNewContentUploadCreatorList, .getCurationList, .getAudioContentByTheme: return .get case .likeContent, .modifyAudioContent, .modifyComment, .unpinContent: @@ -271,6 +275,15 @@ extension ContentApi: TargetType { case .pinContent, .unpinContent: return .requestPlain + + case .getAudioContentByTheme(_, let page, let size, let sort): + let parameters = [ + "page": page - 1, + "size": size, + "sort-type": sort + ] as [String : Any] + + return .requestParameters(parameters: parameters, encoding: URLEncoding.queryString) } } diff --git a/SodaLive/Sources/Content/ContentRepository.swift b/SodaLive/Sources/Content/ContentRepository.swift index adf4e09..649d4b7 100644 --- a/SodaLive/Sources/Content/ContentRepository.swift +++ b/SodaLive/Sources/Content/ContentRepository.swift @@ -125,4 +125,8 @@ final class ContentRepository { func getCategoryList(creatorId: Int) -> AnyPublisher { return categoryApi.requestPublisher(.getCategoryList(creatorId: creatorId)) } + + func getAudioContentByTheme(themeId: Int, page: Int, size: Int, sort: ContentAllByThemeViewModel.Sort) -> AnyPublisher { + return api.requestPublisher(.getAudioContentByTheme(themeId: themeId, page: page, size: size, sort: sort)) + } } diff --git a/SodaLive/Sources/Content/Main/ContentMainView.swift b/SodaLive/Sources/Content/Main/ContentMainView.swift index e528f1e..86fbd5b 100644 --- a/SodaLive/Sources/Content/Main/ContentMainView.swift +++ b/SodaLive/Sources/Content/Main/ContentMainView.swift @@ -35,11 +35,60 @@ struct ContentMainView: View { .padding(.horizontal, 13.3) ContentMainBannerView() - .padding(.bottom, 40) + .padding(.bottom, 26.7) .padding(.horizontal, 13.3) + HStack(spacing: 13.3) { + VStack(spacing: 2.7) { + HStack(spacing: 2.7) { + Image("ic_short_play") + + Text("숏플") + .font(.custom(Font.bold.rawValue, size: 14.7)) + .foregroundColor(Color(hex: "dd158d")) + } + + Text("짧지만 꼴릿한 이야기") + .font(.custom(Font.light.rawValue, size: 10)) + .foregroundColor(Color(hex: "dd158d")) + } + .padding(.vertical, 10) + .frame(maxWidth: .infinity) + .background(Color(hex: "ffecf7")) + .cornerRadius(2.6) + .onTapGesture { + AppState.shared.setAppStep( + step: .contentAllByTheme(themeId: 11) + ) + } + + VStack(spacing: 2.7) { + HStack(spacing: 2.7) { + Image("ic_thumb_play_blue") + + Text("라이브 다시듣기") + .font(.custom(Font.bold.rawValue, size: 14.7)) + .foregroundColor(Color(hex: "0057ff")) + } + + Text("놓쳤던 라이브 다시듣기") + .font(.custom(Font.light.rawValue, size: 10)) + .foregroundColor(Color(hex: "0057ff")) + } + .padding(.vertical, 10) + .frame(maxWidth: .infinity) + .background(Color(hex: "ecf9ff")) + .cornerRadius(2.6) + .onTapGesture { + AppState.shared.setAppStep( + step: .contentAllByTheme(themeId: 7) + ) + } + } + .padding(.bottom, 40) + .padding(.horizontal, 13.3) + ContentMainMyStashView() - .padding(.bottom, 40) .padding(.horizontal, 13.3) ContentMainNewContentView() diff --git a/SodaLive/Sources/Content/Main/Order/ContentMainMyStashView.swift b/SodaLive/Sources/Content/Main/Order/ContentMainMyStashView.swift index 8a949db..919e068 100644 --- a/SodaLive/Sources/Content/Main/Order/ContentMainMyStashView.swift +++ b/SodaLive/Sources/Content/Main/Order/ContentMainMyStashView.swift @@ -39,6 +39,7 @@ struct ContentMainMyStashView: View { } } } + .padding(.bottom, 40) } if viewModel.isLoading { diff --git a/SodaLive/Sources/ContentView.swift b/SodaLive/Sources/ContentView.swift index 9e2d228..af23a02 100644 --- a/SodaLive/Sources/ContentView.swift +++ b/SodaLive/Sources/ContentView.swift @@ -175,6 +175,9 @@ struct ContentView: View { case .canCoupon: CanCouponView() + case .contentAllByTheme(let themeId): + ContentAllByThemeView(themeId: themeId) + default: EmptyView() .frame(width: 0, height: 0, alignment: .topLeading)