From 64b03806715f7f9648cbefec7de43d0715cf61ad Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Fri, 11 Aug 2023 07:33:38 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B3=A0=EA=B0=9D=EC=84=BC=ED=84=B0=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Contents.json | 21 ++++ .../ic_service_center_kakao.png | Bin 0 -> 514 bytes SodaLive/Sources/App/AppStep.swift | 2 + SodaLive/Sources/ContentView.swift | 3 + .../Sources/MyPage/ServiceCenter/Faq.swift | 13 +++ .../Sources/MyPage/ServiceCenter/FaqApi.swift | 48 ++++++++ .../MyPage/ServiceCenter/FaqRepository.swift | 23 ++++ .../MyPage/ServiceCenter/FaqView.swift | 85 ++++++++++++++ .../ServiceCenterButtonView.swift | 1 + .../ServiceCenterCategoryItemView.swift | 31 +++++ .../ServiceCenterCategoryView.swift | 48 ++++++++ .../ServiceCenter/ServiceCenterView.swift | 99 ++++++++++++++++ .../ServiceCenterViewModel.swift | 108 ++++++++++++++++++ 13 files changed, 482 insertions(+) create mode 100644 SodaLive/Resources/Assets.xcassets/ic_service_center_kakao.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/ic_service_center_kakao.imageset/ic_service_center_kakao.png create mode 100644 SodaLive/Sources/MyPage/ServiceCenter/Faq.swift create mode 100644 SodaLive/Sources/MyPage/ServiceCenter/FaqApi.swift create mode 100644 SodaLive/Sources/MyPage/ServiceCenter/FaqRepository.swift create mode 100644 SodaLive/Sources/MyPage/ServiceCenter/FaqView.swift rename SodaLive/Sources/MyPage/{ => ServiceCenter}/ServiceCenterButtonView.swift (94%) create mode 100644 SodaLive/Sources/MyPage/ServiceCenter/ServiceCenterCategoryItemView.swift create mode 100644 SodaLive/Sources/MyPage/ServiceCenter/ServiceCenterCategoryView.swift create mode 100644 SodaLive/Sources/MyPage/ServiceCenter/ServiceCenterView.swift create mode 100644 SodaLive/Sources/MyPage/ServiceCenter/ServiceCenterViewModel.swift diff --git a/SodaLive/Resources/Assets.xcassets/ic_service_center_kakao.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_service_center_kakao.imageset/Contents.json new file mode 100644 index 0000000..b394621 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_service_center_kakao.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_service_center_kakao.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_service_center_kakao.imageset/ic_service_center_kakao.png b/SodaLive/Resources/Assets.xcassets/ic_service_center_kakao.imageset/ic_service_center_kakao.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8594571dbbc3b02ce855f017d76cb4cf113008 GIT binary patch literal 514 zcmeAS@N?(olHy`uVBq!ia0vp^_CRdG!3-p8TP}nGDVB6cUq=Rpjs4tz5?O(K#^NA% zCx&(BWL^R}mH|E?uI>dsKqeXBbirqNpf;hBAirP+_M5gs6)$Fe-Psv&(nlrJXjR7s zF*l%fo}Mm_As)wt51#{@k*&~`#zv@6i<*7vWW^axeQoQS`IpjQ?5(ZL>?~O!Ke|6WaGCu$Spyv3FSD&qYkz zj1T-{E{slS*4Yzu;PBZ(#x?2Y_2xQrB&}4f926|~U+1>_IQjmRdnSeJB)7lw6_~!O ze%9_Fhw|6TZ*Rz@RD7Axn|rBbLBFlR=G+_Cf2SrToXY)NW7lSINNQ2%#v9*Le$TP~ za^nvB&$i>aJHIEdS3NpuGK;;LqWO=!)Efu?-#1wQ_Wt+BU!tG!v#Bk2+() + + func getFaqs(category: String) -> AnyPublisher { + return api.requestPublisher(.faqs(category: category)) + } + + func getFaqCategories() -> AnyPublisher { + return api.requestPublisher(.faqCategories) + } +} diff --git a/SodaLive/Sources/MyPage/ServiceCenter/FaqView.swift b/SodaLive/Sources/MyPage/ServiceCenter/FaqView.swift new file mode 100644 index 0000000..7d9d703 --- /dev/null +++ b/SodaLive/Sources/MyPage/ServiceCenter/FaqView.swift @@ -0,0 +1,85 @@ +// +// FaqView.swift +// SodaLive +// +// Created by klaus on 2023/08/11. +// + +import SwiftUI +import RichText + +struct FaqView: View { + + let faqs: [Faq] + + @State private var openIndex = -1 + + var body: some View { + VStack(spacing: 0) { + ForEach(0..() + + @Published var errorMessage = "" + @Published var isShowPopup = false + @Published var isLoading = false + + @Published var faqs = [Faq]() + @Published var categories = [String]() + @Published var selectedCategory = "" { + didSet { + getFaqs() + } + } + + func getFaqCategories() { + categories.removeAll() + isLoading = true + + repository.getFaqCategories() + .sink { result in + switch result { + case .finished: + DEBUG_LOG("finish") + case .failure(let error): + ERROR_LOG(error.localizedDescription) + } + } receiveValue: { response in + self.isLoading = false + let responseData = response.data + + do { + let jsonDecoder = JSONDecoder() + let decoded = try jsonDecoder.decode(ApiResponse<[String]>.self, from: responseData) + + if let data = decoded.data, decoded.success { + self.categories.append(contentsOf: data) + if !data.isEmpty { + self.selectedCategory = data[0] + } + } else { + if let message = decoded.message { + self.errorMessage = message + } else { + self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." + } + + self.isShowPopup = true + } + } catch { + self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." + self.isShowPopup = true + } + } + .store(in: &subscription) + } + + func getFaqs() { + faqs.removeAll() + isLoading = true + + repository.getFaqs(category: self.selectedCategory) + .sink { result in + switch result { + case .finished: + DEBUG_LOG("finish") + case .failure(let error): + ERROR_LOG(error.localizedDescription) + } + } receiveValue: { response in + self.isLoading = false + let responseData = response.data + + do { + let jsonDecoder = JSONDecoder() + let decoded = try jsonDecoder.decode(ApiResponse<[Faq]>.self, from: responseData) + + if let data = decoded.data, decoded.success { + self.faqs.append(contentsOf: data) + } else { + if let message = decoded.message { + self.errorMessage = message + } else { + self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." + } + + self.isShowPopup = true + } + } catch { + self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." + self.isShowPopup = true + } + } + .store(in: &subscription) + } +}