// // UserProfileFanTalkCheersItemView.swift // SodaLive // // Created by klaus on 2023/08/11. // import SwiftUI import Kingfisher struct UserProfileFanTalkCheersItemView: View { let userId: Int let cheersItem: GetCheersResponseItem let writeCheerReply: (String) -> Void let modifyCheer: (Int, String) -> Void let reportPopup: (Int) -> Void let onClickDelete: (Int) -> Void let onClickProfile: (Int) -> Void @State var replyContent: String = "" @State var isShowInputReply = false @State var isShowPopupMenu: Bool = false @State var isModeModify: Bool = false @State var cheers: String = "" var body: some View { ZStack(alignment: .topTrailing) { VStack(alignment: .leading, spacing: 0) { HStack(alignment: .top, spacing: 6.7) { KFImage(URL(string: cheersItem.profileUrl)) .cancelOnDisappear(true) .downsampling(size: CGSize(width: 33.3, height: 33.3)) .resizable() .frame(width: 33.3, height: 33.3) .clipShape(Circle()) .onTapGesture { if UserDefaults.int(forKey: .userId) != cheersItem.memberId { onClickProfile(cheersItem.memberId) } } VStack(alignment: .leading, spacing: 0) { Text("\(cheersItem.nickname)") .font(.custom(Font.medium.rawValue, size: 12)) .foregroundColor(Color.gray90) Text("\(cheersItem.date)") .font(.custom(Font.medium.rawValue, size: 10.7)) .foregroundColor(Color.gray55) .padding(.top, 8.3) if isModeModify { HStack(spacing: 10) { TextField("", text: $cheers) .autocapitalization(.none) .disableAutocorrection(true) .font(.custom(Font.medium.rawValue, size: 13.3)) .foregroundColor(Color.grayee) .padding(13.3) .background(Color.gray23) .accentColor(Color.button) .keyboardType(.default) .cornerRadius(10) .overlay( RoundedRectangle(cornerRadius: 10) .strokeBorder(lineWidth: 1) .foregroundColor(Color.button) ) Text("수정") .font(.custom(Font.bold.rawValue, size: 13.3)) .foregroundColor(Color.white) .padding(13.3) .background(Color.button) .cornerRadius(6.7) .onTapGesture { modifyCheer(cheersItem.cheersId, cheers) isModeModify = false } Text("취소") .font(.custom(Font.bold.rawValue, size: 13.3)) .foregroundColor(Color.button) .padding(13.3) .background(Color.gray22) .cornerRadius(6.7) .onTapGesture { isModeModify = false } } .padding(.top, 13.3) } else { Text("\(cheersItem.content)") .font(.custom(Font.medium.rawValue, size: 13.3)) .foregroundColor(Color.grayee) .fixedSize(horizontal: false, vertical: true) .lineSpacing(8) .padding(.top, 13.3) } if isShowInputReply { HStack(spacing: 10) { TextField("응원댓글에 답글을 남겨보세요!", text: $replyContent) .autocapitalization(.none) .disableAutocorrection(true) .font(.custom(Font.medium.rawValue, size: 13.3)) .foregroundColor(Color.grayee) .padding(13.3) .background(Color.gray23) .accentColor(Color.button) .keyboardType(.default) .cornerRadius(10) .overlay( RoundedRectangle(cornerRadius: 10) .strokeBorder(lineWidth: 1) .foregroundColor(Color.button) ) Text("등록") .font(.custom(Font.bold.rawValue, size: 13.3)) .foregroundColor(Color.white) .padding(13.3) .background(Color.button) .cornerRadius(6.7) .onTapGesture { if cheersItem.replyList.count > 0 { modifyCheer(cheersItem.replyList[0].cheersId, replyContent) } else { writeCheerReply(replyContent) } } } .padding(.top, 10) } else { if cheersItem.replyList.count <= 0 { if userId == UserDefaults.int(forKey: .userId) { Text("답글쓰기") .font(.custom(Font.medium.rawValue, size: 12)) .foregroundColor(Color.button) .padding(.top, 18.3) .onTapGesture { isShowInputReply = true } } } else { let reply = cheersItem.replyList[0] VStack(alignment: .leading, spacing: 8.3) { Text(reply.content) .font(.custom(Font.medium.rawValue, size: 12)) .foregroundColor(Color.white) .frame(minWidth: 100) .padding(.horizontal, 6.7) .padding(.vertical, 6.7) .background(Color.button.opacity(0.3)) .cornerRadius(16.7) .padding(.top, 18.3) .fixedSize(horizontal: false, vertical: true) HStack(spacing: 6.7) { Text(reply.date) .font(.custom(Font.medium.rawValue, size: 10.7)) .foregroundColor(Color.gray52) if userId == UserDefaults.int(forKey: .userId) { Text("답글 수정") .font(.custom(Font.medium.rawValue, size: 10.7)) .foregroundColor(Color.button) .onTapGesture { self.replyContent = reply.content isShowInputReply = true } } } } } } } Spacer() if !isModeModify { Image("ic_seemore_vertical") .onTapGesture { isShowPopupMenu = true } } } Rectangle() .frame(height: 1) .foregroundColor(Color.gray90.opacity(0.5)) .padding(.top, 13.3) } .frame(width: screenSize().width - 26.7) if isShowPopupMenu { VStack(spacing: 10) { if cheersItem.memberId != UserDefaults.int(forKey: .userId) { Text("신고하기") .font(.custom(Font.medium.rawValue, size: 14)) .foregroundColor(Color.gray77) .onTapGesture { reportPopup(cheersItem.cheersId) isShowPopupMenu = false } } if cheersItem.memberId == UserDefaults.int(forKey: .userId) { Text("수정") .font(.custom(Font.medium.rawValue, size: 14)) .foregroundColor(Color.gray77) .onTapGesture { isModeModify = true isShowPopupMenu = false cheers = cheersItem.content } } if userId == UserDefaults.int(forKey: .userId) || cheersItem.memberId == UserDefaults.int(forKey: .userId) { Text("삭제") .font(.custom(Font.medium.rawValue, size: 14)) .foregroundColor(Color.gray77) .onTapGesture { onClickDelete(cheersItem.cheersId) isShowPopupMenu = false } } } .padding(10) .background(Color.gray22) } } .contentShape(Rectangle()) .onTapGesture { isShowPopupMenu = false } } }