// // LiveRoomProfilesDialogView.swift // SodaLive // // Created by klaus on 2023/08/14. // import SwiftUI import Kingfisher struct LiveRoomProfilesDialogView: View { @Binding var isShowing: Bool let viewModel: LiveRoomViewModel let roomInfo: GetRoomInfoResponse var profiles: [AnyView] = [] let accountId = UserDefaults.int(forKey: .userId) init( isShowing: Binding, viewModel: LiveRoomViewModel, roomInfo: GetRoomInfoResponse, registerNotification: @escaping () -> Void, unRegisterNotification: @escaping () -> Void, onClickProfile: @escaping (Int) -> Void, onClickNoChatting: @escaping (Int, String, String) -> Void ) { self._isShowing = isShowing self.viewModel = viewModel self.roomInfo = roomInfo if !roomInfo.managerList.isEmpty { self.profiles.append( AnyView( LiveRoomProfileItemTitleView( title: "스탭", count: roomInfo.managerList.count, totalCount: nil ) .padding(.vertical, 14) ) ) } let isStaff = viewModel.isEqualToStaffId(creatorId: UserDefaults.int(forKey: .userId)) || roomInfo.creatorId == UserDefaults.int(forKey: .userId) for manager in roomInfo.managerList { self.profiles.append( AnyView( LiveRoomProfileItemUserView( isStaff: isStaff , userId: manager.id, creatorId: roomInfo.creatorId, nickname: manager.nickname, profileUrl: manager.profileImage, role: manager.role, onClickChangeListener: { _ in }, onClickInviteSpeaker: { _ in }, onClickKickOut: { _ in }, onClickProfile: onClickProfile, onClickNoChatting: { _, _, _ in } ) ) ) } if (roomInfo.speakerList.count - 1) > 0 { self.profiles.append( AnyView( LiveRoomProfileItemTitleView( title: "스피커", count: roomInfo.speakerList.count - 1, totalCount: roomInfo.totalAvailableParticipantsCount ) .padding(.vertical, 14) ) ) } for speaker in roomInfo.speakerList { if speaker.id == roomInfo.creatorId { self.profiles.insert( AnyView( LiveRoomProfileItemMasterView( id: speaker.id, nickname: speaker.nickname, profileUrl: speaker.profileImage, onClickProfile: onClickProfile ) ), at: 0 ) } else { self.profiles.append( AnyView( LiveRoomProfileItemUserView( isStaff: isStaff, userId: speaker.id, creatorId: roomInfo.creatorId, nickname: speaker.nickname, profileUrl: speaker.profileImage, role: speaker.role, onClickChangeListener: { if $0 == UserDefaults.int(forKey: .userId) { viewModel.setListener() return } viewModel.changeListener(peerId: $0) }, onClickInviteSpeaker: { _ in }, onClickKickOut: { viewModel.kickOutId = $0 viewModel.isShowKickOutPopup = true }, onClickProfile: onClickProfile, onClickNoChatting: onClickNoChatting ) ) ) } } self.profiles.append( AnyView( LiveRoomProfileItemTitleView( title: "리스너", count: nil, totalCount: nil ) .padding(.top, 20) .padding(.bottom, 14) ) ) for listener in roomInfo.listenerList { self.profiles.append( AnyView( LiveRoomProfileItemUserView( isStaff: isStaff, userId: listener.id, creatorId: roomInfo.creatorId, nickname: listener.nickname, profileUrl: listener.profileImage, role: listener.role, onClickChangeListener: { _ in }, onClickInviteSpeaker: { if viewModel.liveRoomInfo!.speakerList.count <= 4 { viewModel.inviteSpeaker(peerId: $0) viewModel.popupContent = "스피커 요청을 보냈습니다.\n잠시만 기다려 주세요." viewModel.isShowPopup = true } else { viewModel.errorMessage = "스피커 정원을 초과했습니다." viewModel.isShowErrorPopup = true } }, onClickKickOut: { viewModel.kickOutId = $0 viewModel.isShowKickOutPopup = true }, onClickProfile: onClickProfile, onClickNoChatting: onClickNoChatting ) ) ) } } var body: some View { ZStack { VStack(spacing: 16.7) { HStack(spacing: 0) { Text("참여자") .font(.custom(Font.bold.rawValue, size: 15)) .foregroundColor(Color(hex: "eeeeee")) Text("\(roomInfo.participantsCount)") .font(.custom(Font.medium.rawValue, size: 14)) .foregroundColor(Color(hex: "3bb9f1")) .padding(.leading, 6.7) Text("/\(roomInfo.totalAvailableParticipantsCount)") .font(.custom(Font.medium.rawValue, size: 14)) .foregroundColor(Color(hex: "bbbbbb")) Spacer() Image("ic_close_white") .resizable() .frame(width: 20, height: 20) .onTapGesture { isShowing = false } } ScrollView(.vertical, showsIndicators: false) { VStack(alignment: .leading, spacing: 20) { ForEach(0..