Skip to content

Commit 31cb0f8

Browse files
authored
Merge pull request #154 from boostcampwm-2024/feature/#151-participants-layout-sync
[FEAT/#151] 참가자들의 화면 순서를 동기화 합니다.
2 parents bf9d57a + b8a7f82 commit 31cb0f8

File tree

16 files changed

+144
-70
lines changed

16 files changed

+144
-70
lines changed

PhotoGether/DataLayer/PhotoGetherData/PhotoGetherData/ConnectionRepositoryImpl.swift

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@ public final class ConnectionRepositoryImpl: ConnectionRepository {
99

1010
public var clients: [ConnectionClient]
1111

12+
private let didEnterNewUserSubject = PassthroughSubject<(UserInfo, UIView), Never>()
13+
public var didEnterNewUserPublisher: AnyPublisher<(UserInfo, UIView), Never> {
14+
didEnterNewUserSubject.eraseToAnyPublisher()
15+
}
1216
private let _localVideoView = CapturableVideoView()
13-
private var localUserInfo: UserInfo?
17+
public private(set) var localUserInfo: UserInfo?
1418

1519
public var localVideoView: UIView { _localVideoView }
1620
public var capturedLocalVideo: UIImage? { _localVideoView.capturedImage }
@@ -225,7 +229,10 @@ extension ConnectionRepositoryImpl {
225229
}, receiveValue: { [weak self] entity in
226230
guard let self else { return }
227231
let newUser = entity.newUser
228-
let emptyClient = clients.first(where: { $0.remoteUserInfo == nil })
232+
guard let emptyClient = clients.first(where: { $0.remoteUserInfo == nil }) else {
233+
PTGDataLogger.log("방이 가득 찼는데 누군가 입장했어요!")
234+
return
235+
}
229236

230237
guard let viewPosition = UserInfo.ViewPosition(rawValue: newUser.initialPosition),
231238
let roomID = self.localUserInfo?.roomID
@@ -238,8 +245,9 @@ extension ConnectionRepositoryImpl {
238245
viewPosition: viewPosition,
239246
roomID: roomID
240247
)
241-
242-
emptyClient?.setRemoteUserInfo(newUserInfoEntity)
248+
249+
emptyClient.setRemoteUserInfo(newUserInfoEntity)
250+
didEnterNewUserSubject.send((newUserInfoEntity, emptyClient.remoteVideoView))
243251
PTGDataLogger.log("newUser Entered: \(newUserInfoEntity)")
244252
})
245253
.store(in: &cancellables)
@@ -274,6 +282,7 @@ extension ConnectionRepositoryImpl {
274282
private func setLocalUserInfo(entity: RoomOwnerEntity) -> RoomOwnerEntity {
275283
guard let localUserInfo = localUserInfo(for: entity) else { return entity }
276284
self.localUserInfo = localUserInfo
285+
self.didEnterNewUserSubject.send((localUserInfo, localVideoView))
277286
return entity
278287
}
279288

@@ -305,7 +314,7 @@ extension ConnectionRepositoryImpl {
305314
private func localUserInfo(for entity: RoomOwnerEntity) -> UserInfo? {
306315
return UserInfo(
307316
id: entity.hostID,
308-
nickname: "내가 호스트다",
317+
nickname: String(entity.hostID.suffix(4)), // TODO: 서버에서 받아온 닉네임으로 변경 예정
309318
isHost: true,
310319
viewPosition: .topLeading,
311320
roomID: entity.roomID
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import UIKit
2+
import Combine
3+
import PhotoGetherDomainInterface
4+
5+
public final class DidEnterNewUserPublisherUseCaseImpl: DidEnterNewUserPublisherUseCase {
6+
public func publisher() -> AnyPublisher<(UserInfo, UIView), Never> {
7+
return connectionRepository.didEnterNewUserPublisher
8+
}
9+
private let connectionRepository: ConnectionRepository
10+
11+
public init(connectionRepository: ConnectionRepository) {
12+
self.connectionRepository = connectionRepository
13+
}
14+
}

PhotoGether/DomainLayer/PhotoGetherDomain/PhotoGetherDomain/UseCaseImpl/GetLocalVideoUseCaseImpl.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@ import UIKit
33
import PhotoGetherDomainInterface
44

55
public final class GetLocalVideoUseCaseImpl: GetLocalVideoUseCase {
6-
public func execute() -> UIView {
7-
// TODO: 리포지토리에서 하나의 localVideoView만 들고 있도록 변경 예정
8-
connectionRepository.localVideoView
6+
public func execute() -> (UserInfo?, UIView) {
7+
return (connectionRepository.localUserInfo, connectionRepository.localVideoView)
98
}
109

1110
private let connectionRepository: ConnectionRepository

PhotoGether/DomainLayer/PhotoGetherDomain/PhotoGetherDomain/UseCaseImpl/GetRemoteVideoUseCaseImpl.swift

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,8 @@ import UIKit
33
import PhotoGetherDomainInterface
44

55
public final class GetRemoteVideoUseCaseImpl: GetRemoteVideoUseCase {
6-
public func execute() -> [UIView] {
7-
let sortedClients = connectionRepository.clients
8-
.sorted { lhs, rhs in
9-
let lhsPosition = lhs.remoteUserInfo?.viewPosition.rawValue ?? Int.max
10-
let rhsPosition = rhs.remoteUserInfo?.viewPosition.rawValue ?? Int.max
11-
return lhsPosition < rhsPosition
12-
}
13-
.map { $0.remoteVideoView }
14-
15-
return sortedClients
6+
public func execute() -> [(UserInfo?, UIView)] {
7+
return connectionRepository.clients.map { ($0.remoteUserInfo, $0.remoteVideoView) }
168
}
179

1810
private let connectionRepository: ConnectionRepository

PhotoGether/DomainLayer/PhotoGetherDomain/PhotoGetherDomainInterface/Entity/UserInfo.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ public struct UserInfo: Identifiable {
99

1010
public enum ViewPosition: Int {
1111
case topLeading
12+
case bottomTrailing
1213
case topTrailing
1314
case bottomLeading
14-
case bottomTrailing
1515
}
1616

1717
public init(

PhotoGether/DomainLayer/PhotoGetherDomain/PhotoGetherDomainInterface/Repository/ConnectionRepository.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ import UIKit
22
import Combine
33

44
public protocol ConnectionRepository {
5+
var didEnterNewUserPublisher: AnyPublisher<(UserInfo, UIView), Never> { get }
6+
7+
var localUserInfo: UserInfo? { get }
8+
59
var clients: [ConnectionClient] { get }
610
var localVideoView: UIView { get }
711
var capturedLocalVideo: UIImage? { get }
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import UIKit
2+
import Combine
3+
4+
public protocol DidEnterNewUserPublisherUseCase {
5+
func publisher() -> AnyPublisher<(UserInfo, UIView), Never>
6+
}

PhotoGether/DomainLayer/PhotoGetherDomain/PhotoGetherDomainInterface/UseCase/GetLocalVideoUseCase.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ import Foundation
22
import UIKit
33

44
public protocol GetLocalVideoUseCase {
5-
func execute() -> UIView
5+
func execute() -> (UserInfo?, UIView)
66
}

PhotoGether/DomainLayer/PhotoGetherDomain/PhotoGetherDomainInterface/UseCase/GetRemoteVideoUseCase.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ import Foundation
22
import UIKit
33

44
public protocol GetRemoteVideoUseCase {
5-
func execute() -> [UIView]
5+
func execute() -> [(UserInfo?, UIView)]
66
}

PhotoGether/PhotoGether/App/SceneDelegate.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
8282
connectionRepository: connectionRepository
8383
)
8484

85+
let didEnterNewUserPublisherUseCase: DidEnterNewUserPublisherUseCase = DidEnterNewUserPublisherUseCaseImpl(
86+
connectionRepository: connectionRepository
87+
)
88+
8589
let photoRoomViewModel: PhotoRoomViewModel = PhotoRoomViewModel(
8690
captureVideosUseCase: captureVideosUseCase
8791
)
@@ -97,7 +101,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
97101
sendOfferUseCase: sendOfferUseCase,
98102
getLocalVideoUseCase: getLocalVideoUseCase,
99103
getRemoteVideoUseCase: getRemoteVideoUseCase,
100-
createRoomUseCase: createRoomUseCase
104+
createRoomUseCase: createRoomUseCase,
105+
didEnterNewUserPublisherUseCase: didEnterNewUserPublisherUseCase
101106
)
102107

103108
let waitingRoomViewController: WaitingRoomViewController = WaitingRoomViewController(

0 commit comments

Comments
 (0)