// // 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 @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()) 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(hex: "eeeeee")) .padding(13.3) .background(Color(hex: "232323")) .accentColor(Color(hex: "3bb9f1")) .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(hex: "ffffff")) .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(hex: "222222")) .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(hex: "eeeeee")) .padding(13.3) .background(Color(hex: "232323")) .accentColor(Color(hex: "3bb9f1")) .keyboardType(.default) .cornerRadius(10) .overlay( RoundedRectangle(cornerRadius: 10) .strokeBorder(lineWidth: 1) .foregroundColor(Color(hex: "3bb9f1")) ) Text("등록") .font(.custom(Font.bold.rawValue, size: 13.3)) .foregroundColor(Color(hex: "ffffff")) .padding(13.3) .background(Color(hex: "3bb9f1")) .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(hex: "ffffff")) .frame(minWidth: 100) .padding(.horizontal, 6.7) .padding(.vertical, 6.7) .background(Color.button.opacity(0.3)) .cornerRadius(16.7) .padding(.top, 18.3) HStack(spacing: 6.7) { Text(reply.date) .font(.custom(Font.medium.rawValue, size: 10.7)) .foregroundColor(Color(hex: "525252")) if userId == UserDefaults.int(forKey: .userId) { Text("답글 수정") .font(.custom(Font.medium.rawValue, size: 10.7)) .foregroundColor(Color(hex: "9970ff")) .onTapGesture { self.replyContent = reply.content isShowInputReply = true } } } } } } } Spacer() if !isModeModify { Image("ic_seemore_vertical") .onTapGesture { isShowPopupMenu = true } } } Rectangle() .frame(height: 1) .foregroundColor(Color(hex: "909090").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(hex: "777777")) .onTapGesture { reportPopup(cheersItem.cheersId) isShowPopupMenu = false } } if cheersItem.memberId == UserDefaults.int(forKey: .userId) { Text("수정") .font(.custom(Font.medium.rawValue, size: 14)) .foregroundColor(Color(hex: "777777")) .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(hex: "777777")) .onTapGesture { onClickDelete(cheersItem.cheersId) isShowPopupMenu = false } } } .padding(10) .background(Color(hex: "222222")) } } .contentShape(Rectangle()) .onTapGesture { isShowPopupMenu = false } } }