copinism-ios/copinism/Views/Message/MessageView.swift
2024-06-04 09:41:01 +08:00

131 lines
5.3 KiB
Swift

//
//
import SwiftUI
import Kingfisher
struct MessageView: View {
@ObservedObject private var viewModel = UserProfileViewModel.shared
@State private var selectedMessage: String?
@State private var selectedSender: String?
@State private var selectedTimestamp: String?
@State private var isDetailViewActive = false
@State private var messages: [Message] = [
Message(text: "发来了条消息", sender: "系统消息", timestamp: "4:00 PM", isSelf: false, avatar: "https://s3.hcpp.top/avatar/ORTPJkyqeULR/%E9%BB%84%E5%AF%8C%E8%B4%B5/1709263869_avatar.jpg?e=1717342975&token=DhKKj58tWve-b3U6BMyFGVUdZ78NXqs4mUhnPaZq:IsdKBn2Kyovp4haD0IQMAKrE6oA=", num: 9),
]
var body: some View {
NavigationStack {
VStack {
HStack {
Spacer()
Text("消息")
Spacer()
Button(action: addNewMessage) {
Image(systemName: "plus")
}
}
.padding()
List {
ForEach(messages) { message in
HStack {
if let url = URL(string: message.avatar) {
KFImage(url)
.resizable()
.placeholder {
ProgressView()
}
.frame(width: 50, height: 50)
.clipShape(Circle())
} else {
Image(message.avatar)
.CircleImage(size: 50)
}
VStack {
HStack {
Text(message.sender)
Spacer()
Text(message.timestamp)
.SetTextStyle(size: 13, color: .black.opacity(0.4))
}
HStack {
Text(message.text)
.SetTextStyle(size: 14, color: .black.opacity(0.5))
Spacer()
Text("\(message.num)")
.SetTextStyle(size: 13, color: .white)
.padding(.vertical, 2)
.padding(.horizontal, 6)
.background(Color.red, in: RoundedRectangle(cornerRadius: 12))
}
}
}
.padding(.horizontal, 12)
.padding(.vertical, 7)
.background(Color.white)
.onTapGesture {
selectedMessage = message.text
selectedSender = message.sender
selectedTimestamp = message.timestamp
isDetailViewActive = true
}
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
Button(role: .destructive) {
deleteMessage(message)
} label: {
Label("删除", systemImage: "trash")
}
}
}
}
}
.navigationDestination(isPresented: $isDetailViewActive) {
MessageDetailView()
}
.toolbar(.hidden)
}
.onAppear {
requestNotificationPermission()
}
}
private func addNewMessage() {
let newMessage = Message(text: "来了条消息", sender: "系统消息", timestamp: "4:00 PM", isSelf: false, avatar: "https://s3.hcpp.top/avatar/ORTPJkyqeULR/%E9%BB%84%E5%AF%8C%E8%B4%B5/1709263869_avatar.jpg?e=1717342975&token=DhKKj58tWve-b3U6BMyFGVUdZ78NXqs4mUhnPaZq:IsdKBn2Kyovp4haD0IQMAKrE6oA=", num: 12)
messages.insert(newMessage, at: 0)
sendNotification(for: newMessage)
}
private func deleteMessage(_ message: Message) {
if let index = messages.firstIndex(where: { $0.id == message.id }) {
messages.remove(at: index)
}
}
private func requestNotificationPermission() {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
if let error = error {
print("Request authorization failed: \(error)")
}
}
}
private func sendNotification(for message: Message) {
let content = UNMutableNotificationContent()
content.title = message.sender
content.body = message.text
content.sound = UNNotificationSound.default
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request)
}
}
#Preview {
MessageView()
}