mirror of
https://github.com/stoatchat/for-ios.git
synced 2026-07-21 05:45:20 -04:00
147 lines
5.7 KiB
Swift
147 lines
5.7 KiB
Swift
//
|
|
// Message.swift
|
|
// Revolt
|
|
//
|
|
// Created by Zomatree on 21/04/2023.
|
|
//
|
|
|
|
import Foundation
|
|
import SwiftUI
|
|
import Shiny
|
|
|
|
struct MessageView: View {
|
|
@StateObject var viewModel: MessageContentsViewModel
|
|
|
|
@EnvironmentObject var viewState: ViewState
|
|
|
|
@State var showMemberSheet: Bool = false
|
|
@State var showReportSheet: Bool = false
|
|
@State var isStatic: Bool
|
|
|
|
var body: some View {
|
|
VStack(alignment: .leading) {
|
|
VStack(alignment: .leading) {
|
|
if let replies = viewModel.message.replies {
|
|
VStack(alignment: .leading) {
|
|
ForEach(replies, id: \.self) { id in
|
|
MessageReplyView(mentions: viewModel.$message.mentions, channelScrollPosition: viewModel.$channelScrollPosition, id: id, channel: viewModel.message.channel)
|
|
.padding(.leading, 48)
|
|
}
|
|
}
|
|
}
|
|
HStack(alignment: .top) {
|
|
ZStack(alignment: .topLeading) {
|
|
Avatar(user: viewModel.author, member: viewModel.member, masquerade: viewModel.message.masquerade, width: 32, height: 32)
|
|
|
|
if viewModel.message.masquerade != nil {
|
|
Avatar(user: viewModel.author, member: viewModel.member, width: 16, height: 16)
|
|
.padding(.leading, -4)
|
|
.padding(.top, -4)
|
|
}
|
|
}
|
|
.onTapGesture {
|
|
if !isStatic {
|
|
showMemberSheet.toggle()
|
|
}
|
|
}
|
|
.padding(.trailing, 8)
|
|
|
|
VStack(alignment: .leading, spacing: 0) {
|
|
HStack {
|
|
let name = viewModel.message.masquerade?.name ?? viewModel.member?.nickname ?? viewModel.author.display_name ?? viewModel.author.username
|
|
let _ = print(name)
|
|
Text(verbatim: name)
|
|
.onTapGesture {
|
|
if !isStatic {
|
|
showMemberSheet.toggle()
|
|
}
|
|
}
|
|
.foregroundStyle(viewModel.member?.displayColour(server: viewModel.server!) ?? viewState.theme.foreground.color)
|
|
.fontWeight(.heavy)
|
|
|
|
|
|
if viewModel.author.bot != nil {
|
|
MessageBadge(text: String(localized: "Bot"), color: viewState.theme.accent.color)
|
|
}
|
|
|
|
Text(createdAt(id: viewModel.message.id).formatted())
|
|
.font(.caption2)
|
|
.foregroundStyle(.gray)
|
|
|
|
if viewModel.message.edited != nil {
|
|
Text("(edited)")
|
|
.font(.caption2)
|
|
.foregroundStyle(.gray)
|
|
}
|
|
}
|
|
|
|
MessageContentsView(viewModel: viewModel, isStatic: isStatic)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.listRowSeparator(.hidden)
|
|
.sheet(isPresented: $showMemberSheet) {
|
|
let user = viewModel.author
|
|
|
|
if case .server(let serverId) = viewState.currentServer {
|
|
let serverMembers = viewState.members[serverId]
|
|
let member = serverMembers?[user.id]
|
|
|
|
UserSheet(user: user, member: member)
|
|
} else {
|
|
UserSheet(user: user, member: nil)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
struct GhostMessageView: View {
|
|
@EnvironmentObject var viewState: ViewState
|
|
|
|
var message: QueuedMessage
|
|
|
|
var body: some View {
|
|
HStack(alignment: .top) {
|
|
Avatar(user: viewState.currentUser!, width: 16, height: 16)
|
|
VStack(alignment: .leading) {
|
|
HStack {
|
|
Text(viewState.currentUser!.username)
|
|
.fontWeight(.heavy)
|
|
Text(createdAt(id: message.nonce).formatted())
|
|
}
|
|
Contents(text: message.content)
|
|
//.frame(maxWidth: .infinity, alignment: .leading)
|
|
}
|
|
//.frame(maxWidth: .infinity, alignment: .leading)
|
|
}
|
|
.listRowSeparator(.hidden)
|
|
}
|
|
}
|
|
|
|
//struct MessageView_Previews: PreviewProvider {
|
|
// static var viewState: ViewState = ViewState.preview()
|
|
// @State static var message = viewState.messages["01HD4VQY398JNRJY60JDY2QHA5"]!
|
|
// @State static var author = viewState.users[message.author]!
|
|
// @State static var member = viewState.members["0"]!["0"]
|
|
// @State static var channel = viewState.channels["0"]!
|
|
// @State static var server = viewState.servers["0"]
|
|
// @State static var replies: [Reply] = []
|
|
// @State static var channelScrollPosition: String? = nil
|
|
//
|
|
// static var previews: some View {
|
|
// MessageView(viewModel: viewModel(
|
|
// viewState: viewState,
|
|
// message: $message,
|
|
// author: $author,
|
|
// member: $member,
|
|
// server: $server,
|
|
// channel: $channel,
|
|
// replies: $replies,
|
|
// channelScrollPosition: $channelScrollPosition
|
|
// ), isStatic: false)
|
|
// .environmentObject(viewState)
|
|
// .previewLayout(.sizeThatFits)
|
|
// }
|
|
//}
|