From 63aa482862d45993868ad85bf586c9627b06355f Mon Sep 17 00:00:00 2001 From: hogumachu Date: Tue, 23 Jan 2024 12:15:15 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20Search=20refresh=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/SearchPresentation/SearchReactor.swift | 14 ++++++++++++-- .../SearchPresentation/SearchViewController.swift | 13 +++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/InMyMemory/Presentation/Sources/SearchPresentation/SearchReactor.swift b/InMyMemory/Presentation/Sources/SearchPresentation/SearchReactor.swift index 765982e..24e8bf2 100644 --- a/InMyMemory/Presentation/Sources/SearchPresentation/SearchReactor.swift +++ b/InMyMemory/Presentation/Sources/SearchPresentation/SearchReactor.swift @@ -18,18 +18,21 @@ import Then final class SearchReactor: Reactor, Stepper { enum Action { - case search(String) + case search + case updateKeyword(String?) case closeDidTap case itemDidTap(IndexPath) } struct State { + var keyword: String? var isLoading: Bool = false var isEmpty: Bool = true var sections: [SearchSection] = [] } enum Mutation { + case setKeyword(String?) case setLoading(Bool) case setSections([Memory], [Emotion], [Todo]) } @@ -53,13 +56,17 @@ final class SearchReactor: Reactor, Stepper { func mutate(action: Action) -> Observable { switch action { - case .search(let keyword): + case .search: + guard let keyword = currentState.keyword else { return .empty() } return .concat([ .just(.setLoading(true)), search(keyword: keyword), .just(.setLoading(false)) ]) + case .updateKeyword(let keyword): + return .just(.setKeyword(keyword)) + case .closeDidTap: steps.accept(AppStep.searchIsComplete) return .empty() @@ -85,6 +92,9 @@ final class SearchReactor: Reactor, Stepper { func reduce(state: State, mutation: Mutation) -> State { var newState = state switch mutation { + case .setKeyword(let keyword): + newState.keyword = keyword + case .setLoading(let isLoading): newState.isLoading = isLoading diff --git a/InMyMemory/Presentation/Sources/SearchPresentation/SearchViewController.swift b/InMyMemory/Presentation/Sources/SearchPresentation/SearchViewController.swift index dd8e504..d4ec395 100644 --- a/InMyMemory/Presentation/Sources/SearchPresentation/SearchViewController.swift +++ b/InMyMemory/Presentation/Sources/SearchPresentation/SearchViewController.swift @@ -81,19 +81,28 @@ final class SearchViewController: BaseViewController { } override func bind(reactor: SearchReactor) { - bindAction(reactor) bindState(reactor) + bindAction(reactor) bindETC(reactor) } + override func refresh() { + reactor?.action.onNext(.search) + } + private func bindAction(_ reactor: SearchReactor) { navigationView.rx.leftButtonDidTap .map { Reactor.Action.closeDidTap } .bind(to: reactor.action) .disposed(by: disposeBag) + searchInputView.rx.text + .map { Reactor.Action.updateKeyword($0) } + .bind(to: reactor.action) + .disposed(by: disposeBag) + searchInputView.rx.searchDidTap - .map { Reactor.Action.search($0) } + .map { _ in Reactor.Action.search } .bind(to: reactor.action) .disposed(by: disposeBag)