fix desktop chat
This commit is contained in:
@@ -2,6 +2,10 @@ package org.example.petshopdesktop.api.dto.chat;
|
|||||||
|
|
||||||
public class MessageRequest {
|
public class MessageRequest {
|
||||||
private String content;
|
private String content;
|
||||||
|
private String attachmentUrl;
|
||||||
|
private String attachmentName;
|
||||||
|
private String attachmentMimeType;
|
||||||
|
private Long attachmentSizeBytes;
|
||||||
|
|
||||||
public MessageRequest() {
|
public MessageRequest() {
|
||||||
}
|
}
|
||||||
@@ -17,4 +21,36 @@ public class MessageRequest {
|
|||||||
public void setContent(String content) {
|
public void setContent(String content) {
|
||||||
this.content = 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,10 @@ public class MessageResponse {
|
|||||||
private String content;
|
private String content;
|
||||||
private LocalDateTime timestamp;
|
private LocalDateTime timestamp;
|
||||||
private Boolean isRead;
|
private Boolean isRead;
|
||||||
|
private String attachmentUrl;
|
||||||
|
private String attachmentName;
|
||||||
|
private String attachmentMimeType;
|
||||||
|
private Long attachmentSizeBytes;
|
||||||
|
|
||||||
public MessageResponse() {
|
public MessageResponse() {
|
||||||
}
|
}
|
||||||
@@ -60,4 +64,36 @@ public class MessageResponse {
|
|||||||
public void setIsRead(Boolean isRead) {
|
public void setIsRead(Boolean isRead) {
|
||||||
this.isRead = 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import javafx.collections.FXCollections;
|
|||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.scene.control.Button;
|
import javafx.scene.control.Button;
|
||||||
|
import javafx.scene.control.Hyperlink;
|
||||||
import javafx.scene.control.Label;
|
import javafx.scene.control.Label;
|
||||||
import javafx.scene.control.ListCell;
|
import javafx.scene.control.ListCell;
|
||||||
import javafx.scene.control.ListView;
|
import javafx.scene.control.ListView;
|
||||||
@@ -284,15 +285,35 @@ public class ChatController {
|
|||||||
Label author = new Label(resolveAuthorLabel(message));
|
Label author = new Label(resolveAuthorLabel(message));
|
||||||
author.setStyle("-fx-font-weight: bold; -fx-text-fill: " + (mine ? "#ffffff" : "#1f2937") + ";");
|
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());
|
String timestampText = message.getTimestamp() == null ? "" : TIME_FORMATTER.format(message.getTimestamp());
|
||||||
Label timestamp = new Label(timestampText);
|
Label timestamp = new Label(timestampText);
|
||||||
timestamp.setStyle("-fx-text-fill: " + (mine ? "#dbeafe" : "#94a3b8") + "; -fx-font-size: 11px;");
|
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.setMaxWidth(420);
|
||||||
bubble.setStyle(mine
|
bubble.setStyle(mine
|
||||||
? "-fx-background-color: #0f766e; -fx-background-radius: 14; -fx-padding: 12;"
|
? "-fx-background-color: #0f766e; -fx-background-radius: 14; -fx-padding: 12;"
|
||||||
@@ -347,4 +368,29 @@ public class ChatController {
|
|||||||
private void scrollMessagesToBottom() {
|
private void scrollMessagesToBottom() {
|
||||||
Platform.runLater(() -> spMessages.setVvalue(1.0));
|
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]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user