Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

๐Ÿ”€ :: (#477) Feature ๋ ˆ์ด์–ด์˜ ๋กœ๊ทธ์•„์›ƒ ๋กœ์ง ๋ฆฌํŒฉํ† ๋ง #487

Merged
merged 8 commits into from
Apr 14, 2024
Merged
30 changes: 30 additions & 0 deletions Projects/App/Sources/Application/NeedleGenerated.swift
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,9 @@ private class PlayerDependencyf8a3d594cc3b9254f8adProvider: PlayerDependency {
var fetchFavoriteSongsUseCase: any FetchFavoriteSongsUseCase {
return appComponent.fetchFavoriteSongsUseCase
}
var logoutUseCase: any LogoutUseCase {
return appComponent.logoutUseCase
}
var playlistComponent: PlaylistComponent {
return appComponent.playlistComponent
}
Expand Down Expand Up @@ -319,6 +322,9 @@ private class MyPlayListDependency067bbf42b28f80e413acProvider: MyPlayListDepend
var deletePlayListUseCase: any DeletePlayListUseCase {
return appComponent.deletePlayListUseCase
}
var logoutUseCase: any LogoutUseCase {
return appComponent.logoutUseCase
}
private let appComponent: AppComponent
init(appComponent: AppComponent) {
self.appComponent = appComponent
Expand Down Expand Up @@ -369,6 +375,9 @@ private class FavoriteDependency8f7fd37aeb6f0e5d0e30Provider: FavoriteDependency
var deleteFavoriteListUseCase: any DeleteFavoriteListUseCase {
return appComponent.deleteFavoriteListUseCase
}
var logoutUseCase: any LogoutUseCase {
return appComponent.logoutUseCase
}
private let appComponent: AppComponent
init(appComponent: AppComponent) {
self.appComponent = appComponent
Expand Down Expand Up @@ -582,6 +591,9 @@ private class ContainSongsDependencydbd9ae8a072db3a22630Provider: ContainSongsDe
var addSongIntoPlayListUseCase: any AddSongIntoPlayListUseCase {
return appComponent.addSongIntoPlayListUseCase
}
var logoutUseCase: any LogoutUseCase {
return appComponent.logoutUseCase
}
private let appComponent: AppComponent
init(appComponent: AppComponent) {
self.appComponent = appComponent
Expand Down Expand Up @@ -617,6 +629,9 @@ private class MultiPurposePopDependency30141c7a9a9e67e148afProvider: MultiPurpos
var editPlayListNameUseCase: any EditPlayListNameUseCase {
return appComponent.editPlayListNameUseCase
}
var logoutUseCase: any LogoutUseCase {
return appComponent.logoutUseCase
}
private let appComponent: AppComponent
init(appComponent: AppComponent) {
self.appComponent = appComponent
Expand Down Expand Up @@ -649,6 +664,9 @@ private class PlayListDetailDependencyb06fb5392859952b82a2Provider: PlayListDeta
var removeSongsUseCase: any RemoveSongsUseCase {
return appComponent.removeSongsUseCase
}
var logoutUseCase: any LogoutUseCase {
return appComponent.logoutUseCase
}
var multiPurposePopComponent: MultiPurposePopComponent {
return appComponent.multiPurposePopComponent
}
Expand Down Expand Up @@ -693,6 +711,9 @@ private class ProfilePopDependency081172e20caa75abdb54Provider: ProfilePopDepend
var setProfileUseCase: any SetProfileUseCase {
return appComponent.setProfileUseCase
}
var logoutUseCase: any LogoutUseCase {
return appComponent.logoutUseCase
}
private let appComponent: AppComponent
init(appComponent: AppComponent) {
self.appComponent = appComponent
Expand Down Expand Up @@ -742,10 +763,12 @@ extension AppComponent: Registration {
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["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 }
Expand Down Expand Up @@ -856,6 +879,7 @@ extension PlayerComponent: Registration {
keyPathToName[\PlayerDependency.cancelLikeSongUseCase] = "cancelLikeSongUseCase-any CancelLikeSongUseCase"
keyPathToName[\PlayerDependency.fetchLikeNumOfSongUseCase] = "fetchLikeNumOfSongUseCase-any FetchLikeNumOfSongUseCase"
keyPathToName[\PlayerDependency.fetchFavoriteSongsUseCase] = "fetchFavoriteSongsUseCase-any FetchFavoriteSongsUseCase"
keyPathToName[\PlayerDependency.logoutUseCase] = "logoutUseCase-any LogoutUseCase"
keyPathToName[\PlayerDependency.playlistComponent] = "playlistComponent-PlaylistComponent"
keyPathToName[\PlayerDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent"
}
Expand Down Expand Up @@ -922,6 +946,7 @@ extension MyPlayListComponent: Registration {
keyPathToName[\MyPlayListDependency.fetchPlayListUseCase] = "fetchPlayListUseCase-any FetchPlayListUseCase"
keyPathToName[\MyPlayListDependency.editPlayListOrderUseCase] = "editPlayListOrderUseCase-any EditPlayListOrderUseCase"
keyPathToName[\MyPlayListDependency.deletePlayListUseCase] = "deletePlayListUseCase-any DeletePlayListUseCase"
keyPathToName[\MyPlayListDependency.logoutUseCase] = "logoutUseCase-any LogoutUseCase"
}
}
extension AfterLoginComponent: Registration {
Expand All @@ -940,6 +965,7 @@ extension FavoriteComponent: Registration {
keyPathToName[\FavoriteDependency.fetchFavoriteSongsUseCase] = "fetchFavoriteSongsUseCase-any FetchFavoriteSongsUseCase"
keyPathToName[\FavoriteDependency.editFavoriteSongsOrderUseCase] = "editFavoriteSongsOrderUseCase-any EditFavoriteSongsOrderUseCase"
keyPathToName[\FavoriteDependency.deleteFavoriteListUseCase] = "deleteFavoriteListUseCase-any DeleteFavoriteListUseCase"
keyPathToName[\FavoriteDependency.logoutUseCase] = "logoutUseCase-any LogoutUseCase"
}
}
extension RequestComponent: Registration {
Expand Down Expand Up @@ -1026,6 +1052,7 @@ extension ContainSongsComponent: Registration {
keyPathToName[\ContainSongsDependency.multiPurposePopComponent] = "multiPurposePopComponent-MultiPurposePopComponent"
keyPathToName[\ContainSongsDependency.fetchPlayListUseCase] = "fetchPlayListUseCase-any FetchPlayListUseCase"
keyPathToName[\ContainSongsDependency.addSongIntoPlayListUseCase] = "addSongIntoPlayListUseCase-any AddSongIntoPlayListUseCase"
keyPathToName[\ContainSongsDependency.logoutUseCase] = "logoutUseCase-any LogoutUseCase"
}
}
extension ServiceInfoComponent: Registration {
Expand All @@ -1039,6 +1066,7 @@ extension MultiPurposePopComponent: Registration {
keyPathToName[\MultiPurposePopDependency.loadPlayListUseCase] = "loadPlayListUseCase-any LoadPlayListUseCase"
keyPathToName[\MultiPurposePopDependency.setUserNameUseCase] = "setUserNameUseCase-any SetUserNameUseCase"
keyPathToName[\MultiPurposePopDependency.editPlayListNameUseCase] = "editPlayListNameUseCase-any EditPlayListNameUseCase"
keyPathToName[\MultiPurposePopDependency.logoutUseCase] = "logoutUseCase-any LogoutUseCase"
}
}
extension NewSongsComponent: Registration {
Expand All @@ -1051,6 +1079,7 @@ extension PlayListDetailComponent: Registration {
keyPathToName[\PlayListDetailDependency.fetchPlayListDetailUseCase] = "fetchPlayListDetailUseCase-any FetchPlayListDetailUseCase"
keyPathToName[\PlayListDetailDependency.editPlayListUseCase] = "editPlayListUseCase-any EditPlayListUseCase"
keyPathToName[\PlayListDetailDependency.removeSongsUseCase] = "removeSongsUseCase-any RemoveSongsUseCase"
keyPathToName[\PlayListDetailDependency.logoutUseCase] = "logoutUseCase-any LogoutUseCase"
keyPathToName[\PlayListDetailDependency.multiPurposePopComponent] = "multiPurposePopComponent-MultiPurposePopComponent"
keyPathToName[\PlayListDetailDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent"
}
Expand All @@ -1069,6 +1098,7 @@ extension ProfilePopComponent: Registration {
public func registerItems() {
keyPathToName[\ProfilePopDependency.fetchProfileListUseCase] = "fetchProfileListUseCase-any FetchProfileListUseCase"
keyPathToName[\ProfilePopDependency.setProfileUseCase] = "setProfileUseCase-any SetProfileUseCase"
keyPathToName[\ProfilePopDependency.logoutUseCase] = "logoutUseCase-any LogoutUseCase"
}
}
extension NewSongsContentComponent: Registration {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
// Copyright ยฉ 2023 yongbeomkwak. All rights reserved.
//

import AuthDomainInterface
import Foundation
import NeedleFoundation
import PlayListDomainInterface
Expand All @@ -15,6 +16,7 @@ public protocol ContainSongsDependency: Dependency {
var multiPurposePopComponent: MultiPurposePopComponent { get }
var fetchPlayListUseCase: any FetchPlayListUseCase { get }
var addSongIntoPlayListUseCase: any AddSongIntoPlayListUseCase { get }
var logoutUseCase: any LogoutUseCase { get }
}

public final class ContainSongsComponent: Component<ContainSongsDependency> {
Expand All @@ -24,7 +26,8 @@ public final class ContainSongsComponent: Component<ContainSongsDependency> {
viewModel: .init(
songs: songs,
fetchPlayListUseCase: dependency.fetchPlayListUseCase,
addSongIntoPlayListUseCase: dependency.addSongIntoPlayListUseCase
addSongIntoPlayListUseCase: dependency.addSongIntoPlayListUseCase,
logoutUseCase: dependency.logoutUseCase
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
// Copyright ยฉ 2023 yongbeomkwak. All rights reserved.
//

import AuthDomainInterface
import Foundation
import NeedleFoundation
import PlayListDomainInterface
Expand All @@ -16,6 +17,7 @@ public protocol MultiPurposePopDependency: Dependency {
var loadPlayListUseCase: any LoadPlayListUseCase { get }
var setUserNameUseCase: any SetUserNameUseCase { get }
var editPlayListNameUseCase: any EditPlayListNameUseCase { get }
var logoutUseCase: any LogoutUseCase { get }
}

public final class MultiPurposePopComponent: Component<MultiPurposePopDependency> {
Expand All @@ -31,7 +33,8 @@ public final class MultiPurposePopComponent: Component<MultiPurposePopDependency
createPlayListUseCase: dependency.createPlayListUseCase,
loadPlayListUseCase: dependency.loadPlayListUseCase,
setUserNameUseCase: dependency.setUserNameUseCase,
editPlayListNameUseCase: dependency.editPlayListNameUseCase
editPlayListNameUseCase: dependency.editPlayListNameUseCase,
logoutUseCase: dependency.logoutUseCase
),
completion: completion
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
// Copyright ยฉ 2023 yongbeomkwak. All rights reserved.
//

import AuthDomainInterface
import Foundation
import NeedleFoundation
import PlayListDomainInterface
Expand All @@ -15,6 +16,7 @@ public protocol PlayListDetailDependency: Dependency {

var editPlayListUseCase: any EditPlayListUseCase { get }
var removeSongsUseCase: any RemoveSongsUseCase { get }
var logoutUseCase: any LogoutUseCase { get }

var multiPurposePopComponent: MultiPurposePopComponent { get }
var containSongsComponent: ContainSongsComponent { get }
Expand All @@ -28,7 +30,8 @@ public final class PlayListDetailComponent: Component<PlayListDetailDependency>
type: type,
fetchPlayListDetailUseCase: dependency.fetchPlayListDetailUseCase,
editPlayListUseCase: dependency.editPlayListUseCase,
removeSongsUseCase: dependency.removeSongsUseCase
removeSongsUseCase: dependency.removeSongsUseCase,
logoutUseCase: dependency.logoutUseCase
),
multiPurposePopComponent: dependency.multiPurposePopComponent,
containSongsComponent: dependency.containSongsComponent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,24 @@
// Copyright ยฉ 2023 yongbeomkwak. All rights reserved.
//

import AuthDomainInterface
import Foundation
import NeedleFoundation
import UserDomainInterface

public protocol ProfilePopDependency: Dependency {
var fetchProfileListUseCase: any FetchProfileListUseCase { get }
var setProfileUseCase: any SetProfileUseCase { get }
var logoutUseCase: any LogoutUseCase { get }
}

public final class ProfilePopComponent: Component<ProfilePopDependency> {
public func makeView() -> ProfilePopViewController {
return ProfilePopViewController.viewController(
viewModel: .init(
fetchProfileListUseCase: dependency.fetchProfileListUseCase,
setProfileUseCase: dependency.setProfileUseCase
setProfileUseCase: dependency.setProfileUseCase,
logoutUseCas: dependency.logoutUseCase
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,20 +112,24 @@ extension ContainSongsViewController {
guard let self = self else { return }
self.showToast(text: result.description, font: DesignSystemFontFamily.Pretendard.light.font(size: 14))

if result.status == 401 {
LOGOUT()
PlayState.shared.switchPlayerMode(to: .mini)
self.dismiss(animated: true) { [weak self] in
guard let self else { return }
self.delegate?.tokenExpired()
}
} else {
NotificationCenter.default.post(name: .playListRefresh, object: nil) // ํ”Œ๋ฆฌ๋ชฉ๋ก์ฐฝ ์ด๋ฆ„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•จ
self.dismiss(animated: true)
}
NotificationCenter.default.post(name: .playListRefresh, object: nil) // ํ”Œ๋ฆฌ๋ชฉ๋ก์ฐฝ ์ด๋ฆ„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•จ
self.dismiss(animated: true)
})
.disposed(by: disposeBag)

output.onLogout
.bind(with: self) { owner, error in
let toastFont = DesignSystemFontFamily.Pretendard.light.font(size: 14)
owner.showToast(text: error.localizedDescription, font: toastFont)
NotificationCenter.default.post(name: .movedTab, object: 4)

PlayState.shared.switchPlayerMode(to: .mini)
owner.dismiss(animated: true) {
owner.delegate?.tokenExpired()
}
}
.disposed(by: disposeBag)

NotificationCenter.default.rx.notification(.playListRefresh)
.map { _ in () }
.bind(to: input.playListLoad)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -354,20 +354,23 @@ extension MultiPurposePopupViewController {
text: description,
font: DesignSystemFontFamily.Pretendard.light.font(size: 14)
)

} else if res.status == 401 {
self.showToast(text: res.description, font: DesignSystemFontFamily.Pretendard.light.font(size: 14))
LOGOUT()
if self.viewModel.type == .edit || self.viewModel.type == .creation {
self.delegate?.didTokenExpired()
}

} else {
self.showToast(text: res.description, font: DesignSystemFontFamily.Pretendard.light.font(size: 14))
}
})
.disposed(by: disposeBag)

output.onLogout.bind(with: self) { owner, error in
let toastFont = DesignSystemFontFamily.Pretendard.light.font(size: 14)
owner.showToast(text: error.localizedDescription, font: toastFont)
NotificationCenter.default.post(name: .movedTab, object: 4)

if owner.viewModel.type == .edit || owner.viewModel.type == .creation {
owner.delegate?.didTokenExpired()
}
}
.disposed(by: disposeBag)

saveButton.rx.tap.subscribe(onNext: { [weak self] in
guard let self = self else {
return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,16 +325,19 @@ extension PlayListDetailViewController {
guard let self = self else { return }
self.showToast(text: $0.description, font: DesignSystemFontFamily.Pretendard.light.font(size: 14))

if $0.status == 401 {
LOGOUT()
self.navigationController?.popViewController(animated: true)

} else {
self.input.state.accept(EditState(isEditing: false, force: true))
}
self.input.state.accept(EditState(isEditing: false, force: true))
})
.disposed(by: disposeBag)

output.onLogout.bind(with: self) { owner, error in
let toastFont = DesignSystemFontFamily.Pretendard.light.font(size: 14)
owner.showToast(text: error.localizedDescription, font: toastFont)
NotificationCenter.default.post(name: .movedTab, object: 4)

owner.navigationController?.popViewController(animated: true)
}
.disposed(by: disposeBag)

tableView.rx.itemSelected
.withLatestFrom(output.dataSource) { ($0, $1) }
.withLatestFrom(input.state) { ($0.0, $0.1, $1) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,18 +152,7 @@ extension ProfilePopViewController {

if result.status == 200 {
self.dismiss(animated: true)
}

else if result.status == 401 {
LOGOUT()
self.dismiss(animated: true)
self.showToast(
text: result.description,
font: DesignSystemFontFamily.Pretendard.light.font(size: 14)
)
}

else {
} else {
self.showToast(
text: result.description,
font: DesignSystemFontFamily.Pretendard.light.font(size: 14)
Expand All @@ -181,6 +170,16 @@ extension ProfilePopViewController {
self.panModalTransition(to: .longForm)
self.view.layoutIfNeeded()
}).disposed(by: disposeBag)

viewModel.output.onLogout
.bind(with: self) { owner, error in
let toastFont = DesignSystemFontFamily.Pretendard.light.font(size: 14)
owner.showToast(text: error.localizedDescription, font: toastFont)
NotificationCenter.default.post(name: .movedTab, object: 4)

owner.dismiss(animated: true)
}
.disposed(by: disposeBag)
}
}

Expand Down
Loading
Loading