From 4f016134a02a781c015efa9ed0775ffab10bf25d Mon Sep 17 00:00:00 2001 From: Hamp Date: Tue, 7 May 2024 23:09:46 +0900 Subject: [PATCH 01/13] =?UTF-8?q?:recycle:=20::=20AfterVC=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=EC=A4=91..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/AfterSearchComponent.swift | 2 +- .../Sources/Reactors/AfterSearchReactor.swift | 103 +++++++++ .../AfterSearchContentViewController.swift | 32 +-- .../AfterSearchViewController.swift | 197 ++++++++++-------- .../SearchViewController.swift | 13 +- 5 files changed, 243 insertions(+), 104 deletions(-) create mode 100644 Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift diff --git a/Projects/Features/SearchFeature/Sources/Components/AfterSearchComponent.swift b/Projects/Features/SearchFeature/Sources/Components/AfterSearchComponent.swift index e44dc89b5..91d3cb97d 100644 --- a/Projects/Features/SearchFeature/Sources/Components/AfterSearchComponent.swift +++ b/Projects/Features/SearchFeature/Sources/Components/AfterSearchComponent.swift @@ -15,7 +15,7 @@ public final class AfterSearchComponent: Component { return AfterSearchViewController.viewController( afterSearchContentComponent: dependency.afterSearchContentComponent, containSongsFactory: dependency.containSongsFactory, - viewModel: .init(fetchSearchSongUseCase: dependency.fetchSearchSongUseCase) + reactor: .init(fetchSearchSongUseCase: dependency.fetchSearchSongUseCase) ) } } diff --git a/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift b/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift new file mode 100644 index 000000000..c1f5c496d --- /dev/null +++ b/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift @@ -0,0 +1,103 @@ +import Foundation +import ReactorKit +import RxSwift +import SongsDomainInterface +import LogManager + +public final class AfterSearchReactor: Reactor { + + var disposeBag: DisposeBag = DisposeBag() + var fetchSearchSongUseCase: FetchSearchSongUseCase + + public enum Action { + case fetchData(String) + } + + public enum Mutation { + case fetchData([[SearchSectionModel]]) + } + + public struct State { + var dataSource: [[SearchSectionModel]] + var text: String + } + + public var initialState: State + + init(fetchSearchSongUseCase: FetchSearchSongUseCase) { + self.fetchSearchSongUseCase = fetchSearchSongUseCase + self.initialState = State( + dataSource: [], + text: "" + ) + } + + deinit { + LogManager.printDebug("\(Self.self)") + } + + public func reduce(state: State, mutation: Mutation) -> State { + + var newState = state + + switch mutation { + + case let .fetchData(data): + newState.dataSource = data + } + + return newState + } + + public func mutate(action: Action) -> Observable { + + switch action { + + case let .fetchData(text): + return fetchData(text) + } + + } +} + +extension AfterSearchReactor { + func fetchData(_ text: String) -> Observable { + + return fetchSearchSongUseCase + .execute(keyword: text) + .asObservable() + .map { res in + + let r1 = res.song + let r2 = res.artist + let r3 = res.remix + + let limitCount: Int = 3 + + let all: [SearchSectionModel] = [ + SearchSectionModel( + model: (.song, r1.count), + items: r1.count > limitCount ? Array(r1[0 ... limitCount - 1]) : r1 + ), + SearchSectionModel( + model: (.artist, r2.count), + items: r2.count > limitCount ? Array(r2[0 ... limitCount - 1]) : r2 + ), + SearchSectionModel( + model: (.remix, r3.count), + items: r3.count > limitCount ? Array(r3[0 ... limitCount - 1]) : r3 + ) + ] + + var results: [[SearchSectionModel]] = [] + results.append(all) + results.append([SearchSectionModel(model: (.song, r1.count), items: r1)]) + results.append([SearchSectionModel(model: (.artist, r2.count), items: r2)]) + results.append([SearchSectionModel(model: (.remix, r3.count), items: r3)]) + + return results + } + .map{ Mutation.fetchData($0) } + + } +} diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchContentViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchContentViewController.swift index 38a4278ed..6167ae2fe 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchContentViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchContentViewController.swift @@ -84,7 +84,7 @@ extension AfterSearchContentViewController { return } self.input.deSelectedAllSongs.accept(()) - parent.output.songEntityOfSelectedSongs.accept([]) + // parent.output.songEntityOfSelectedSongs.accept([]) }).disposed(by: disposeBag) } @@ -92,21 +92,21 @@ extension AfterSearchContentViewController { guard let parent = self.parent?.parent as? AfterSearchViewController else { return } - let entities = parent.output.songEntityOfSelectedSongs.value - let models = output.dataSource.value - - let indexPaths = entities.map { entity -> IndexPath? in - var indexPath: IndexPath? - - models.enumerated().forEach { section, model in - if let row = model.items.firstIndex(where: { $0 == entity }) { - indexPath = IndexPath(row: row, section: section) - } - } - return indexPath - }.compactMap { $0 } - - input.mandatoryLoadIndexPath.accept(indexPaths) +// let entities = parent.output.songEntityOfSelectedSongs.value +// let models = output.dataSource.value +// +// let indexPaths = entities.map { entity -> IndexPath? in +// var indexPath: IndexPath? +// +// models.enumerated().forEach { section, model in +// if let row = model.items.firstIndex(where: { $0 == entity }) { +// indexPath = IndexPath(row: row, section: section) +// } +// } +// return indexPath +// }.compactMap { $0 } + +// input.mandatoryLoadIndexPath.accept(indexPaths) } private func configureUI() { diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift index 71749fa1f..7d61af5ff 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift @@ -8,16 +8,19 @@ import SongsDomainInterface import Tabman import UIKit import Utility +import ReactorKit -public final class AfterSearchViewController: TabmanViewController, ViewControllerFromStoryBoard, SongCartViewType { + +public final class AfterSearchViewController: TabmanViewController, ViewControllerFromStoryBoard, StoryboardView, SongCartViewType { @IBOutlet weak var tabBarView: UIView! @IBOutlet weak var fakeView: UIView! @IBOutlet weak var indicator: NVActivityIndicatorView! - var viewModel: AfterSearchViewModel! var afterSearchContentComponent: AfterSearchContentComponent! var containSongsFactory: ContainSongsFactory! - let disposeBag = DisposeBag() + public var disposeBag = DisposeBag() + + private var viewControllers: [UIViewController] = [ UIViewController(), @@ -25,8 +28,6 @@ public final class AfterSearchViewController: TabmanViewController, ViewControll UIViewController(), UIViewController() ] - lazy var input = AfterSearchViewModel.Input() - lazy var output = viewModel.transform(from: input) public var songCartView: SongCartView! public var bottomSheetView: BottomSheetView! @@ -35,32 +36,77 @@ public final class AfterSearchViewController: TabmanViewController, ViewControll override public func viewDidLoad() { super.viewDidLoad() configureUI() - bindRx() } override public func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.scrollToPage(.at(index: 0), animated: false) + self.indicator.startAnimating() } public static func viewController( afterSearchContentComponent: AfterSearchContentComponent, containSongsFactory: ContainSongsFactory, - viewModel: AfterSearchViewModel + reactor: AfterSearchReactor ) -> AfterSearchViewController { let viewController = AfterSearchViewController.viewController(storyBoardName: "Search", bundle: Bundle.module) - viewController.viewModel = viewModel viewController.afterSearchContentComponent = afterSearchContentComponent viewController.containSongsFactory = containSongsFactory + viewController.reactor = reactor return viewController } deinit { DEBUG_LOG("❌ \(Self.self)") } + + public func bind(reactor: AfterSearchReactor) { + bindState(reacotr: reactor) + bindAction(reactor: reactor) + + } } extension AfterSearchViewController { + + func bindState(reacotr: AfterSearchReactor) { + + let currentState = reacotr.state.share(replay:2) + + //TODO: Content쪽 tableView처리 + currentState.map(\.dataSource) + .withUnretained(self) + .bind(onNext: { (owner,dataSource) in + + guard let comp = owner.afterSearchContentComponent else { + return + } + + if dataSource.isEmpty { + return + } + + + owner.viewControllers = [ + comp.makeView(type: .all, dataSource: dataSource[0]), + comp.makeView(type: .song, dataSource: dataSource[1]), + comp.makeView(type: .artist, dataSource: dataSource[2]), + comp.makeView(type: .remix, dataSource: dataSource[3]) + ] + owner.indicator.stopAnimating() + owner.reloadData() + }) + .disposed(by: disposeBag) + + } + + func bindAction(reactor: AfterSearchReactor) { + + + + } + + private func configureUI() { self.fakeView.backgroundColor = DesignSystemAsset.GrayColor.gray100.color self.indicator.type = .circleStrokeSpin @@ -96,69 +142,50 @@ extension AfterSearchViewController { ) } - private func bindRx() { - output.dataSource - .skip(1) - .subscribe(onNext: { [weak self] result in - guard let self = self else { - return - } - guard let comp = self.afterSearchContentComponent else { - return - } - self.viewControllers = [ - comp.makeView(type: .all, dataSource: result[0]), - comp.makeView(type: .song, dataSource: result[1]), - comp.makeView(type: .artist, dataSource: result[2]), - comp.makeView(type: .remix, dataSource: result[3]) - ] - self.indicator.stopAnimating() - self.reloadData() - }) - .disposed(by: disposeBag) - - output.isFetchStart - .subscribe(onNext: { [weak self] _ in - guard let self = self else { - return - } - self.indicator.startAnimating() - guard let child = self.viewControllers.first as? AfterSearchContentViewController else { - return - } - child.tableView.isHidden = true // 검색 시작 시 테이블 뷰 숨김 - }) - .disposed(by: disposeBag) +// private func bindRx() { +// +// output.isFetchStart +// .subscribe(onNext: { [weak self] _ in +// guard let self = self else { +// return +// } +// self.indicator.startAnimating() +// guard let child = self.viewControllers.first as? AfterSearchContentViewController else { +// return +// } +// child.tableView.isHidden = true // 검색 시작 시 테이블 뷰 숨김 +// }) +// .disposed(by: disposeBag) +// +// output.songEntityOfSelectedSongs +// .skip(1) +// .subscribe(onNext: { [weak self] (songs: [SongEntity]) in +// guard let self = self else { return } +// if !songs.isEmpty { +// self.showSongCart( +// in: self.view, +// type: .searchSong, +// selectedSongCount: songs.count, +// totalSongCount: 100, +// useBottomSpace: false +// ) +// self.songCartView.delegate = self +// } else { +// self.hideSongCart() +// } +// }) +// .disposed(by: disposeBag) +// } - output.songEntityOfSelectedSongs - .skip(1) - .subscribe(onNext: { [weak self] (songs: [SongEntity]) in - guard let self = self else { return } - if !songs.isEmpty { - self.showSongCart( - in: self.view, - type: .searchSong, - selectedSongCount: songs.count, - totalSongCount: 100, - useBottomSpace: false - ) - self.songCartView.delegate = self - } else { - self.hideSongCart() - } - }) - .disposed(by: disposeBag) - } - - func clearSongCart() { - self.output.songEntityOfSelectedSongs.accept([]) - self.viewControllers.forEach { vc in - guard let afterContentVc = vc as? AfterSearchContentViewController else { - return - } - afterContentVc.input.deSelectedAllSongs.accept(()) - } - } +// func clearSongCart() { +// self.output.songEntityOfSelectedSongs.accept([]) +// self.viewControllers.forEach { vc in +// guard let afterContentVc = vc as? AfterSearchContentViewController else { +// return +// } +// afterContentVc.input.deSelectedAllSongs.accept(()) +// } +// } } extension AfterSearchViewController: PageboyViewControllerDataSource, TMBarDataSource { @@ -202,23 +229,25 @@ extension AfterSearchViewController: SongCartViewDelegate { return case .addSong: - let songs: [String] = output.songEntityOfSelectedSongs.value.map { $0.id } - let viewController = containSongsFactory.makeView(songs: songs) - viewController.modalPresentationStyle = .overFullScreen - self.present(viewController, animated: true) { [weak self] in - guard let self = self else { return } - self.clearSongCart() - } +// let songs: [String] = output.songEntityOfSelectedSongs.value.map { $0.id } +// let viewController = containSongsFactory.makeView(songs: songs) +// viewController.modalPresentationStyle = .overFullScreen +// self.present(viewController, animated: true) { [weak self] in +// guard let self = self else { return } +// self.clearSongCart() +// } + break case .addPlayList: - let songs = output.songEntityOfSelectedSongs.value - playState.appendSongsToPlaylist(songs) - self.clearSongCart() - +// let songs = output.songEntityOfSelectedSongs.value +// playState.appendSongsToPlaylist(songs) +// self.clearSongCart() + break case .play: - let songs = output.songEntityOfSelectedSongs.value - playState.loadAndAppendSongsToPlaylist(songs) - self.clearSongCart() +// let songs = output.songEntityOfSelectedSongs.value +// playState.loadAndAppendSongsToPlaylist(songs) +// self.clearSongCart() + break case .remove: return diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift index f7c71dfe2..2ca3d91bd 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift @@ -136,7 +136,8 @@ public final class SearchViewController: BaseStoryboardReactorViewController Date: Tue, 7 May 2024 23:09:56 +0900 Subject: [PATCH 02/13] =?UTF-8?q?:bricks:=20::=20=ED=8F=AC=EB=A7=B7?= =?UTF-8?q?=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Reactors/AfterSearchReactor.swift | 32 ++++++--------- .../AfterSearchContentViewController.swift | 2 +- .../AfterSearchViewController.swift | 40 +++++++------------ .../SearchViewController.swift | 9 ++--- 4 files changed, 31 insertions(+), 52 deletions(-) diff --git a/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift b/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift index c1f5c496d..5ec81bc92 100644 --- a/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift +++ b/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift @@ -1,29 +1,28 @@ import Foundation +import LogManager import ReactorKit import RxSwift import SongsDomainInterface -import LogManager public final class AfterSearchReactor: Reactor { - var disposeBag: DisposeBag = DisposeBag() var fetchSearchSongUseCase: FetchSearchSongUseCase - + public enum Action { case fetchData(String) } - + public enum Mutation { case fetchData([[SearchSectionModel]]) } - + public struct State { var dataSource: [[SearchSectionModel]] var text: String } - + public var initialState: State - + init(fetchSearchSongUseCase: FetchSearchSongUseCase) { self.fetchSearchSongUseCase = fetchSearchSongUseCase self.initialState = State( @@ -31,38 +30,32 @@ public final class AfterSearchReactor: Reactor { text: "" ) } - + deinit { LogManager.printDebug("\(Self.self)") } - + public func reduce(state: State, mutation: Mutation) -> State { - var newState = state - + switch mutation { - case let .fetchData(data): newState.dataSource = data } - + return newState } - + public func mutate(action: Action) -> Observable { - switch action { - case let .fetchData(text): return fetchData(text) } - } } extension AfterSearchReactor { func fetchData(_ text: String) -> Observable { - return fetchSearchSongUseCase .execute(keyword: text) .asObservable() @@ -97,7 +90,6 @@ extension AfterSearchReactor { return results } - .map{ Mutation.fetchData($0) } - + .map { Mutation.fetchData($0) } } } diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchContentViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchContentViewController.swift index 6167ae2fe..fba0003a7 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchContentViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchContentViewController.swift @@ -84,7 +84,7 @@ extension AfterSearchContentViewController { return } self.input.deSelectedAllSongs.accept(()) - // parent.output.songEntityOfSelectedSongs.accept([]) + // parent.output.songEntityOfSelectedSongs.accept([]) }).disposed(by: disposeBag) } diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift index 7d61af5ff..c6c51ce5f 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift @@ -3,15 +3,15 @@ import BaseFeatureInterface import DesignSystem import NVActivityIndicatorView import Pageboy +import ReactorKit import RxSwift import SongsDomainInterface import Tabman import UIKit import Utility -import ReactorKit - -public final class AfterSearchViewController: TabmanViewController, ViewControllerFromStoryBoard, StoryboardView, SongCartViewType { +public final class AfterSearchViewController: TabmanViewController, ViewControllerFromStoryBoard, StoryboardView, + SongCartViewType { @IBOutlet weak var tabBarView: UIView! @IBOutlet weak var fakeView: UIView! @IBOutlet weak var indicator: NVActivityIndicatorView! @@ -20,8 +20,6 @@ public final class AfterSearchViewController: TabmanViewController, ViewControll var containSongsFactory: ContainSongsFactory! public var disposeBag = DisposeBag() - - private var viewControllers: [UIViewController] = [ UIViewController(), UIViewController(), @@ -59,34 +57,30 @@ public final class AfterSearchViewController: TabmanViewController, ViewControll deinit { DEBUG_LOG("❌ \(Self.self)") } - + public func bind(reactor: AfterSearchReactor) { bindState(reacotr: reactor) bindAction(reactor: reactor) - } } extension AfterSearchViewController { - func bindState(reacotr: AfterSearchReactor) { - - let currentState = reacotr.state.share(replay:2) - - //TODO: Content쪽 tableView처리 + let currentState = reacotr.state.share(replay: 2) + + // TODO: Content쪽 tableView처리 currentState.map(\.dataSource) .withUnretained(self) - .bind(onNext: { (owner,dataSource) in - + .bind(onNext: { owner, dataSource in + guard let comp = owner.afterSearchContentComponent else { return } - + if dataSource.isEmpty { return } - - + owner.viewControllers = [ comp.makeView(type: .all, dataSource: dataSource[0]), comp.makeView(type: .song, dataSource: dataSource[1]), @@ -97,16 +91,10 @@ extension AfterSearchViewController { owner.reloadData() }) .disposed(by: disposeBag) - } - - func bindAction(reactor: AfterSearchReactor) { - - - - } - - + + func bindAction(reactor: AfterSearchReactor) {} + private func configureUI() { self.fakeView.backgroundColor = DesignSystemAsset.GrayColor.gray100.color self.indicator.type = .circleStrokeSpin diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift index 2ca3d91bd..24cf3cc7b 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift @@ -226,16 +226,15 @@ extension SearchViewController { self.remove(asChildViewController: beforeVc) self.add(asChildViewController: afterVc) - - guard let childReactor = afterVc.reactor as? AfterSearchReactor else { + + guard let childReactor = afterVc.reactor as? AfterSearchReactor else { return } - + childReactor.action.onNext(.fetchData(text)) - } } else if let nowChildVc = children.first as? AfterSearchViewController { - if state == .search { + if state == .search { return } else { From 3247b745221593762824a95ffc6ab753d5e15f71 Mon Sep 17 00:00:00 2001 From: Hamp Date: Wed, 8 May 2024 16:48:43 +0900 Subject: [PATCH 03/13] =?UTF-8?q?:bulb:=20::=20=EC=9E=84=EC=8B=9C=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=ED=95=B4=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AfterSearchViewController.swift | 21 +++++++++---------- .../SearchViewController.swift | 3 +-- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift index c6c51ce5f..53fa593b8 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift @@ -39,7 +39,6 @@ public final class AfterSearchViewController: TabmanViewController, ViewControll override public func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.scrollToPage(.at(index: 0), animated: false) - self.indicator.startAnimating() } public static func viewController( @@ -68,7 +67,7 @@ extension AfterSearchViewController { func bindState(reacotr: AfterSearchReactor) { let currentState = reacotr.state.share(replay: 2) - // TODO: Content쪽 tableView처리 + // TODO: 검색 결과 화면 나올 때 , Content쪽 tableView hidden처리 및 indicator start 시점 고려 currentState.map(\.dataSource) .withUnretained(self) .bind(onNext: { owner, dataSource in @@ -165,15 +164,15 @@ extension AfterSearchViewController { // .disposed(by: disposeBag) // } -// func clearSongCart() { -// self.output.songEntityOfSelectedSongs.accept([]) -// self.viewControllers.forEach { vc in -// guard let afterContentVc = vc as? AfterSearchContentViewController else { -// return -// } -// afterContentVc.input.deSelectedAllSongs.accept(()) -// } -// } + func clearSongCart() { + // self.output.songEntityOfSelectedSongs.accept([]) + self.viewControllers.forEach { vc in + guard let afterContentVc = vc as? AfterSearchContentViewController else { + return + } + afterContentVc.input.deSelectedAllSongs.accept(()) + } + } } extension AfterSearchViewController: PageboyViewControllerDataSource, TMBarDataSource { diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift index 24cf3cc7b..a00759664 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift @@ -136,8 +136,7 @@ public final class SearchViewController: BaseStoryboardReactorViewController Date: Wed, 8 May 2024 16:48:55 +0900 Subject: [PATCH 04/13] =?UTF-8?q?:bricks:=20::=20=ED=8F=AC=EB=A7=B7?= =?UTF-8?q?=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ViewControllers/AfterSearchViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift index 53fa593b8..390dae149 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift @@ -165,7 +165,7 @@ extension AfterSearchViewController { // } func clearSongCart() { - // self.output.songEntityOfSelectedSongs.accept([]) + // self.output.songEntityOfSelectedSongs.accept([]) self.viewControllers.forEach { vc in guard let afterContentVc = vc as? AfterSearchContentViewController else { return From 179c78ff99430be4d890ad7a52200556d5c8becb Mon Sep 17 00:00:00 2001 From: Hamp Date: Wed, 8 May 2024 16:58:03 +0900 Subject: [PATCH 05/13] =?UTF-8?q?:bricks:=20::=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=8B=A4=EC=9A=B4=20=EC=BA=90=EC=8A=A4?= =?UTF-8?q?=ED=8C=85=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ViewControllers/SearchViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift index a00759664..842b515bb 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/SearchViewController.swift @@ -226,7 +226,7 @@ extension SearchViewController { self.remove(asChildViewController: beforeVc) self.add(asChildViewController: afterVc) - guard let childReactor = afterVc.reactor as? AfterSearchReactor else { + guard let childReactor = afterVc.reactor else { return } From b98844c5c082a23ee02a58a8db03e0919f42d864 Mon Sep 17 00:00:00 2001 From: Hamp <48616183+yongbeomkwak@users.noreply.github.com> Date: Wed, 8 May 2024 22:57:24 +0900 Subject: [PATCH 06/13] Apply suggestions from code review pre filtering Co-authored-by: baegteun --- .../Sources/ViewControllers/AfterSearchViewController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift index 390dae149..fbeeef627 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift @@ -69,6 +69,7 @@ extension AfterSearchViewController { // TODO: 검색 결과 화면 나올 때 , Content쪽 tableView hidden처리 및 indicator start 시점 고려 currentState.map(\.dataSource) + .filter { !$0.isEmpty } .withUnretained(self) .bind(onNext: { owner, dataSource in From 79f72bffb4d21f6608b651a995f12380f45268af Mon Sep 17 00:00:00 2001 From: Hamp <48616183+yongbeomkwak@users.noreply.github.com> Date: Wed, 8 May 2024 22:57:53 +0900 Subject: [PATCH 07/13] Update Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift Co-authored-by: baegteun --- .../SearchFeature/Sources/Reactors/AfterSearchReactor.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift b/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift index 5ec81bc92..e47d36637 100644 --- a/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift +++ b/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift @@ -54,7 +54,7 @@ public final class AfterSearchReactor: Reactor { } } -extension AfterSearchReactor { +private extension AfterSearchReactor { func fetchData(_ text: String) -> Observable { return fetchSearchSongUseCase .execute(keyword: text) From 3e4be6eaffdce875c2ef001ba1fa81d99577bef0 Mon Sep 17 00:00:00 2001 From: Hamp Date: Wed, 8 May 2024 23:01:53 +0900 Subject: [PATCH 08/13] =?UTF-8?q?:zap:=20::=20isEmpty=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ViewControllers/AfterSearchViewController.swift | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift index fbeeef627..beba622b1 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift @@ -77,10 +77,6 @@ extension AfterSearchViewController { return } - if dataSource.isEmpty { - return - } - owner.viewControllers = [ comp.makeView(type: .all, dataSource: dataSource[0]), comp.makeView(type: .song, dataSource: dataSource[1]), From 0f06aa87a1d6fc7cfc99ac5ad7055555a9da9d6d Mon Sep 17 00:00:00 2001 From: Hamp <48616183+yongbeomkwak@users.noreply.github.com> Date: Wed, 8 May 2024 23:03:11 +0900 Subject: [PATCH 09/13] Update Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift Co-authored-by: baegteun --- .../SearchFeature/Sources/Reactors/AfterSearchReactor.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift b/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift index e47d36637..34d7a1b04 100644 --- a/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift +++ b/Projects/Features/SearchFeature/Sources/Reactors/AfterSearchReactor.swift @@ -6,7 +6,7 @@ import SongsDomainInterface public final class AfterSearchReactor: Reactor { var disposeBag: DisposeBag = DisposeBag() - var fetchSearchSongUseCase: FetchSearchSongUseCase + private let fetchSearchSongUseCase: FetchSearchSongUseCase public enum Action { case fetchData(String) From d656bd361096bd2e7d41f390a374c0382f5c082f Mon Sep 17 00:00:00 2001 From: Hamp Date: Thu, 9 May 2024 17:44:40 +0900 Subject: [PATCH 10/13] =?UTF-8?q?:bulb:=20::=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EB=AA=A9=EC=A0=81=20=EB=AA=85=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ViewControllers/AfterSearchViewController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift index beba622b1..694d5cde6 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift @@ -126,6 +126,7 @@ extension AfterSearchViewController { ) } +// TODO: 검색 결과 화면 나오면 이어서 작업 // private func bindRx() { // // output.isFetchStart From 10e1098cb350ffd52636784cea601901b29f6652 Mon Sep 17 00:00:00 2001 From: Hamp Date: Thu, 9 May 2024 17:44:57 +0900 Subject: [PATCH 11/13] =?UTF-8?q?:bricks:=20::=20=ED=8F=AC=EB=A7=B7?= =?UTF-8?q?=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ViewControllers/AfterSearchViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift index 694d5cde6..6084293b9 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift @@ -126,7 +126,7 @@ extension AfterSearchViewController { ) } -// TODO: 검색 결과 화면 나오면 이어서 작업 + // TODO: 검색 결과 화면 나오면 이어서 작업 // private func bindRx() { // // output.isFetchStart From 1dd8664e86871dcc47e3f1c15df3270441afe7fc Mon Sep 17 00:00:00 2001 From: Hamp Date: Thu, 9 May 2024 18:47:16 +0900 Subject: [PATCH 12/13] =?UTF-8?q?zap:=20::=20=EB=B0=94=EC=9D=B8=EB=93=9C?= =?UTF-8?q?=20onNext=20=EB=A0=88=EC=9D=B4=EB=B8=94=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ViewControllers/AfterSearchViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift index 6084293b9..3ba46d61e 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift @@ -71,7 +71,7 @@ extension AfterSearchViewController { currentState.map(\.dataSource) .filter { !$0.isEmpty } .withUnretained(self) - .bind(onNext: { owner, dataSource in + .bind{ owner, dataSource in guard let comp = owner.afterSearchContentComponent else { return @@ -85,7 +85,7 @@ extension AfterSearchViewController { ] owner.indicator.stopAnimating() owner.reloadData() - }) + } .disposed(by: disposeBag) } From 34359f02cd64f2239ee6f4fd0044d3dbcf599499 Mon Sep 17 00:00:00 2001 From: Hamp Date: Thu, 9 May 2024 18:47:25 +0900 Subject: [PATCH 13/13] =?UTF-8?q?:bricks:=20::=20=ED=8F=AC=EB=A7=B7?= =?UTF-8?q?=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ViewControllers/AfterSearchViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift index 3ba46d61e..a18d3a746 100644 --- a/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift +++ b/Projects/Features/SearchFeature/Sources/ViewControllers/AfterSearchViewController.swift @@ -71,7 +71,7 @@ extension AfterSearchViewController { currentState.map(\.dataSource) .filter { !$0.isEmpty } .withUnretained(self) - .bind{ owner, dataSource in + .bind { owner, dataSource in guard let comp = owner.afterSearchContentComponent else { return