메시지 - 리스트, 쓰기, 상세 페이지 추가
This commit is contained in:
195
SodaLive/Sources/Message/Text/Detail/TextMessageDetailView.swift
Normal file
195
SodaLive/Sources/Message/Text/Detail/TextMessageDetailView.swift
Normal file
@@ -0,0 +1,195 @@
|
||||
//
|
||||
// TextMessageDetailView.swift
|
||||
// SodaLive
|
||||
//
|
||||
// Created by klaus on 2023/08/10.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import Kingfisher
|
||||
|
||||
struct TextMessageDetailView: View {
|
||||
|
||||
@StateObject var viewModel = TextMessageDetailViewModel()
|
||||
@StateObject var appState = AppState.shared
|
||||
|
||||
let messageItem: TextMessageItem
|
||||
let messageBox: MessageFilterTab
|
||||
|
||||
let refresh: () -> Void
|
||||
|
||||
func back() {
|
||||
refresh()
|
||||
AppState.shared.back()
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
BaseView(isLoading: $viewModel.isLoading) {
|
||||
VStack(spacing: 0) {
|
||||
switch messageBox {
|
||||
case .receive:
|
||||
DetailNavigationBar(title: "받은 메시지 상세") { back() }
|
||||
case .sent:
|
||||
DetailNavigationBar(title: "보낸 메시지 상세") { back() }
|
||||
case .keep:
|
||||
DetailNavigationBar(title: "저장한 메시지 상세") { back() }
|
||||
}
|
||||
|
||||
HStack(spacing: 13.3) {
|
||||
KFImage(
|
||||
URL(
|
||||
string: messageBox == .sent ?
|
||||
messageItem.recipientProfileImageUrl :
|
||||
messageItem.senderProfileImageUrl
|
||||
)
|
||||
)
|
||||
.resizable()
|
||||
.scaledToFill()
|
||||
.frame(width: 26.7, height: 26.7, alignment: .top)
|
||||
.cornerRadius(13.3)
|
||||
|
||||
Text(
|
||||
messageBox == .sent ?
|
||||
messageItem.recipientNickname :
|
||||
messageItem.senderNickname
|
||||
)
|
||||
.font(.custom(Font.bold.rawValue, size: 18.3))
|
||||
.foregroundColor(Color(hex: "eeeeee"))
|
||||
}
|
||||
.padding(.vertical, 12.7)
|
||||
.frame(width: screenSize().width - 26.7)
|
||||
.background(Color(hex: "1b1b1b"))
|
||||
.cornerRadius(10)
|
||||
|
||||
Text(messageItem.date.convertDateFormat(
|
||||
from: "yyyy-MM-dd hh:mm:ss",
|
||||
to: "yyyy년 MM월 dd일 E요일 HH:mm"
|
||||
))
|
||||
.font(.custom(Font.medium.rawValue, size: 15))
|
||||
.foregroundColor(Color(hex: "bbbbbb"))
|
||||
.padding(.top, 16.7)
|
||||
|
||||
ScrollView(.vertical, showsIndicators: false) {
|
||||
Text(messageItem.textMessage)
|
||||
.font(.custom(Font.medium.rawValue, size: 15))
|
||||
.foregroundColor(Color(hex: "eeeeee"))
|
||||
.multilineTextAlignment(.leading)
|
||||
.padding(26.7)
|
||||
.frame(width: screenSize().width - 26.7, alignment: .leading)
|
||||
}
|
||||
.frame(width: screenSize().width - 26.7)
|
||||
.background(Color(hex: "222222"))
|
||||
.cornerRadius(10)
|
||||
.padding(.top, 10)
|
||||
|
||||
Spacer()
|
||||
|
||||
if messageBox == .receive {
|
||||
HStack(spacing: 6.7) {
|
||||
Text("답장")
|
||||
.font(.custom(Font.bold.rawValue, size: 14.7))
|
||||
.foregroundColor(Color(hex: "eeeeee"))
|
||||
.frame(
|
||||
width: (screenSize().width - 40) / 3,
|
||||
height: 48.7
|
||||
)
|
||||
.background(Color(hex: "9970ff"))
|
||||
.cornerRadius(6.7)
|
||||
.onTapGesture {
|
||||
AppState.shared.setAppStep(step: .writeTextMessage(userId: messageItem.senderId, nickname: messageItem.senderNickname))
|
||||
}
|
||||
|
||||
Text("보관")
|
||||
.font(.custom(Font.bold.rawValue, size: 14.7))
|
||||
.foregroundColor(Color(hex: "9970ff"))
|
||||
.frame(
|
||||
width: (screenSize().width - 40) / 3,
|
||||
height: 48.7
|
||||
)
|
||||
.background(Color(hex: "1f1734"))
|
||||
.cornerRadius(6.7)
|
||||
.onTapGesture {
|
||||
if messageItem.isKept {
|
||||
viewModel.errorMessage = "이미 보관된 메시지 입니다"
|
||||
viewModel.isShowPopup = true
|
||||
return
|
||||
} else {
|
||||
viewModel.keepTextMessage()
|
||||
}
|
||||
}
|
||||
|
||||
Text("삭제")
|
||||
.font(.custom(Font.bold.rawValue, size: 14.7))
|
||||
.foregroundColor(Color(hex: "9970ff"))
|
||||
.frame(
|
||||
width: (screenSize().width - 40) / 3,
|
||||
height: 48.7
|
||||
)
|
||||
.background(Color(hex: "1f1734"))
|
||||
.cornerRadius(6.7)
|
||||
.onTapGesture {
|
||||
viewModel.deleteMessage { back() }
|
||||
}
|
||||
}
|
||||
.frame(width: screenSize().width - 26.7)
|
||||
.padding(.vertical, 26.7)
|
||||
} else {
|
||||
Text("삭제")
|
||||
.font(.custom(Font.bold.rawValue, size: 14.7))
|
||||
.foregroundColor(Color(hex: "9970ff"))
|
||||
.frame(
|
||||
width: screenSize().width - 26.7,
|
||||
height: 48.7
|
||||
)
|
||||
.background(Color(hex: "1f1734"))
|
||||
.cornerRadius(6.7)
|
||||
.onTapGesture {
|
||||
viewModel.deleteMessage { back() }
|
||||
}
|
||||
.padding(.vertical, 26.7)
|
||||
}
|
||||
}
|
||||
}
|
||||
.popup(isPresented: $viewModel.isShowPopup, type: .toast, position: .top, autohideIn: 2) {
|
||||
GeometryReader { geo in
|
||||
HStack {
|
||||
Spacer()
|
||||
Text(viewModel.errorMessage)
|
||||
.padding(.vertical, 13.3)
|
||||
.padding(.horizontal, 6.7)
|
||||
.frame(width: geo.size.width - 66.7, alignment: .center)
|
||||
.font(.custom(Font.medium.rawValue, size: 12))
|
||||
.background(Color(hex: "9970ff"))
|
||||
.foregroundColor(Color.white)
|
||||
.multilineTextAlignment(.leading)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
.cornerRadius(20)
|
||||
.padding(.top, 66.7)
|
||||
Spacer()
|
||||
}
|
||||
}
|
||||
}
|
||||
.onAppear {
|
||||
viewModel.messageId = messageItem.messageId
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct TextMessageDetailView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
TextMessageDetailView(
|
||||
messageItem: TextMessageItem(
|
||||
messageId: 10,
|
||||
senderId: 1,
|
||||
senderNickname: "누군가",
|
||||
senderProfileImageUrl: "https://test-cf.sodalive.net/profile/default-profile.png",
|
||||
recipientNickname: "테스터",
|
||||
recipientProfileImageUrl: "https://test-cf.sodalive.net/profile/default-profile.png",
|
||||
textMessage: "testtesttesttest",
|
||||
date: "2022-07-08 10:20:30",
|
||||
isKept: false),
|
||||
messageBox: .receive,
|
||||
refresh: {}
|
||||
)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user