From c776c579ab3618e860cdf8245d1459867be2fad3 Mon Sep 17 00:00:00 2001 From: Harkamal Randhawa Date: Tue, 7 Apr 2026 09:34:31 -0600 Subject: [PATCH] fix desktop chat --- .../api/dto/chat/MessageRequest.java | 36 ++++++++++++ .../api/dto/chat/MessageResponse.java | 36 ++++++++++++ .../controllers/ChatController.java | 56 +++++++++++++++++-- 3 files changed, 123 insertions(+), 5 deletions(-) diff --git a/desktop/src/main/java/org/example/petshopdesktop/api/dto/chat/MessageRequest.java b/desktop/src/main/java/org/example/petshopdesktop/api/dto/chat/MessageRequest.java index a5c17ca4..cd8efedf 100644 --- a/desktop/src/main/java/org/example/petshopdesktop/api/dto/chat/MessageRequest.java +++ b/desktop/src/main/java/org/example/petshopdesktop/api/dto/chat/MessageRequest.java @@ -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; + } } diff --git a/desktop/src/main/java/org/example/petshopdesktop/api/dto/chat/MessageResponse.java b/desktop/src/main/java/org/example/petshopdesktop/api/dto/chat/MessageResponse.java index f81db82d..096a6e58 100644 --- a/desktop/src/main/java/org/example/petshopdesktop/api/dto/chat/MessageResponse.java +++ b/desktop/src/main/java/org/example/petshopdesktop/api/dto/chat/MessageResponse.java @@ -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; + } } diff --git a/desktop/src/main/java/org/example/petshopdesktop/controllers/ChatController.java b/desktop/src/main/java/org/example/petshopdesktop/controllers/ChatController.java index bc343639..99fed184 100644 --- a/desktop/src/main/java/org/example/petshopdesktop/controllers/ChatController.java +++ b/desktop/src/main/java/org/example/petshopdesktop/controllers/ChatController.java @@ -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]); + } }