From ebeb7ff55ce554502f9ec83567511a508e4478c9 Mon Sep 17 00:00:00 2001 From: "pikagreen@nate.com" Date: Fri, 19 Apr 2024 23:59:46 +0900 Subject: [PATCH 1/6] =?UTF-8?q?=F0=9F=90=9B=20::=20[#494]=20=EC=95=84?= =?UTF-8?q?=ED=8B=B0=EC=8A=A4=ED=8A=B8=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=201?= =?UTF-8?q?=EA=B0=9C=EC=9D=BC=20=EB=95=8C=20=ED=9E=88=EB=93=A0=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=20=EC=B6=94=EA=B0=80=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Application/NeedleGenerated.swift | 194 +++++++++--------- .../Sources/Reactors/ArtistReactor.swift | 5 +- .../ArtistMusicContentViewModel.swift | 52 ++--- 3 files changed, 119 insertions(+), 132 deletions(-) diff --git a/Projects/App/Sources/Application/NeedleGenerated.swift b/Projects/App/Sources/Application/NeedleGenerated.swift index 93de4be4b..2ac4432fd 100644 --- a/Projects/App/Sources/Application/NeedleGenerated.swift +++ b/Projects/App/Sources/Application/NeedleGenerated.swift @@ -754,103 +754,103 @@ private func factorya77269be267fb568bd4ff47b58f8f304c97af4d5(_ component: Needle extension AppComponent: Registration { public func registerItems() { - localTable["keychain-any Keychain"] = { [unowned self] in self.keychain as Any } - localTable["searchComponent-SearchComponent"] = { [unowned self] in self.searchComponent as Any } - localTable["afterSearchComponent-AfterSearchComponent"] = { [unowned self] in self.afterSearchComponent as Any } - localTable["afterSearchContentComponent-AfterSearchContentComponent"] = { [unowned self] in self.afterSearchContentComponent as Any } - localTable["homeComponent-HomeComponent"] = { [unowned self] in self.homeComponent as Any } - localTable["newSongsComponent-NewSongsComponent"] = { [unowned self] in self.newSongsComponent as Any } - localTable["newSongsContentComponent-NewSongsContentComponent"] = { [unowned self] in self.newSongsContentComponent as Any } - localTable["remoteSongsDataSource-any RemoteSongsDataSource"] = { [unowned self] in self.remoteSongsDataSource as Any } - localTable["songsRepository-any SongsRepository"] = { [unowned self] in self.songsRepository as Any } - localTable["fetchSearchSongUseCase-any FetchSearchSongUseCase"] = { [unowned self] in self.fetchSearchSongUseCase as Any } - localTable["fetchLyricsUseCase-any FetchLyricsUseCase"] = { [unowned self] in self.fetchLyricsUseCase as Any } - localTable["fetchNewSongsUseCase-any FetchNewSongsUseCase"] = { [unowned self] in self.fetchNewSongsUseCase as Any } - localTable["signInComponent-SignInComponent"] = { [unowned self] in self.signInComponent as Any } - localTable["storageComponent-StorageComponent"] = { [unowned self] in self.storageComponent as Any } - localTable["afterLoginComponent-AfterLoginComponent"] = { [unowned self] in self.afterLoginComponent as Any } - localTable["requestComponent-RequestComponent"] = { [unowned self] in self.requestComponent as Any } - localTable["localAuthDataSource-any LocalAuthDataSource"] = { [unowned self] in self.localAuthDataSource as Any } - localTable["remoteAuthDataSource-any RemoteAuthDataSource"] = { [unowned self] in self.remoteAuthDataSource as Any } - localTable["authRepository-any AuthRepository"] = { [unowned self] in self.authRepository as Any } - localTable["fetchTokenUseCase-any FetchTokenUseCase"] = { [unowned self] in self.fetchTokenUseCase as Any } - localTable["fetchNaverUserInfoUseCase-any FetchNaverUserInfoUseCase"] = { [unowned self] in self.fetchNaverUserInfoUseCase as Any } - localTable["logoutUseCase-any LogoutUseCase"] = { [unowned self] in self.logoutUseCase as Any } - localTable["checkIsExistAccessTokenUseCase-any CheckIsExistAccessTokenUseCase"] = { [unowned self] in self.checkIsExistAccessTokenUseCase as Any } - localTable["remoteLikeDataSource-any RemoteLikeDataSource"] = { [unowned self] in self.remoteLikeDataSource as Any } - localTable["likeRepository-any LikeRepository"] = { [unowned self] in self.likeRepository as Any } - localTable["fetchLikeNumOfSongUseCase-any FetchLikeNumOfSongUseCase"] = { [unowned self] in self.fetchLikeNumOfSongUseCase as Any } - localTable["addLikeSongUseCase-any AddLikeSongUseCase"] = { [unowned self] in self.addLikeSongUseCase as Any } - localTable["cancelLikeSongUseCase-any CancelLikeSongUseCase"] = { [unowned self] in self.cancelLikeSongUseCase as Any } - localTable["beforeSearchComponent-BeforeSearchComponent"] = { [unowned self] in self.beforeSearchComponent as Any } - localTable["playlistDetailFactory-any PlaylistDetailFactory"] = { [unowned self] in self.playlistDetailFactory as Any } - localTable["myPlayListComponent-MyPlayListComponent"] = { [unowned self] in self.myPlayListComponent as Any } - localTable["containSongsComponent-ContainSongsComponent"] = { [unowned self] in self.containSongsComponent as Any } - localTable["remotePlayListDataSource-any RemotePlayListDataSource"] = { [unowned self] in self.remotePlayListDataSource as Any } - localTable["playListRepository-any PlayListRepository"] = { [unowned self] in self.playListRepository as Any } - localTable["fetchRecommendPlayListUseCase-any FetchRecommendPlayListUseCase"] = { [unowned self] in self.fetchRecommendPlayListUseCase as Any } - localTable["fetchPlayListDetailUseCase-any FetchPlayListDetailUseCase"] = { [unowned self] in self.fetchPlayListDetailUseCase as Any } - localTable["createPlayListUseCase-any CreatePlayListUseCase"] = { [unowned self] in self.createPlayListUseCase as Any } - localTable["editPlayListUseCase-any EditPlayListUseCase"] = { [unowned self] in self.editPlayListUseCase as Any } - localTable["editPlayListNameUseCase-any EditPlayListNameUseCase"] = { [unowned self] in self.editPlayListNameUseCase as Any } - localTable["loadPlayListUseCase-any LoadPlayListUseCase"] = { [unowned self] in self.loadPlayListUseCase as Any } - localTable["addSongIntoPlayListUseCase-any AddSongIntoPlayListUseCase"] = { [unowned self] in self.addSongIntoPlayListUseCase as Any } - localTable["removeSongsUseCase-any RemoveSongsUseCase"] = { [unowned self] in self.removeSongsUseCase as Any } - localTable["artistComponent-ArtistComponent"] = { [unowned self] in self.artistComponent as Any } - localTable["remoteArtistDataSource-RemoteArtistDataSourceImpl"] = { [unowned self] in self.remoteArtistDataSource as Any } - localTable["artistRepository-any ArtistRepository"] = { [unowned self] in self.artistRepository as Any } - localTable["fetchArtistListUseCase-any FetchArtistListUseCase"] = { [unowned self] in self.fetchArtistListUseCase as Any } - localTable["artistDetailComponent-ArtistDetailComponent"] = { [unowned self] in self.artistDetailComponent as Any } - localTable["fetchArtistSongListUseCase-any FetchArtistSongListUseCase"] = { [unowned self] in self.fetchArtistSongListUseCase as Any } - localTable["artistMusicComponent-ArtistMusicComponent"] = { [unowned self] in self.artistMusicComponent as Any } - localTable["artistMusicContentComponent-ArtistMusicContentComponent"] = { [unowned self] in self.artistMusicContentComponent as Any } - localTable["profilePopComponent-ProfilePopComponent"] = { [unowned self] in self.profilePopComponent as Any } - localTable["favoriteComponent-FavoriteComponent"] = { [unowned self] in self.favoriteComponent as Any } - localTable["remoteUserDataSource-any RemoteUserDataSource"] = { [unowned self] in self.remoteUserDataSource as Any } - localTable["userRepository-any UserRepository"] = { [unowned self] in self.userRepository as Any } - localTable["fetchProfileListUseCase-any FetchProfileListUseCase"] = { [unowned self] in self.fetchProfileListUseCase as Any } - localTable["setProfileUseCase-any SetProfileUseCase"] = { [unowned self] in self.setProfileUseCase as Any } - localTable["setUserNameUseCase-any SetUserNameUseCase"] = { [unowned self] in self.setUserNameUseCase as Any } - localTable["fetchPlayListUseCase-any FetchPlayListUseCase"] = { [unowned self] in self.fetchPlayListUseCase as Any } - localTable["fetchFavoriteSongsUseCase-any FetchFavoriteSongsUseCase"] = { [unowned self] in self.fetchFavoriteSongsUseCase as Any } - localTable["editFavoriteSongsOrderUseCase-any EditFavoriteSongsOrderUseCase"] = { [unowned self] in self.editFavoriteSongsOrderUseCase as Any } - localTable["editPlayListOrderUseCase-any EditPlayListOrderUseCase"] = { [unowned self] in self.editPlayListOrderUseCase as Any } - localTable["deletePlayListUseCase-any DeletePlayListUseCase"] = { [unowned self] in self.deletePlayListUseCase as Any } - localTable["deleteFavoriteListUseCase-any DeleteFavoriteListUseCase"] = { [unowned self] in self.deleteFavoriteListUseCase as Any } - localTable["fetchUserInfoUseCase-any FetchUserInfoUseCase"] = { [unowned self] in self.fetchUserInfoUseCase as Any } - localTable["withdrawUserInfoUseCase-any WithdrawUserInfoUseCase"] = { [unowned self] in self.withdrawUserInfoUseCase as Any } - localTable["mainContainerComponent-MainContainerComponent"] = { [unowned self] in self.mainContainerComponent as Any } - localTable["bottomTabBarComponent-BottomTabBarComponent"] = { [unowned self] in self.bottomTabBarComponent as Any } - localTable["mainTabBarComponent-MainTabBarComponent"] = { [unowned self] in self.mainTabBarComponent as Any } - localTable["playerComponent-PlayerComponent"] = { [unowned self] in self.playerComponent as Any } - localTable["playlistComponent-PlaylistComponent"] = { [unowned self] in self.playlistComponent as Any } - localTable["openSourceLicenseComponent-OpenSourceLicenseComponent"] = { [unowned self] in self.openSourceLicenseComponent as Any } - localTable["serviceInfoComponent-ServiceInfoComponent"] = { [unowned self] in self.serviceInfoComponent as Any } - localTable["permissionComponent-PermissionComponent"] = { [unowned self] in self.permissionComponent as Any } - localTable["noticePopupComponent-NoticePopupComponent"] = { [unowned self] in self.noticePopupComponent as Any } - localTable["noticeComponent-NoticeComponent"] = { [unowned self] in self.noticeComponent as Any } - localTable["noticeDetailComponent-NoticeDetailComponent"] = { [unowned self] in self.noticeDetailComponent as Any } - localTable["remoteNoticeDataSource-any RemoteNoticeDataSource"] = { [unowned self] in self.remoteNoticeDataSource as Any } - localTable["noticeRepository-any NoticeRepository"] = { [unowned self] in self.noticeRepository as Any } - localTable["fetchNoticeUseCase-any FetchNoticeUseCase"] = { [unowned self] in self.fetchNoticeUseCase as Any } - localTable["fetchNoticeCategoriesUseCase-any FetchNoticeCategoriesUseCase"] = { [unowned self] in self.fetchNoticeCategoriesUseCase as Any } - localTable["multiPurposePopUpFactory-any MultiPurposePopUpFactory"] = { [unowned self] in self.multiPurposePopUpFactory as Any } - localTable["questionComponent-QuestionComponent"] = { [unowned self] in self.questionComponent as Any } - localTable["faqComponent-FaqComponent"] = { [unowned self] in self.faqComponent as Any } - localTable["faqContentComponent-FaqContentComponent"] = { [unowned self] in self.faqContentComponent as Any } - localTable["remoteFaqDataSource-any RemoteFaqDataSource"] = { [unowned self] in self.remoteFaqDataSource as Any } - localTable["faqRepository-any FaqRepository"] = { [unowned self] in self.faqRepository as Any } - localTable["fetchFaqCategoriesUseCase-any FetchFaqCategoriesUseCase"] = { [unowned self] in self.fetchFaqCategoriesUseCase as Any } - localTable["fetchFaqUseCase-any FetchFaqUseCase"] = { [unowned self] in self.fetchFaqUseCase as Any } - localTable["remoteAppDataSource-any RemoteAppDataSource"] = { [unowned self] in self.remoteAppDataSource as Any } - localTable["appRepository-any AppRepository"] = { [unowned self] in self.appRepository as Any } - localTable["fetchAppCheckUseCase-any FetchAppCheckUseCase"] = { [unowned self] in self.fetchAppCheckUseCase as Any } - localTable["chartComponent-ChartComponent"] = { [unowned self] in self.chartComponent as Any } - localTable["chartContentComponent-ChartContentComponent"] = { [unowned self] in self.chartContentComponent as Any } - localTable["remoteChartDataSource-any RemoteChartDataSource"] = { [unowned self] in self.remoteChartDataSource as Any } - localTable["chartRepository-any ChartRepository"] = { [unowned self] in self.chartRepository as Any } - localTable["fetchChartRankingUseCase-any FetchChartRankingUseCase"] = { [unowned self] in self.fetchChartRankingUseCase as Any } - localTable["fetchChartUpdateTimeUseCase-any FetchChartUpdateTimeUseCase"] = { [unowned self] in self.fetchChartUpdateTimeUseCase as Any } + localTable["keychain-any Keychain"] = { self.keychain as Any } + localTable["searchComponent-SearchComponent"] = { self.searchComponent as Any } + localTable["afterSearchComponent-AfterSearchComponent"] = { self.afterSearchComponent as Any } + localTable["afterSearchContentComponent-AfterSearchContentComponent"] = { self.afterSearchContentComponent as Any } + localTable["homeComponent-HomeComponent"] = { self.homeComponent as Any } + localTable["newSongsComponent-NewSongsComponent"] = { self.newSongsComponent as Any } + localTable["newSongsContentComponent-NewSongsContentComponent"] = { self.newSongsContentComponent as Any } + localTable["remoteSongsDataSource-any RemoteSongsDataSource"] = { self.remoteSongsDataSource as Any } + localTable["songsRepository-any SongsRepository"] = { self.songsRepository as Any } + localTable["fetchSearchSongUseCase-any FetchSearchSongUseCase"] = { self.fetchSearchSongUseCase as Any } + localTable["fetchLyricsUseCase-any FetchLyricsUseCase"] = { self.fetchLyricsUseCase as Any } + localTable["fetchNewSongsUseCase-any FetchNewSongsUseCase"] = { self.fetchNewSongsUseCase as Any } + localTable["signInComponent-SignInComponent"] = { self.signInComponent as Any } + localTable["storageComponent-StorageComponent"] = { self.storageComponent as Any } + localTable["afterLoginComponent-AfterLoginComponent"] = { self.afterLoginComponent as Any } + localTable["requestComponent-RequestComponent"] = { self.requestComponent as Any } + localTable["localAuthDataSource-any LocalAuthDataSource"] = { self.localAuthDataSource as Any } + localTable["remoteAuthDataSource-any RemoteAuthDataSource"] = { self.remoteAuthDataSource as Any } + localTable["authRepository-any AuthRepository"] = { self.authRepository as Any } + localTable["fetchTokenUseCase-any FetchTokenUseCase"] = { self.fetchTokenUseCase as Any } + localTable["fetchNaverUserInfoUseCase-any FetchNaverUserInfoUseCase"] = { self.fetchNaverUserInfoUseCase as Any } + localTable["logoutUseCase-any LogoutUseCase"] = { self.logoutUseCase as Any } + localTable["checkIsExistAccessTokenUseCase-any CheckIsExistAccessTokenUseCase"] = { self.checkIsExistAccessTokenUseCase as Any } + localTable["remoteLikeDataSource-any RemoteLikeDataSource"] = { self.remoteLikeDataSource as Any } + localTable["likeRepository-any LikeRepository"] = { self.likeRepository as Any } + localTable["fetchLikeNumOfSongUseCase-any FetchLikeNumOfSongUseCase"] = { self.fetchLikeNumOfSongUseCase as Any } + localTable["addLikeSongUseCase-any AddLikeSongUseCase"] = { self.addLikeSongUseCase as Any } + localTable["cancelLikeSongUseCase-any CancelLikeSongUseCase"] = { self.cancelLikeSongUseCase as Any } + localTable["beforeSearchComponent-BeforeSearchComponent"] = { self.beforeSearchComponent as Any } + localTable["playlistDetailFactory-any PlaylistDetailFactory"] = { self.playlistDetailFactory as Any } + localTable["myPlayListComponent-MyPlayListComponent"] = { self.myPlayListComponent as Any } + localTable["containSongsComponent-ContainSongsComponent"] = { self.containSongsComponent as Any } + localTable["remotePlayListDataSource-any RemotePlayListDataSource"] = { self.remotePlayListDataSource as Any } + localTable["playListRepository-any PlayListRepository"] = { self.playListRepository as Any } + localTable["fetchRecommendPlayListUseCase-any FetchRecommendPlayListUseCase"] = { self.fetchRecommendPlayListUseCase as Any } + localTable["fetchPlayListDetailUseCase-any FetchPlayListDetailUseCase"] = { self.fetchPlayListDetailUseCase as Any } + localTable["createPlayListUseCase-any CreatePlayListUseCase"] = { self.createPlayListUseCase as Any } + localTable["editPlayListUseCase-any EditPlayListUseCase"] = { self.editPlayListUseCase as Any } + localTable["editPlayListNameUseCase-any EditPlayListNameUseCase"] = { self.editPlayListNameUseCase as Any } + localTable["loadPlayListUseCase-any LoadPlayListUseCase"] = { self.loadPlayListUseCase as Any } + localTable["addSongIntoPlayListUseCase-any AddSongIntoPlayListUseCase"] = { self.addSongIntoPlayListUseCase as Any } + localTable["removeSongsUseCase-any RemoveSongsUseCase"] = { self.removeSongsUseCase as Any } + localTable["artistComponent-ArtistComponent"] = { self.artistComponent as Any } + localTable["remoteArtistDataSource-RemoteArtistDataSourceImpl"] = { self.remoteArtistDataSource as Any } + localTable["artistRepository-any ArtistRepository"] = { self.artistRepository as Any } + localTable["fetchArtistListUseCase-any FetchArtistListUseCase"] = { self.fetchArtistListUseCase as Any } + localTable["artistDetailComponent-ArtistDetailComponent"] = { self.artistDetailComponent as Any } + localTable["fetchArtistSongListUseCase-any FetchArtistSongListUseCase"] = { self.fetchArtistSongListUseCase as Any } + localTable["artistMusicComponent-ArtistMusicComponent"] = { self.artistMusicComponent as Any } + localTable["artistMusicContentComponent-ArtistMusicContentComponent"] = { self.artistMusicContentComponent as Any } + localTable["profilePopComponent-ProfilePopComponent"] = { self.profilePopComponent as Any } + localTable["favoriteComponent-FavoriteComponent"] = { self.favoriteComponent as Any } + localTable["remoteUserDataSource-any RemoteUserDataSource"] = { self.remoteUserDataSource as Any } + localTable["userRepository-any UserRepository"] = { self.userRepository as Any } + localTable["fetchProfileListUseCase-any FetchProfileListUseCase"] = { self.fetchProfileListUseCase as Any } + localTable["setProfileUseCase-any SetProfileUseCase"] = { self.setProfileUseCase as Any } + localTable["setUserNameUseCase-any SetUserNameUseCase"] = { self.setUserNameUseCase as Any } + localTable["fetchPlayListUseCase-any FetchPlayListUseCase"] = { self.fetchPlayListUseCase as Any } + localTable["fetchFavoriteSongsUseCase-any FetchFavoriteSongsUseCase"] = { self.fetchFavoriteSongsUseCase as Any } + localTable["editFavoriteSongsOrderUseCase-any EditFavoriteSongsOrderUseCase"] = { self.editFavoriteSongsOrderUseCase as Any } + localTable["editPlayListOrderUseCase-any EditPlayListOrderUseCase"] = { self.editPlayListOrderUseCase as Any } + localTable["deletePlayListUseCase-any DeletePlayListUseCase"] = { self.deletePlayListUseCase as Any } + localTable["deleteFavoriteListUseCase-any DeleteFavoriteListUseCase"] = { self.deleteFavoriteListUseCase as Any } + localTable["fetchUserInfoUseCase-any FetchUserInfoUseCase"] = { self.fetchUserInfoUseCase as Any } + localTable["withdrawUserInfoUseCase-any WithdrawUserInfoUseCase"] = { self.withdrawUserInfoUseCase as Any } + localTable["mainContainerComponent-MainContainerComponent"] = { self.mainContainerComponent as Any } + localTable["bottomTabBarComponent-BottomTabBarComponent"] = { self.bottomTabBarComponent as Any } + localTable["mainTabBarComponent-MainTabBarComponent"] = { self.mainTabBarComponent as Any } + localTable["playerComponent-PlayerComponent"] = { self.playerComponent as Any } + localTable["playlistComponent-PlaylistComponent"] = { self.playlistComponent as Any } + localTable["openSourceLicenseComponent-OpenSourceLicenseComponent"] = { self.openSourceLicenseComponent as Any } + localTable["serviceInfoComponent-ServiceInfoComponent"] = { self.serviceInfoComponent as Any } + localTable["permissionComponent-PermissionComponent"] = { self.permissionComponent as Any } + localTable["noticePopupComponent-NoticePopupComponent"] = { self.noticePopupComponent as Any } + localTable["noticeComponent-NoticeComponent"] = { self.noticeComponent as Any } + localTable["noticeDetailComponent-NoticeDetailComponent"] = { self.noticeDetailComponent as Any } + localTable["remoteNoticeDataSource-any RemoteNoticeDataSource"] = { self.remoteNoticeDataSource as Any } + localTable["noticeRepository-any NoticeRepository"] = { self.noticeRepository as Any } + localTable["fetchNoticeUseCase-any FetchNoticeUseCase"] = { self.fetchNoticeUseCase as Any } + localTable["fetchNoticeCategoriesUseCase-any FetchNoticeCategoriesUseCase"] = { self.fetchNoticeCategoriesUseCase as Any } + localTable["multiPurposePopUpFactory-any MultiPurposePopUpFactory"] = { self.multiPurposePopUpFactory as Any } + localTable["questionComponent-QuestionComponent"] = { self.questionComponent as Any } + localTable["faqComponent-FaqComponent"] = { self.faqComponent as Any } + localTable["faqContentComponent-FaqContentComponent"] = { self.faqContentComponent as Any } + localTable["remoteFaqDataSource-any RemoteFaqDataSource"] = { self.remoteFaqDataSource as Any } + localTable["faqRepository-any FaqRepository"] = { self.faqRepository as Any } + localTable["fetchFaqCategoriesUseCase-any FetchFaqCategoriesUseCase"] = { self.fetchFaqCategoriesUseCase as Any } + localTable["fetchFaqUseCase-any FetchFaqUseCase"] = { self.fetchFaqUseCase as Any } + localTable["remoteAppDataSource-any RemoteAppDataSource"] = { self.remoteAppDataSource as Any } + localTable["appRepository-any AppRepository"] = { self.appRepository as Any } + localTable["fetchAppCheckUseCase-any FetchAppCheckUseCase"] = { self.fetchAppCheckUseCase as Any } + localTable["chartComponent-ChartComponent"] = { self.chartComponent as Any } + localTable["chartContentComponent-ChartContentComponent"] = { self.chartContentComponent as Any } + localTable["remoteChartDataSource-any RemoteChartDataSource"] = { self.remoteChartDataSource as Any } + localTable["chartRepository-any ChartRepository"] = { self.chartRepository as Any } + localTable["fetchChartRankingUseCase-any FetchChartRankingUseCase"] = { self.fetchChartRankingUseCase as Any } + localTable["fetchChartUpdateTimeUseCase-any FetchChartUpdateTimeUseCase"] = { self.fetchChartUpdateTimeUseCase as Any } } } extension ArtistComponent: Registration { diff --git a/Projects/Features/ArtistFeature/Sources/Reactors/ArtistReactor.swift b/Projects/Features/ArtistFeature/Sources/Reactors/ArtistReactor.swift index 30fc37e93..0d0634f40 100644 --- a/Projects/Features/ArtistFeature/Sources/Reactors/ArtistReactor.swift +++ b/Projects/Features/ArtistFeature/Sources/Reactors/ArtistReactor.swift @@ -32,9 +32,6 @@ public final class ArtistReactor: Reactor { switch action { case .viewDidLoad: return viewDidLoad() - - default: - return .empty() } } @@ -64,7 +61,7 @@ private extension ArtistReactor { // Waterfall Grid UI가 기본적으로 왼쪽부터 쌓이게 되기에 첫번째 Cell을 hide 시킵니다 if newArtistList.count == 1 { let hiddenItem: ArtistListEntity = self.makeHiddenArtistEntity() - newArtistList.append(hiddenItem) + newArtistList.insert(hiddenItem, at: 0) } else { newArtistList.swapAt(0, 1) } diff --git a/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift b/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift index 50f3857bb..135e940a7 100644 --- a/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift +++ b/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift @@ -37,24 +37,19 @@ public final class ArtistMusicContentViewModel: ViewModelType { } public struct Output { - var canLoadMore: BehaviorRelay - var dataSource: BehaviorRelay<[ArtistSongListEntity]> - let indexOfSelectedSongs: BehaviorRelay<[Int]> - let songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> + var canLoadMore: BehaviorRelay = BehaviorRelay(value: true) + var dataSource: BehaviorRelay<[ArtistSongListEntity]> = BehaviorRelay(value: []) + let indexOfSelectedSongs: BehaviorRelay<[Int]> = BehaviorRelay(value: []) + let songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) } public func transform(from input: Input) -> Output { + let output = Output() let ID: String = model?.artistId ?? "" let type: ArtistSongSortType = self.type let fetchArtistSongListUseCase: FetchArtistSongListUseCase = self.fetchArtistSongListUseCase - - let dataSource: BehaviorRelay<[ArtistSongListEntity]> = BehaviorRelay(value: []) - let canLoadMore: BehaviorRelay = BehaviorRelay(value: true) - let indexOfSelectedSongs: BehaviorRelay<[Int]> = BehaviorRelay(value: []) - let songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) - let refresh = Observable - .combineLatest(dataSource, input.pageID) { dataSource, pageID -> [ArtistSongListEntity] in + .combineLatest(output.dataSource, input.pageID) { dataSource, pageID -> [ArtistSongListEntity] in return pageID == 1 ? [] : dataSource } @@ -67,19 +62,19 @@ public final class ArtistMusicContentViewModel: ViewModelType { .asObservable() .do(onNext: { model in let loadMore: Bool = model.count < 30 ? false : true - canLoadMore.accept(loadMore) + output.canLoadMore.accept(loadMore) // DEBUG_LOG("page: \(input.pageID.value) called, count: \(model.count), nextPage exist: \(loadMore)") }, onError: { _ in - canLoadMore.accept(false) + output.canLoadMore.accept(false) }) .withLatestFrom(refresh, resultSelector: { newModels, datasources -> [ArtistSongListEntity] in return datasources + newModels }) - .bind(to: dataSource) + .bind(to: output.dataSource) .disposed(by: disposeBag) input.songTapped - .withLatestFrom(indexOfSelectedSongs, resultSelector: { index, selectedSongs -> [Int] in + .withLatestFrom(output.indexOfSelectedSongs, resultSelector: { index, selectedSongs -> [Int] in if selectedSongs.contains(index) { guard let removeTargetIndex = selectedSongs.firstIndex(where: { $0 == index }) else { return selectedSongs } @@ -92,25 +87,25 @@ public final class ArtistMusicContentViewModel: ViewModelType { } }) .map { $0.sorted { $0 < $1 } } - .bind(to: indexOfSelectedSongs) + .bind(to: output.indexOfSelectedSongs) .disposed(by: disposeBag) input.allSongSelected - .withLatestFrom(dataSource) { ($0, $1) } + .withLatestFrom(output.dataSource) { ($0, $1) } .map { flag, dataSource -> [Int] in return flag ? Array(0 ..< dataSource.count) : [] } - .bind(to: indexOfSelectedSongs) + .bind(to: output.indexOfSelectedSongs) .disposed(by: disposeBag) Utility.PreferenceManager.$startPage .skip(1) .map { _ in [] } - .bind(to: indexOfSelectedSongs) + .bind(to: output.indexOfSelectedSongs) .disposed(by: disposeBag) - indexOfSelectedSongs - .withLatestFrom(dataSource) { ($0, $1) } + output.indexOfSelectedSongs + .withLatestFrom(output.dataSource) { ($0, $1) } .map { selectedSongs, dataSource in var newModel = dataSource newModel.indices.forEach { newModel[$0].isSelected = false } @@ -120,11 +115,11 @@ public final class ArtistMusicContentViewModel: ViewModelType { } return newModel } - .bind(to: dataSource) + .bind(to: output.dataSource) .disposed(by: disposeBag) - indexOfSelectedSongs - .withLatestFrom(dataSource) { ($0, $1) } + output.indexOfSelectedSongs + .withLatestFrom(output.dataSource) { ($0, $1) } .map { indexOfSelectedSongs, dataSource in return indexOfSelectedSongs.map { SongEntity( @@ -139,14 +134,9 @@ public final class ArtistMusicContentViewModel: ViewModelType { ) } } - .bind(to: songEntityOfSelectedSongs) + .bind(to: output.songEntityOfSelectedSongs) .disposed(by: disposeBag) - return Output( - canLoadMore: canLoadMore, - dataSource: dataSource, - indexOfSelectedSongs: indexOfSelectedSongs, - songEntityOfSelectedSongs: songEntityOfSelectedSongs - ) + return output } } From a6533d854253960f21df8420adcb91c5c96875fb Mon Sep 17 00:00:00 2001 From: "pikagreen@nate.com" Date: Sun, 21 Apr 2024 20:42:05 +0900 Subject: [PATCH 2/6] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20::=20=08=EC=9E=A1?= =?UTF-8?q?=EB=8B=A4=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ViewModels/ArtistMusicContentViewModel.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift b/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift index 135e940a7..34289d956 100644 --- a/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift +++ b/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift @@ -31,7 +31,7 @@ public final class ArtistMusicContentViewModel: ViewModelType { } public struct Input { - var pageID: BehaviorRelay + var pageID: BehaviorRelay = BehaviorRelay(value: 1) var songTapped: PublishSubject = PublishSubject() var allSongSelected: PublishSubject = PublishSubject() } @@ -39,8 +39,8 @@ public final class ArtistMusicContentViewModel: ViewModelType { public struct Output { var canLoadMore: BehaviorRelay = BehaviorRelay(value: true) var dataSource: BehaviorRelay<[ArtistSongListEntity]> = BehaviorRelay(value: []) - let indexOfSelectedSongs: BehaviorRelay<[Int]> = BehaviorRelay(value: []) - let songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) + var indexOfSelectedSongs: BehaviorRelay<[Int]> = BehaviorRelay(value: []) + var songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) } public func transform(from input: Input) -> Output { @@ -48,6 +48,7 @@ public final class ArtistMusicContentViewModel: ViewModelType { let ID: String = model?.artistId ?? "" let type: ArtistSongSortType = self.type let fetchArtistSongListUseCase: FetchArtistSongListUseCase = self.fetchArtistSongListUseCase + let refresh = Observable .combineLatest(output.dataSource, input.pageID) { dataSource, pageID -> [ArtistSongListEntity] in return pageID == 1 ? [] : dataSource From 55a09f6eab4e583075a54e7ff589f35780d4c573 Mon Sep 17 00:00:00 2001 From: "pikagreen@nate.com" Date: Tue, 23 Apr 2024 23:55:52 +0900 Subject: [PATCH 3/6] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20::=20=08[#494]=20flip(?= =?UTF-8?q?)=20=EB=A1=9C=EC=A7=81=20=EA=B0=84=EC=86=8C=ED=99=94,=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ArtistDetailHeaderViewController.swift | 59 +++++++------------ 1 file changed, 22 insertions(+), 37 deletions(-) diff --git a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailHeaderViewController.swift b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailHeaderViewController.swift index 964d2f027..7c0b2a742 100644 --- a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailHeaderViewController.swift +++ b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailHeaderViewController.swift @@ -34,7 +34,6 @@ class ArtistDetailHeaderViewController: UIViewController, ViewControllerFromStor @IBOutlet weak var introDescriptionLabel: UILabel! var disposeBag: DisposeBag = DisposeBag() - var isBack: Bool = false deinit { DEBUG_LOG("\(Self.self) Deinit") @@ -93,8 +92,8 @@ extension ArtistDetailHeaderViewController { ) self.artistNameLabelHeight.constant = - (availableWidth >= artistNameWidth) ? 36 : - ceil(artistNameAttributedString.height(containerWidth: availableWidth)) + (availableWidth >= artistNameWidth) ? 36 : + ceil(artistNameAttributedString.height(containerWidth: availableWidth)) self.artistNameLabel.attributedText = artistNameAttributedString @@ -144,51 +143,37 @@ extension ArtistDetailHeaderViewController { ) self.view.layoutIfNeeded() } +} - private func bind() { +private extension ArtistDetailHeaderViewController { + func bind() { let mergeObservable = Observable.merge( descriptionFrontButton.rx.tap.map { _ in () }, descriptionBackButton.rx.tap.map { _ in () } ) mergeObservable - .subscribe(onNext: { [weak self] _ in - guard let `self` = self else { return } - self.flip() - }).disposed(by: disposeBag) + .bind(with: self) { owner, _ in + owner.flipArtistIntro() + } + .disposed(by: disposeBag) } - private func flip() { - if self.isBack { - self.isBack = false - self.descriptionFrontView.isHidden = self.isBack - self.descriptionBackView.isHidden = !self.descriptionFrontView.isHidden - - UIView.transition( - with: self.descriptionView, - duration: 0.3, - options: .transitionFlipFromLeft, - animations: nil, - completion: { _ in - } - ) - } else { - self.isBack = true - self.descriptionFrontView.isHidden = self.isBack - self.descriptionBackView.isHidden = !self.descriptionFrontView.isHidden - - UIView.transition( - with: self.descriptionView, - duration: 0.3, - options: .transitionFlipFromRight, - animations: nil, - completion: { _ in - } - ) - } + func flipArtistIntro() { + descriptionFrontView.isHidden = descriptionFrontView.isHidden ? false : true + descriptionBackView.isHidden = !descriptionFrontView.isHidden + + UIView.transition( + with: self.descriptionView, + duration: 0.3, + options: descriptionFrontView.isHidden ? .transitionFlipFromRight : .transitionFlipFromLeft, + animations: nil, + completion: { _ in + } + ) } - private func configureUI() { + func configureUI() { descriptionFrontButton.setImage(DesignSystemAsset.Artist.documentOff.image, for: .normal) descriptionBackButton.setImage(DesignSystemAsset.Artist.documentOn.image, for: .normal) From c355b918d19f0597988cc977f6a057b79ab8fe9d Mon Sep 17 00:00:00 2001 From: "pikagreen@nate.com" Date: Wed, 24 Apr 2024 11:17:48 +0900 Subject: [PATCH 4/6] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20::=20=08[#494]=20var?= =?UTF-8?q?=20>=20let?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ArtistDetailHeaderViewController.swift | 2 +- .../ArtistMusicContentViewController.swift | 2 +- .../ViewModels/ArtistMusicContentViewModel.swift | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailHeaderViewController.swift b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailHeaderViewController.swift index 7c0b2a742..a132d9798 100644 --- a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailHeaderViewController.swift +++ b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistDetailHeaderViewController.swift @@ -164,7 +164,7 @@ private extension ArtistDetailHeaderViewController { descriptionBackView.isHidden = !descriptionFrontView.isHidden UIView.transition( - with: self.descriptionView, + with: descriptionView, duration: 0.3, options: descriptionFrontView.isHidden ? .transitionFlipFromRight : .transitionFlipFromLeft, animations: nil, diff --git a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistMusicContentViewController.swift b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistMusicContentViewController.swift index 1d229c313..cb5f10d1f 100644 --- a/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistMusicContentViewController.swift +++ b/Projects/Features/ArtistFeature/Sources/ViewControllers/ArtistMusicContentViewController.swift @@ -25,7 +25,7 @@ public class ArtistMusicContentViewController: BaseViewController, ViewControlle var containSongsComponent: ContainSongsComponent! private var viewModel: ArtistMusicContentViewModel! - lazy var input = ArtistMusicContentViewModel.Input(pageID: BehaviorRelay(value: 1)) + lazy var input = ArtistMusicContentViewModel.Input() lazy var output = viewModel.transform(from: input) var disposeBag = DisposeBag() diff --git a/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift b/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift index 34289d956..ae7c254e5 100644 --- a/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift +++ b/Projects/Features/ArtistFeature/Sources/ViewModels/ArtistMusicContentViewModel.swift @@ -31,16 +31,16 @@ public final class ArtistMusicContentViewModel: ViewModelType { } public struct Input { - var pageID: BehaviorRelay = BehaviorRelay(value: 1) - var songTapped: PublishSubject = PublishSubject() - var allSongSelected: PublishSubject = PublishSubject() + let pageID: BehaviorRelay = BehaviorRelay(value: 1) + let songTapped: PublishSubject = PublishSubject() + let allSongSelected: PublishSubject = PublishSubject() } public struct Output { - var canLoadMore: BehaviorRelay = BehaviorRelay(value: true) - var dataSource: BehaviorRelay<[ArtistSongListEntity]> = BehaviorRelay(value: []) - var indexOfSelectedSongs: BehaviorRelay<[Int]> = BehaviorRelay(value: []) - var songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) + let canLoadMore: BehaviorRelay = BehaviorRelay(value: true) + let dataSource: BehaviorRelay<[ArtistSongListEntity]> = BehaviorRelay(value: []) + let indexOfSelectedSongs: BehaviorRelay<[Int]> = BehaviorRelay(value: []) + let songEntityOfSelectedSongs: BehaviorRelay<[SongEntity]> = BehaviorRelay(value: []) } public func transform(from input: Input) -> Output { From dc89335b49a4457c84ffdf5cd36901b9a2cf3480 Mon Sep 17 00:00:00 2001 From: KTH Date: Wed, 24 Apr 2024 14:38:29 +0900 Subject: [PATCH 5/6] =?UTF-8?q?=E2=9C=85=20::=20=08[#494]=20insert=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tests/ArtistReactorTests.swift | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Projects/Features/ArtistFeature/Tests/ArtistReactorTests.swift b/Projects/Features/ArtistFeature/Tests/ArtistReactorTests.swift index 2fdba1509..f817672ee 100644 --- a/Projects/Features/ArtistFeature/Tests/ArtistReactorTests.swift +++ b/Projects/Features/ArtistFeature/Tests/ArtistReactorTests.swift @@ -19,7 +19,7 @@ final class ArtistReactorTests: XCTestCase { sut = nil } - func test_when_viewDidLoad_action_and_artist_count_is_1_then_append_hidden_item() { + func test_when_viewDidLoad_action_and_artist_count_is_1_then_insert_hidden_item() { // Given let dummyArtistList = [makeTwoDummyArtistList().first!] fetchArtistListUseCase.handler = { @@ -59,20 +59,20 @@ final class ArtistReactorTests: XCTestCase { private func makeTwoDummyArtistList() -> [ArtistListEntity] { [ ArtistListEntity( - artistId: "1", - name: "name", - short: "short", - group: "group", - title: "title", - description: "description", - color: [["ffffff"]], - youtube: "https://youtube.com", - twitch: "twitch", - instagram: "insta", - imageRoundVersion: 1, - imageSquareVersion: 1, + artistId: "", + name: "", + short: "", + group: "", + title: "", + description: "", + color: [], + youtube: "", + twitch: "", + instagram: "", + imageRoundVersion: 0, + imageSquareVersion: 0, graduated: false, - isHiddenItem: false + isHiddenItem: true ), ArtistListEntity( artistId: "2", From 3eecf8833c73ca595511358586349244d0a8f362 Mon Sep 17 00:00:00 2001 From: KTH Date: Wed, 24 Apr 2024 14:45:27 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=E2=9C=85=20::=20=08[#494]=20insert=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Features/ArtistFeature/Tests/ArtistReactorTests.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Projects/Features/ArtistFeature/Tests/ArtistReactorTests.swift b/Projects/Features/ArtistFeature/Tests/ArtistReactorTests.swift index f817672ee..5b337818a 100644 --- a/Projects/Features/ArtistFeature/Tests/ArtistReactorTests.swift +++ b/Projects/Features/ArtistFeature/Tests/ArtistReactorTests.swift @@ -19,7 +19,7 @@ final class ArtistReactorTests: XCTestCase { sut = nil } - func test_when_viewDidLoad_action_and_artist_count_is_1_then_insert_hidden_item() { + func test_when_viewDidLoad_action_and_artist_count_is_1_then_insert_zero_index_hidden_item() { // Given let dummyArtistList = [makeTwoDummyArtistList().first!] fetchArtistListUseCase.handler = { @@ -32,8 +32,8 @@ final class ArtistReactorTests: XCTestCase { // Then XCTAssertEqual(fetchArtistListUseCase.callCount, 1) XCTAssertEqual(sut.currentState.artistList[0], dummyArtistList.first) - XCTAssertEqual(sut.currentState.artistList[1].artistId, "") - XCTAssertEqual(sut.currentState.artistList[1].isHiddenItem, true) + XCTAssertEqual(sut.currentState.artistList[0].artistId, "") + XCTAssertEqual(sut.currentState.artistList[0].isHiddenItem, true) } func test_when_viewDidLoad_action_and_artist_count_greater_than_2_then_swap_index_0_and_1() {