249 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			249 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
//
 | 
						|
//  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<Bool>,
 | 
						|
        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 <= 5 {
 | 
						|
                                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.grayee)
 | 
						|
                    
 | 
						|
                    Text("\(roomInfo.participantsCount)")
 | 
						|
                        .font(.custom(Font.medium.rawValue, size: 14))
 | 
						|
                        .foregroundColor(Color.button)
 | 
						|
                        .padding(.leading, 6.7)
 | 
						|
                    
 | 
						|
                    Text("/\(roomInfo.totalAvailableParticipantsCount)")
 | 
						|
                        .font(.custom(Font.medium.rawValue, size: 14))
 | 
						|
                        .foregroundColor(Color.graybb)
 | 
						|
                    
 | 
						|
                    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..<profiles.count, id: \.self) { index in
 | 
						|
                            profiles[index]
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            .padding(.vertical, 26.7)
 | 
						|
            .padding(.horizontal, 13.3)
 | 
						|
            .background(Color.gray22.edgesIgnoringSafeArea(.all))
 | 
						|
            .cornerRadius(16.7)
 | 
						|
            
 | 
						|
            if viewModel.isShowPopup {
 | 
						|
                LiveRoomDialogView(
 | 
						|
                    content: viewModel.popupContent,
 | 
						|
                    cancelTitle: viewModel.popupCancelTitle,
 | 
						|
                    cancelAction: viewModel.popupCancelAction,
 | 
						|
                    confirmTitle: viewModel.popupConfirmTitle,
 | 
						|
                    confirmAction: viewModel.popupConfirmAction
 | 
						|
                ).onAppear {
 | 
						|
                    if viewModel.popupConfirmTitle == nil && viewModel.popupConfirmAction == nil {
 | 
						|
                        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
 | 
						|
                            viewModel.isShowPopup = false
 | 
						|
                            viewModel.popupCancelTitle = nil
 | 
						|
                            viewModel.popupCancelAction = nil
 | 
						|
                            viewModel.popupConfirmTitle = nil
 | 
						|
                            viewModel.popupConfirmAction = nil
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            
 | 
						|
            if viewModel.isShowKickOutPopup {
 | 
						|
                SodaDialog(
 | 
						|
                    title: "내보내기",
 | 
						|
                    desc: viewModel.kickOutDesc,
 | 
						|
                    confirmButtonTitle: "내보내기",
 | 
						|
                    confirmButtonAction: {
 | 
						|
                        viewModel.kickOut()
 | 
						|
                    },
 | 
						|
                    cancelButtonTitle: "취소",
 | 
						|
                    cancelButtonAction: {
 | 
						|
                        viewModel.isShowKickOutPopup = false
 | 
						|
                        viewModel.kickOutDesc = ""
 | 
						|
                        viewModel.kickOutId = 0
 | 
						|
                    }
 | 
						|
                )
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |