281 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			281 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
//
 | 
						|
//  LiveRoomInfoHostView.swift
 | 
						|
//  SodaLive
 | 
						|
//
 | 
						|
//  Created by klaus on 2024/01/17.
 | 
						|
//
 | 
						|
 | 
						|
import SwiftUI
 | 
						|
import Kingfisher
 | 
						|
 | 
						|
struct LiveRoomInfoHostView: View {
 | 
						|
    
 | 
						|
    let title: String
 | 
						|
    let totalHeart: Int
 | 
						|
    let totalDonationCan: Int
 | 
						|
    let participantsCount: Int
 | 
						|
    
 | 
						|
    let isOnBg: Bool
 | 
						|
    let isOnNotice: Bool
 | 
						|
    let isOnMenuPan: Bool
 | 
						|
    let isOnSignature: Bool
 | 
						|
    let isShowMenuPanButton: Bool
 | 
						|
    
 | 
						|
    let creatorId: Int
 | 
						|
    let creatorNickname: String
 | 
						|
    let creatorProfileUrl: String
 | 
						|
    let speakerList: [LiveRoomMember]
 | 
						|
    let muteSpeakerList: [UInt]
 | 
						|
    let activeSpeakerList: [UInt]
 | 
						|
    
 | 
						|
    let isAdult: Bool
 | 
						|
    
 | 
						|
    let onClickQuit: () -> Void
 | 
						|
    let onClickToggleBg: () -> Void
 | 
						|
    let onClickShare: () -> Void
 | 
						|
    let onClickEdit: () -> Void
 | 
						|
    let onClickProfile: (Int) -> Void
 | 
						|
    let onClickNotice: () -> Void
 | 
						|
    let onClickMenuPan: () -> Void
 | 
						|
    let onClickTotalHeart: () -> Void
 | 
						|
    let onClickTotalDonation: () -> Void
 | 
						|
    let onClickParticipants: () -> Void
 | 
						|
    let onClickToggleSignature: () -> Void
 | 
						|
    
 | 
						|
    var body: some View {
 | 
						|
        ZStack {
 | 
						|
            VStack(alignment: .leading, spacing: 13.3) {
 | 
						|
                HStack(spacing: 5.3) {
 | 
						|
                    LiveRoomOverlayStrokeTextButton(
 | 
						|
                        text: "라이브 종료",
 | 
						|
                        textColor: Color.red,
 | 
						|
                        strokeColor: Color.red,
 | 
						|
                        strokeWidth: 1,
 | 
						|
                        strokeCornerRadius: 5.3
 | 
						|
                    ) { onClickQuit() }
 | 
						|
                    
 | 
						|
                    Spacer()
 | 
						|
                    
 | 
						|
                    LiveRoomOverlayStrokeTextToggleButton(
 | 
						|
                        isOn: isOnSignature,
 | 
						|
                        onText: "시그 ON",
 | 
						|
                        onTextColor: Color.button,
 | 
						|
                        onStrokeColor: Color.button,
 | 
						|
                        offText: "시그 OFF",
 | 
						|
                        offTextColor: Color.graybb,
 | 
						|
                        offStrokeColor: Color.graybb,
 | 
						|
                        strokeWidth: 1,
 | 
						|
                        strokeCornerRadius: 5.3
 | 
						|
                    ) { onClickToggleSignature() }
 | 
						|
                    
 | 
						|
                    LiveRoomOverlayStrokeTextToggleButton(
 | 
						|
                        isOn: isOnBg,
 | 
						|
                        onText: "배경 ON",
 | 
						|
                        onTextColor: Color.button,
 | 
						|
                        onStrokeColor: Color.button,
 | 
						|
                        offText: "배경 OFF",
 | 
						|
                        offTextColor: Color.graybb,
 | 
						|
                        offStrokeColor: Color.graybb,
 | 
						|
                        strokeWidth: 1,
 | 
						|
                        strokeCornerRadius: 5.3
 | 
						|
                    ) { onClickToggleBg() }
 | 
						|
                    
 | 
						|
                    LiveRoomOverlayStrokeImageButton(
 | 
						|
                        imageName: "ic_share",
 | 
						|
                        strokeColor: Color.graybb,
 | 
						|
                        strokeWidth: 1,
 | 
						|
                        strokeCornerRadius: 5.3
 | 
						|
                    ) { onClickShare() }
 | 
						|
                    
 | 
						|
                    LiveRoomOverlayStrokeImageButton(
 | 
						|
                        imageName: "ic_edit",
 | 
						|
                        strokeColor: Color.graybb,
 | 
						|
                        strokeWidth: 1,
 | 
						|
                        strokeCornerRadius: 5.3
 | 
						|
                    ) { onClickEdit() }
 | 
						|
                }
 | 
						|
                
 | 
						|
                HStack(spacing: 8) {
 | 
						|
                    LiveRoomInfoCreatorView(
 | 
						|
                        roomTitle: title,
 | 
						|
                        creatorNickname: creatorNickname,
 | 
						|
                        creatorProfileUrl: creatorProfileUrl,
 | 
						|
                        isMute: muteSpeakerList.contains(UInt(creatorId)),
 | 
						|
                        isAdult: isAdult,
 | 
						|
                        isFollowing: false,
 | 
						|
                        isActiveSpeaker: activeSpeakerList.contains(UInt(creatorId)),
 | 
						|
                        isShowFollowingButton: false,
 | 
						|
                        onClickFollow: {},
 | 
						|
                        onClickProfile: {}
 | 
						|
                    )
 | 
						|
                    
 | 
						|
                    Spacer()
 | 
						|
                    
 | 
						|
                    ScrollView(.horizontal, showsIndicators: false) {
 | 
						|
                        HStack(spacing: 8) {
 | 
						|
                            ForEach(0..<speakerList.count, id: \.self) { index in
 | 
						|
                                let speaker = speakerList[index]
 | 
						|
                                
 | 
						|
                                if speaker.id != UInt(creatorId) {
 | 
						|
                                    LiveRoomInfoSpeakerView(
 | 
						|
                                        nickname: speaker.nickname,
 | 
						|
                                        profileUrl: speaker.profileImage,
 | 
						|
                                        isMute: muteSpeakerList.contains(UInt(speaker.id)),
 | 
						|
                                        isActiveSpeaker: activeSpeakerList.contains(UInt(speaker.id)),
 | 
						|
                                        onClickProfile: { onClickProfile(speaker.id) }
 | 
						|
                                    )
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                        .rotationEffect(Angle(degrees: 180))
 | 
						|
                    }
 | 
						|
                    .rotationEffect(Angle(degrees: 180))
 | 
						|
                }
 | 
						|
                
 | 
						|
                HStack(spacing: 5.3) {
 | 
						|
                    LiveRoomOverlayStrokeTextToggleButton(
 | 
						|
                        isOn: isOnNotice,
 | 
						|
                        onText: "공지",
 | 
						|
                        onTextColor: .button,
 | 
						|
                        onStrokeColor: .button,
 | 
						|
                        offText: nil,
 | 
						|
                        offTextColor: .graybb,
 | 
						|
                        offStrokeColor: .graybb,
 | 
						|
                        strokeWidth: 1,
 | 
						|
                        strokeCornerRadius: 5.3,
 | 
						|
                        onClick: { onClickNotice() }
 | 
						|
                    )
 | 
						|
                    
 | 
						|
                    if isShowMenuPanButton {
 | 
						|
                        LiveRoomOverlayStrokeTextToggleButton(
 | 
						|
                            isOn: isOnMenuPan,
 | 
						|
                            onText: "메뉴판",
 | 
						|
                            onTextColor: .button,
 | 
						|
                            onStrokeColor: .button,
 | 
						|
                            offText: nil,
 | 
						|
                            offTextColor: .graybb,
 | 
						|
                            offStrokeColor: .graybb,
 | 
						|
                            strokeWidth: 1,
 | 
						|
                            strokeCornerRadius: 5.3,
 | 
						|
                            onClick: { onClickMenuPan() }
 | 
						|
                        )
 | 
						|
                    }
 | 
						|
                    
 | 
						|
                    Spacer()
 | 
						|
                    
 | 
						|
                    HStack(spacing: 6.7) {
 | 
						|
                        Image("ic_heart_pink")
 | 
						|
                            .resizable()
 | 
						|
                            .frame(width: 12, height: 12)
 | 
						|
                        
 | 
						|
                        Text("\(totalHeart)")
 | 
						|
                            .font(.custom(Font.medium.rawValue, size: 12))
 | 
						|
                            .foregroundColor(.graybb)
 | 
						|
                    }
 | 
						|
                    .padding(.horizontal, 11)
 | 
						|
                    .padding(.vertical, 5.3)
 | 
						|
                    .overlay(
 | 
						|
                        RoundedRectangle(cornerRadius: 5.3)
 | 
						|
                            .stroke(Color.graybb, lineWidth: 1)
 | 
						|
                    )
 | 
						|
                    .onTapGesture { onClickTotalHeart() }
 | 
						|
                    
 | 
						|
                    HStack(spacing: 6.7) {
 | 
						|
                        Image("ic_can")
 | 
						|
                            .resizable()
 | 
						|
                            .frame(width: 12, height: 12)
 | 
						|
                        
 | 
						|
                        Text("\(totalDonationCan)")
 | 
						|
                            .font(.custom(Font.medium.rawValue, size: 12))
 | 
						|
                            .foregroundColor(.graybb)
 | 
						|
                    }
 | 
						|
                    .padding(.horizontal, 11)
 | 
						|
                    .padding(.vertical, 5.3)
 | 
						|
                    .overlay(
 | 
						|
                        RoundedRectangle(cornerRadius: 5.3)
 | 
						|
                            .stroke(Color.graybb, lineWidth: 1)
 | 
						|
                    )
 | 
						|
                    .onTapGesture { onClickTotalDonation() }
 | 
						|
                    
 | 
						|
                    HStack(spacing: 6.7) {
 | 
						|
                        Text("참여자")
 | 
						|
                            .font(.custom(Font.medium.rawValue, size: 12))
 | 
						|
                            .foregroundColor(.graybb)
 | 
						|
                        
 | 
						|
                        Text("\(participantsCount)")
 | 
						|
                            .font(.custom(Font.bold.rawValue, size: 12))
 | 
						|
                            .foregroundColor(.graybb)
 | 
						|
                    }
 | 
						|
                    .padding(.horizontal, 11)
 | 
						|
                    .padding(.vertical, 5.3)
 | 
						|
                    .overlay(
 | 
						|
                        RoundedRectangle(cornerRadius: 5.3)
 | 
						|
                            .stroke(Color.graybb, lineWidth: 1)
 | 
						|
                    )
 | 
						|
                    .onTapGesture { onClickParticipants() }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            
 | 
						|
            if muteSpeakerList.contains(UInt(creatorId)) {
 | 
						|
                Image("img_noti_mute")
 | 
						|
            }
 | 
						|
        }
 | 
						|
        .padding(.horizontal, 13.3)
 | 
						|
        .padding(.top, 16)
 | 
						|
        .background(Color.gray22)
 | 
						|
        .onAppear {
 | 
						|
            UIScrollView.appearance().bounces = false
 | 
						|
        }
 | 
						|
        .onDisappear {
 | 
						|
            UIScrollView.appearance().bounces = true
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
struct LiveRoomInfoHostView_Previews: PreviewProvider {
 | 
						|
    static var previews: some View {
 | 
						|
        LiveRoomInfoHostView(
 | 
						|
            title: "오늘의 라이브방송은 OOO입니다.",
 | 
						|
            totalHeart: 1234,
 | 
						|
            totalDonationCan: 123456,
 | 
						|
            participantsCount: 18,
 | 
						|
            isOnBg: true,
 | 
						|
            isOnNotice: true,
 | 
						|
            isOnMenuPan: false,
 | 
						|
            isOnSignature: false,
 | 
						|
            isShowMenuPanButton: false,
 | 
						|
            creatorId: 1,
 | 
						|
            creatorNickname: "도화",
 | 
						|
            creatorProfileUrl: "https://cf.sodalive.net/profile/26/26-profile-ddf78b4d-0300-4c50-9c84-5d8a95fd5fe2-4892-1705256364320",
 | 
						|
            speakerList: [
 | 
						|
                LiveRoomMember(
 | 
						|
                    id: 1,
 | 
						|
                    nickname: "도화",
 | 
						|
                    profileImage: "https://cf.sodalive.net/profile/26/26-profile-ddf78b4d-0300-4c50-9c84-5d8a95fd5fe2-4892-1705256364320",
 | 
						|
                    role: .SPEAKER
 | 
						|
                ),
 | 
						|
                LiveRoomMember(
 | 
						|
                    id: 2,
 | 
						|
                    nickname: "청령",
 | 
						|
                    profileImage: "https://cf.sodalive.net/profile/13/13-profile-fabb75e0-2870-4d99-900e-1d9aa63e605b-685-1704859996417",
 | 
						|
                    role: .SPEAKER
 | 
						|
                )
 | 
						|
            ],
 | 
						|
            muteSpeakerList: [],
 | 
						|
            activeSpeakerList: [],
 | 
						|
            isAdult: false,
 | 
						|
            onClickQuit: {},
 | 
						|
            onClickToggleBg: {},
 | 
						|
            onClickShare: {},
 | 
						|
            onClickEdit: {},
 | 
						|
            onClickProfile: { _ in },
 | 
						|
            onClickNotice: {},
 | 
						|
            onClickMenuPan: {},
 | 
						|
            onClickTotalHeart: {},
 | 
						|
            onClickTotalDonation: {},
 | 
						|
            onClickParticipants: {},
 | 
						|
            onClickToggleSignature: {}
 | 
						|
        )
 | 
						|
    }
 | 
						|
}
 |