From ac0ebc16276cb9f8b4897050d8e97b1028b043b1 Mon Sep 17 00:00:00 2001 From: baegteun Date: Wed, 28 Aug 2024 20:28:48 +0900 Subject: [PATCH 1/2] =?UTF-8?q?:children=5Fcrossing:=20::=20[#1230]=20?= =?UTF-8?q?=EB=85=B8=EB=9E=98=20=EC=83=81=EC=84=B8=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=9E=AC=EC=83=9D=EB=AA=A9=EB=A1=9D=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EC=8B=9C=20=EC=9E=AC=EC=83=9D=EB=AA=A9=EB=A1=9D=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EC=8A=A4=ED=81=AC=EB=A1=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PlayListPresenterGlobalState.swift | 13 +++++++++---- .../MainContainerViewController.swift | 8 ++++++-- .../Demo/Sources/AppDelegate.swift | 3 ++- .../MusicDetail/MusicDetailReactor.swift | 4 ++-- .../MusicDetailViewController.swift | 8 ++++---- .../Interface/PlaylistFactory.swift | 1 + .../Sources/Components/PlaylistComponent.swift | 14 ++++++++++++++ .../PlaylistViewController.swift | 18 ++++++++++++++++++ 8 files changed, 56 insertions(+), 13 deletions(-) diff --git a/Projects/Features/BaseFeature/Sources/GlobalState/PlayListPresenterGlobalState.swift b/Projects/Features/BaseFeature/Sources/GlobalState/PlayListPresenterGlobalState.swift index c81300aba..b029b9d55 100644 --- a/Projects/Features/BaseFeature/Sources/GlobalState/PlayListPresenterGlobalState.swift +++ b/Projects/Features/BaseFeature/Sources/GlobalState/PlayListPresenterGlobalState.swift @@ -2,20 +2,25 @@ import Foundation import RxSwift public protocol PlayListPresenterGlobalStateProtocol { - var presentPlayListObservable: Observable { get } + var presentPlayListObservable: Observable { get } + func presentPlayList(currentSongID: String?) func presentPlayList() } public final class PlayListPresenterGlobalState: PlayListPresenterGlobalStateProtocol { - private let presentPlayListSubject = PublishSubject() - public var presentPlayListObservable: Observable { + private let presentPlayListSubject = PublishSubject() + public var presentPlayListObservable: Observable { presentPlayListSubject } public init() {} + public func presentPlayList(currentSongID: String?) { + presentPlayListSubject.onNext(currentSongID) + } + public func presentPlayList() { - presentPlayListSubject.onNext(()) + presentPlayList(currentSongID: nil) } } diff --git a/Projects/Features/MainTabFeature/Sources/ViewControllers/MainContainerViewController.swift b/Projects/Features/MainTabFeature/Sources/ViewControllers/MainContainerViewController.swift index 61839d213..11a0b654f 100644 --- a/Projects/Features/MainTabFeature/Sources/ViewControllers/MainContainerViewController.swift +++ b/Projects/Features/MainTabFeature/Sources/ViewControllers/MainContainerViewController.swift @@ -122,9 +122,13 @@ private extension MainContainerViewController { ) playlistPresenterGlobalState.presentPlayListObservable - .bind { [navigationController, playlistFactory] _ in + .bind { [navigationController, playlistFactory] currentSongID in guard let playlistFactory else { return } - let playlistViewController = playlistFactory.makeViewController() + let playlistViewController = if let currentSongID { + playlistFactory.makeViewController(currentSongID: currentSongID) + } else { + playlistFactory.makeViewController() + } playlistViewController.modalPresentationStyle = .overFullScreen navigationController?.topViewController?.present(playlistViewController, animated: true) } diff --git a/Projects/Features/MusicDetailFeature/Demo/Sources/AppDelegate.swift b/Projects/Features/MusicDetailFeature/Demo/Sources/AppDelegate.swift index 53f3fe22f..944f0a847 100644 --- a/Projects/Features/MusicDetailFeature/Demo/Sources/AppDelegate.swift +++ b/Projects/Features/MusicDetailFeature/Demo/Sources/AppDelegate.swift @@ -119,7 +119,8 @@ final class DummyTextPopupFactory: TextPopupFactory { } final class DummyPlaylistPresenterGlobalState: PlayListPresenterGlobalStateProtocol { - var presentPlayListObservable: RxSwift.Observable { .empty() } + var presentPlayListObservable: RxSwift.Observable { .empty() } + func presentPlayList(currentSongID: String?) {} func presentPlayList() {} } diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailReactor.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailReactor.swift index ac741c061..eeb27d6b1 100644 --- a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailReactor.swift +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailReactor.swift @@ -43,7 +43,7 @@ final class MusicDetailReactor: Reactor { case credit(id: String) case lyricsHighlighting(model: LyricHighlightingRequiredModel) case musicPick(id: String) - case playlist + case playlist(id: String) case dismiss case textPopup(text: String, completion: () -> Void) case signin @@ -411,7 +411,7 @@ private extension MusicDetailReactor { guard let song = currentState.selectedSong else { return .empty() } let log = Log.clickPlaylistButton(id: song.videoID) LogManager.analytics(log) - return navigateMutation(navigate: .playlist) + return navigateMutation(navigate: .playlist(id: song.videoID)) } } diff --git a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailViewController.swift b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailViewController.swift index 7a9dc4f98..4a6e26168 100644 --- a/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailViewController.swift +++ b/Projects/Features/MusicDetailFeature/Sources/MusicDetail/MusicDetailViewController.swift @@ -137,8 +137,8 @@ final class MusicDetailViewController: BaseReactorViewController UIViewController + func makeViewController(currentSongID: String) -> UIViewController } diff --git a/Projects/Features/PlaylistFeature/Sources/Components/PlaylistComponent.swift b/Projects/Features/PlaylistFeature/Sources/Components/PlaylistComponent.swift index d384b6319..75fa25e8b 100644 --- a/Projects/Features/PlaylistFeature/Sources/Components/PlaylistComponent.swift +++ b/Projects/Features/PlaylistFeature/Sources/Components/PlaylistComponent.swift @@ -16,6 +16,20 @@ public final class PlaylistComponent: Component, PlaylistFac public func makeViewController() -> UIViewController { let viewModel = PlaylistViewModel() let viewController = PlaylistViewController( + currentSongID: nil, + viewModel: viewModel, + containSongsFactory: dependency.containSongsFactory, + songDetailPresenter: dependency.songDetailPresenter, + textPopupFactory: dependency.textPopupFactory, + signInFactory: dependency.signInFactory + ) + return viewController + } + + public func makeViewController(currentSongID: String) -> UIViewController { + let viewModel = PlaylistViewModel() + let viewController = PlaylistViewController( + currentSongID: currentSongID, viewModel: viewModel, containSongsFactory: dependency.containSongsFactory, songDetailPresenter: dependency.songDetailPresenter, diff --git a/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistViewController.swift b/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistViewController.swift index 1ba369646..68b7f80e1 100644 --- a/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistViewController.swift +++ b/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistViewController.swift @@ -52,13 +52,17 @@ public final class PlaylistViewController: UIViewController, SongCartViewType { ) lazy var output = self.viewModel.transform(from: input) + private let currentSongID: String? + init( + currentSongID: String?, viewModel: PlaylistViewModel, containSongsFactory: ContainSongsFactory, songDetailPresenter: any SongDetailPresentable, textPopupFactory: any TextPopupFactory, signInFactory: any SignInFactory ) { + self.currentSongID = currentSongID self.containSongsFactory = containSongsFactory self.songDetailPresenter = songDetailPresenter self.signInFactory = signInFactory @@ -178,6 +182,20 @@ private extension PlaylistViewController { output.playlists .map { [PlayListSectionModel.init(model: 0, items: $0)] } + .do(afterNext: { [currentSongID, tableView = playlistView.playlistTableView] playListSectionModel in + guard let currentSongID else { return } + guard + let sectionIndex = playListSectionModel.firstIndex(where: { model in + model.items.contains(where: { $0.id == currentSongID }) + }), + let itemIndex = playListSectionModel[safe: sectionIndex]?.items + .firstIndex(where: { $0.id == currentSongID }) + else { return } + let index = IndexPath(row: itemIndex, section: sectionIndex) + DispatchQueue.main.async { + tableView.scrollToRow(at: index, at: .middle, animated: false) + } + }) .bind(to: playlistView.playlistTableView.rx.items(dataSource: createDatasources(output: output))) .disposed(by: disposeBag) From 181579713a5344f6fa617abd567636497f48a9f6 Mon Sep 17 00:00:00 2001 From: baegteun Date: Wed, 28 Aug 2024 20:28:56 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=8E=A8=20::=20=EC=BD=94=EB=93=9C=20Fo?= =?UTF-8?q?rmatting=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ViewControllers/PlaylistViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistViewController.swift b/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistViewController.swift index 68b7f80e1..414a6bebf 100644 --- a/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistViewController.swift +++ b/Projects/Features/PlaylistFeature/Sources/ViewControllers/PlaylistViewController.swift @@ -189,7 +189,7 @@ private extension PlaylistViewController { model.items.contains(where: { $0.id == currentSongID }) }), let itemIndex = playListSectionModel[safe: sectionIndex]?.items - .firstIndex(where: { $0.id == currentSongID }) + .firstIndex(where: { $0.id == currentSongID }) else { return } let index = IndexPath(row: itemIndex, section: sectionIndex) DispatchQueue.main.async {