From 4fa9ac47957bdc1b5bd3ea2a0c34dca12424b1d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=EC=98=81=28=EB=AA=A8=EB=B0=94=EC=9D=BC?= =?UTF-8?q?=29?= Date: Mon, 11 Jan 2021 05:14:10 +0900 Subject: [PATCH] =?UTF-8?q?:bug:=20Send=20Message=20Close=20Alert=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#35)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :bug: Send Message Close Alert 추가 * :bug: Twemoji로 변경 * :bug: SendMessage 진입시 초기 이모지 로드하게 구현 * :fire: Message Mock 삭제 * :sparkles: CheeringMap 국가 이모지 twemoji로 변경 * :sparkles: Discover 화면 Twemoji 적용 --- .../Dear-World.xcodeproj/project.pbxproj | 27 ++-- .../xcshareddata/swiftpm/Package.resolved | 9 ++ .../Emoji/Model/Emoji.Model.Random.swift | 9 +- .../API/Message.Model.SendMessage.swift | 4 +- .../World/Model/World.Model.Country.swift | 2 + .../Scene/About/AboutReactor.swift | 1 + .../Cell/RankerTableViewCell.swift | 24 ++-- .../Presentation/Scene/Discover/APIMock.swift | 30 ----- .../Discover/Cell/MessageTableViewCell.swift | 24 ++-- .../Scene/Discover/DiscoverReactor.swift | 120 ++++++++++++------ .../Discover/DiscoverViewController.swift | 75 +++++++---- .../Scene/Discover/MessageMock.swift | 16 --- .../Scene/Main/Message.Model.Messages.swift | 15 +++ .../Send Message/SendMessageReactor.swift | 69 ++++++---- .../SendMessageViewController.swift | 68 +++++++--- .../Presentation/View/CheerButton.swift | 2 +- .../View/CountrySelectController.swift | 7 +- .../View/DWAlertViewController.swift | 6 +- Dear-World/Dear-World/Support File/Info.plist | 2 +- 19 files changed, 310 insertions(+), 200 deletions(-) delete mode 100644 Dear-World/Dear-World/Source/Presentation/Scene/Discover/APIMock.swift delete mode 100644 Dear-World/Dear-World/Source/Presentation/Scene/Discover/MessageMock.swift diff --git a/Dear-World/Dear-World.xcodeproj/project.pbxproj b/Dear-World/Dear-World.xcodeproj/project.pbxproj index 1aac33c..292475b 100644 --- a/Dear-World/Dear-World.xcodeproj/project.pbxproj +++ b/Dear-World/Dear-World.xcodeproj/project.pbxproj @@ -11,8 +11,6 @@ 121BDB44259735200062B15A /* UIColor+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 121BDB43259735200062B15A /* UIColor+.swift */; }; 121BDB592597652A0062B15A /* MessageTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 121BDB582597652A0062B15A /* MessageTableViewCell.swift */; }; 121BDB672597982F0062B15A /* DiscoverReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 121BDB662597982F0062B15A /* DiscoverReactor.swift */; }; - 121BDB6C2597A49B0062B15A /* MessageMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 121BDB6B2597A49B0062B15A /* MessageMock.swift */; }; - 121BDB712597A5D60062B15A /* APIMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 121BDB702597A5D60062B15A /* APIMock.swift */; }; 121BDB8E259829840062B15A /* CountrySelectController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 121BDB8D259829840062B15A /* CountrySelectController.swift */; }; 12257E1825A622750007E65E /* SortTypeSelectController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12257E1725A622750007E65E /* SortTypeSelectController.swift */; }; 1263E09725A1C87400E3F121 /* Message.API.Countries.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1263E09625A1C87400E3F121 /* Message.API.Countries.swift */; }; @@ -28,6 +26,7 @@ 3902F12425970E5600A3DF8C /* Number+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3902F12325970E5600A3DF8C /* Number+.swift */; }; 3902F12A259714D800A3DF8C /* RankerTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3902F129259714D800A3DF8C /* RankerTableViewCell.swift */; }; 3914D9E6259F3FA1009765B0 /* Message.Model.Messages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3914D9E5259F3FA1009765B0 /* Message.Model.Messages.swift */; }; + 391E066A25AB7BBF006158E4 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 391E066925AB7BBF006158E4 /* Kingfisher */; }; 393E0D4025A23A12000DB3B9 /* World.Model.Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 393E0D3F25A23A12000DB3B9 /* World.Model.Map.swift */; }; 393E0D4525A23A7B000DB3B9 /* World.API.Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 393E0D4425A23A7B000DB3B9 /* World.API.Map.swift */; }; 393E0D5725A2BE3C000DB3B9 /* AboutTeamViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 393E0D5625A2BE3C000DB3B9 /* AboutTeamViewController.swift */; }; @@ -115,8 +114,6 @@ 121BDB43259735200062B15A /* UIColor+.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = "UIColor+.swift"; sourceTree = ""; tabWidth = 2; }; 121BDB582597652A0062B15A /* MessageTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageTableViewCell.swift; sourceTree = ""; }; 121BDB662597982F0062B15A /* DiscoverReactor.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = DiscoverReactor.swift; sourceTree = ""; tabWidth = 2; }; - 121BDB6B2597A49B0062B15A /* MessageMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageMock.swift; sourceTree = ""; }; - 121BDB702597A5D60062B15A /* APIMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIMock.swift; sourceTree = ""; }; 121BDB8D259829840062B15A /* CountrySelectController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountrySelectController.swift; sourceTree = ""; }; 12257E1725A622750007E65E /* SortTypeSelectController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SortTypeSelectController.swift; sourceTree = ""; }; 1263E09625A1C87400E3F121 /* Message.API.Countries.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Message.API.Countries.swift; sourceTree = ""; }; @@ -207,6 +204,7 @@ 3971EB32259A8BC90084E6DC /* SwiftRichString in Frameworks */, 39518C8125A8FB9D00F777D1 /* FirebaseCrashlytics in Frameworks */, 395825F0259494B1007325AB /* ReactorKit in Frameworks */, + 391E066A25AB7BBF006158E4 /* Kingfisher in Frameworks */, 3958261B2596D06C007325AB /* Then in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -454,8 +452,6 @@ 121BDB57259764F10062B15A /* Cell */, 395826112596322B007325AB /* DiscoverViewController.swift */, 121BDB662597982F0062B15A /* DiscoverReactor.swift */, - 121BDB6B2597A49B0062B15A /* MessageMock.swift */, - 121BDB702597A5D60062B15A /* APIMock.swift */, ); path = Discover; sourceTree = ""; @@ -634,6 +630,7 @@ 39518C8025A8FB9D00F777D1 /* FirebaseCrashlytics */, 39518C8225A8FB9D00F777D1 /* FirebaseRemoteConfig */, 39518C8425A8FB9D00F777D1 /* FirebaseAuth */, + 391E066925AB7BBF006158E4 /* Kingfisher */, ); productName = "Dear-World"; productReference = 3958257725948E41007325AB /* Dear-World.app */; @@ -719,6 +716,7 @@ 3971EB30259A8BC90084E6DC /* XCRemoteSwiftPackageReference "SwiftRichString" */, 39658F99259ADB130050D180 /* XCRemoteSwiftPackageReference "lottie-ios" */, 39518C7B25A8FB9D00F777D1 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, + 391E066825AB7BBF006158E4 /* XCRemoteSwiftPackageReference "Kingfisher" */, ); productRefGroup = 3958257825948E41007325AB /* Products */; projectDirPath = ""; @@ -823,7 +821,6 @@ buildActionMask = 2147483647; files = ( 39EED241259D0227007452E1 /* Revision.swift in Sources */, - 121BDB712597A5D60062B15A /* APIMock.swift in Sources */, 39672DB32598D139001D7E69 /* SelectCountryView.swift in Sources */, 39E9F7DB25A1BBED00BC2CC2 /* PixelWorldMapView.swift in Sources */, 3902F118259704AF00A3DF8C /* AboutViewController.swift in Sources */, @@ -877,7 +874,6 @@ 39E9F7E025A1BC3C00BC2CC2 /* NoticeBadge.swift in Sources */, 12257E1825A622750007E65E /* SortTypeSelectController.swift in Sources */, 39E9F7ED25A1C84900BC2CC2 /* WorldMap.Model.Country.swift in Sources */, - 121BDB6C2597A49B0062B15A /* MessageMock.swift in Sources */, 39658FC0259AE58C0050D180 /* World.Model.Country.swift in Sources */, 121BDB8E259829840062B15A /* CountrySelectController.swift in Sources */, 121BDB672597982F0062B15A /* DiscoverReactor.swift in Sources */, @@ -1057,6 +1053,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MARKETING_VERSION = 1.0.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = "com.OFU.Dear-World"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1079,6 +1076,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MARKETING_VERSION = 1.0.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = "com.OFU.Dear-World"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1213,6 +1211,14 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ + 391E066825AB7BBF006158E4 /* XCRemoteSwiftPackageReference "Kingfisher" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/onevcat/Kingfisher"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 6.0.1; + }; + }; 39518C7B25A8FB9D00F777D1 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/firebase/firebase-ios-sdk.git"; @@ -1312,6 +1318,11 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ + 391E066925AB7BBF006158E4 /* Kingfisher */ = { + isa = XCSwiftPackageProductDependency; + package = 391E066825AB7BBF006158E4 /* XCRemoteSwiftPackageReference "Kingfisher" */; + productName = Kingfisher; + }; 39518C7C25A8FB9D00F777D1 /* FirebaseInstallations */ = { isa = XCSwiftPackageProductDependency; package = 39518C7B25A8FB9D00F777D1 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; diff --git a/Dear-World/Dear-World.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Dear-World/Dear-World.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 96bc02f..f31d32c 100644 --- a/Dear-World/Dear-World.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Dear-World/Dear-World.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -55,6 +55,15 @@ "version": "1.5.0" } }, + { + "package": "Kingfisher", + "repositoryURL": "https://github.com/onevcat/Kingfisher", + "state": { + "branch": null, + "revision": "0be276f6a7fd54af4c3eb03f2d12e12d8c8a1a1d", + "version": "6.0.1" + } + }, { "package": "leveldb", "repositoryURL": "https://github.com/firebase/leveldb.git", diff --git a/Dear-World/Dear-World/Source/Domain/Emoji/Model/Emoji.Model.Random.swift b/Dear-World/Dear-World/Source/Domain/Emoji/Model/Emoji.Model.Random.swift index 1423d13..b9404b2 100644 --- a/Dear-World/Dear-World/Source/Domain/Emoji/Model/Emoji.Model.Random.swift +++ b/Dear-World/Dear-World/Source/Domain/Emoji/Model/Emoji.Model.Random.swift @@ -9,7 +9,14 @@ import Foundation extension Emoji.Model { struct Random: Decodable { - let id: Int + let id: Int? let unicode: String + let imageURL: String + + enum CodingKeys: String, CodingKey { + case id + case unicode + case imageURL = "imageUrl" + } } } diff --git a/Dear-World/Dear-World/Source/Domain/Message/API/Message.Model.SendMessage.swift b/Dear-World/Dear-World/Source/Domain/Message/API/Message.Model.SendMessage.swift index ad6ec4e..6c92ce8 100644 --- a/Dear-World/Dear-World/Source/Domain/Message/API/Message.Model.SendMessage.swift +++ b/Dear-World/Dear-World/Source/Domain/Message/API/Message.Model.SendMessage.swift @@ -9,9 +9,9 @@ import Foundation extension Message.Model { struct SendMessage: Decodable { - let likeCount: Int let id: Int - let anonymousUserId: Int let content: String + let likeCount: Int + let anonymousUserId: Int } } diff --git a/Dear-World/Dear-World/Source/Domain/World/Model/World.Model.Country.swift b/Dear-World/Dear-World/Source/Domain/World/Model/World.Model.Country.swift index 981d1aa..f54f9fb 100644 --- a/Dear-World/Dear-World/Source/Domain/World/Model/World.Model.Country.swift +++ b/Dear-World/Dear-World/Source/Domain/World/Model/World.Model.Country.swift @@ -13,6 +13,7 @@ extension World.Model { let code: String let name: String let emoji: String + let imageURL: String? let status: Status? enum CodingKeys: String, CodingKey { @@ -21,6 +22,7 @@ extension World.Model { case name = "fullName" case emoji = "emojiUnicode" case status = "countryStatus" + case imageURL = "imageUrl" } } } diff --git a/Dear-World/Dear-World/Source/Presentation/Scene/About/AboutReactor.swift b/Dear-World/Dear-World/Source/Presentation/Scene/About/AboutReactor.swift index 3f173ae..06b7831 100644 --- a/Dear-World/Dear-World/Source/Presentation/Scene/About/AboutReactor.swift +++ b/Dear-World/Dear-World/Source/Presentation/Scene/About/AboutReactor.swift @@ -48,6 +48,7 @@ final class AboutReactor: Reactor { switch action { case .initalize: return .empty() + case .tapCrewInfo: return .just(.setPresentCrewInfo(true)) diff --git a/Dear-World/Dear-World/Source/Presentation/Scene/Cheering Map/Cell/RankerTableViewCell.swift b/Dear-World/Dear-World/Source/Presentation/Scene/Cheering Map/Cell/RankerTableViewCell.swift index e8145ec..49d1006 100644 --- a/Dear-World/Dear-World/Source/Presentation/Scene/Cheering Map/Cell/RankerTableViewCell.swift +++ b/Dear-World/Dear-World/Source/Presentation/Scene/Cheering Map/Cell/RankerTableViewCell.swift @@ -28,7 +28,7 @@ final class RankerTableViewCell: UITableViewCell { // MARK: 🖼 UI let rankLabel: UILabel = UILabel() - let countryFlagLabel: UILabel = UILabel() + let countryFlagImageView: UIImageView = UIImageView() let countryNameLabel: UILabel = UILabel() let messageCountLabel: UILabel = UILabel() let cheerUpButton: CheerUpButton = CheerUpButton() @@ -51,21 +51,19 @@ final class RankerTableViewCell: UITableViewCell { // MARK: 📍 Setup private func setupUI() { self.contentView.addSubview(rankLabel) - self.contentView.addSubview(countryFlagLabel) + self.contentView.addSubview(countryFlagImageView) rankLabel.do { $0.font = .boldSystemFont(ofSize: 12) } rankLabel.snp.makeConstraints { $0.leading.equalToSuperview().inset(20) - $0.bottom.equalTo(countryFlagLabel) + $0.bottom.equalTo(countryFlagImageView) } - - countryFlagLabel.do { - $0.font = .boldSystemFont(ofSize: 14) - } - countryFlagLabel.snp.makeConstraints { + countryFlagImageView.snp.makeConstraints { $0.top.equalToSuperview().inset(14) $0.leading.equalToSuperview().inset(62) + $0.width.equalTo(18) + $0.height.equalTo(18) } self.contentView.addSubview(countryNameLabel) @@ -75,15 +73,15 @@ final class RankerTableViewCell: UITableViewCell { } countryNameLabel.snp.makeConstraints { $0.top.equalToSuperview().inset(12) - $0.leading.equalTo(countryFlagLabel.snp.trailing).offset(10) + $0.leading.equalTo(countryFlagImageView.snp.trailing).offset(10) } let messageImageView: UIImageView = UIImageView(image: UIImage(named: "message_default")!) self.contentView.addSubview(messageImageView) messageImageView.snp.makeConstraints { $0.leading.equalTo(countryNameLabel) - $0.width.equalTo(12) - $0.height.equalTo(9) + $0.width.equalTo(18) + $0.height.equalTo(12) $0.top.equalTo(countryNameLabel.snp.bottom).offset(10) } @@ -114,7 +112,9 @@ final class RankerTableViewCell: UITableViewCell { func configure(with country: World.Model.Country, ranking: Int) { rankLabel.attributedText = formatRank(ranking) countryNameLabel.text = country.name - countryFlagLabel.text = country.emoji + if let url = URL(string: country.imageURL) { + countryFlagImageView.kf.setImage(with: url) + } messageCountLabel.text = country.status?.messageCount.formatted } diff --git a/Dear-World/Dear-World/Source/Presentation/Scene/Discover/APIMock.swift b/Dear-World/Dear-World/Source/Presentation/Scene/Discover/APIMock.swift deleted file mode 100644 index 3fc594a..0000000 --- a/Dear-World/Dear-World/Source/Presentation/Scene/Discover/APIMock.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// apiMock.swift -// Dear-World -// -// Created by rookie.w on 2020/12/27. -// - -import RxSwift -import UIKit -class APIMock { - - func getMessages(page: Int, country: String) -> Observable { - return - Observable - .just(Message.Model.Messages(firstMsgId: 0, lastMsgId: 1, messageCount: 20, messages: [ - - ])) -// .just([ -// MessageMock(emoji: "🎅🏻", name: "용완", country: "🇰🇷", countryName: "South Korea", detail: "\(Date())", likes: 20), -// MessageMock(emoji: "🙃", name: "동영", country: "🍎", countryName: "South Korea", detail: "ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ", likes: 24), -// MessageMock(emoji: "👩🏻‍🚀", name: "선영", country: "💀", countryName: "South Korea", detail: "ㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹ", likes: 10), -// MessageMock(emoji: "👩🏻‍🚀", name: "용완4", country: "🇰🇷", countryName: "South Korea", detail: "iasjdliajdliajsdliajdsilajsdliajsdlajdasjdlajsdliajsldiajsd", likes: 20), -// MessageMock(emoji: "🎅🏻", name: "용완", country: "🇰🇷", countryName: "South Korea", detail: "iasjdliajdliajsdliajdsilajsdliajsdlajdasjdlajsdliajsldiajsd", likes: 20), -// MessageMock(emoji: "🎅🏻", name: "용완", country: "🇰🇷", countryName: "South Korea", detail: "iasjdliajdliajsdliajdsilajsdliajsdlajdasjdlajsdliajsldiajsd", likes: 20), -// MessageMock(emoji: "🎅🏻", name: "용완", country: "🇰🇷", countryName: "South Korea", detail: "iasjdliajdliajsdliajdsilajsdliajsdlajdasjdlajsdliajsldiajsd", likes: 20) -// -// ]) -// .delay(.seconds(1), scheduler: MainScheduler.instance) - } -} diff --git a/Dear-World/Dear-World/Source/Presentation/Scene/Discover/Cell/MessageTableViewCell.swift b/Dear-World/Dear-World/Source/Presentation/Scene/Discover/Cell/MessageTableViewCell.swift index 4aa824c..bd724ad 100644 --- a/Dear-World/Dear-World/Source/Presentation/Scene/Discover/Cell/MessageTableViewCell.swift +++ b/Dear-World/Dear-World/Source/Presentation/Scene/Discover/Cell/MessageTableViewCell.swift @@ -12,9 +12,10 @@ import UIKit final class MessageTableViewCell: UITableViewCell { let disposeBag: DisposeBag = DisposeBag() // MARK: 🖼 UI - let emojiLabel: UILabel = UILabel() + let emojiImageView: UIImageView = UIImageView() let nameLabel: UILabel = UILabel() let countryLabel: UILabel = UILabel() + let countryFlagImageView: UIImageView = UIImageView() let detailTextView: UITextView = UITextView() let likeView: UIImageView = UIImageView() let likeCountLabel: UILabel = UILabel() @@ -78,13 +79,8 @@ final class MessageTableViewCell: UITableViewCell { $0.height.width.equalTo(40) } - self.emojiLabel.do { - $0.text = "🎅🏻" - $0.font = .systemFont(ofSize: 14) - $0.textAlignment = .center - } - mainView.addSubview(self.emojiLabel) - self.emojiLabel.snp.makeConstraints { + mainView.addSubview(emojiImageView) + emojiImageView.snp.makeConstraints { $0.size.equalTo(20) $0.center.equalTo(emojiView) } @@ -101,15 +97,21 @@ final class MessageTableViewCell: UITableViewCell { $0.trailing.greaterThanOrEqualToSuperview().inset(30) } + mainView.addSubview(countryFlagImageView) + countryFlagImageView.snp.makeConstraints { + $0.bottom.equalTo(emojiView.snp.bottom) + $0.leading.equalTo(emojiView.snp.trailing).offset(10) + $0.width.height.equalTo(18) + } self.countryLabel.do { - $0.text = "🇰🇷 South Korea" + $0.text = "South Korea" $0.font = .boldSystemFont(ofSize: 12) $0.textColor = .grayWhite } mainView.addSubview(self.countryLabel) self.countryLabel.snp.makeConstraints { - $0.bottom.equalTo(emojiView.snp.bottom) - $0.leading.equalTo(emojiView.snp.trailing).offset(10) + $0.centerY.equalTo(countryFlagImageView) + $0.leading.equalTo(countryFlagImageView.snp.trailing).offset(10) $0.trailing.greaterThanOrEqualToSuperview().inset(30) } diff --git a/Dear-World/Dear-World/Source/Presentation/Scene/Discover/DiscoverReactor.swift b/Dear-World/Dear-World/Source/Presentation/Scene/Discover/DiscoverReactor.swift index c3431a2..c7c7bbf 100644 --- a/Dear-World/Dear-World/Source/Presentation/Scene/Discover/DiscoverReactor.swift +++ b/Dear-World/Dear-World/Source/Presentation/Scene/Discover/DiscoverReactor.swift @@ -6,10 +6,13 @@ // import Foundation -import RxOptional import ReactorKit +import RxOptional final class DiscoverReactor: Reactor { + typealias Model = Message.Model + typealias API = Message.API + enum Action { case viewWillAppear case tapAbout @@ -20,21 +23,26 @@ final class DiscoverReactor: Reactor { } enum Mutation { - case setMessages(result: Message.Model.Messages) + case setMessages(result: Model.Messages) case setRefreshing(Bool) - case addMessages(result: Message.Model.Messages) - case setCountry(country: Message.Model.Country?) + case addMessages(result: Model.Messages) + case setCountry(country: Model.Country?) case setLoading(Bool) case setPresentAboutPage(Bool) case setMessageCount(Int) - case setCurrentSortType(Message.Model.ListType) + case setCurrentSortType(Model.ListType) } struct State { var messageCount: Int = 0 - @Revision var selectedCountry: Message.Model.Country? - @Revision var selectedSortType: Message.Model.ListType = .recent - @Revision var messages: Message.Model.Messages = .init(firstMsgId: nil, lastMsgId: nil, messageCount: 0, messages: []) + @Revision var selectedCountry: Model.Country? + @Revision var selectedSortType: Model.ListType = .recent + @Revision var messages: Model.Messages = .init( + firstMsgId: nil, + lastMsgId: nil, + messageCount: 0, + messages: [] + ) var isRefreshing: Bool = false var isLoading: Bool = false var isAnimating: Bool = false @@ -53,53 +61,69 @@ final class DiscoverReactor: Reactor { switch action { case .viewWillAppear: return .merge( - Network.request(Message.API.MessageCount(countryCode: currentState.selectedCountry?.code)) - .filterNil() - .map { Mutation.setMessageCount($0.messageCount) }, - Network.request(Message.API.Messages( - countryCode: currentState.selectedCountry?.code, - lastMsgId: nil, - type: .recent - )) + Network.request( + API.MessageCount( + countryCode: currentState.selectedCountry?.code + ) + ) .filterNil() - .map{ Mutation.setMessages(result: $0) } + .map { Mutation.setMessageCount($0.messageCount) }, + Network.request( + API.Messages( + countryCode: currentState.selectedCountry?.code, + lastMsgId: nil, + type: .recent + ) + ) + .filterNil() + .map { Mutation.setMessages(result: $0) } ) case let .countryDidChanged(country): return .merge( - Network.request(Message.API.MessageCount(countryCode: country?.code)) - .filterNil() - .map { .setMessageCount($0.messageCount) }, + Network.request( + API.MessageCount( + countryCode: country?.code + ) + ) + .filterNil() + .map { .setMessageCount($0.messageCount) }, .concat( .just(.setCountry(country: country)), .just(.setLoading(true)), - Network.request( - Message.API.Messages( - countryCode: country?.code, - lastMsgId: nil, - type: currentState.selectedSortType) + Network.request( + API.Messages( + countryCode: country?.code, + lastMsgId: nil, + type: currentState.selectedSortType ) - .filterNil() - .map{ Mutation.setMessages(result: $0) }, + ) + .filterNil() + .map{ Mutation.setMessages(result: $0) }, .just(.setLoading(false)) ) ) case let .sortTypeDidChanged(sortType: sortType) : return .merge( - Network.request(Message.API.MessageCount(countryCode: currentState.selectedCountry?.code)) - .filterNil() - .map { .setMessageCount($0.messageCount) }, + Network.request( + API.MessageCount( + countryCode: currentState.selectedCountry?.code + ) + ) + .filterNil() + .map { .setMessageCount($0.messageCount) }, .concat( .just(.setCurrentSortType(sortType ?? .recent)), .just(.setLoading(true)), - Network.request( - Message.API.Messages( - countryCode: currentState.selectedCountry?.code, - lastMsgId: nil, - type: sortType ?? .recent) + Network.request( + API.Messages( + countryCode: currentState.selectedCountry?.code, + lastMsgId: nil, + type: sortType ?? .recent ) - .filterNil() - .map{ Mutation.setMessages(result: $0) }, + ) + .filterNil() + .map{ Mutation.setMessages(result: $0) }, .just(.setLoading(false)) ) ) @@ -113,9 +137,15 @@ final class DiscoverReactor: Reactor { guard !currentState.isLoading else { return .empty() } return Observable.concat([ .just(.setLoading(true)), - Network.request(Message.API.Messages(countryCode: currentState.selectedCountry?.code, lastMsgId: currentState.messages.lastMsgId, type: currentState.selectedSortType)) - .filterNil() - .map{ .addMessages(result: $0) }, + Network.request( + API.Messages( + countryCode: currentState.selectedCountry?.code, + lastMsgId: currentState.messages.lastMsgId, + type: currentState.selectedSortType + ) + ) + .filterNil() + .map { .addMessages(result: $0) }, .just(.setLoading(false)) ]) @@ -135,7 +165,12 @@ final class DiscoverReactor: Reactor { newState.isRefreshing = flag case let .addMessages(result: results): - newState.messages = Message.Model.Messages(firstMsgId: state.messages.firstMsgId, lastMsgId: results.lastMsgId, messageCount: state.messageCount + results.messageCount, messages: currentState.messages.messages + results.messages) + newState.messages = Model.Messages( + firstMsgId: state.messages.firstMsgId, + lastMsgId: results.lastMsgId, + messageCount: state.messageCount + results.messageCount, + messages: currentState.messages.messages + results.messages + ) case let .setCountry(country: country): newState.selectedCountry = country @@ -148,8 +183,9 @@ final class DiscoverReactor: Reactor { case let .setMessageCount(count): newState.messageCount = count + case let .setCurrentSortType(type): - newState.selectedSortType = type + newState.selectedSortType = type } return newState } diff --git a/Dear-World/Dear-World/Source/Presentation/Scene/Discover/DiscoverViewController.swift b/Dear-World/Dear-World/Source/Presentation/Scene/Discover/DiscoverViewController.swift index ff2d8ae..cb356d7 100644 --- a/Dear-World/Dear-World/Source/Presentation/Scene/Discover/DiscoverViewController.swift +++ b/Dear-World/Dear-World/Source/Presentation/Scene/Discover/DiscoverViewController.swift @@ -13,6 +13,7 @@ import Then import UIKit final class DiscoverViewController: UIViewController, View { + typealias Model = Message.Model // MARK: 🖼 UI private let messageCountBadgeView: MessageCountBadgeView = MessageCountBadgeView() @@ -149,11 +150,13 @@ final class DiscoverViewController: UIViewController, View { // MARK: 🔗 Bind func bind(reactor: DiscoverReactor) { _ = AllCountries.shared - reactor.action.onNext(.countryDidChanged(country: Message.Model.Country( - code: nil, - fullName: "Whole World", - emojiUnicode: "🍎" - ))) + reactor.action.onNext(.countryDidChanged( + country: Model.Country( + code: nil, + fullName: "Whole World", + emojiUnicode: "🍎", imageURL: nil + ) + )) reactor.state .map(\.messageCount) @@ -174,7 +177,8 @@ final class DiscoverViewController: UIViewController, View { reactor.state .distinctUntilChanged(\.$isPresentAboutPage) .map { $0.isPresentAboutPage } - .subscribe(onNext: { [weak self] in + .filter { $0 } + .subscribe(onNext: { [weak self] _ in let viewController = AboutViewController().then { $0.reactor = AboutReactor() } @@ -197,7 +201,7 @@ final class DiscoverViewController: UIViewController, View { reactor.state .distinctUntilChanged(\.$selectedCountry) .map(\.selectedCountry) - .map{ $0?.fullName } + .map { $0?.fullName } .bind(to: self.countryLabel.rx.text) .disposed(by: self.disposeBag) @@ -233,14 +237,25 @@ final class DiscoverViewController: UIViewController, View { .rx.tapGesture() .throttle(.milliseconds(300), scheduler: MainScheduler.instance) .skip(1) - .flatMap { [weak self] _ -> Observable in - guard let self = self else { return Observable.just(Message.Model.Country(code: "", fullName: "", emojiUnicode: "")) } - return CountrySelectController.selectCountry(presenting: self, disposeBag: self.disposeBag, selected: self.reactor?.currentState.selectedCountry) + .flatMap { [weak self] _ -> Observable in + guard let self = self else { + return Observable.just(Message.Model.Country( + code: "", + fullName: "", + emojiUnicode: "", + imageURL: nil) + ) + } + return CountrySelectController.selectCountry( + presenting: self, + disposeBag: self.disposeBag, + selected: self.reactor?.currentState.selectedCountry + ) } .map { Reactor.Action.countryDidChanged(country: $0) } .bind(to: reactor.action) .disposed(by: self.disposeBag) - + self.aboutButton.rx.tap .throttle(.milliseconds(300), scheduler: MainScheduler.instance) .map { Reactor.Action.tapAbout } @@ -250,11 +265,14 @@ final class DiscoverViewController: UIViewController, View { self.sortView .rx.tapGesture() .throttle(.milliseconds(300), scheduler: MainScheduler.instance) - //MARK: 왜 하날 스킵해야하지? .skip(1) - .flatMap { [weak self] _ -> Observable in - guard let self = self else { return Observable.just(Message.Model.ListType.recent)} - return SortTypeSelectController.select(presenting: self, disposeBag: self.disposeBag, selected: self.reactor?.currentState.selectedSortType) + .flatMap { [weak self] _ -> Observable in + guard let self = self else { return .just(Model.ListType.recent) } + return SortTypeSelectController + .select( + presenting: self, + disposeBag: self.disposeBag, + selected: self.reactor?.currentState.selectedSortType) } .map { Reactor.Action.sortTypeDidChanged(sortType: $0)} .bind(to: reactor.action) @@ -266,7 +284,6 @@ final class DiscoverViewController: UIViewController, View { .map(\.title) .bind(to: self.sortLabel.rx.text) .disposed(by: self.disposeBag) - } } extension DiscoverViewController: UITableViewDelegate, UITableViewDataSource { @@ -305,20 +322,26 @@ extension DiscoverViewController: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as? MessageTableViewCell else { return UITableViewCell() } - cell.do { - let cellMessage = self.messages[indexPath.row] - $0.nameLabel.text = cellMessage.user.nickname - $0.emojiLabel.text = cellMessage.user.emoji.unicode - $0.detailTextView.text = cellMessage.content - $0.likeCount = cellMessage.likeCount - $0.isLike = cellMessage.isLiked - $0.countryLabel.text = cellMessage.user.country.emojiUnicode - $0.messageId = cellMessage.id + cell.do { + let cellMessage = self.messages[indexPath.row] + $0.nameLabel.text = cellMessage.user.nickname + + $0.detailTextView.text = cellMessage.content + $0.likeCount = cellMessage.likeCount + $0.isLike = cellMessage.isLiked + $0.countryLabel.text = cellMessage.user.country.fullName + if let emojiImageURL: URL = URL(string: cellMessage.user.emoji.imageURL) { + $0.emojiImageView.kf.setImage(with: emojiImageURL) } + if let countryImageURL: URL = URL(string: cellMessage.user.country.imageURL) { + $0.countryFlagImageView.kf.setImage(with: countryImageURL) + } + $0.messageId = cellMessage.id + } bindShareButton(button: cell.shareButton) return cell } - + private func bindShareButton(button: UIButton) { button .rx.tap diff --git a/Dear-World/Dear-World/Source/Presentation/Scene/Discover/MessageMock.swift b/Dear-World/Dear-World/Source/Presentation/Scene/Discover/MessageMock.swift deleted file mode 100644 index 6271887..0000000 --- a/Dear-World/Dear-World/Source/Presentation/Scene/Discover/MessageMock.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// MessageMock.swift -// Dear-World -// -// Created by rookie.w on 2020/12/27. -// - -import Foundation -public struct MessageMock: Equatable { - var emoji = "🎅🏻" - var name = "Judy" - var country: String = "🇰🇷" - var countryName: String = "South Korea" - var detail: String = "Hello world, dont worry because you’re strong enough to overcome this corona blue. e end of the day, trust yourself. more" - var likes: Int = 10 -} diff --git a/Dear-World/Dear-World/Source/Presentation/Scene/Main/Message.Model.Messages.swift b/Dear-World/Dear-World/Source/Presentation/Scene/Main/Message.Model.Messages.swift index ceca7cb..73d91f0 100644 --- a/Dear-World/Dear-World/Source/Presentation/Scene/Main/Message.Model.Messages.swift +++ b/Dear-World/Dear-World/Source/Presentation/Scene/Main/Message.Model.Messages.swift @@ -45,8 +45,15 @@ extension Message.Model { let country: Country let nickname: String let emoji: Emoji + struct Emoji: Decodable { let unicode: String + let imageURL: String + + enum CodingKeys: String, CodingKey { + case unicode + case imageURL = "imageUrl" + } } } @@ -54,6 +61,14 @@ extension Message.Model { let code: String? let fullName: String let emojiUnicode: String? + let imageURL: String? + + enum CodingKeys: String, CodingKey { + case code + case fullName + case emojiUnicode + case imageURL = "imageUrl" + } } enum ListType: String, CaseIterable { diff --git a/Dear-World/Dear-World/Source/Presentation/Scene/Send Message/SendMessageReactor.swift b/Dear-World/Dear-World/Source/Presentation/Scene/Send Message/SendMessageReactor.swift index 982f8d0..eef323b 100644 --- a/Dear-World/Dear-World/Source/Presentation/Scene/Send Message/SendMessageReactor.swift +++ b/Dear-World/Dear-World/Source/Presentation/Scene/Send Message/SendMessageReactor.swift @@ -22,32 +22,36 @@ final class SendMessageReactor: Reactor { case typeName(String) case typeMessage(String) case tapSendMessage - case confirmAlert + case confirmSendAlert + case confirmCancelAlert case countryDidChange(Model.Country) } enum Mutation { case setEmojiId(Int) - case setEmoji(String) + case setEmojiURL(String) case setName(String) case setMessage(String) case setPresent(Bool) - case setPresentAlert(Bool) + case setPresentSendAlert(Bool) + case setPresentCancelAlert(Bool) case setCountry(Model.Country) } struct State: Then { @Revision var isPresented: Bool = true - @Revision var isPresentAlert: Bool = false - var emoji: String = "👽" + @Revision var isPresentSendAlert: Bool = false + @Revision var isPresentCancelAlert: Bool = false + @Revision var selectedCountry: Model.Country? + var emojiURL: String? + var emojiIsLoading: Bool = true var canSendMessage: Bool = false var name: String = "" var message: String = "" var nameStatusMessage: NSAttributedString = NSAttributedString(string: "0/15") var messageLimitGauge: Float = 0.0 var messageStatusMessage: NSAttributedString = NSAttributedString(string: "0/300") - @Revision var selectedCountry: Model.Country? - fileprivate var emojiId: Int = 21 + fileprivate var emojiId: Int? fileprivate let nameCountLimit: Int = 15 fileprivate let messageCountLimit: Int = 300 } @@ -77,15 +81,15 @@ final class SendMessageReactor: Reactor { return .empty() case .tapClose: - return .just(.setPresent(false)) + return .just(.setPresentCancelAlert(true)) case .tapRefresh: return Network.request(Emoji.API.Random()) .filterNil() .flatMap { Observable.from([ - .setEmojiId($0.id), - .setEmoji($0.unicode) + .setEmojiId($0.id ?? 0), + .setEmojiURL($0.imageURL) ]) } @@ -96,22 +100,27 @@ final class SendMessageReactor: Reactor { return .just(.setMessage(message)) case .tapSendMessage: - return .just(.setPresentAlert(true)) + return .just(.setPresentSendAlert(true)) - case .confirmAlert: - let api: API.SendMessage = API.SendMessage( - countryCode: "KR", - emojiId: currentState.emojiId, - name: currentState.name, - message: currentState.message - ) + case .confirmSendAlert: + guard let emojiId = currentState.emojiId else { return .empty() } return .concat( - Network.request(api) - .filterNil() - .flatMap { _ in Observable.empty() }, + Network.request( + API.SendMessage( + countryCode: "KR", + emojiId: emojiId, + name: currentState.name, + message: currentState.message + ) + ) + .filterNil() + .flatMap { _ in Observable.empty() }, .just(.setPresent(false)) ) + case .confirmCancelAlert: + return .just(.setPresent(false)) + case .countryDidChange(let country): return .just(.setCountry(country)) } @@ -126,14 +135,14 @@ final class SendMessageReactor: Reactor { $0.isPresented = isPresented } - case .setPresentAlert(let isPresentAlert): + case .setPresentSendAlert(let isPresentSendAlert): newState = state.with { - $0.isPresentAlert = isPresentAlert + $0.isPresentSendAlert = isPresentSendAlert } - case .setEmoji(let emoji): + case .setPresentCancelAlert(let isPresentCancelAlert): newState = state.with { - $0.emoji = emoji + $0.isPresentCancelAlert = isPresentCancelAlert } case .setName(let name): @@ -164,11 +173,17 @@ final class SendMessageReactor: Reactor { } case .setEmojiId(let id): - newState = state.with { $0.emojiId = id } + newState = state.with { + $0.emojiId = id + } + + case .setEmojiURL(let emojiURL): + newState = state.with { + $0.emojiURL = emojiURL + } case .setCountry(let country): newState = state.with { $0.selectedCountry = country } - } return newState } diff --git a/Dear-World/Dear-World/Source/Presentation/Scene/Send Message/SendMessageViewController.swift b/Dear-World/Dear-World/Source/Presentation/Scene/Send Message/SendMessageViewController.swift index e2c019c..9ff5e26 100644 --- a/Dear-World/Dear-World/Source/Presentation/Scene/Send Message/SendMessageViewController.swift +++ b/Dear-World/Dear-World/Source/Presentation/Scene/Send Message/SendMessageViewController.swift @@ -11,6 +11,7 @@ import RxKeyboard import RxOptional import RxSwift import UIKit +import Kingfisher import UITextView_Placeholder final class SendMessageViewController: UIViewController, View { @@ -23,7 +24,7 @@ final class SendMessageViewController: UIViewController, View { private let titleLabel: UILabel = UILabel() private let sendButton: UIButton = UIButton() private let selectCountryView: SelectCountryView = SelectCountryView() - private let emojiLabel: UILabel = UILabel() + private let emojiImageView: UIImageView = UIImageView() private let refreshButton: UIButton = UIButton() private let nameTextField: UITextField = UITextField() private let nameCountLabel: UILabel = UILabel() @@ -47,7 +48,7 @@ final class SendMessageViewController: UIViewController, View { override func viewDidLoad() { super.viewDidLoad() - setupUI() + setupUI() } // MARK: 🔗 Bind @@ -103,17 +104,24 @@ final class SendMessageViewController: UIViewController, View { .bind(to: selectCountryView.titleLabel.rx.text) .disposed(by: disposeBag) - reactor.state.map(\.isPresented) + reactor.state + .distinctUntilChanged(\.$isPresented) + .map(\.isPresented) .map { !$0 } + .delay(.milliseconds(300), scheduler: MainScheduler.instance) .subscribe(onNext: { [weak self] willDismiss in guard willDismiss else { return } self?.dismiss(animated: true, completion: nil) }) .disposed(by: disposeBag) - reactor.state.map(\.emoji) + reactor.state.map(\.emojiURL) + .map { URL(string: $0) } + .filterNil() .distinctUntilChanged() - .bind(to: emojiLabel.rx.text) + .subscribe { [weak self] in + self?.emojiImageView.kf.setImage(with: $0) + } .disposed(by: disposeBag) reactor.state.map(\.canSendMessage) @@ -133,25 +141,29 @@ final class SendMessageViewController: UIViewController, View { .bind(to: nameCountLabel.rx.attributedText) .disposed(by: disposeBag) - reactor.state.map(\.message) + reactor.state + .map(\.message) .filter { [weak self] message in self?.messageTextView.text != message } .bind(to: messageTextView.rx.text) .disposed(by: disposeBag) - reactor.state.map(\.messageLimitGauge) + reactor.state + .map(\.messageLimitGauge) .distinctUntilChanged() .bind(to: messageLimitGaugeBar.rx.progress) .disposed(by: disposeBag) - reactor.state.map(\.messageStatusMessage) + reactor.state + .map(\.messageStatusMessage) .distinctUntilChanged() .bind(to: messageStatusMessageLabel.rx.attributedText) .disposed(by: disposeBag) - reactor.state.distinctUntilChanged(\.$isPresentAlert) - .map { $0.isPresentAlert } + reactor.state + .distinctUntilChanged(\.$isPresentSendAlert) + .map { $0.isPresentSendAlert } .filter { $0 } .subscribe(onNext: { [weak self] _ in guard let self = self else { return } @@ -161,7 +173,27 @@ final class SendMessageViewController: UIViewController, View { ) viewController.modalPresentationStyle = .overFullScreen viewController.answer() - .map { _ in Action.confirmAlert } + .map { _ in Action.confirmSendAlert } + .bind(to: reactor.action) + .disposed(by: self.disposeBag) + self.present(viewController, animated: true, completion: nil) + }) + .disposed(by: disposeBag) + + reactor.state + .distinctUntilChanged(\.$isPresentCancelAlert) + .map { $0.isPresentCancelAlert } + .filter { $0 } + .subscribe(onNext: { [weak self] _ in + guard let self = self else { return } + let viewController = DWAlertViewController( + title: "Wanna stop writting?", + message: "Your writting will be deleted." + ) + viewController.modalPresentationStyle = .overFullScreen + viewController.answer() + .filter { $0 } + .map { _ in Action.confirmCancelAlert } .bind(to: reactor.action) .disposed(by: self.disposeBag) self.present(viewController, animated: true, completion: nil) @@ -169,6 +201,7 @@ final class SendMessageViewController: UIViewController, View { .disposed(by: disposeBag) reactor.action.onNext(.initialize) + reactor.action.onNext(.tapRefresh) } // MARK: 📍 Setup @@ -233,13 +266,10 @@ final class SendMessageViewController: UIViewController, View { $0.width.height.equalTo(80) } - self.view.addSubview(emojiLabel) - emojiLabel.do { - $0.backgroundColor = .grayWhite - $0.font = .systemFont(ofSize: 40) - } - emojiLabel.snp.makeConstraints { + self.view.addSubview(emojiImageView) + emojiImageView.snp.makeConstraints { $0.center.equalTo(profileBackgroundView) + $0.edges.equalTo(profileBackgroundView).inset(18) } self.view.addSubview(refreshButton) @@ -377,9 +407,9 @@ final class SendMessageViewController: UIViewController, View { .disposed(by: disposeBag) RxKeyboard.instance.visibleHeight - .drive(onNext: { [weak self] keyboardHeight in + .drive { [weak self] keyboardHeight in self?.updateBottomBarLayout(with: keyboardHeight) - }) + } .disposed(by: disposeBag) rotateArrowImageViews() diff --git a/Dear-World/Dear-World/Source/Presentation/View/CheerButton.swift b/Dear-World/Dear-World/Source/Presentation/View/CheerButton.swift index d1f5809..f00e29d 100644 --- a/Dear-World/Dear-World/Source/Presentation/View/CheerButton.swift +++ b/Dear-World/Dear-World/Source/Presentation/View/CheerButton.swift @@ -54,11 +54,11 @@ final class CheerUpButton: UIButton { $0.borderColor = UIColor.grayWhite.cgColor } self.addTarget(self, action: #selector(activate), for: .touchDown) + self.addTarget(self, action: #selector(occurHapticFeedback), for: [.touchDown]) self.addTarget(self, action: #selector(deactivate), for: [.touchUpInside, .touchUpOutside, .touchCancel, .touchDragExit]) - self.addTarget(self, action: #selector(occurHapticFeedback), for: [.touchDown]) } @objc diff --git a/Dear-World/Dear-World/Source/Presentation/View/CountrySelectController.swift b/Dear-World/Dear-World/Source/Presentation/View/CountrySelectController.swift index 5d8b52a..4fa2792 100644 --- a/Dear-World/Dear-World/Source/Presentation/View/CountrySelectController.swift +++ b/Dear-World/Dear-World/Source/Presentation/View/CountrySelectController.swift @@ -143,7 +143,12 @@ public final class CountrySelectController: UIViewController { self.wholeWorldButton .rx.tap .subscribe(onNext: { [weak self] in - self?.selectedCountry = .init(code: nil, fullName: "Whole world", emojiUnicode: "🍎") + self?.selectedCountry = .init( + code: nil, + fullName: "Whole world", + emojiUnicode: "🍎", + imageURL: nil + ) self?.willMove(toParent: nil) }) .disposed(by: self.disposeBag) diff --git a/Dear-World/Dear-World/Source/Presentation/View/DWAlertViewController.swift b/Dear-World/Dear-World/Source/Presentation/View/DWAlertViewController.swift index 8610869..95ce433 100644 --- a/Dear-World/Dear-World/Source/Presentation/View/DWAlertViewController.swift +++ b/Dear-World/Dear-World/Source/Presentation/View/DWAlertViewController.swift @@ -111,18 +111,18 @@ final class DWAlertViewController: UIViewController { } } - func answer() -> Observable { Observable.create { [weak self] observer in guard let self = self else { return Disposables.create() } Observable.merge( self.okButton.rx.tap.map { _ in true }, self.cancelButton.rx.tap.map { _ in false } - ).throttle(.milliseconds(300), scheduler: MainScheduler.instance) + ) + .throttle(.milliseconds(300), scheduler: MainScheduler.instance) .subscribe(onNext: { [weak self] in observer.onNext($0) - observer.onCompleted() self?.dismiss(animated: true, completion: nil) + observer.onCompleted() }) .disposed(by: self.disposeBag) diff --git a/Dear-World/Dear-World/Support File/Info.plist b/Dear-World/Dear-World/Support File/Info.plist index 587e8fe..e07941b 100644 --- a/Dear-World/Dear-World/Support File/Info.plist +++ b/Dear-World/Dear-World/Support File/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.0 + $(MARKETING_VERSION) CFBundleVersion 1 LSRequiresIPhoneOS