From 7847bf19ccb4d90c5d112cbd17ac317ccd21d7b8 Mon Sep 17 00:00:00 2001 From: Alex <78383757+Lextical@users.noreply.github.com> Date: Tue, 14 Apr 2026 23:34:07 -0600 Subject: [PATCH] fixed chat messaging on same account with different devices --- .../petstoremobile/fragments/ChatFragment.java | 4 +--- .../viewmodels/ChatListViewModel.java | 5 +++++ .../websocket/StompChatManager.java | 1 + .../controllers/ChatController.java | 16 ++++++++++------ 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/android/app/src/main/java/com/example/petstoremobile/fragments/ChatFragment.java b/android/app/src/main/java/com/example/petstoremobile/fragments/ChatFragment.java index 47f755a2..0aee1de5 100644 --- a/android/app/src/main/java/com/example/petstoremobile/fragments/ChatFragment.java +++ b/android/app/src/main/java/com/example/petstoremobile/fragments/ChatFragment.java @@ -470,9 +470,7 @@ public class ChatFragment extends Fragment implements ChatAdapter.OnChatClickLis public void onMessageReceived(MessageDTO dto) { requireActivity().runOnUiThread(() -> { if (activeConversationId != null && activeConversationId.equals(dto.getConversationId())) { - if (!tokenManager.getUserId().equals(dto.getSenderId())) { - viewModel.addMessageLocally(dto); - } + viewModel.addMessageLocally(dto); } viewModel.updateConversationLocally(new ConversationDTO(dto.getConversationId(), 0L, 0L, dto.getContent(), "")); }); diff --git a/android/app/src/main/java/com/example/petstoremobile/viewmodels/ChatListViewModel.java b/android/app/src/main/java/com/example/petstoremobile/viewmodels/ChatListViewModel.java index 88123907..f0bad647 100644 --- a/android/app/src/main/java/com/example/petstoremobile/viewmodels/ChatListViewModel.java +++ b/android/app/src/main/java/com/example/petstoremobile/viewmodels/ChatListViewModel.java @@ -133,6 +133,11 @@ public class ChatListViewModel extends ViewModel { public void addMessageLocally(MessageDTO dto) { List current = new ArrayList<>(messageList.getValue()); + if (dto.getId() != null) { + for (Message m : current) { + if (dto.getId().equals(m.getId())) return; + } + } current.add(dtoToModel(dto)); messageList.setValue(current); } diff --git a/android/app/src/main/java/com/example/petstoremobile/websocket/StompChatManager.java b/android/app/src/main/java/com/example/petstoremobile/websocket/StompChatManager.java index f0f5d7ec..3aad4b8d 100644 --- a/android/app/src/main/java/com/example/petstoremobile/websocket/StompChatManager.java +++ b/android/app/src/main/java/com/example/petstoremobile/websocket/StompChatManager.java @@ -95,6 +95,7 @@ public class StompChatManager { headers.put("Authorization", "Bearer " + authToken); stompClient = Stomp.over(Stomp.ConnectionProvider.OKHTTP, webSocketUrl, headers); + stompClient.withClientHeartbeat(0).withServerHeartbeat(0); compositeDisposable.add( stompClient.lifecycle() 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 17033f16..c746db2e 100644 --- a/desktop/src/main/java/org/example/petshopdesktop/controllers/ChatController.java +++ b/desktop/src/main/java/org/example/petshopdesktop/controllers/ChatController.java @@ -35,9 +35,11 @@ import java.io.File; import java.time.format.DateTimeFormatter; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; public class ChatController { @@ -87,6 +89,7 @@ public class ChatController { private final ObservableList activeConversations = FXCollections.observableArrayList(); private final ObservableList closedConversations = FXCollections.observableArrayList(); private final Map customerLabels = new HashMap<>(); + private final Set renderedMessageIds = new HashSet<>(); private final ChatRealtimeClient realtimeClient = ChatRealtimeClient.getInstance(); private ConversationResponse selectedConversation; private File selectedAttachmentFile; @@ -131,12 +134,7 @@ public class ChatController { }); realtimeClient.setConversationListener(conversation -> Platform.runLater(() -> upsertConversation(conversation))); - realtimeClient.setMessageListener(message -> Platform.runLater(() -> { - Long myId = UserSession.getInstance().getUserId(); - if (message.getSenderId() == null || !message.getSenderId().equals(myId)) { - appendMessageIfSelected(message); - } - })); + realtimeClient.setMessageListener(message -> Platform.runLater(() -> appendMessageIfSelected(message))); realtimeClient.setStatusListener(status -> Platform.runLater(() -> lblChatStatus.setText(status))); realtimeClient.subscribeToConversations(); @@ -419,9 +417,11 @@ public class ChatController { private void renderMessages(List messages) { vbMessages.getChildren().clear(); + renderedMessageIds.clear(); for (MessageResponse message : messages) { try { vbMessages.getChildren().add(createMessageBubble(message)); + if (message.getId() != null) renderedMessageIds.add(message.getId()); } catch (Exception e) { ActivityLogger.getInstance().logException( "ChatController.renderMessages", @@ -436,7 +436,11 @@ public class ChatController { try { upsertConversationForMessage(message); if (selectedConversation != null && selectedConversation.getId().equals(message.getConversationId())) { + if (message.getId() != null && renderedMessageIds.contains(message.getId())) { + return; + } vbMessages.getChildren().add(createMessageBubble(message)); + if (message.getId() != null) renderedMessageIds.add(message.getId()); scrollMessagesToBottom(); } } catch (Exception e) {