139 lines
5.7 KiB
Swift
139 lines
5.7 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 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()
|
|
}
|