Skip to content

Commit

Permalink
🐛 Send Message Close Alert 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
O-O-wl committed Jan 10, 2021
1 parent f06e01d commit 863984c
Show file tree
Hide file tree
Showing 11 changed files with 131 additions and 70 deletions.
2 changes: 2 additions & 0 deletions Dear-World/Dear-World.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1057,6 +1057,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.0;
OTHER_LDFLAGS = "-ObjC";
PRODUCT_BUNDLE_IDENTIFIER = "com.OFU.Dear-World";
PRODUCT_NAME = "$(TARGET_NAME)";
Expand All @@ -1079,6 +1080,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.0;
OTHER_LDFLAGS = "-ObjC";
PRODUCT_BUNDLE_IDENTIFIER = "com.OFU.Dear-World";
PRODUCT_NAME = "$(TARGET_NAME)";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ final class AboutReactor: Reactor {
switch action {
case .initalize:
return .empty()

case .tapCrewInfo:
return .just(.setPresentCrewInfo(true))

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,8 @@ final class RankerTableViewCell: UITableViewCell {
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)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
//

import Foundation
import RxOptional
import ReactorKit
import RxOptional

final class DiscoverReactor: Reactor {
enum Action {
Expand All @@ -33,7 +33,10 @@ final class DiscoverReactor: Reactor {
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 messages: Message.Model.Messages = .init(firstMsgId: nil,
lastMsgId: nil,
messageCount: 0,
messages: [])
var isRefreshing: Bool = false
var isLoading: Bool = false
var isAnimating: Bool = false
Expand All @@ -52,37 +55,44 @@ 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(Message.API.MessageCount(
countryCode: currentState.selectedCountry?.code
))
.filterNil()
.map{ Mutation.setMessages(result: $0) }
.map { Mutation.setMessageCount($0.messageCount) },
Network.request(
Message.API.Messages(
countryCode: currentState.selectedCountry?.code,
lastMsgId: nil,
type: .recent
)
)
.filterNil()
.map { Mutation.setMessages(result: $0) }
)

case let .countryDidChanged(country, sortType):
return .merge(
Network.request(Message.API.MessageCount(countryCode: country?.code))
.filterNil()
.map { Mutation.setMessageCount($0.messageCount) },
.concat(
.just(.setCountry(country: country)),
.just(.setCurrentSortType(sortType)),
.just(.setLoading(true)),
Network.request(
Message.API.Messages(
countryCode: country?.code,
lastMsgId: nil,
type: sortType ?? currentState.selectedSortType)
)
.filterNil()
.map{ Mutation.setMessages(result: $0) },
.just(.setLoading(false))
Network.request(
Message.API.MessageCount(
countryCode: country?.code
)
)
.filterNil()
.map { Mutation.setMessageCount($0.messageCount) },
.just(.setCountry(country: country)),
.just(.setCurrentSortType(sortType)),
.just(.setLoading(true)),
Network.request(
Message.API.Messages(
countryCode: country?.code,
lastMsgId: nil,
type: sortType ?? currentState.selectedSortType
)
)
.filterNil()
.map { Mutation.setMessages(result: $0) },
.just(.setLoading(false))
)

case .refresh:
Expand All @@ -95,9 +105,15 @@ final class DiscoverReactor: Reactor {
guard !currentState.isLoading else { return .empty() }
return Observable<Mutation>.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(
Message.API.Messages(
countryCode: currentState.selectedCountry?.code,
lastMsgId: currentState.messages.lastMsgId,
type: currentState.selectedSortType
)
)
.filterNil()
.map { .addMessages(result: $0) },
.just(.setLoading(false))
])

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,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()
}
Expand All @@ -132,7 +133,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)

Expand Down Expand Up @@ -179,11 +180,14 @@ final class DiscoverViewController: UIViewController, View {
self.sortView
.rx.tapGesture()
.throttle(.milliseconds(300), scheduler: MainScheduler.instance)
//MARK: 왜 하날 스킵해야하지?
.skip(1)
.flatMap { [weak self] _ -> Observable<Message.Model.ListType> 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)
guard let self = self else { return .just(Message.Model.ListType.recent) }
return SortTypeSelectController
.select(
presenting: self,
disposeBag: self.disposeBag,
selected: self.reactor?.currentState.selectedSortType)
}
.map { Reactor.Action.countryDidChanged(country: reactor.currentState.selectedCountry, sortType: $0)}
.bind(to: reactor.action)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ final class SendMessageReactor: Reactor {
case typeName(String)
case typeMessage(String)
case tapSendMessage
case confirmAlert
case confirmSendAlert
case confirmCancelAlert
case countryDidChange(Model.Country)
}

Expand All @@ -32,21 +33,23 @@ final class SendMessageReactor: Reactor {
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
@Revision var isPresentSendAlert: Bool = false
@Revision var isPresentCancelAlert: Bool = false
@Revision var selectedCountry: Model.Country?
var emoji: String = "👽"
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 let nameCountLimit: Int = 15
fileprivate let messageCountLimit: Int = 300
Expand Down Expand Up @@ -77,7 +80,7 @@ final class SendMessageReactor: Reactor {
return .empty()

case .tapClose:
return .just(.setPresent(false))
return .just(.setPresentCancelAlert(true))

case .tapRefresh:
return Network.request(Emoji.API.Random())
Expand All @@ -96,22 +99,26 @@ 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:
return .concat(
Network.request(api)
.filterNil()
.flatMap { _ in Observable<Mutation>.empty() },
Network.request(
API.SendMessage(
countryCode: "KR",
emojiId: currentState.emojiId,
name: currentState.name,
message: currentState.message
)
)
.filterNil()
.flatMap { _ in Observable<Mutation>.empty() },
.just(.setPresent(false))
)

case .confirmCancelAlert:
return .just(.setPresent(false))

case .countryDidChange(let country):
return .just(.setCountry(country))
}
Expand All @@ -126,9 +133,14 @@ final class SendMessageReactor: Reactor {
$0.isPresented = isPresented
}

case .setPresentAlert(let isPresentAlert):
case .setPresentSendAlert(let isPresentSendAlert):
newState = state.with {
$0.isPresentSendAlert = isPresentSendAlert
}

case .setPresentCancelAlert(let isPresentCancelAlert):
newState = state.with {
$0.isPresentAlert = isPresentAlert
$0.isPresentCancelAlert = isPresentCancelAlert
}

case .setEmoji(let emoji):
Expand Down Expand Up @@ -168,7 +180,6 @@ final class SendMessageReactor: Reactor {

case .setCountry(let country):
newState = state.with { $0.selectedCountry = country }

}
return newState
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ final class SendMessageViewController: UIViewController, View {
override func viewDidLoad() {
super.viewDidLoad()

setupUI()
setupUI()
}

// MARK: 🔗 Bind
Expand Down Expand Up @@ -103,8 +103,11 @@ 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)
Expand Down Expand Up @@ -133,25 +136,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 }
Expand All @@ -161,7 +168,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)
Expand Down
Loading

0 comments on commit 863984c

Please sign in to comment.