// 消息页面 // 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 isSettingsViewActive = 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") } Spacer() Button(action: { isSettingsViewActive = true }) { Image(systemName: "gearshape.fill") } } .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() } .navigationDestination(isPresented: $isSettingsViewActive) { MessageSettingsView() } } .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() }