mirror of
https://github.com/stoatchat/for-ios.git
synced 2026-07-21 05:45:20 -04:00
83 lines
2.6 KiB
Swift
83 lines
2.6 KiB
Swift
//
|
|
// MessageReply.swift
|
|
// Revolt
|
|
//
|
|
// Created by Angelo on 31/10/2023.
|
|
//
|
|
|
|
import Foundation
|
|
import SwiftUI
|
|
import Types
|
|
|
|
struct MessageReplyView: View {
|
|
@EnvironmentObject var viewState: ViewState
|
|
|
|
@Binding var mentions: [String]?
|
|
var channelScrollPosition: ChannelScrollController
|
|
@State var dead: Bool = false
|
|
var id: String
|
|
var channel: String
|
|
|
|
var body: some View {
|
|
let message = viewState.messages[id]
|
|
if message != nil || dead {
|
|
InnerMessageReplyView(mentions: $mentions, channelScrollPosition: channelScrollPosition, message: message)
|
|
} else {
|
|
if !viewState.loadingMessages.contains(id) {
|
|
let _ = Task {
|
|
do {
|
|
let message = try await viewState.http.fetchMessage(channel: channel, message: id).get()
|
|
viewState.messages[id] = message
|
|
} catch {
|
|
dead = true
|
|
}
|
|
}
|
|
}
|
|
|
|
Text("Loading...")
|
|
}
|
|
}
|
|
}
|
|
|
|
struct InnerMessageReplyView: View {
|
|
@EnvironmentObject var viewState: ViewState
|
|
|
|
@Binding var mentions: [String]?
|
|
var channelScrollPosition: ChannelScrollController
|
|
var message: Message?
|
|
|
|
var body: some View {
|
|
if let message = message {
|
|
HStack(spacing: 4) {
|
|
let author = viewState.users[message.author] ?? User(id: "0", username: "Unknown User", discriminator: "0000")
|
|
let member = viewState.currentServer.id.flatMap { viewState.members[$0] }.flatMap { $0[message.author] }
|
|
|
|
Avatar(user: author, member: member, masquerade: message.masquerade, width: 16, height: 16)
|
|
|
|
HStack(spacing: 0) {
|
|
if mentions?.contains(message.author) == true {
|
|
Text("@")
|
|
.font(.caption)
|
|
}
|
|
|
|
Text(message.masquerade?.name ?? member?.nickname ?? author.display_name ?? author.username)
|
|
.font(.caption)
|
|
}
|
|
|
|
if let content = message.content {
|
|
Text(content)
|
|
.font(.caption)
|
|
.lineLimit(1)
|
|
.truncationMode(.tail)
|
|
}
|
|
}
|
|
.onTapGesture {
|
|
channelScrollPosition.scrollTo(message.id)
|
|
}
|
|
} else {
|
|
Text("Unknown message")
|
|
.foregroundStyle(viewState.theme.foreground2)
|
|
}
|
|
}
|
|
}
|