From 80e7b09b50970e33b6bc4610c51429f8b3b231dd Mon Sep 17 00:00:00 2001 From: Joon Baek Date: Tue, 30 Jul 2024 19:47:01 +0900 Subject: [PATCH 1/6] [WIP] #211 - SendFeedback --- Smeem-iOS/Smeem-iOS.xcodeproj/project.pbxproj | 4 + .../xcshareddata/swiftpm/Package.resolved | 36 +++--- .../Setting/VC/SettingViewController.swift | 49 ++++++-- .../Setting/View/SendFeedbackView.swift | 112 ++++++++++++++++++ 4 files changed, 171 insertions(+), 30 deletions(-) create mode 100644 Smeem-iOS/Smeem-iOS/Presentation/Setting/View/SendFeedbackView.swift diff --git a/Smeem-iOS/Smeem-iOS.xcodeproj/project.pbxproj b/Smeem-iOS/Smeem-iOS.xcodeproj/project.pbxproj index 79a90411..983ba647 100644 --- a/Smeem-iOS/Smeem-iOS.xcodeproj/project.pbxproj +++ b/Smeem-iOS/Smeem-iOS.xcodeproj/project.pbxproj @@ -59,6 +59,7 @@ 37ADCC022B0289AD00E474AA /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37ADCC012B0289AD00E474AA /* Observable.swift */; }; 37B360AA2AC2A4680006C8ED /* SmeemTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B360A92AC2A4680006C8ED /* SmeemTextView.swift */; }; 37BCADF22BC3FFBF006EF960 /* DetailDiaryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37BCADF12BC3FFBF006EF960 /* DetailDiaryViewModel.swift */; }; + 37BDC9872C4FEA940075F68A /* SendFeedbackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37BDC9862C4FEA940075F68A /* SendFeedbackView.swift */; }; 37DCA6572A47574300FF8F90 /* RandomTopicAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37DCA6562A47574300FF8F90 /* RandomTopicAPI.swift */; }; 37DCA65A2A47598700FF8F90 /* RandomTopicService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37DCA6592A47598700FF8F90 /* RandomTopicService.swift */; }; 37DCA65D2A475B5100FF8F90 /* RandomTopicResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37DCA65C2A475B5100FF8F90 /* RandomTopicResponse.swift */; }; @@ -293,6 +294,7 @@ 37ADCC012B0289AD00E474AA /* Observable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = ""; }; 37B360A92AC2A4680006C8ED /* SmeemTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmeemTextView.swift; sourceTree = ""; }; 37BCADF12BC3FFBF006EF960 /* DetailDiaryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailDiaryViewModel.swift; sourceTree = ""; }; + 37BDC9862C4FEA940075F68A /* SendFeedbackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendFeedbackView.swift; sourceTree = ""; }; 37DCA6562A47574300FF8F90 /* RandomTopicAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RandomTopicAPI.swift; sourceTree = ""; }; 37DCA6592A47598700FF8F90 /* RandomTopicService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RandomTopicService.swift; sourceTree = ""; }; 37DCA65C2A475B5100FF8F90 /* RandomTopicResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RandomTopicResponse.swift; sourceTree = ""; }; @@ -1521,6 +1523,7 @@ 4AC705902BEA1E49003C5310 /* PlanContainerView.swift */, 4AC705922BEA1E52003C5310 /* LanguageContainerView.swift */, 4AC705942BEA1E58003C5310 /* AlarmContainerView.swift */, + 37BDC9862C4FEA940075F68A /* SendFeedbackView.swift */, ); path = View; sourceTree = ""; @@ -1918,6 +1921,7 @@ 4AF58CE92A4820AA00305248 /* AuthNetworkModel.swift in Sources */, 378E461F2B551A6F00D2A473 /* DeepLResponse.swift in Sources */, 3761116C2A278D0E0095EC5A /* String+.swift in Sources */, + 37BDC9872C4FEA940075F68A /* SendFeedbackView.swift in Sources */, 4A07F8AC2B7B3E7F004185F2 /* SignupViewModel.swift in Sources */, 4AB7C91B2B7624CC00845733 /* ServiceAcceptAppData.swift in Sources */, 4AC707B42B73D2D400B1D791 /* UserNicknameViewModel.swift in Sources */, diff --git a/Smeem-iOS/Smeem-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Smeem-iOS/Smeem-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 74b92f93..0405f1e3 100644 --- a/Smeem-iOS/Smeem-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Smeem-iOS/Smeem-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/google/abseil-cpp-binary.git", "state" : { - "revision" : "bfc0b6f81adc06ce5121eb23f628473638d67c5c", - "version" : "1.2022062300.0" + "revision" : "df308b8b46607675f2b9ec8e569109008f9155ce", + "version" : "1.2022062300.1" } }, { @@ -68,8 +68,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/google/GoogleDataTransport.git", "state" : { - "revision" : "7874c1b48cbffd086ce8a052c4be873a78613775", - "version" : "9.2.3" + "revision" : "a637d318ae7ae246b02d7305121275bc75ed5565", + "version" : "9.4.0" } }, { @@ -77,8 +77,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/google/GoogleUtilities.git", "state" : { - "revision" : "871d43135925cde39ef7421d8723ce47edfdcc39", - "version" : "7.11.1" + "revision" : "57a1d307f42df690fdef2637f3e5b776da02aad6", + "version" : "7.13.3" } }, { @@ -86,8 +86,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/google/grpc-binary.git", "state" : { - "revision" : "2b7656d8ee892cd39db460b1a0d849de618405e6", - "version" : "1.50.1" + "revision" : "f1b366129d1125be7db83247e003fc333104b569", + "version" : "1.50.2" } }, { @@ -95,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/google/gtm-session-fetcher.git", "state" : { - "revision" : "d415594121c9e8a4f9d79cecee0965cf35e74dbd", - "version" : "3.1.1" + "revision" : "a2ab612cb980066ee56d90d60d8462992c07f24b", + "version" : "3.5.0" } }, { @@ -122,8 +122,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/firebase/leveldb.git", "state" : { - "revision" : "0706abcc6b0bd9cedfbb015ba840e4a780b5159b", - "version" : "1.22.2" + "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", + "version" : "1.22.5" } }, { @@ -149,8 +149,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/google/promises.git", "state" : { - "revision" : "ec957ccddbcc710ccc64c9dcbd4c7006fcf8b73a", - "version" : "2.2.0" + "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac", + "version" : "2.4.0" } }, { @@ -167,8 +167,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/ReactiveX/RxSwift.git", "state" : { - "revision" : "9dcaa4b333db437b0fbfaf453fad29069044a8b4", - "version" : "6.6.0" + "revision" : "b06a8c8596e4c3e8e7788e08e720e3248563ce6a", + "version" : "6.7.1" } }, { @@ -185,8 +185,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-protobuf.git", "state" : { - "revision" : "0af9125c4eae12a4973fb66574c53a54962a9e1e", - "version" : "1.21.0" + "revision" : "d57a5aecf24a25b32ec4a74be2f5d0a995a47c4b", + "version" : "1.27.0" } } ], diff --git a/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift b/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift index b6bb7afe..b6d4c704 100644 --- a/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift +++ b/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift @@ -8,6 +8,8 @@ import UIKit import Combine +import SnapKit + final class SettingViewController: BaseViewController { private let viewWillAppearSubject = PassthroughSubject() @@ -22,6 +24,7 @@ final class SettingViewController: BaseViewController { private let summaryScrollerView: UIScrollView = { let scrollerView = UIScrollView() scrollerView.showsVerticalScrollIndicator = false + scrollerView.isScrollEnabled = true return scrollerView }() @@ -48,12 +51,14 @@ final class SettingViewController: BaseViewController { return button }() - private let planContainerView = PlanContainerView() private let nicknameContainerView = NicknameContainerView() + private let planContainerView = PlanContainerView() private let languageContainerView = LanguageContainerView() private let alarmContainerView = AlarmContainerView() private let alarmCollectionContainerView = UIView() private let alarmCollectionView = AlarmCollectionView() + private let separationLine = SeparationLine(height: .thin) + private let sendFeedbackView = SendFeedbackView() override func viewDidLoad() { super.viewDidLoad() @@ -215,8 +220,13 @@ final class SettingViewController: BaseViewController { view.addSubviews(naviView, summaryScrollerView) naviView.addSubviews(backButton, summaryLabel, moreButton) summaryScrollerView.addSubview(contentView) - contentView.addSubviews(planContainerView, nicknameContainerView, - languageContainerView, alarmContainerView, alarmCollectionView) + contentView.addSubviews(nicknameContainerView, + planContainerView, + languageContainerView, + alarmContainerView, + alarmCollectionView, + separationLine, + sendFeedbackView) alarmCollectionView.addSubview(alarmCollectionContainerView) naviView.snp.makeConstraints { @@ -226,12 +236,15 @@ final class SettingViewController: BaseViewController { summaryScrollerView.snp.makeConstraints { $0.top.equalTo(naviView.snp.bottom) - $0.leading.trailing.bottom.equalTo(view.safeAreaLayoutGuide) + $0.leading.trailing.bottom.equalToSuperview() } contentView.snp.makeConstraints { - $0.edges.equalTo(summaryScrollerView.contentLayoutGuide) - $0.width.equalTo(summaryScrollerView.frameLayoutGuide) + $0.width.equalToSuperview() + $0.top.bottom.equalToSuperview() + + // 왜 edges로 하면 안됨? +// $0.edges.equalToSuperview() } backButton.snp.makeConstraints { @@ -253,37 +266,49 @@ final class SettingViewController: BaseViewController { nicknameContainerView.snp.makeConstraints { $0.top.equalTo(naviView.snp.bottom).offset(18) $0.leading.trailing.equalToSuperview().inset(18) - $0.height.equalTo(convertByHeightRatio(87)) + $0.height.equalTo(87) } planContainerView.snp.makeConstraints { $0.top.equalTo(nicknameContainerView.snp.bottom).offset(28) $0.leading.trailing.equalToSuperview().inset(18) - $0.height.equalTo(convertByHeightRatio(87)) + $0.height.equalTo(87) } languageContainerView.snp.makeConstraints { $0.top.equalTo(planContainerView.snp.bottom).offset(28) $0.leading.trailing.equalToSuperview().inset(18) - $0.height.equalTo(convertByHeightRatio(87)) + $0.height.equalTo(87) } alarmContainerView.snp.makeConstraints { $0.top.equalTo(languageContainerView.snp.bottom).offset(28) $0.leading.trailing.equalToSuperview().inset(18) - $0.height.equalTo(convertByHeightRatio(87)) + $0.height.equalTo(87) } alarmCollectionView.snp.makeConstraints { $0.top.equalTo(alarmContainerView.snp.bottom).offset(convertByHeightRatio(10)) $0.leading.trailing.equalToSuperview().inset(18) - $0.bottom.equalToSuperview().inset(convertByHeightRatio(80)) - $0.height.equalTo(convertByHeightRatio(133)) + $0.height.equalTo(133) } alarmCollectionContainerView.snp.makeConstraints { $0.edges.equalToSuperview() $0.width.height.equalTo(alarmCollectionView) } + + separationLine.snp.remakeConstraints { + $0.top.equalTo(alarmCollectionView.snp.bottom).offset(28) + $0.height.equalTo(1) + $0.leading.trailing.equalTo(nicknameContainerView) + } + + sendFeedbackView.snp.makeConstraints { + $0.top.equalTo(separationLine.snp.bottom).offset(28) + $0.leading.trailing.equalTo(alarmContainerView) + $0.height.equalTo(88) + $0.bottom.equalToSuperview() + } } } diff --git a/Smeem-iOS/Smeem-iOS/Presentation/Setting/View/SendFeedbackView.swift b/Smeem-iOS/Smeem-iOS/Presentation/Setting/View/SendFeedbackView.swift new file mode 100644 index 00000000..efb1b99d --- /dev/null +++ b/Smeem-iOS/Smeem-iOS/Presentation/Setting/View/SendFeedbackView.swift @@ -0,0 +1,112 @@ +// +// SendFeedbackView.swift +// Smeem-iOS +// +// Created by Joon Baek on 2024/07/23. +// + +import UIKit +import Combine + +final class SendFeedbackView: UIView { + + private (set) var goToButtonTapped = PassthroughSubject() + private var cancelBag = Set() + + private let titleLabel: UILabel = { + let label = UILabel() + label.font = .s1 + label.textColor = .smeemBlack + return label + }() + + private let containerView: UIView = { + let view = UIView() + view.backgroundColor = .clear + view.layer.borderWidth = 1.5 + view.layer.borderColor = UIColor.gray100.cgColor + view.makeRoundCorner(cornerRadius: 6) + return view + }() + + private let detailLabel: UILabel = { + let label = UILabel() + label.font = .b4 + label.textColor = .smeemBlack + return label + }() + + private let editDetailButton: UIButton = { + let label = UIButton() + label.titleLabel?.font = .c3 + label.setTitleColor(.point, for: .normal) + return label + }() + + init() { + super.init(frame: .zero) + + setLayout() + setLabel() + bind() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func bind() { + editDetailButton.tapPublisher + .sink { [weak self] _ in + self?.goToButtonTapped.send(()) + } + .store(in: &cancelBag) + } + + private func setLayout() { + addSubviews(titleLabel, containerView) + containerView.addSubviews(detailLabel, editDetailButton) + + titleLabel.snp.makeConstraints { + $0.top.leading.equalToSuperview() + } + + containerView.snp.makeConstraints { + $0.top.equalTo(titleLabel.snp.bottom).offset(12) + $0.leading.trailing.bottom.equalToSuperview() + $0.height.equalTo(convertByHeightRatio(54)) + } + + detailLabel.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalToSuperview().offset(convertByWidthRatio(20)) + } + } + + private func setLabel() { + titleLabel.text = "의견 보내기" + } + + func hasPlanData(data: String) { + detailLabel.text = data + detailLabel.textColor = .black + editDetailButton.setTitle("바로가기", for: .normal) + + editDetailButton.snp.makeConstraints { + $0.top.trailing.bottom.equalToSuperview() + $0.width.equalTo(89) + } + } + +// func hasNotPlanData() { +// detailLabel.text = "아직 플랜이 없어요!" +// detailLabel.textColor = .gray500 +// editDetailButton.setTitle("플랜 설정하기", for: .normal) +// +// editDetailButton.snp.makeConstraints { +// $0.top.trailing.bottom.equalToSuperview() +// $0.width.equalTo(117) +// } +// } +} + From 93ac7597df972382d1573a3c7a899edabc6240a7 Mon Sep 17 00:00:00 2001 From: Joon Baek Date: Mon, 5 Aug 2024 11:44:24 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[Fix]=20#211=20-=20ScrollView=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A1=A4=20=EC=9D=B4=EC=8A=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Alarm/AlarmCollectionView.swift | 1 + .../Setting/VC/SettingViewController.swift | 37 ++++++++----------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/Smeem-iOS/Smeem-iOS/Global/UIComponents/Alarm/AlarmCollectionView.swift b/Smeem-iOS/Smeem-iOS/Global/UIComponents/Alarm/AlarmCollectionView.swift index 5cc4a1b6..23f4522c 100644 --- a/Smeem-iOS/Smeem-iOS/Global/UIComponents/Alarm/AlarmCollectionView.swift +++ b/Smeem-iOS/Smeem-iOS/Global/UIComponents/Alarm/AlarmCollectionView.swift @@ -70,6 +70,7 @@ final class AlarmCollectionView: UICollectionView { setCellRegister() setViewRegister() setLayerUI() + self.isScrollEnabled = false } required init?(coder: NSCoder) { diff --git a/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift b/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift index b6d4c704..a2195b0d 100644 --- a/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift +++ b/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift @@ -21,14 +21,9 @@ final class SettingViewController: BaseViewController { private let toastSubject = PassthroughSubject() private let viewModel = SettingViewModel(provider: SettingService()) - private let summaryScrollerView: UIScrollView = { - let scrollerView = UIScrollView() - scrollerView.showsVerticalScrollIndicator = false - scrollerView.isScrollEnabled = true - return scrollerView - }() - + private let summaryScrollerView = UIScrollView() private let contentView = UIView() + private let naviView = UIView() private let backButton: UIButton = { @@ -234,19 +229,6 @@ final class SettingViewController: BaseViewController { $0.height.equalTo(66) } - summaryScrollerView.snp.makeConstraints { - $0.top.equalTo(naviView.snp.bottom) - $0.leading.trailing.bottom.equalToSuperview() - } - - contentView.snp.makeConstraints { - $0.width.equalToSuperview() - $0.top.bottom.equalToSuperview() - - // 왜 edges로 하면 안됨? -// $0.edges.equalToSuperview() - } - backButton.snp.makeConstraints { $0.centerY.equalToSuperview() $0.leading.equalToSuperview().inset(10) @@ -263,8 +245,20 @@ final class SettingViewController: BaseViewController { $0.height.width.equalTo(40) } + // MARK: - summaryScrollerView + + summaryScrollerView.snp.makeConstraints { + $0.top.equalTo(naviView.snp.bottom) + $0.leading.trailing.bottom.equalToSuperview() + } + + contentView.snp.makeConstraints { + $0.edges.equalToSuperview() + $0.leading.centerX.equalToSuperview() + } + nicknameContainerView.snp.makeConstraints { - $0.top.equalTo(naviView.snp.bottom).offset(18) + $0.top.equalToSuperview().offset(18) $0.leading.trailing.equalToSuperview().inset(18) $0.height.equalTo(87) } @@ -295,7 +289,6 @@ final class SettingViewController: BaseViewController { alarmCollectionContainerView.snp.makeConstraints { $0.edges.equalToSuperview() - $0.width.height.equalTo(alarmCollectionView) } separationLine.snp.remakeConstraints { From f0e2c1f81170cc94f1b5e3c16443c4ecd9e02ed7 Mon Sep 17 00:00:00 2001 From: Joon Baek Date: Mon, 5 Aug 2024 12:24:36 +0900 Subject: [PATCH 3/6] =?UTF-8?q?[Feat]=20#211=20-=20=EC=84=A4=EB=AC=B8=20?= =?UTF-8?q?=EB=A7=81=ED=81=AC=20=EB=8B=A4=EC=9D=B4=EB=A0=89=EC=85=98=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Setting/VC/SettingViewController.swift | 13 +++++ .../Setting/View/SendFeedbackView.swift | 51 +++++++------------ 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift b/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift index a2195b0d..90d066c7 100644 --- a/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift +++ b/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift @@ -106,6 +106,17 @@ final class SettingViewController: BaseViewController { } .store(in: &cancelBag) + sendFeedbackView.directButtonTapped + .sink { _ in + guard let url = URL(string: "https://walla.my/survey/2SAyT8aWPKjqaL4cZ5vm") else { return } + UIApplication.shared.open(url, options: [:]) { success in + if !success { + //에러토스트 + } + } + } + .store(in: &cancelBag) + let output = viewModel.transform(input: SettingViewModel.Input(viewWillAppearSubject: viewWillAppearSubject, alarmToggleSubject: alarmToggleTapped, nicknameButtonTapped: nicknameButtonTapped, @@ -297,6 +308,8 @@ final class SettingViewController: BaseViewController { $0.leading.trailing.equalTo(nicknameContainerView) } + separationLine.backgroundColor = .gray100 + sendFeedbackView.snp.makeConstraints { $0.top.equalTo(separationLine.snp.bottom).offset(28) $0.leading.trailing.equalTo(alarmContainerView) diff --git a/Smeem-iOS/Smeem-iOS/Presentation/Setting/View/SendFeedbackView.swift b/Smeem-iOS/Smeem-iOS/Presentation/Setting/View/SendFeedbackView.swift index efb1b99d..4ef38113 100644 --- a/Smeem-iOS/Smeem-iOS/Presentation/Setting/View/SendFeedbackView.swift +++ b/Smeem-iOS/Smeem-iOS/Presentation/Setting/View/SendFeedbackView.swift @@ -8,15 +8,18 @@ import UIKit import Combine +import SnapKit + final class SendFeedbackView: UIView { - private (set) var goToButtonTapped = PassthroughSubject() + private (set) var directButtonTapped = PassthroughSubject() private var cancelBag = Set() private let titleLabel: UILabel = { let label = UILabel() label.font = .s1 label.textColor = .smeemBlack + label.text = "의견 보내기" return label }() @@ -33,21 +36,22 @@ final class SendFeedbackView: UIView { let label = UILabel() label.font = .b4 label.textColor = .smeemBlack + label.text = "스밈에 대한 의견을 남겨주세요 :)" return label }() - private let editDetailButton: UIButton = { - let label = UIButton() - label.titleLabel?.font = .c3 - label.setTitleColor(.point, for: .normal) - return label + private let directButton: UIButton = { + let button = UIButton() + button.titleLabel?.font = .c3 + button.setTitleColor(.point, for: .normal) + button.setTitle("바로가기", for: .normal) + return button }() init() { super.init(frame: .zero) setLayout() - setLabel() bind() } @@ -56,16 +60,16 @@ final class SendFeedbackView: UIView { } private func bind() { - editDetailButton.tapPublisher + directButton.tapPublisher .sink { [weak self] _ in - self?.goToButtonTapped.send(()) + self?.directButtonTapped.send(()) } .store(in: &cancelBag) } private func setLayout() { addSubviews(titleLabel, containerView) - containerView.addSubviews(detailLabel, editDetailButton) + containerView.addSubviews(detailLabel, directButton) titleLabel.snp.makeConstraints { $0.top.leading.equalToSuperview() @@ -81,32 +85,13 @@ final class SendFeedbackView: UIView { $0.centerY.equalToSuperview() $0.leading.equalToSuperview().offset(convertByWidthRatio(20)) } - } - - private func setLabel() { - titleLabel.text = "의견 보내기" - } - - func hasPlanData(data: String) { - detailLabel.text = data - detailLabel.textColor = .black - editDetailButton.setTitle("바로가기", for: .normal) - editDetailButton.snp.makeConstraints { - $0.top.trailing.bottom.equalToSuperview() + directButton.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview() $0.width.equalTo(89) + $0.height.equalTo(54) } } - -// func hasNotPlanData() { -// detailLabel.text = "아직 플랜이 없어요!" -// detailLabel.textColor = .gray500 -// editDetailButton.setTitle("플랜 설정하기", for: .normal) -// -// editDetailButton.snp.makeConstraints { -// $0.top.trailing.bottom.equalToSuperview() -// $0.width.equalTo(117) -// } -// } } From 9889fcab09b9818b2f513cdad04b654db6a4aaa0 Mon Sep 17 00:00:00 2001 From: cchanmi <113524@naver.com> Date: Tue, 6 Aug 2024 12:35:50 +0900 Subject: [PATCH 4/6] =?UTF-8?q?[Chore]=20#211=20-=20Toast=20Layout=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SmeemComponent/SmeemToastView.swift | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Smeem-iOS/Smeem-iOS/Global/UIComponents/SmeemComponent/SmeemToastView.swift b/Smeem-iOS/Smeem-iOS/Global/UIComponents/SmeemComponent/SmeemToastView.swift index 4b3a68e2..4e497d58 100644 --- a/Smeem-iOS/Smeem-iOS/Global/UIComponents/SmeemComponent/SmeemToastView.swift +++ b/Smeem-iOS/Smeem-iOS/Global/UIComponents/SmeemComponent/SmeemToastView.swift @@ -81,6 +81,15 @@ final class SmeemToastView: UIView { return imageView }() + private let labelStackView: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.distribution = .fill + stackView.spacing = 3 + stackView.alignment = .leading + return stackView + }() + private let headLabel: UILabel = { let label = UILabel() label.font = .c1 @@ -169,7 +178,8 @@ final class SmeemToastView: UIView { } private func setToastViewLayout() { - addSubviews(cautionImage, headLabel, bodyLabel) + addSubviews(cautionImage, labelStackView) + labelStackView.addArrangedSubviews(headLabel, bodyLabel) switch type { case .smeemToast: @@ -184,14 +194,9 @@ final class SmeemToastView: UIView { make.width.height.equalTo(22) } - headLabel.snp.makeConstraints { make in - make.top.equalToSuperview().offset(14) + labelStackView.snp.makeConstraints { make in make.leading.equalTo(cautionImage.snp.trailing).offset(14) - } - - bodyLabel.snp.makeConstraints { make in - make.top.equalTo(headLabel.snp.bottom).offset(3) - make.leading.equalTo(headLabel) + make.centerY.equalTo(cautionImage) } } @@ -202,7 +207,7 @@ final class SmeemToastView: UIView { if case .smeemToast = type { make.height.equalTo(convertByHeightRatio(50)) } else { - make.height.equalTo(convertByHeightRatio(70)) + make.height.equalTo(convertByWidthRatio(70)) } } } From fd702fb9c78f83cd28155d917a94210ecbabc828 Mon Sep 17 00:00:00 2001 From: cchanmi <113524@naver.com> Date: Tue, 6 Aug 2024 12:36:05 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[Chore]=20#211=20-=20=EC=97=90=EB=9F=AC=20s?= =?UTF-8?q?ubject=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Setting/VC/SettingViewController.swift | 9 ++++++--- .../Setting/ViewModel/SettingViewModel.swift | 5 ++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift b/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift index 90d066c7..85755bde 100644 --- a/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift +++ b/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift @@ -17,6 +17,7 @@ final class SettingViewController: BaseViewController { private let planButtonTapped = PassthroughSubject() private let alarmToggleTapped = PassthroughSubject() private let alarmButtnTapped = PassthroughSubject() + private let errorSubject = PassthroughSubject() private var cancelBag = Set() private let toastSubject = PassthroughSubject() private let viewModel = SettingViewModel(provider: SettingService()) @@ -110,10 +111,11 @@ final class SettingViewController: BaseViewController { .sink { _ in guard let url = URL(string: "https://walla.my/survey/2SAyT8aWPKjqaL4cZ5vm") else { return } UIApplication.shared.open(url, options: [:]) { success in - if !success { - //에러토스트 + if success { + self.errorSubject.send(.clientError) } } + } .store(in: &cancelBag) @@ -121,7 +123,8 @@ final class SettingViewController: BaseViewController { alarmToggleSubject: alarmToggleTapped, nicknameButtonTapped: nicknameButtonTapped, planButtonTapped: planButtonTapped, - alarmButtonTapped: alarmButtnTapped)) + alarmButtonTapped: alarmButtnTapped, + errorSubject: errorSubject)) output.hasPlanResult .receive(on: DispatchQueue.main) .sink { [weak self] response in diff --git a/Smeem-iOS/Smeem-iOS/Presentation/Setting/ViewModel/SettingViewModel.swift b/Smeem-iOS/Smeem-iOS/Presentation/Setting/ViewModel/SettingViewModel.swift index 0b6f4048..793cbe1d 100644 --- a/Smeem-iOS/Smeem-iOS/Presentation/Setting/ViewModel/SettingViewModel.swift +++ b/Smeem-iOS/Smeem-iOS/Presentation/Setting/ViewModel/SettingViewModel.swift @@ -26,6 +26,7 @@ final class SettingViewModel: ViewModel { let nicknameButtonTapped: PassthroughSubject let planButtonTapped: PassthroughSubject let alarmButtonTapped: PassthroughSubject + let errorSubject: PassthroughSubject } struct Output { @@ -148,6 +149,8 @@ final class SettingViewModel: ViewModel { let loadingViewResult = loadingViewSubject.eraseToAnyPublisher() let errorResult = errorSubject.eraseToAnyPublisher() + let inputErrorResult = input.errorSubject.eraseToAnyPublisher() + let totalError = Publishers.Merge(errorResult, inputErrorResult).eraseToAnyPublisher() return Output(alarmToggleResult: pushButtonResult, hasPlanResult: hasPlanResult, @@ -156,6 +159,6 @@ final class SettingViewModel: ViewModel { planButtonResult: planButtonResult, alarmButtonResult: alarmButtonResult, loadingViewResult: loadingViewResult, - errorResult: errorResult) + errorResult: totalError) } } From 5c2a6445e197aa126fc9747837ba73c97be2fe79 Mon Sep 17 00:00:00 2001 From: cchanmi <113524@naver.com> Date: Tue, 6 Aug 2024 12:40:48 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[Chore]=20#211=20-=20setting=20view=20heigh?= =?UTF-8?q?t=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20=EA=B8=B0=EA=B8=B0?= =?UTF-8?q?=EB=8C=80=EC=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Setting/VC/SettingViewController.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift b/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift index 85755bde..d2d1fde8 100644 --- a/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift +++ b/Smeem-iOS/Smeem-iOS/Presentation/Setting/VC/SettingViewController.swift @@ -274,31 +274,31 @@ final class SettingViewController: BaseViewController { nicknameContainerView.snp.makeConstraints { $0.top.equalToSuperview().offset(18) $0.leading.trailing.equalToSuperview().inset(18) - $0.height.equalTo(87) + $0.height.equalTo(convertByHeightRatio(87)) } planContainerView.snp.makeConstraints { $0.top.equalTo(nicknameContainerView.snp.bottom).offset(28) $0.leading.trailing.equalToSuperview().inset(18) - $0.height.equalTo(87) + $0.height.equalTo(convertByHeightRatio(87)) } languageContainerView.snp.makeConstraints { $0.top.equalTo(planContainerView.snp.bottom).offset(28) $0.leading.trailing.equalToSuperview().inset(18) - $0.height.equalTo(87) + $0.height.equalTo(convertByHeightRatio(87)) } alarmContainerView.snp.makeConstraints { $0.top.equalTo(languageContainerView.snp.bottom).offset(28) $0.leading.trailing.equalToSuperview().inset(18) - $0.height.equalTo(87) + $0.height.equalTo(convertByHeightRatio(87)) } alarmCollectionView.snp.makeConstraints { $0.top.equalTo(alarmContainerView.snp.bottom).offset(convertByHeightRatio(10)) $0.leading.trailing.equalToSuperview().inset(18) - $0.height.equalTo(133) + $0.height.equalTo(convertByHeightRatio(133)) } alarmCollectionContainerView.snp.makeConstraints { @@ -316,7 +316,7 @@ final class SettingViewController: BaseViewController { sendFeedbackView.snp.makeConstraints { $0.top.equalTo(separationLine.snp.bottom).offset(28) $0.leading.trailing.equalTo(alarmContainerView) - $0.height.equalTo(88) + $0.height.equalTo(convertByHeightRatio(88)) $0.bottom.equalToSuperview() } }