Close chat #169

Closed
RecentRunner wants to merge 291 commits from close-chat into main
3 changed files with 123 additions and 5 deletions
Showing only changes of commit 7980a7b930 - Show all commits

View File

@@ -2,6 +2,10 @@ package org.example.petshopdesktop.api.dto.chat;
public class MessageRequest {
private String content;
private String attachmentUrl;
private String attachmentName;
private String attachmentMimeType;
private Long attachmentSizeBytes;
public MessageRequest() {
}
@@ -17,4 +21,36 @@ public class MessageRequest {
public void setContent(String content) {
this.content = content;
}
public String getAttachmentUrl() {
return attachmentUrl;
}
public void setAttachmentUrl(String attachmentUrl) {
this.attachmentUrl = attachmentUrl;
}
public String getAttachmentName() {
return attachmentName;
}
public void setAttachmentName(String attachmentName) {
this.attachmentName = attachmentName;
}
public String getAttachmentMimeType() {
return attachmentMimeType;
}
public void setAttachmentMimeType(String attachmentMimeType) {
this.attachmentMimeType = attachmentMimeType;
}
public Long getAttachmentSizeBytes() {
return attachmentSizeBytes;
}
public void setAttachmentSizeBytes(Long attachmentSizeBytes) {
this.attachmentSizeBytes = attachmentSizeBytes;
}
}

View File

@@ -9,6 +9,10 @@ public class MessageResponse {
private String content;
private LocalDateTime timestamp;
private Boolean isRead;
private String attachmentUrl;
private String attachmentName;
private String attachmentMimeType;
private Long attachmentSizeBytes;
public MessageResponse() {
}
@@ -60,4 +64,36 @@ public class MessageResponse {
public void setIsRead(Boolean isRead) {
this.isRead = isRead;
}
public String getAttachmentUrl() {
return attachmentUrl;
}
public void setAttachmentUrl(String attachmentUrl) {
this.attachmentUrl = attachmentUrl;
}
public String getAttachmentName() {
return attachmentName;
}
public void setAttachmentName(String attachmentName) {
this.attachmentName = attachmentName;
}
public String getAttachmentMimeType() {
return attachmentMimeType;
}
public void setAttachmentMimeType(String attachmentMimeType) {
this.attachmentMimeType = attachmentMimeType;
}
public Long getAttachmentSizeBytes() {
return attachmentSizeBytes;
}
public void setAttachmentSizeBytes(Long attachmentSizeBytes) {
this.attachmentSizeBytes = attachmentSizeBytes;
}
}

View File

@@ -5,6 +5,7 @@ import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Hyperlink;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
@@ -284,15 +285,35 @@ public class ChatController {
Label author = new Label(resolveAuthorLabel(message));
author.setStyle("-fx-font-weight: bold; -fx-text-fill: " + (mine ? "#ffffff" : "#1f2937") + ";");
Label content = new Label(message.getContent());
content.setWrapText(true);
content.setStyle("-fx-text-fill: " + (mine ? "#ffffff" : "#1f2937") + ";");
String timestampText = message.getTimestamp() == null ? "" : TIME_FORMATTER.format(message.getTimestamp());
Label timestamp = new Label(timestampText);
timestamp.setStyle("-fx-text-fill: " + (mine ? "#dbeafe" : "#94a3b8") + "; -fx-font-size: 11px;");
VBox bubble = new VBox(4, author, content, timestamp);
VBox bubble = new VBox(4, author);
String contentText = message.getContent() == null ? "" : message.getContent();
if (!contentText.isBlank()) {
Label content = new Label(contentText);
content.setWrapText(true);
content.setStyle("-fx-text-fill: " + (mine ? "#ffffff" : "#1f2937") + ";");
bubble.getChildren().add(content);
}
if (message.getAttachmentUrl() != null && !message.getAttachmentUrl().isBlank()) {
String attachmentLabel = message.getAttachmentName();
if (attachmentLabel == null || attachmentLabel.isBlank()) {
attachmentLabel = "Attachment";
}
if (message.getAttachmentSizeBytes() != null && message.getAttachmentSizeBytes() > 0) {
attachmentLabel = attachmentLabel + " (" + formatSize(message.getAttachmentSizeBytes()) + ")";
}
Hyperlink attachment = new Hyperlink(attachmentLabel);
attachment.setWrapText(true);
attachment.setOnAction(event -> openAttachment(message.getAttachmentUrl()));
attachment.setStyle("-fx-text-fill: " + (mine ? "#dbeafe" : "#0f766e") + ";");
bubble.getChildren().add(attachment);
}
bubble.getChildren().add(timestamp);
bubble.setMaxWidth(420);
bubble.setStyle(mine
? "-fx-background-color: #0f766e; -fx-background-radius: 14; -fx-padding: 12;"
@@ -347,4 +368,29 @@ public class ChatController {
private void scrollMessagesToBottom() {
Platform.runLater(() -> spMessages.setVvalue(1.0));
}
private void openAttachment(String url) {
try {
java.awt.Desktop.getDesktop().browse(java.net.URI.create(url));
} catch (Exception e) {
ActivityLogger.getInstance().logException(
"ChatController.openAttachment",
e,
"Opening chat attachment");
}
}
private String formatSize(Long bytes) {
if (bytes == null || bytes <= 0) {
return "";
}
double size = bytes;
String[] units = {"B", "KB", "MB", "GB"};
int unitIndex = 0;
while (size >= 1024 && unitIndex < units.length - 1) {
size = size / 1024;
unitIndex++;
}
return unitIndex == 0 ? String.format("%.0f %s", size, units[unitIndex]) : String.format("%.1f %s", size, units[unitIndex]);
}
}