From a87aff42e7553b67c34479d5b8259472d22fd1a7 Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Thu, 5 Dec 2024 21:49:52 +0900 Subject: [PATCH 01/15] =?UTF-8?q?[STYLE]:=20swiftLint=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Data/CRDTTest/CRDTTest.swift | 1 - Data/Data/DataMapper/DataMapper.swift | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Data/CRDTTest/CRDTTest.swift b/Data/CRDTTest/CRDTTest.swift index a705caa8..cec35a73 100644 --- a/Data/CRDTTest/CRDTTest.swift +++ b/Data/CRDTTest/CRDTTest.swift @@ -31,7 +31,6 @@ final class CRDTTest: XCTestCase { } func testIsMergeCompletWhenEventArrivedRandomly() async { - let peerCount = 3 let peer0ID = UUID().uuidString let peer1ID = UUID().uuidString let peer2ID = UUID().uuidString diff --git a/Data/Data/DataMapper/DataMapper.swift b/Data/Data/DataMapper/DataMapper.swift index 023fcef6..4714c8c7 100644 --- a/Data/Data/DataMapper/DataMapper.swift +++ b/Data/Data/DataMapper/DataMapper.swift @@ -69,7 +69,10 @@ enum DataMapper { } static func mappingToVideo(_ element: EditVideoElement) -> Video? { - guard let url = FileSystemManager.shared.mappingToLocalURL(url: element.url, resourceName: element.name) else { return nil } + guard let url = FileSystemManager.shared.mappingToLocalURL( + url: element.url, + resourceName: element.name + ) else { return nil } let user = DataMapper.mappingToConnectedUser(element.editor) return .init( From a9f0bf9303ca27f2033ca0719785969712ea9a9e Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Thu, 5 Dec 2024 21:50:03 +0900 Subject: [PATCH 02/15] =?UTF-8?q?[FEAT]:=20BaseCoordinator=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BaseCoordinator/Coordinator.swift | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 Core/Utilities/BaseCoordinator/Coordinator.swift diff --git a/Core/Utilities/BaseCoordinator/Coordinator.swift b/Core/Utilities/BaseCoordinator/Coordinator.swift new file mode 100644 index 00000000..9968df3e --- /dev/null +++ b/Core/Utilities/BaseCoordinator/Coordinator.swift @@ -0,0 +1,61 @@ +// +// Coordinator.swift +// Core +// +// Created by jung on 12/5/24. +// + +import UIKit + +/// 부모 Coordinator에게 요청하는 메서드를 구현하면 됩니다. +public protocol CoordinatorListener: AnyObject { } + +/// 화면 전환 로직 및, `ViewController`와 `Interactor`생성을 담당하는 객체입니다. +public protocol Coordinating: AnyObject { + var navigationController: UINavigationController { get } + var children: [Coordinating] { get } + + func start() + func stop() + func addChild(_ coordinator: Coordinating) + func removeChild(_ coordinator: Coordinating) +} + +public class Coordinator: Coordinating { + public let navigationController: UINavigationController + final public private(set)var children: [Coordinating] = [] + + public init(navigationController: UINavigationController) { + self.navigationController = navigationController + } + + /// 부모에게 붙여졌을 때, 원하는 동작을 해당 메서드에 구현합니다. + public func start() { } + + /// 부모에게 제거되었을 때 원하는 동작을 해당 메서드에 구현합니다. + public func stop() { + self.removeAllChild() + } + + public final func addChild(_ coordinator: Coordinating) { + guard !children.contains(where: { $0 === coordinator }) else { return } + + children.append(coordinator) + start() + } + + public final func removeChild(_ coordinator: Coordinating) { + guard let index = children.firstIndex(where: { $0 === coordinator }) else { return } + + children.remove(at: index) + + coordinator.stop() + } +} + +// MARK: - Private Methods +private extension Coordinator { + func removeAllChild() { + children.forEach { removeChild($0) } + } +} From 883c39e1b8e7cfb8daebd782c9fe8614160ca7e9 Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Fri, 6 Dec 2024 04:53:57 +0900 Subject: [PATCH 03/15] =?UTF-8?q?[FEAT]:=20Container=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EB=B0=8F=20Coordinator=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Utilities/BaseCoordinator/Container.swift | 15 ++++++ .../BaseCoordinator/Coordinator.swift | 51 +++++++++++-------- 2 files changed, 44 insertions(+), 22 deletions(-) create mode 100644 Core/Utilities/BaseCoordinator/Container.swift diff --git a/Core/Utilities/BaseCoordinator/Container.swift b/Core/Utilities/BaseCoordinator/Container.swift new file mode 100644 index 00000000..aa6c75b7 --- /dev/null +++ b/Core/Utilities/BaseCoordinator/Container.swift @@ -0,0 +1,15 @@ +// +// Container.swift +// Core +// +// Created by jung on 12/6/24. +// + +/// `Coordinator`, `ViewController`, `Interactor`에서 필요한 의존성을 들고 있으며, `Coordinator`생성을 담당하는 객체입니다. +open class Container { + public let dependency: DependencyType + + public init(dependency: DependencyType) { + self.dependency = dependency + } +} diff --git a/Core/Utilities/BaseCoordinator/Coordinator.swift b/Core/Utilities/BaseCoordinator/Coordinator.swift index 9968df3e..0d8e0e24 100644 --- a/Core/Utilities/BaseCoordinator/Coordinator.swift +++ b/Core/Utilities/BaseCoordinator/Coordinator.swift @@ -11,45 +11,52 @@ import UIKit public protocol CoordinatorListener: AnyObject { } /// 화면 전환 로직 및, `ViewController`와 `Interactor`생성을 담당하는 객체입니다. -public protocol Coordinating: AnyObject { - var navigationController: UINavigationController { get } - var children: [Coordinating] { get } - - func start() +public protocol Coordinatable: AnyObject { + var viewController: UIViewController { get } + var navigationController: UINavigationController? { get set } + var children: [Coordinatable] { get } + + func start(_ navigationController: UINavigationController?) func stop() - func addChild(_ coordinator: Coordinating) - func removeChild(_ coordinator: Coordinating) + func addChild(_ coordinator: Coordinatable) + func removeChild(_ coordinator: Coordinatable) } -public class Coordinator: Coordinating { - public let navigationController: UINavigationController - final public private(set)var children: [Coordinating] = [] - - public init(navigationController: UINavigationController) { - self.navigationController = navigationController +open class Coordinator: Coordinatable { + public let viewController: UIViewController + public var navigationController: UINavigationController? + public final var children: [Coordinatable] = [] + + public init(viewController: UIViewController) { + self.viewController = viewController } /// 부모에게 붙여졌을 때, 원하는 동작을 해당 메서드에 구현합니다. - public func start() { } - + open func start(_ navigationController: UINavigationController?) { + self.navigationController = navigationController + } + /// 부모에게 제거되었을 때 원하는 동작을 해당 메서드에 구현합니다. - public func stop() { - self.removeAllChild() + open func stop() { + navigationController?.popViewController(animated: true) + navigationController = nil } - public final func addChild(_ coordinator: Coordinating) { + public final func addChild(_ coordinator: Coordinatable) { guard !children.contains(where: { $0 === coordinator }) else { return } children.append(coordinator) - start() } - public final func removeChild(_ coordinator: Coordinating) { + public final func removeChild(_ coordinator: Coordinatable) { guard let index = children.firstIndex(where: { $0 === coordinator }) else { return } children.remove(at: index) - - coordinator.stop() + } + + deinit { + self.stop() + if !children.isEmpty { removeAllChild() } } } From df99413da2dbd8aa12e150aefff1e42f7b5b9b7b Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Fri, 6 Dec 2024 05:05:24 +0900 Subject: [PATCH 04/15] =?UTF-8?q?[FEAT]:=20Connection=EC=97=90=20Coordinat?= =?UTF-8?q?or=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Feature/Feature.xcodeproj/project.pbxproj | 4 ++ .../ConnectionCoordinator.swift | 53 +++++++++++++++++++ .../ConnectionViewContainer.swift | 33 ++++++++++++ .../ConnectionViewController.swift | 10 ---- .../ViewModel/ConnectionViewModel.swift | 27 ++++++++-- .../ViewModel/ConnectionViewOutput.swift | 1 - 6 files changed, 112 insertions(+), 16 deletions(-) create mode 100644 Feature/Feature/ConnectionView/ConnectionCoordinator.swift create mode 100644 Feature/Feature/ConnectionView/ConnectionViewContainer.swift diff --git a/Feature/Feature.xcodeproj/project.pbxproj b/Feature/Feature.xcodeproj/project.pbxproj index e504e97e..ad38340f 100644 --- a/Feature/Feature.xcodeproj/project.pbxproj +++ b/Feature/Feature.xcodeproj/project.pbxproj @@ -37,11 +37,15 @@ FE8208012CED782500307694 /* Exceptions for "Feature" folder in "Feature" target */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( + ConnectionView/ConnectionCoordinator.swift, + ConnectionView/ConnectionViewContainer.swift, ConnectionView/ConnectionViewController.swift, ConnectionView/View/CustomCircleView.swift, ConnectionView/ViewModel/ConnectionViewInput.swift, ConnectionView/ViewModel/ConnectionViewModel.swift, ConnectionView/ViewModel/ConnectionViewOutput.swift, + GroupInfoView/GroupInfoContainer.swift, + GroupInfoView/GroupInfoCoordinator.swift, GroupInfoView/GroupInfoViewController.swift, GroupInfoView/View/ParticipantCountView.swift, GroupInfoView/View/ParticipantInfoView.swift, diff --git a/Feature/Feature/ConnectionView/ConnectionCoordinator.swift b/Feature/Feature/ConnectionView/ConnectionCoordinator.swift new file mode 100644 index 00000000..ab18df9f --- /dev/null +++ b/Feature/Feature/ConnectionView/ConnectionCoordinator.swift @@ -0,0 +1,53 @@ +// +// ConnectionCoordinator.swift +// Feature +// +// Created by 이숲 on 12/5/24. +// + +import Core +import Interfaces +import UIKit + +public protocol ConnectionListener: AnyObject { } + +final class ConnectionCoordinator: Coordinator, ConnectionCoordinatable { + weak var listener: ConnectionListener? + private let viewModel: ConnectionViewModel + + private let videoListContainer: VideoListContainable + private var videoListCoordinator: Coordinatable? + + override func start(_ navigationController: UINavigationController?) { + super.start(navigationController) + + detachVideoList() + viewModel.fetchBrowedUsers() + } + + init(viewModel: ConnectionViewModel, videoListContainable: VideoListContainable) { + self.viewModel = viewModel + self.videoListContainer = videoListContainable + super.init(viewController: ConnectionViewController(viewModel: viewModel)) + viewModel.coordinator = self + } + + func attachVideoList() { + guard videoListCoordinator == nil else { return } + viewModel.isNotCurrentPresentedView() + let coordinator = videoListContainer.coordinator(listener: self) + addChild(coordinator) + coordinator.start(navigationController) + videoListCoordinator = coordinator + } + + func detachVideoList() { + guard let coordinator = videoListCoordinator else { return } + + removeChild(coordinator) + videoListCoordinator = nil + } +} + +// MARK: - +extension ConnectionCoordinator: VideoListListener { } diff --git a/Feature/Feature/ConnectionView/ConnectionViewContainer.swift b/Feature/Feature/ConnectionView/ConnectionViewContainer.swift new file mode 100644 index 00000000..ca8fa7c9 --- /dev/null +++ b/Feature/Feature/ConnectionView/ConnectionViewContainer.swift @@ -0,0 +1,33 @@ +// +// ConnectionViewContainer.swift +// Feature +// +// Created by jung on 12/6/24. +// + +import Core +import Interfaces + +public protocol ConnectionDependency { + var videoListContaiable: VideoListContainable { get } + var browsingUseCase: BrowsingUserUseCaseInterface { get } +} + +public protocol ConnectionContainable { + func coordinator(listener: ConnectionListener) -> Coordinatable +} + +public final class ConnectionContainer: + Container, ConnectionContainable { + public func coordinator(listener: ConnectionListener) -> Coordinatable { + let viewModel = ConnectionViewModel(usecase: dependency.browsingUseCase) + + let coordinator = ConnectionCoordinator( + viewModel: viewModel, + videoListContainable: dependency.videoListContaiable + ) + coordinator.listener = listener + + return coordinator + } +} diff --git a/Feature/Feature/ConnectionView/ConnectionViewController.swift b/Feature/Feature/ConnectionView/ConnectionViewController.swift index 4bf4b775..ca286d12 100644 --- a/Feature/Feature/ConnectionView/ConnectionViewController.swift +++ b/Feature/Feature/ConnectionView/ConnectionViewController.swift @@ -102,8 +102,6 @@ extension ConnectionViewController { case .invitationTimeout: owner.resetCurrentAlert() owner.invitationTimeoutAlert() - case .openSharedVideoList: - owner.openVideoList() } } .store(in: &cancellables) @@ -187,14 +185,6 @@ private extension ConnectionViewController { currentUserId = nil } - func openVideoList() { - let videoListViewController = VideoListViewController( - viewModel: DIContainer.shared.resolve(type: MultipeerVideoListViewModel.self) - ) - guard navigationController?.viewControllers.last === self else { return } - self.navigationController?.pushViewController(videoListViewController, animated: true) - } - func presentInvitationReceivedAlert(by user: BrowsedUser) { let alert = UIAlertController( type: .invitationReceivedBy(name: user.name), diff --git a/Feature/Feature/ConnectionView/ViewModel/ConnectionViewModel.swift b/Feature/Feature/ConnectionView/ViewModel/ConnectionViewModel.swift index 5e27fce1..4806284d 100644 --- a/Feature/Feature/ConnectionView/ViewModel/ConnectionViewModel.swift +++ b/Feature/Feature/ConnectionView/ViewModel/ConnectionViewModel.swift @@ -11,6 +11,10 @@ import Entity import Foundation import Interfaces +protocol ConnectionCoordinatable: AnyObject { + func attachVideoList() +} + final public class ConnectionViewModel { // MARK: - Typealias @@ -18,7 +22,7 @@ final public class ConnectionViewModel { typealias Output = ConnectionViewOutput // MARK: - Properties - + private var isCurrentPresentedView = true private let usecase: BrowsingUserUseCaseInterface private var output = PassthroughSubject() private var cancellables: Set = [] @@ -28,6 +32,8 @@ final public class ConnectionViewModel { private var outerRadius: CGFloat? private var usedPositions: [String: CGPoint] = [:] + weak var coordinator: ConnectionCoordinatable? + // MARK: - Initializer public init(usecase: BrowsingUserUseCaseInterface) { @@ -49,6 +55,15 @@ final public class ConnectionViewModel { guard self.centerPosition == currentCenter else { return false } return true } + + func fetchBrowedUsers() { + usecase.startAdvertising() + usecase.fetchBrowsedUsers().forEach({ self.found(user: $0) }) + } + + func isNotCurrentPresentedView() { + self.isCurrentPresentedView = false + } } // MARK: - Transform @@ -61,7 +76,7 @@ extension ConnectionViewModel { switch result { // Connection Input case .fetchUsers: - usecase.fetchBrowsedUsers().forEach({ self.found(user: $0) }) + fetchBrowedUsers() case .inviteUser(let id): usecase.inviteUser(with: id) // Invitation Input @@ -81,11 +96,12 @@ extension ConnectionViewModel { } // MARK: - Binding - private extension ConnectionViewModel { func setupBind() { // isInGroup + // group을 어떻게 감지해???????? usecase.isInGroup + .filter { [weak self] _ in self?.isCurrentPresentedView ?? false } .sink(with: self) { owner, value in value ? owner.usecase.stopAdvertising() : owner.usecase.startAdvertising() } @@ -140,9 +156,10 @@ private extension ConnectionViewModel { .store(in: &cancellables) usecase.openingEvent + .receive(on: DispatchQueue.main) .sink(with: self) { owner, _ in - owner.output.send(.openSharedVideoList) - owner.usecase.rejectInvitation() + owner.usecase.stopAdvertising() + owner.coordinator?.attachVideoList() } .store(in: &cancellables) } diff --git a/Feature/Feature/ConnectionView/ViewModel/ConnectionViewOutput.swift b/Feature/Feature/ConnectionView/ViewModel/ConnectionViewOutput.swift index 31fa3225..0b34cd65 100644 --- a/Feature/Feature/ConnectionView/ViewModel/ConnectionViewOutput.swift +++ b/Feature/Feature/ConnectionView/ViewModel/ConnectionViewOutput.swift @@ -23,5 +23,4 @@ enum ConnectionViewOutput { case connected(user: InvitedUser) case invitationRejectedBy(name: String) case invitationTimeout - case openSharedVideoList } From 7223edf613bf3c88e754f21a8d574c8268a77f3b Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Fri, 6 Dec 2024 05:06:24 +0900 Subject: [PATCH 05/15] =?UTF-8?q?[FEAT]:=20GroupInfo=EC=97=90=20Coordinato?= =?UTF-8?q?r=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GroupInfoView/GroupInfoContainer.swift | 30 +++++++++++++++++++ .../GroupInfoView/GroupInfoCoordinator.swift | 29 ++++++++++++++++++ .../GroupInfoViewController.swift | 1 - .../ViewModel/GroupInfoViewModel.swift | 7 +++++ 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 Feature/Feature/GroupInfoView/GroupInfoContainer.swift create mode 100644 Feature/Feature/GroupInfoView/GroupInfoCoordinator.swift diff --git a/Feature/Feature/GroupInfoView/GroupInfoContainer.swift b/Feature/Feature/GroupInfoView/GroupInfoContainer.swift new file mode 100644 index 00000000..b750710e --- /dev/null +++ b/Feature/Feature/GroupInfoView/GroupInfoContainer.swift @@ -0,0 +1,30 @@ +// +// GroupInfoContainer.swift +// Feature +// +// Created by jung on 12/6/24. +// + +import Core +import Interfaces + +public protocol GroupInfoDependency { + var videoListContaiable: VideoListContainable { get } + var connectedUserUseCase: ConnectedUserUseCaseInterface { get } +} + +public protocol GroupInfoContainable { + func coordinator(listener: GroupInfoListener) -> Coordinatable +} + +public final class GroupInfoContainer: + Container, GroupInfoContainable { + public func coordinator(listener: GroupInfoListener) -> Coordinatable { + let viewModel = GroupInfoViewModel(usecase: dependency.connectedUserUseCase) + + let coordinator = GroupInfoCoordinator(viewModel: viewModel) + coordinator.listener = listener + + return coordinator + } +} diff --git a/Feature/Feature/GroupInfoView/GroupInfoCoordinator.swift b/Feature/Feature/GroupInfoView/GroupInfoCoordinator.swift new file mode 100644 index 00000000..3377a678 --- /dev/null +++ b/Feature/Feature/GroupInfoView/GroupInfoCoordinator.swift @@ -0,0 +1,29 @@ +// +// GroupInfoCoordinator.swift +// Feature +// +// Created by 이숲 on 12/5/24. +// + +import Core +import UIKit + +public protocol GroupInfoListener: AnyObject { + func exitGroupButtonDidTap() +} + +final class GroupInfoCoordinator: Coordinator, GroupInfoCoordinatable { + weak var listener: GroupInfoListener? + private let viewModel: GroupInfoViewModel + + init(viewModel: GroupInfoViewModel) { + self.viewModel = viewModel + let viewController = GroupInfoViewController(viewModel: viewModel) + super.init(viewController: viewController) + viewModel.coordinator = self + } + + func exitGroupButtonDidTap() { + listener?.exitGroupButtonDidTap() + } +} diff --git a/Feature/Feature/GroupInfoView/GroupInfoViewController.swift b/Feature/Feature/GroupInfoView/GroupInfoViewController.swift index 35942164..08919b6a 100644 --- a/Feature/Feature/GroupInfoView/GroupInfoViewController.swift +++ b/Feature/Feature/GroupInfoView/GroupInfoViewController.swift @@ -68,7 +68,6 @@ private extension GroupInfoViewController { view.addSubview(participantScrollView) view.addSubview(exitButton) -// exitButton.isEnabled = false participantScrollView.addSubview(participantStackView) } diff --git a/Feature/Feature/GroupInfoView/ViewModel/GroupInfoViewModel.swift b/Feature/Feature/GroupInfoView/ViewModel/GroupInfoViewModel.swift index 5e6e3aec..ec0f9d5a 100644 --- a/Feature/Feature/GroupInfoView/ViewModel/GroupInfoViewModel.swift +++ b/Feature/Feature/GroupInfoView/ViewModel/GroupInfoViewModel.swift @@ -9,6 +9,10 @@ import Combine import Entity import Interfaces +protocol GroupInfoCoordinatable: AnyObject { + func exitGroupButtonDidTap() +} + public final class GroupInfoViewModel { typealias Input = GroupInfoViewInput typealias Output = GroupInfoViewOutput @@ -19,6 +23,8 @@ public final class GroupInfoViewModel { var output = PassthroughSubject() var cancellables: Set = [] + weak var coordinator: GroupInfoCoordinatable? + public init(usecase: ConnectedUserUseCaseInterface) { self.usecase = usecase setupBind() @@ -85,5 +91,6 @@ private extension GroupInfoViewModel { func exitGroupButtonDidTab() { usecase.leaveGroup() + coordinator?.exitGroupButtonDidTap() } } From 9e579c8e89648e9f78d4b49a133e57ed8dfa3d71 Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Fri, 6 Dec 2024 09:05:17 +0900 Subject: [PATCH 06/15] =?UTF-8?q?[FEAT]:=20VideoList=EC=97=90=20Coordinato?= =?UTF-8?q?r=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VideoListView/VideoListContainer.swift | 33 +++++++++++++ .../VideoListView/VideoListCoordinator.swift | 48 +++++++++++++++++++ .../VideoListViewController.swift | 9 ---- .../ViewModel/MockVideoListViewModel.swift | 2 +- .../MultipeerVideoListViewModel.swift | 11 ++++- .../ViewModel/VideoListViewOutput.swift | 1 - 6 files changed, 91 insertions(+), 13 deletions(-) create mode 100644 Feature/Feature/VideoListView/VideoListContainer.swift create mode 100644 Feature/Feature/VideoListView/VideoListCoordinator.swift diff --git a/Feature/Feature/VideoListView/VideoListContainer.swift b/Feature/Feature/VideoListView/VideoListContainer.swift new file mode 100644 index 00000000..7a1bbffc --- /dev/null +++ b/Feature/Feature/VideoListView/VideoListContainer.swift @@ -0,0 +1,33 @@ +// +// VideoListContainer.swift +// Feature +// +// Created by jung on 12/6/24. +// + +import Core +import Interfaces + +public protocol VideoListDependency { + var sharedEditVideoContainer: SharedEditVideoContainable { get } + var sharingVideoUseCase: SharingVideoUseCaseInterface { get } +} + +public protocol VideoListContainable { + func coordinator(listener: VideoListListener) -> Coordinatable +} + +public final class VideoListContainer: + Container, VideoListContainable { + public func coordinator(listener: VideoListListener) -> Coordinatable { + let viewModel = MultipeerVideoListViewModel(usecase: dependency.sharingVideoUseCase) + + let coordinator = VideoListCoordinator( + viewModel: viewModel, + sharedEditVideoContainer: dependency.sharedEditVideoContainer + ) + coordinator.listener = listener + + return coordinator + } +} diff --git a/Feature/Feature/VideoListView/VideoListCoordinator.swift b/Feature/Feature/VideoListView/VideoListCoordinator.swift new file mode 100644 index 00000000..1a43b9f4 --- /dev/null +++ b/Feature/Feature/VideoListView/VideoListCoordinator.swift @@ -0,0 +1,48 @@ +// +// VideoListCoordinator.swift +// Feature +// +// Created by 이숲 on 12/5/24. +// + +import Core +import UIKit + +public protocol VideoListListener: AnyObject { } + +final class VideoListCoordinator: Coordinator, VideoListCoordinatable { + weak var listener: VideoListListener? + + private let viewModel: MultipeerVideoListViewModel + + private let sharedEditVideoContainer: SharedEditVideoContainable + private var sharedEditVideoCoordinator: Coordinatable? + + init( + viewModel: MultipeerVideoListViewModel, + sharedEditVideoContainer: SharedEditVideoContainable + ) { + self.viewModel = viewModel + self.sharedEditVideoContainer = sharedEditVideoContainer + let viewController = VideoListViewController(viewModel: viewModel) + super.init(viewController: viewController) + viewModel.coordinator = self + } + + override func start(_ navigationController: UINavigationController?) { + super.start(navigationController) + navigationController?.pushViewController(viewController, animated: true) + } + + func nextButtonDidTap() { + guard sharedEditVideoCoordinator == nil else { return } + + let coordinator = sharedEditVideoContainer.coordinator(listener: self) + addChild(coordinator) + coordinator.start(navigationController) + sharedEditVideoCoordinator = coordinator + } +} + +// MARK: - SharedVideoEditListener +extension VideoListCoordinator: SharedVideoEditListener { } diff --git a/Feature/Feature/VideoListView/VideoListViewController.swift b/Feature/Feature/VideoListView/VideoListViewController.swift index 90ec9ee8..ba3b2bb6 100644 --- a/Feature/Feature/VideoListView/VideoListViewController.swift +++ b/Feature/Feature/VideoListView/VideoListViewController.swift @@ -101,8 +101,6 @@ private extension VideoListViewController { switch output { case .videoListDidChanged(let videos): self?.items = videos - case .readyForNextScreen: - self?.navigateToEditor() } } .store(in: &cancellables) @@ -188,13 +186,6 @@ private extension VideoListViewController { picker.delegate = self present(picker, animated: true, completion: nil) } - - func navigateToEditor() { - let sharedVideoEditViewController = SharedVideoEditViewController( - viewModel: DIContainer.shared.resolve(type: SharedVideoEditViewModel.self) - ) - navigationController?.pushViewController(sharedVideoEditViewController, animated: true) - } } // MARK: - Collection View diff --git a/Feature/Feature/VideoListView/ViewModel/MockVideoListViewModel.swift b/Feature/Feature/VideoListView/ViewModel/MockVideoListViewModel.swift index 49ede225..db83d719 100644 --- a/Feature/Feature/VideoListView/ViewModel/MockVideoListViewModel.swift +++ b/Feature/Feature/VideoListView/ViewModel/MockVideoListViewModel.swift @@ -43,7 +43,7 @@ extension MockVideoListViewModel: VideoListViewModel { await self.appendItem(with: url) } case .validateSynchronization: - output.send(.readyForNextScreen) + break } } .store(in: &cancellables) diff --git a/Feature/Feature/VideoListView/ViewModel/MultipeerVideoListViewModel.swift b/Feature/Feature/VideoListView/ViewModel/MultipeerVideoListViewModel.swift index cdfd7189..0378c31f 100644 --- a/Feature/Feature/VideoListView/ViewModel/MultipeerVideoListViewModel.swift +++ b/Feature/Feature/VideoListView/ViewModel/MultipeerVideoListViewModel.swift @@ -11,13 +11,19 @@ import Core import Entity import Interfaces +protocol VideoListCoordinatable: AnyObject { + func nextButtonDidTap() +} + public final class MultipeerVideoListViewModel { private var videoItems: [VideoListItem] = [] private let usecase: SharingVideoUseCaseInterface var output = PassthroughSubject() var cancellables: Set = [] - + + weak var coordinator: VideoListCoordinatable? + public init(usecase: SharingVideoUseCaseInterface) { self.usecase = usecase setupBind() @@ -36,9 +42,10 @@ private extension MultipeerVideoListViewModel { .store(in: &cancellables) usecase.isSynchronized + .receive(on: DispatchQueue.main) .sink { [weak self] _ in guard let self else { return } - output.send(.readyForNextScreen) + coordinator?.nextButtonDidTap() } .store(in: &cancellables) } diff --git a/Feature/Feature/VideoListView/ViewModel/VideoListViewOutput.swift b/Feature/Feature/VideoListView/ViewModel/VideoListViewOutput.swift index fe5daf90..e741be99 100644 --- a/Feature/Feature/VideoListView/ViewModel/VideoListViewOutput.swift +++ b/Feature/Feature/VideoListView/ViewModel/VideoListViewOutput.swift @@ -9,5 +9,4 @@ import Foundation public enum VideoListViewOutput { case videoListDidChanged(videos: [VideoListItem]) - case readyForNextScreen } From 6913addf83e9311aa8d4bd66fd57723341a6c4b7 Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Fri, 6 Dec 2024 09:06:40 +0900 Subject: [PATCH 07/15] =?UTF-8?q?[FEAT]:=20ShareVideoEdit=EC=97=90=20Coord?= =?UTF-8?q?inator=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Data/Data/SharingVideoRepository.swift | 4 +-- .../SharedVideoEditContainer.swift | 30 ++++++++++++++++++ .../SharedVideoEditCoordinator.swift | 31 +++++++++++++++++++ .../ViewModel/SharedVideoEditViewInput.swift | 1 + .../ViewModel/SharedVideoEditViewModel.swift | 8 +++++ 5 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 Feature/Feature/SharedVideoEditView/SharedVideoEditContainer.swift create mode 100644 Feature/Feature/SharedVideoEditView/SharedVideoEditCoordinator.swift diff --git a/Data/Data/SharingVideoRepository.swift b/Data/Data/SharingVideoRepository.swift index aed26034..fc3f3f8d 100644 --- a/Data/Data/SharingVideoRepository.swift +++ b/Data/Data/SharingVideoRepository.swift @@ -33,9 +33,7 @@ public final class SharingVideoRepository: SharingVideoRepositoryInterface { public init(socketProvider: SharingVideoSocketProvidable) { self.socketProvider = socketProvider socketProvider.resourceShared - .compactMap { resource in - DataMapper.mappingToSharedVideo(resource) - } + .compactMap { DataMapper.mappingToSharedVideo($0) } .subscribe(updatedSharedVideo) .store(in: &cancellables) diff --git a/Feature/Feature/SharedVideoEditView/SharedVideoEditContainer.swift b/Feature/Feature/SharedVideoEditView/SharedVideoEditContainer.swift new file mode 100644 index 00000000..16594ad5 --- /dev/null +++ b/Feature/Feature/SharedVideoEditView/SharedVideoEditContainer.swift @@ -0,0 +1,30 @@ +// +// SharedEditVideoContainer.swift +// Feature +// +// Created by jung on 12/6/24. +// + +import Core +import Interfaces + +public protocol SharedEditVideoDependency { + var editVideoUseCase: EditVideoUseCaseInterface { get } +} + +public protocol SharedEditVideoContainable { + func coordinator(listener: SharedVideoEditListener) -> Coordinatable +} + +public final class SharedVideoEditContainer: + Container, SharedEditVideoContainable { + public func coordinator(listener: SharedVideoEditListener) -> Coordinatable { + let viewModel = SharedVideoEditViewModel(usecase: dependency.editVideoUseCase) + + let coordinator = SharedVideoEditCoordinator(viewModel: viewModel) + + coordinator.listener = listener + + return coordinator + } +} diff --git a/Feature/Feature/SharedVideoEditView/SharedVideoEditCoordinator.swift b/Feature/Feature/SharedVideoEditView/SharedVideoEditCoordinator.swift new file mode 100644 index 00000000..875fb9b0 --- /dev/null +++ b/Feature/Feature/SharedVideoEditView/SharedVideoEditCoordinator.swift @@ -0,0 +1,31 @@ +// +// SharedVideoEditCoordinator.swift +// Feature +// +// Created by 이숲 on 12/5/24. +// + +import Core +import UIKit + +public protocol SharedVideoEditListener: AnyObject { } + +final class SharedVideoEditCoordinator: Coordinator, SharedVideoEditCoordinatable { + weak var listener: SharedVideoEditListener? + + private let viewModel: SharedVideoEditViewModel + + init(viewModel: SharedVideoEditViewModel) { + self.viewModel = viewModel + let viewController = SharedVideoEditViewController(viewModel: viewModel) + super.init(viewController: viewController) + viewModel.coordinator = self + } + + override func start(_ navigationController: UINavigationController?) { + super.start(navigationController) + navigationController?.pushViewController(viewController, animated: true) + } + + func nextButtonDidTap() { } +} diff --git a/Feature/Feature/SharedVideoEditView/ViewModel/SharedVideoEditViewInput.swift b/Feature/Feature/SharedVideoEditView/ViewModel/SharedVideoEditViewInput.swift index b269983f..552e8f60 100644 --- a/Feature/Feature/SharedVideoEditView/ViewModel/SharedVideoEditViewInput.swift +++ b/Feature/Feature/SharedVideoEditView/ViewModel/SharedVideoEditViewInput.swift @@ -13,4 +13,5 @@ enum SharedVideoEditViewInput { case sliderModelLowerValueDidChanged(value: Double) case sliderModelUpperValueDidChanged(value: Double) case sliderEditSaveButtonDidTapped + case nextButtonDidTap } diff --git a/Feature/Feature/SharedVideoEditView/ViewModel/SharedVideoEditViewModel.swift b/Feature/Feature/SharedVideoEditView/ViewModel/SharedVideoEditViewModel.swift index 18b30ac8..a1032cf2 100644 --- a/Feature/Feature/SharedVideoEditView/ViewModel/SharedVideoEditViewModel.swift +++ b/Feature/Feature/SharedVideoEditView/ViewModel/SharedVideoEditViewModel.swift @@ -11,6 +11,10 @@ import Core import Entity import Interfaces +protocol SharedVideoEditCoordinatable: AnyObject { + func nextButtonDidTap() +} + public final class SharedVideoEditViewModel { typealias Input = SharedVideoEditViewInput typealias Output = SharedVideoEditViewOutput @@ -22,6 +26,8 @@ public final class SharedVideoEditViewModel { private var tappedVideoPresentationModel: VideoPresentationModel? private let usecase: EditVideoUseCaseInterface + weak var coordinator: SharedVideoEditCoordinatable? + public init(usecase: EditVideoUseCaseInterface) { self.usecase = usecase self.setupBind() @@ -49,6 +55,8 @@ extension SharedVideoEditViewModel { startTime: currentTappedVideoPresentationModel.startTime, endTime: currentTappedVideoPresentationModel.endTime ) + case .nextButtonDidTap: + owner.coordinator?.nextButtonDidTap() } } .store(in: &cancellables) From 44f1b05a0b32cab749354fcb198a2dd22c8a5828 Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Fri, 6 Dec 2024 09:55:46 +0900 Subject: [PATCH 08/15] =?UTF-8?q?[REFACT]:=20GroupInforView=20=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=95=84=EC=9B=83=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Feature/GroupInfoView/GroupInfoViewController.swift | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Feature/Feature/GroupInfoView/GroupInfoViewController.swift b/Feature/Feature/GroupInfoView/GroupInfoViewController.swift index 08919b6a..663b6d84 100644 --- a/Feature/Feature/GroupInfoView/GroupInfoViewController.swift +++ b/Feature/Feature/GroupInfoView/GroupInfoViewController.swift @@ -73,18 +73,17 @@ private extension GroupInfoViewController { func setupViewConstraints() { countView.snp.makeConstraints { - $0.top.equalTo(view.safeAreaLayoutGuide).inset(10) + $0.top.equalToSuperview().offset(10) $0.trailing.equalToSuperview().inset(28) $0.height.equalTo(20) } participantScrollView.snp.makeConstraints { - $0.leading.equalToSuperview().inset(20) - $0.trailing.equalTo(exitButton.snp.leading).offset(-8) - $0.top.equalTo(view.safeAreaLayoutGuide).inset(30) + $0.leading.trailing.equalToSuperview().inset(20) + $0.top.equalTo(countView.snp.bottom).offset(20) $0.height.equalTo(35) } exitButton.snp.makeConstraints { - $0.top.equalTo(countView.snp.bottom).offset(10) + $0.top.equalTo(participantScrollView.snp.bottom).offset(10) $0.height.equalTo(38) $0.trailing.equalToSuperview().inset(14) } From 2cd20a9e704eb84b864870193f0ed274005ae733 Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Fri, 6 Dec 2024 10:14:15 +0900 Subject: [PATCH 09/15] =?UTF-8?q?[FEAT]:=20Preview=EC=97=90=20Coordinator?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PreviewView/PreviewContainer.swift | 30 ++++++++++++++++++ .../PreviewView/PreviewCoordinator.swift | 31 +++++++++++++++++++ .../PreviewView/PreviewViewController.swift | 6 ++-- .../ViewModel/PreviewViewModel.swift | 3 ++ 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 Feature/Feature/PreviewView/PreviewContainer.swift create mode 100644 Feature/Feature/PreviewView/PreviewCoordinator.swift diff --git a/Feature/Feature/PreviewView/PreviewContainer.swift b/Feature/Feature/PreviewView/PreviewContainer.swift new file mode 100644 index 00000000..1f3673e8 --- /dev/null +++ b/Feature/Feature/PreviewView/PreviewContainer.swift @@ -0,0 +1,30 @@ +// +// PreviewContainer.swift +// Feature +// +// Created by jung on 12/6/24. +// + +import Core +import Interfaces + +public protocol PreviewDependency { + var editVideoUseCase: EditVideoUseCaseInterface { get } +} + +public protocol PreviewContainable { + func coordinator(listener: PreviewListener) -> Coordinatable +} + +public final class PreviewContainer: + Container, PreviewContainable { + public func coordinator(listener: PreviewListener) -> Coordinatable { + let viewModel = PreviewViewModel(usecase: dependency.editVideoUseCase) + + let coordinator = PreviewCoordinator(viewModel: viewModel) + + coordinator.listener = listener + + return coordinator + } +} diff --git a/Feature/Feature/PreviewView/PreviewCoordinator.swift b/Feature/Feature/PreviewView/PreviewCoordinator.swift new file mode 100644 index 00000000..2cd2294f --- /dev/null +++ b/Feature/Feature/PreviewView/PreviewCoordinator.swift @@ -0,0 +1,31 @@ +// +// PreviewCoordinator.swift +// Feature +// +// Created by jung on 12/6/24. +// + +import Core +import UIKit + +public protocol PreviewListener: AnyObject { } + +final class PreviewCoordinator: Coordinator, PreviewCoordinatable { + weak var listener: PreviewListener? + + private let viewModel: PreviewViewModel + + init(viewModel: PreviewViewModel) { + self.viewModel = viewModel + let viewController = PreviewViewController(viewModel: viewModel) + super.init(viewController: viewController) + viewModel.coordinator = self + } + + override func start(_ navigationController: UINavigationController?) { + super.start(navigationController) + navigationController?.pushViewController(viewController, animated: true) + } + + func nextButtonDidTap() { } +} diff --git a/Feature/Feature/PreviewView/PreviewViewController.swift b/Feature/Feature/PreviewView/PreviewViewController.swift index 0b13d640..36791c54 100644 --- a/Feature/Feature/PreviewView/PreviewViewController.swift +++ b/Feature/Feature/PreviewView/PreviewViewController.swift @@ -6,8 +6,10 @@ // import AVFoundation +import Core import Combine import UIKit +import SnapKit public final class PreviewViewController: UIViewController { private let videoView = VideoPlayerView() @@ -100,12 +102,12 @@ private extension PreviewViewController { videoView.snp.makeConstraints { make in make.top.equalToSuperview() make.horizontalEdges.equalToSuperview() - make.height.equalTo(550) + make.height.equalTo(500) } saveButton.snp.makeConstraints { make in make.centerX.equalToSuperview() - make.top.equalTo(videoView.snp.bottom).offset(30) + make.top.equalTo(videoView.snp.bottom).offset(20) make.width.equalTo(160) make.height.equalTo(50) } diff --git a/Feature/Feature/PreviewView/ViewModel/PreviewViewModel.swift b/Feature/Feature/PreviewView/ViewModel/PreviewViewModel.swift index a4c4933c..04a16fa2 100644 --- a/Feature/Feature/PreviewView/ViewModel/PreviewViewModel.swift +++ b/Feature/Feature/PreviewView/ViewModel/PreviewViewModel.swift @@ -11,10 +11,13 @@ import Foundation import Photos import Interfaces +protocol PreviewCoordinatable: AnyObject { } + public final class PreviewViewModel { typealias Input = PreviewViewInput typealias Output = PreviewViewOutput + weak var coordinator: PreviewCoordinatable? var output = PassthroughSubject() var cancellables: Set = [] From ebfc5892b02ea01cba3ba1ab03934ac46fbab988 Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Fri, 6 Dec 2024 10:15:28 +0900 Subject: [PATCH 10/15] =?UTF-8?q?[FEAT]:=20SharedVideoEdit=EC=97=90=20Prev?= =?UTF-8?q?iew=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SharedVideoEditContainer.swift | 6 +++++- .../SharedVideoEditCoordinator.swift | 21 +++++++++++++++++-- .../SharedVideoEditViewController.swift | 9 +------- .../ViewModel/SharedVideoEditViewModel.swift | 7 ++----- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/Feature/Feature/SharedVideoEditView/SharedVideoEditContainer.swift b/Feature/Feature/SharedVideoEditView/SharedVideoEditContainer.swift index 16594ad5..2ab9c6db 100644 --- a/Feature/Feature/SharedVideoEditView/SharedVideoEditContainer.swift +++ b/Feature/Feature/SharedVideoEditView/SharedVideoEditContainer.swift @@ -10,6 +10,7 @@ import Interfaces public protocol SharedEditVideoDependency { var editVideoUseCase: EditVideoUseCaseInterface { get } + var previewContainer: PreviewContainable { get } } public protocol SharedEditVideoContainable { @@ -21,7 +22,10 @@ public final class SharedVideoEditContainer: public func coordinator(listener: SharedVideoEditListener) -> Coordinatable { let viewModel = SharedVideoEditViewModel(usecase: dependency.editVideoUseCase) - let coordinator = SharedVideoEditCoordinator(viewModel: viewModel) + let coordinator = SharedVideoEditCoordinator( + viewModel: viewModel, + previewContainer: dependency.previewContainer + ) coordinator.listener = listener diff --git a/Feature/Feature/SharedVideoEditView/SharedVideoEditCoordinator.swift b/Feature/Feature/SharedVideoEditView/SharedVideoEditCoordinator.swift index 875fb9b0..101f4664 100644 --- a/Feature/Feature/SharedVideoEditView/SharedVideoEditCoordinator.swift +++ b/Feature/Feature/SharedVideoEditView/SharedVideoEditCoordinator.swift @@ -12,11 +12,18 @@ public protocol SharedVideoEditListener: AnyObject { } final class SharedVideoEditCoordinator: Coordinator, SharedVideoEditCoordinatable { weak var listener: SharedVideoEditListener? + + private let previewContainer: PreviewContainable + private var previewCoordinator: Coordinatable? private let viewModel: SharedVideoEditViewModel - init(viewModel: SharedVideoEditViewModel) { + init( + viewModel: SharedVideoEditViewModel, + previewContainer: PreviewContainable + ) { self.viewModel = viewModel + self.previewContainer = previewContainer let viewController = SharedVideoEditViewController(viewModel: viewModel) super.init(viewController: viewController) viewModel.coordinator = self @@ -27,5 +34,15 @@ final class SharedVideoEditCoordinator: Coordinator, SharedVideoEditCoordinatabl navigationController?.pushViewController(viewController, animated: true) } - func nextButtonDidTap() { } + func attachPreview() { + guard previewCoordinator == nil else { return } + + let coordinator = previewContainer.coordinator(listener: self) + addChild(coordinator) + coordinator.start(navigationController) + previewCoordinator = coordinator + } } + +// MARK: - PreviewListener +extension SharedVideoEditCoordinator: PreviewListener { } diff --git a/Feature/Feature/SharedVideoEditView/SharedVideoEditViewController.swift b/Feature/Feature/SharedVideoEditView/SharedVideoEditViewController.swift index d2d6541a..277f76d7 100644 --- a/Feature/Feature/SharedVideoEditView/SharedVideoEditViewController.swift +++ b/Feature/Feature/SharedVideoEditView/SharedVideoEditViewController.swift @@ -113,7 +113,7 @@ private extension SharedVideoEditViewController { nextButton.bs.tap .sink(with: self) { owner, _ in - owner.navigateToPreview() + owner.input.send(.nextButtonDidTap) } .store(in: &cancellables) } @@ -400,13 +400,6 @@ private extension SharedVideoEditViewController { .cancel()] ), animated: true) } - - func navigateToPreview() { - let previewViewController = PreviewViewController( - viewModel: DIContainer.shared.resolve(type: PreviewViewModel.self) - ) - navigationController?.pushViewController(previewViewController, animated: true) - } } // MARK: - UICollectionViewDelegate diff --git a/Feature/Feature/SharedVideoEditView/ViewModel/SharedVideoEditViewModel.swift b/Feature/Feature/SharedVideoEditView/ViewModel/SharedVideoEditViewModel.swift index 7e8f8380..43f44545 100644 --- a/Feature/Feature/SharedVideoEditView/ViewModel/SharedVideoEditViewModel.swift +++ b/Feature/Feature/SharedVideoEditView/ViewModel/SharedVideoEditViewModel.swift @@ -12,7 +12,7 @@ import Entity import Interfaces protocol SharedVideoEditCoordinatable: AnyObject { - func nextButtonDidTap() + func attachPreview() } public final class SharedVideoEditViewModel { @@ -60,7 +60,7 @@ extension SharedVideoEditViewModel { endTime: currentTappedVideoPresentationModel.endTime ) case .nextButtonDidTap: - owner.coordinator?.nextButtonDidTap() + owner.coordinator?.attachPreview() case .timelineCellOrderDidChanged(let to, let url): owner.videoOrderChanged(to: to, url: url) } @@ -97,9 +97,6 @@ private extension SharedVideoEditViewModel { async let item = owner.makeVideoTimelineItem(with: video.url, asset: asset) await timeLineItem.append(item) } -// let newTimelineItems = await orderdVideos.asyncCompactMap { video in -// return await -// } owner.output.send(.timelineItemsDidChanged(items: timeLineItem)) } } From ee47068c0d98422fe0fcf2803ed161323662baca Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Fri, 6 Dec 2024 10:16:15 +0900 Subject: [PATCH 11/15] =?UTF-8?q?[STYLE]:=20=EB=A9=94=EC=84=9C=EB=93=9C=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 --- Feature/Feature.xcodeproj/project.pbxproj | 4 ++-- .../ConnectionView/ViewModel/ConnectionViewModel.swift | 3 +-- Feature/Feature/VideoListView/VideoListCoordinator.swift | 2 +- .../VideoListView/ViewModel/MultipeerVideoListViewModel.swift | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Feature/Feature.xcodeproj/project.pbxproj b/Feature/Feature.xcodeproj/project.pbxproj index a9a5ba2a..34b4c37d 100644 --- a/Feature/Feature.xcodeproj/project.pbxproj +++ b/Feature/Feature.xcodeproj/project.pbxproj @@ -68,8 +68,9 @@ "Helper/UIImage+convertColor.swift", "Helper/UIImage+resize.swift", "Helper/UIView+Extension.swift", - MainViewController.swift, PresentationModel/VideoPresentationModel.swift, + PreviewView/PreviewContainer.swift, + PreviewView/PreviewCoordinator.swift, PreviewView/PreviewViewController.swift, PreviewView/ViewModel/PreviewViewInput.swift, PreviewView/ViewModel/PreviewViewModel.swift, @@ -94,7 +95,6 @@ SharedVideoEditView/ViewModel/SharedVideoEditViewInput.swift, SharedVideoEditView/ViewModel/SharedVideoEditViewModel.swift, SharedVideoEditView/ViewModel/SharedVideoEditViewOutput.swift, - VideoListView/TempViewController.swift, VideoListView/VideoDetailView/VideoDetailViewController.swift, VideoListView/VideoListContainer.swift, VideoListView/VideoListCoordinator.swift, diff --git a/Feature/Feature/ConnectionView/ViewModel/ConnectionViewModel.swift b/Feature/Feature/ConnectionView/ViewModel/ConnectionViewModel.swift index 4806284d..3faa9fc5 100644 --- a/Feature/Feature/ConnectionView/ViewModel/ConnectionViewModel.swift +++ b/Feature/Feature/ConnectionView/ViewModel/ConnectionViewModel.swift @@ -57,6 +57,7 @@ final public class ConnectionViewModel { } func fetchBrowedUsers() { + self.isCurrentPresentedView = true usecase.startAdvertising() usecase.fetchBrowsedUsers().forEach({ self.found(user: $0) }) } @@ -98,8 +99,6 @@ extension ConnectionViewModel { // MARK: - Binding private extension ConnectionViewModel { func setupBind() { - // isInGroup - // group을 어떻게 감지해???????? usecase.isInGroup .filter { [weak self] _ in self?.isCurrentPresentedView ?? false } .sink(with: self) { owner, value in diff --git a/Feature/Feature/VideoListView/VideoListCoordinator.swift b/Feature/Feature/VideoListView/VideoListCoordinator.swift index 1a43b9f4..fde621fd 100644 --- a/Feature/Feature/VideoListView/VideoListCoordinator.swift +++ b/Feature/Feature/VideoListView/VideoListCoordinator.swift @@ -34,7 +34,7 @@ final class VideoListCoordinator: Coordinator, VideoListCoordinatable { navigationController?.pushViewController(viewController, animated: true) } - func nextButtonDidTap() { + func attachSharedEditVideo() { guard sharedEditVideoCoordinator == nil else { return } let coordinator = sharedEditVideoContainer.coordinator(listener: self) diff --git a/Feature/Feature/VideoListView/ViewModel/MultipeerVideoListViewModel.swift b/Feature/Feature/VideoListView/ViewModel/MultipeerVideoListViewModel.swift index 5ff495f2..594e1ab2 100644 --- a/Feature/Feature/VideoListView/ViewModel/MultipeerVideoListViewModel.swift +++ b/Feature/Feature/VideoListView/ViewModel/MultipeerVideoListViewModel.swift @@ -12,7 +12,7 @@ import Entity import Interfaces protocol VideoListCoordinatable: AnyObject { - func nextButtonDidTap() + func attachSharedEditVideo() } public final class MultipeerVideoListViewModel { @@ -45,7 +45,7 @@ private extension MultipeerVideoListViewModel { .receive(on: DispatchQueue.main) .sink { [weak self] _ in guard let self else { return } - coordinator?.nextButtonDidTap() + coordinator?.attachSharedEditVideo() } .store(in: &cancellables) From 91fd1d73a9919bfc8b32bcc09365923c442f4f4c Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Fri, 6 Dec 2024 10:17:17 +0900 Subject: [PATCH 12/15] =?UTF-8?q?[FEAT]:=20AppDelegate=20&=20SceneDelegate?= =?UTF-8?q?=20Main=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/App/{ => AppLifeCycles}/AppDelegate.swift | 0 App/App/AppLifeCycles/SceneDelegate.swift | 37 +++++ App/App/SceneDelegate.swift | 145 ------------------ 3 files changed, 37 insertions(+), 145 deletions(-) rename App/App/{ => AppLifeCycles}/AppDelegate.swift (100%) create mode 100644 App/App/AppLifeCycles/SceneDelegate.swift delete mode 100644 App/App/SceneDelegate.swift diff --git a/App/App/AppDelegate.swift b/App/App/AppLifeCycles/AppDelegate.swift similarity index 100% rename from App/App/AppDelegate.swift rename to App/App/AppLifeCycles/AppDelegate.swift diff --git a/App/App/AppLifeCycles/SceneDelegate.swift b/App/App/AppLifeCycles/SceneDelegate.swift new file mode 100644 index 00000000..71421e77 --- /dev/null +++ b/App/App/AppLifeCycles/SceneDelegate.swift @@ -0,0 +1,37 @@ +// +// SceneDelegate.swift +// App +// +// Created by jung on 11/4/24. +// + +import Core +import Data +import Feature +import Interfaces +import P2PSocket +import UIKit +import UseCase + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? + let container = MainContainer() + var coordinator: Coordinator? + + func scene( + _ scene: UIScene, + willConnectTo session: UISceneSession, + options connectionOptions: UIScene.ConnectionOptions + ) { + guard let windowScene = (scene as? UIWindowScene) else { return } + + let coordinator = container.coordinator() + self.coordinator = coordinator + coordinator.start(nil) + let window = UIWindow(windowScene: windowScene) + window.rootViewController = coordinator.viewController + + self.window = window + window.makeKeyAndVisible() + } +} diff --git a/App/App/SceneDelegate.swift b/App/App/SceneDelegate.swift deleted file mode 100644 index d69d7e1f..00000000 --- a/App/App/SceneDelegate.swift +++ /dev/null @@ -1,145 +0,0 @@ -// -// SceneDelegate.swift -// App -// -// Created by jung on 11/4/24. -// - -import Core -import Data -import Feature -import Interfaces -import P2PSocket -import UIKit -import UseCase - -class SceneDelegate: UIResponder, UIWindowSceneDelegate { - var window: UIWindow? - - func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { - guard let windowScene = (scene as? UIWindowScene) else { return } - registerDependency() - - let window = UIWindow(windowScene: windowScene) - - let groupInfoViewController = GroupInfoViewController(viewModel: DIContainer.shared.resolve(type: GroupInfoViewModel.self)) - let connectionViewController = ConnectionViewController(viewModel: DIContainer.shared.resolve(type: ConnectionViewModel.self)) - - window.rootViewController = MainViewController( - topViewController: groupInfoViewController, - initialViewController: connectionViewController - ) - - self.window = window - window.makeKeyAndVisible() - } -} - -extension SceneDelegate { - func registerDependency() { - registerP2PSocket() - registerRepository() - registerUseCase() - registerViewModel() - } - - func registerP2PSocket() { - DIContainer.shared.register( - type: SocketProvidable.self, - instance: SocketProvider() - ) - } - - func registerRepository() { - let socketProvider = DIContainer.shared.resolve(type: SocketProvidable.self) - - DIContainer.shared.register( - type: BrowsingUserRepositoryInterface.self, - instance: BrowsingUserRepository(socketProvider:socketProvider) - ) - - DIContainer.shared.register( - type: ConnectedUserRepositoryInterface.self, - instance: ConnectedUserRepository(socketProvider: socketProvider) - ) - - DIContainer.shared.register( - type: SharingVideoRepositoryInterface.self, - instance: SharingVideoRepository(socketProvider: socketProvider) - ) - - DIContainer.shared.register( - type: EditVideoRepositoryInterface.self, - instance: EditVideoRepository(socketProvider: socketProvider) - ) - } - - func registerUseCase() { - DIContainer.shared.register( - type: BrowsingUserUseCaseInterface.self, - instance: BrowsingUserUseCase( - repository: DIContainer.shared.resolve(type: BrowsingUserRepositoryInterface.self) - ) - ) - - DIContainer.shared.register( - type: ConnectedUserUseCaseInterface.self, - instance: ConnectedUserUseCase( - repository: DIContainer.shared.resolve(type: ConnectedUserRepositoryInterface.self) - ) - ) - - DIContainer.shared.register( - type: VideoUseCase.self, - instance: VideoUseCase( - sharingVideoRepository: DIContainer.shared.resolve(type: SharingVideoRepositoryInterface.self), - editVideoRepository: DIContainer.shared.resolve(type: EditVideoRepositoryInterface.self) - ) - ) - - DIContainer.shared.register( - type: SharingVideoUseCaseInterface.self, - instance: DIContainer.shared.resolve(type: VideoUseCase.self) - ) - - DIContainer.shared.register( - type: EditVideoUseCaseInterface.self, - instance: DIContainer.shared.resolve(type: VideoUseCase.self) - ) - } - - func registerViewModel() { - DIContainer.shared.register( - type: ConnectionViewModel.self, - instance: ConnectionViewModel( - usecase: DIContainer.shared.resolve(type: BrowsingUserUseCaseInterface.self) - ) - ) - - DIContainer.shared.register( - type: GroupInfoViewModel.self, - instance: GroupInfoViewModel( - usecase: DIContainer.shared.resolve(type: ConnectedUserUseCaseInterface.self) - ) - ) - - DIContainer.shared.register( - type: MultipeerVideoListViewModel.self, - instance: MultipeerVideoListViewModel( - usecase: DIContainer.shared.resolve(type: SharingVideoUseCaseInterface.self) - ) - ) - - DIContainer.shared.register( - type: SharedVideoEditViewModel.self, - instance: SharedVideoEditViewModel( - usecase: DIContainer.shared.resolve(type: EditVideoUseCaseInterface.self) - ) - ) - - DIContainer.shared.register( - type: PreviewViewModel.self, - instance: PreviewViewModel(usecase: DIContainer.shared.resolve(type: EditVideoUseCaseInterface.self)) - ) - } -} From b710572cb555d87968986a3fabdd75d8065dedad Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Fri, 6 Dec 2024 10:17:38 +0900 Subject: [PATCH 13/15] =?UTF-8?q?[FEAT]:=20AppRoot=EC=97=90=20MainViewCont?= =?UTF-8?q?roller=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/App/MainContainer.swift | 83 +++++++++++++++++++ App/App/MainCoordinator.swift | 73 ++++++++++++++++ App/App/MainViewController.swift | 40 +++++++++ App/App/RootViewController.swift | 15 ---- Feature/Feature/MainViewController.swift | 73 ---------------- .../VideoListView/TempViewController.swift | 18 ---- 6 files changed, 196 insertions(+), 106 deletions(-) create mode 100644 App/App/MainContainer.swift create mode 100644 App/App/MainCoordinator.swift create mode 100644 App/App/MainViewController.swift delete mode 100644 App/App/RootViewController.swift delete mode 100644 Feature/Feature/MainViewController.swift delete mode 100644 Feature/Feature/VideoListView/TempViewController.swift diff --git a/App/App/MainContainer.swift b/App/App/MainContainer.swift new file mode 100644 index 00000000..a89d94ed --- /dev/null +++ b/App/App/MainContainer.swift @@ -0,0 +1,83 @@ +// +// MainContainer.swift +// App +// +// Created by jung on 12/6/24. +// + +import Core +import Feature +import P2PSocket +import UseCase +import Data +import Interfaces + +final class MainContainer: + ConnectionDependency, + VideoListDependency, + GroupInfoDependency, + SharedEditVideoDependency, + PreviewDependency { + let socketProvider = SocketProvider() + + func coordinator() -> Coordinator { + let groupInfoContainer = GroupInfoContainer(dependency: self) + let connectionContainer = ConnectionContainer(dependency: self) + + return MainCoordinator( + groupInfoContainer: groupInfoContainer, + connectionContainer: connectionContainer + ) + } + + // MARK: - Containable + var videoListContaiable: VideoListContainable { + return VideoListContainer(dependency: self) + } + + var sharedEditVideoContainer: SharedEditVideoContainable { + return SharedVideoEditContainer(dependency: self) + } + + var previewContainer: PreviewContainable { + return PreviewContainer(dependency: self) + } + + // MARK: - Repository + var browsingUserRepository: BrowsingUserRepositoryInterface { + return BrowsingUserRepository(socketProvider: socketProvider) + } + + var connectedUserRepository: ConnectedUserRepositoryInterface { + return ConnectedUserRepository(socketProvider: socketProvider) + } + + var sharingVideoRepository: SharingVideoRepositoryInterface { + return SharingVideoRepository(socketProvider: socketProvider) + } + + var editVideoRepository: EditVideoRepositoryInterface { + return EditVideoRepository(socketProvider: socketProvider) + } + + // MARK: - UseCase + var browsingUseCase: BrowsingUserUseCaseInterface { + return BrowsingUserUseCase(repository: browsingUserRepository) + } + + var connectedUserUseCase: ConnectedUserUseCaseInterface { + return ConnectedUserUseCase(repository: connectedUserRepository) + } + + lazy var videoUseCase: VideoUseCase = { + return VideoUseCase(sharingVideoRepository: sharingVideoRepository, editVideoRepository: editVideoRepository) + }() + + var sharingVideoUseCase: SharingVideoUseCaseInterface { + videoUseCase + } + + var editVideoUseCase: EditVideoUseCaseInterface { + videoUseCase + } +} diff --git a/App/App/MainCoordinator.swift b/App/App/MainCoordinator.swift new file mode 100644 index 00000000..db57472f --- /dev/null +++ b/App/App/MainCoordinator.swift @@ -0,0 +1,73 @@ +// +// MainCoordinator.swift +// App +// +// Created by jung on 12/6/24. +// + +import Core +import Feature +import UIKit + +public final class MainCoordinator: Coordinator { + private var bottomNavigationController: UINavigationController? + + // MARK: - Coordinatables + private let groupInfoContainer: GroupInfoContainable + private var groupInfoCoordinatable: Coordinatable? + + private let connectionContainer: ConnectionContainable + private var connectionCoordinatable: Coordinatable? + + // MARK: - Initializer + public init( + groupInfoContainer: GroupInfoContainable, + connectionContainer: ConnectionContainable + ) { + self.groupInfoContainer = groupInfoContainer + self.connectionContainer = connectionContainer + super.init(viewController: MainViewController()) + } + + public override func start(_ navigationController: UINavigationController?) { + guard let viewController = viewController as? MainViewController else { return } + + let topViewController = groupInfoViewController() + let bottomViewController = connectionViewController() + viewController.attachTopViewController(topViewController) + viewController.attachBottomViewController(bottomViewController) + } +} + +private extension MainCoordinator { + func connectionViewController() -> UIViewController { + let coordinator = connectionContainer.coordinator(listener: self) + connectionCoordinatable = coordinator + let navigation = UINavigationController(rootViewController: coordinator.viewController) + bottomNavigationController = navigation + coordinator.start(navigation) + + return navigation + } + + func groupInfoViewController() -> UIViewController { + let coordinator = groupInfoContainer.coordinator(listener: self) + groupInfoCoordinatable = coordinator + let navigation = UINavigationController(rootViewController: coordinator.viewController) + coordinator.start(navigation) + + return navigation + } +} + +// MARK: - ConnectionListener +extension MainCoordinator: ConnectionListener { } + +// MARK: - GroupInfoListener +extension MainCoordinator: GroupInfoListener { + public func exitGroupButtonDidTap() { + FileSystemManager.shared.deleteAllFiles() + bottomNavigationController?.popToRootViewController(animated: true) + connectionCoordinatable?.start(bottomNavigationController) + } +} diff --git a/App/App/MainViewController.swift b/App/App/MainViewController.swift new file mode 100644 index 00000000..1ad3f882 --- /dev/null +++ b/App/App/MainViewController.swift @@ -0,0 +1,40 @@ +// +// MainViewController.swift +// App +// +// Created by jung on 12/6/24. +// + +import SnapKit +import UIKit + +final class MainViewController: UIViewController { + private enum Constants { + static let topViewHeight: CGFloat = 200 + } + + func attachTopViewController(_ viewController: UIViewController) { + addChild(viewController) + view.addSubview(viewController.view) + viewController.didMove(toParent: self) + viewController.view.backgroundColor = .red + viewController.view.snp.makeConstraints { make in + make.top.equalTo(view.safeAreaLayoutGuide) + make.leading.equalToSuperview() + make.trailing.equalToSuperview() + make.height.equalTo(Constants.topViewHeight) + } + } + + func attachBottomViewController(_ viewController: UIViewController) { + addChild(viewController) + view.addSubview(viewController.view) + viewController.didMove(toParent: self) + + viewController.view.snp.makeConstraints { make in + make.top.equalToSuperview().offset(Constants.topViewHeight) + make.leading.trailing.equalToSuperview() + make.bottom.equalTo(view.safeAreaLayoutGuide) + } + } +} diff --git a/App/App/RootViewController.swift b/App/App/RootViewController.swift deleted file mode 100644 index 9c66d31d..00000000 --- a/App/App/RootViewController.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// RootViewController.swift -// App -// -// Created by jung on 11/4/24. -// - -import UIKit - -final class RootViewController: UIViewController { - override func viewDidLoad() { - super.viewDidLoad() - print(#function) - } -} diff --git a/Feature/Feature/MainViewController.swift b/Feature/Feature/MainViewController.swift deleted file mode 100644 index cb3829dc..00000000 --- a/Feature/Feature/MainViewController.swift +++ /dev/null @@ -1,73 +0,0 @@ -// -// MainViewController.swift -// Feature -// -// Created by 이숲 on 11/21/24. -// - -import SnapKit -import UIKit - -public final class MainViewController: UIViewController { - // MARK: - UI Components - - private let topViewController: UIViewController - private let bottomNavigationController: UINavigationController - - // MARK: - Initializer - - public init(topViewController: UIViewController, initialViewController: UIViewController) { - self.topViewController = topViewController - self.bottomNavigationController = UINavigationController(rootViewController: initialViewController) - super.init(nibName: nil, bundle: nil) - } - - @available(*, unavailable) - public required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: - LifeCycle - - public override func viewDidLoad() { - super.viewDidLoad() - - setupViewHierarchies() - setupViewConstraints() - } -} - -// MARK: - UI Configure - -private extension MainViewController { - enum Constants { - static let topViewHeight: CGFloat = 120 - } - - func setupViewHierarchies() { - [ - topViewController, - bottomNavigationController - ].forEach({ - addChild($0) - view.addSubview($0.view) - $0.didMove(toParent: self) - }) - } - - func setupViewConstraints() { - topViewController.view.snp.makeConstraints { make in - make.top.equalTo(view.safeAreaLayoutGuide) - make.leading.equalToSuperview() - make.trailing.equalToSuperview() - make.height.equalTo(Constants.topViewHeight) - } - - bottomNavigationController.view.snp.makeConstraints { make in - make.top.equalTo(topViewController.view.snp.bottom) - make.leading.equalToSuperview() - make.trailing.equalToSuperview() - make.bottom.equalTo(view.safeAreaLayoutGuide) - } - } -} diff --git a/Feature/Feature/VideoListView/TempViewController.swift b/Feature/Feature/VideoListView/TempViewController.swift deleted file mode 100644 index 17b1db27..00000000 --- a/Feature/Feature/VideoListView/TempViewController.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// TempViewController.swift -// Feature -// -// Created by 디해 on 11/22/24. -// - -import UIKit - -/// 편집 화면으로 이동하기 위한 임시 뷰 컨트롤러 입니다. -/// 추후 이 뷰 컨트롤러를 사용하여 편집 화면 뷰 컨트롤러를 구현해도 되고, 새로 구현하셔도 됩니다. -final class TempViewController: UIViewController { - override func viewDidLoad() { - super.viewDidLoad() - - view.backgroundColor = .blue - } -} From 003ac4e9982a8178fcbd3d361e9e0d3772fc0c02 Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Fri, 6 Dec 2024 10:18:19 +0900 Subject: [PATCH 14/15] =?UTF-8?q?[FEAT]:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F?= =?UTF-8?q?=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A3=BC=EC=9E=85=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Utilities/DIContainer.swift | 27 --------------------------- Data/Data/EditVideoRepository.swift | 24 ++++++++---------------- 2 files changed, 8 insertions(+), 43 deletions(-) delete mode 100644 Core/Utilities/DIContainer.swift diff --git a/Core/Utilities/DIContainer.swift b/Core/Utilities/DIContainer.swift deleted file mode 100644 index 8095a1de..00000000 --- a/Core/Utilities/DIContainer.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// DIContainer.swift -// Core -// -// Created by 이숲 on 11/20/24. -// - -public final class DIContainer { - public static let shared = DIContainer() - - private var services: [String: Any] = [:] - - private init() { } - - public func register(type: T.Type, instance: T) { - let key = String(describing: type) - services[key] = instance - } - - public func resolve(type: T.Type) -> T { - let key = String(describing: type) - guard let service = services[key] as? T else { - fatalError("\(key) is not registered.") - } - return service - } -} diff --git a/Data/Data/EditVideoRepository.swift b/Data/Data/EditVideoRepository.swift index 85d20583..069cd4fe 100644 --- a/Data/Data/EditVideoRepository.swift +++ b/Data/Data/EditVideoRepository.swift @@ -19,7 +19,7 @@ public final class EditVideoRepository: EditVideoRepositoryInterface { // MARK: - Properties private var cancellables: Set = [] private let socketProvider: EditVideoSocketProvidable - private var elementSet: LWWElementSet + private let elementSet: LWWElementSet public let editedVideos = PassthroughSubject<[Video], Never>() @@ -74,28 +74,20 @@ public extension EditVideoRepository { // MARK: - Binding private extension EditVideoRepository { func binding() { - socketProvider.updatedPeer.sink(with: self) { owner, _ in - let id = owner.socketProvider.id - let peerIDs = owner.socketProvider.connectedPeers().map { $0.id } - owner.elementSet = .init(id: id, peerIDs: peerIDs) - owner.bindUpdatedElements() - }.store(in: &cancellables) - - socketProvider.dataShared - .sink(with: self) { owner, data in - owner.merge(data: data.0) - } - .store(in: &cancellables) - } - - func bindUpdatedElements() { Task { await elementSet.updatedElements .sink(with: self) { owner, elements in + print(elements.count) owner.sendVideo(elements: elements) } .store(in: &cancellables) } + + socketProvider.dataShared + .sink(with: self) { owner, data in + owner.merge(data: data.0) + } + .store(in: &cancellables) } } From 0322e1fdbe401949b53ffaa580d9db5274ca2310 Mon Sep 17 00:00:00 2001 From: Jung SeokYoung Date: Fri, 6 Dec 2024 10:18:41 +0900 Subject: [PATCH 15/15] =?UTF-8?q?[FIX]:=20owner.name=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=ED=95=98=EB=A9=B4=20=EB=B0=9C=EC=83=9D=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=B2=84=EA=B7=B8=20=EC=9E=84=EC=8B=9C=20=EC=A1=B0=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Data/Data/SharingVideoRepository.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Data/Data/SharingVideoRepository.swift b/Data/Data/SharingVideoRepository.swift index a2a3b765..703a3ba7 100644 --- a/Data/Data/SharingVideoRepository.swift +++ b/Data/Data/SharingVideoRepository.swift @@ -34,7 +34,9 @@ public final class SharingVideoRepository: SharingVideoRepositoryInterface { public init(socketProvider: SharingVideoSocketProvidable) { self.socketProvider = socketProvider socketProvider.resourceShared - .compactMap { DataMapper.mappingToSharedVideo($0) } + .compactMap { + return .init(localUrl: $0.url, name: $0.name, author: "iPhone") + } .subscribe(updatedSharedVideo) .store(in: &cancellables)