MoreUserManagerDataCreator.swift 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. //
  2. // MoreUserManagerDataCreator.swift
  3. // TUIRoomKit
  4. //
  5. // Created by janejntang on 2024/10/15.
  6. //
  7. import Foundation
  8. class MoreUserManagerDataCreator {
  9. class func generateMoreUserManagerItems(operation: ConferenceStore) -> [ButtonItemData] {
  10. return [MoreUserManagerDataCreator.getmMuteAllUsersShareScreenItem(operation: operation)]
  11. }
  12. class func getmMuteAllUsersShareScreenItem(operation: ConferenceStore) -> ButtonItemData {
  13. let item = ButtonItemData()
  14. item.normalIcon = "room_mute_share_screen"
  15. item.normalTitle = .onlyHostOrAdminCanShareScreen
  16. item.selectedIcon = "room_unmute_share_screen"
  17. item.selectedTitle = .allParticipantsCanShareScreen
  18. item.resourceBundle = tuiRoomKitBundle()
  19. item.hasLineView = true
  20. item.action = { sender in
  21. let getIsScreenShareDisableForAllUser = operation.selectCurrent(RoomSelectors.getIsScreenShareDisableForAllUser)
  22. MoreUserManagerDataCreator.muteAllShareScreen(isMute: !getIsScreenShareDisableForAllUser, operation: operation)
  23. }
  24. item.bindStateClosure = { button, cancellableSet in
  25. operation.select(RoomSelectors.getIsScreenShareDisableForAllUser)
  26. .receive(on: RunLoop.main)
  27. .sink { [weak button] isScreenShareDisableForAllUser in
  28. guard let button = button else { return }
  29. button.updateSelectState(isScreenShareDisableForAllUser)
  30. }
  31. .store(in: &cancellableSet)
  32. }
  33. return item
  34. }
  35. class func muteAllShareScreen(isMute: Bool, operation: ConferenceStore) {
  36. if isMute, isGeneralUserSharingScreen(operation: operation) {
  37. RoomRouter.presentAlert(title: .muteAllShareScreenAlertTitle, message: .muteAllShareScreenAlertMessage, sureTitle: .open, declineTitle: .cancel, sureBlock: {
  38. EngineManager.shared.muteAllShareScreenAction(isMute: true)
  39. }, declineBlock: nil)
  40. } else {
  41. EngineManager.shared.muteAllShareScreenAction(isMute: isMute)
  42. }
  43. }
  44. class func isGeneralUserSharingScreen(operation: ConferenceStore) -> Bool {
  45. let hasScreenStreamUsers = operation.selectCurrent(UserSelectors.getHasScreenStreamUsers)
  46. let allUsers = EngineManager.shared.store.attendeeList
  47. let hasScreenStreamUserItems = allUsers.filter({ hasScreenStreamUsers.contains($0.userId) })
  48. return hasScreenStreamUserItems.contains(where: { $0.userRole == .generalUser })
  49. }
  50. }
  51. private extension String {
  52. static let onlyHostOrAdminCanShareScreen = localized("Only the host/admin can share screen")
  53. static let allParticipantsCanShareScreen = localized("All participants can share screen")
  54. static let cancel = localized("Cancel")
  55. static let open = localized("Open")
  56. static let muteAllShareScreenAlertTitle = localized("Is it turned on that only the host/admin can share the screen?")
  57. static let muteAllShareScreenAlertMessage = localized("A member is currently sharing the screen, the member's sharing will be terminated after turning on")
  58. }