Skip to content

Commit

Permalink
feat: line limit on reply views
Browse files Browse the repository at this point in the history
  • Loading branch information
Zomatree committed Oct 29, 2024
1 parent d80ecfe commit a7cee19
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 24 deletions.
13 changes: 11 additions & 2 deletions Revolt/Components/Contents.swift
Original file line number Diff line number Diff line change
Expand Up @@ -662,10 +662,17 @@ struct InnerContents: UIViewRepresentable {
var fontSize: CGFloat
var font: UIFont
var foregroundColor: UIColor
var lineLimit: Int?

func makeUIView(context: Context) -> UIViewType {
let textview = SubviewAttachingTextView()
textview.isEditable = false

if let lineLimit {
textview.textContainer.maximumNumberOfLines = lineLimit
textview.textContainer.lineBreakMode = .byTruncatingTail
}

textview.isSelectable = false
textview.font = .systemFont(ofSize: fontSize)
textview.backgroundColor = nil
Expand Down Expand Up @@ -851,6 +858,7 @@ struct InnerContents: UIViewRepresentable {

struct Contents: View {
@EnvironmentObject var viewState: ViewState
@Environment(\.lineLimit) var lineLimit: Int?

@State var calculatedHeight: CGFloat = 0
@Binding var text: String
Expand All @@ -864,19 +872,20 @@ struct Contents: View {
init(text: Binding<String>, currentServer: String? = nil, fontSize: CGFloat? = nil, font: UIFont? = nil, foregroundColor: UIColor? = nil) {
self._text = text
self.currentServer = currentServer
self.fontSize = fontSize ?? UIFont.systemFontSize
self.fontSize = fontSize ?? font?.pointSize ?? UIFont.systemFontSize
self.font = font ?? .systemFont(ofSize: fontSize ?? UIFont.systemFontSize)
self.foregroundColor = foregroundColor ?? .white
}

var body: some View {
if viewState.userSettingsStore.store.experiments.customMarkdown {
InnerContents(text: $text, calculatedHeight: $calculatedHeight, fontSize: fontSize, font: font, foregroundColor: foregroundColor)
InnerContents(text: $text, calculatedHeight: $calculatedHeight, fontSize: fontSize, font: font, foregroundColor: foregroundColor, lineLimit: lineLimit)
.frame(height: calculatedHeight)
} else {
Text((try? AttributedString(markdown: text.data(using: .utf8)!)) ?? AttributedString(text))
.font(Font.system(size: fontSize))
.foregroundStyle(Color(uiColor: foregroundColor))
.lineLimit(lineLimit)
}
}
}
Expand Down
13 changes: 6 additions & 7 deletions Revolt/Components/MessageBox.swift
Original file line number Diff line number Diff line change
Expand Up @@ -39,26 +39,25 @@ struct ReplyView: View {
@EnvironmentObject var viewState: ViewState
@ObservedObject var viewModel: ReplyViewModel

@ViewBuilder
var body: some View {
let reply = $viewModel.replies[viewModel.idx]

let user = viewState.users[reply.message.author.wrappedValue]!
let member = viewModel.server.flatMap { viewState.members[$0.id]?[user.id] }

HStack(alignment: .center) {
HStack(alignment: .center, spacing: 8) {
Button(action: viewModel.remove) {
Image(systemName: "xmark")
.resizable()
.frame(width: 12, height: 12)
.foregroundStyle(viewState.theme.foreground2)
.frame(width: 10, height: 10)
.foregroundStyle(viewState.theme.foreground3)
}

Avatar(user: user, width: 16, height: 16)

Text(reply.message.masquerade.wrappedValue?.name ?? member?.nickname ?? user.display_name ?? user.username)
.font(.caption)
.lineLimit(1)
.fixedSize()
.foregroundStyle(member?.displayColour(theme: viewState.theme, server: viewModel.server!) ?? AnyShapeStyle(viewState.theme.foreground.color))

if !(reply.message.wrappedValue.attachments?.isEmpty ?? true) {
Expand All @@ -72,7 +71,7 @@ struct ReplyView: View {
.lineLimit(1)
.truncationMode(.tail)
}
Spacer()

Button(action: { viewModel.replies[viewModel.idx].mention.toggle() }) {
if viewModel.replies[viewModel.idx].mention {
Text("@ on")
Expand Down Expand Up @@ -232,7 +231,7 @@ struct MessageBox: View {
let model = ReplyViewModel(idx: reply.offset, replies: $channelReplies, channel: channel, server: server)

ReplyView(viewModel: model)
.padding(.horizontal, 8)
.padding(.horizontal, 4)
}
VStack(alignment: .leading, spacing: 8) {
if selectedPhotos.count > 0 {
Expand Down
6 changes: 1 addition & 5 deletions Revolt/Components/MessageRenderer/MessageContentsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ struct MessageContentsView: View {
.sheet(isPresented: $showReactionsSheet) {
MessageReactionsSheet(viewModel: viewModel)
}
.contextMenu(menuItems: {
.contextMenu {
if !isStatic {
Button(action: viewModel.reply, label: {
Label("Reply", systemImage: "arrowshape.turn.up.left.fill")
Expand Down Expand Up @@ -190,10 +190,6 @@ struct MessageContentsView: View {
Label("Copy ID", systemImage: "doc.on.clipboard")
}
}
}) {
MessageView(viewModel: viewModel, isStatic: true)
.padding(8)
.environmentObject(viewState)
}
.swipeActions(edge: .trailing) {
isStatic ? nil :
Expand Down
31 changes: 21 additions & 10 deletions Revolt/Components/MessageRenderer/MessageReply.swift
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,10 @@ struct InnerMessageReplyView: View {
}

var body: some View {
if let message = message {
let author = viewState.users[message.author] ?? User(id: "0", username: "Unknown User", discriminator: "0000")
let member = server.flatMap { viewState.members[$0.id] }.flatMap { $0[message.author] }

HStack(spacing: 4) {
HStack(spacing: 4) {
if let message {
let author = viewState.users[message.author] ?? User(id: "0", username: "Unknown User", discriminator: "0000")
let member = server.flatMap { viewState.members[$0.id] }.flatMap { $0[message.author] }

Avatar(user: author, member: member, masquerade: message.masquerade, width: 16, height: 16)

Expand All @@ -82,19 +81,31 @@ struct InnerMessageReplyView: View {
}

if let content = message.content {
Text(content)
Contents(text: .constant(content))
.font(.caption)
.foregroundStyle(viewState.theme.foreground2)
.lineLimit(1)
.truncationMode(.tail)
}
} else {
Image(systemName: "person.circle.fill")
.resizable()
.frame(width: 16, height: 16)
.foregroundStyle(viewState.theme.foreground2)

Text("@Unknown")
.font(.caption)
.foregroundStyle(viewState.theme.foreground2)

Text("Unknown message")
.font(.caption)
.foregroundStyle(viewState.theme.foreground2)
}
.onTapGesture {
}
.onTapGesture {
if let message {
channelScrollPosition.scrollTo(message: message.id)
}
} else {
Text("Unknown message")
.foregroundStyle(viewState.theme.foreground2)
}
}
}

0 comments on commit a7cee19

Please sign in to comment.