diff --git a/src/main/java/org/example/petshopdesktop/api/ChatRealtimeClient.java b/src/main/java/org/example/petshopdesktop/api/ChatRealtimeClient.java index da6d94c3..fcb93c0c 100644 --- a/src/main/java/org/example/petshopdesktop/api/ChatRealtimeClient.java +++ b/src/main/java/org/example/petshopdesktop/api/ChatRealtimeClient.java @@ -37,6 +37,7 @@ public class ChatRealtimeClient implements WebSocket.Listener { private Consumer conversationListener; private Consumer messageListener; private Consumer statusListener; + private volatile String currentStatus = "Chat disconnected"; private ChatRealtimeClient() { this.httpClient = HttpClient.newBuilder() @@ -58,6 +59,9 @@ public class ChatRealtimeClient implements WebSocket.Listener { public void setStatusListener(Consumer statusListener) { this.statusListener = statusListener; + if (statusListener != null) { + statusListener.accept(currentStatus); + } } public void connect() { @@ -286,6 +290,7 @@ public class ChatRealtimeClient implements WebSocket.Listener { } private void publishStatus(String status) { + currentStatus = status; if (statusListener != null) { statusListener.accept(status); } diff --git a/src/main/java/org/example/petshopdesktop/controllers/ChatController.java b/src/main/java/org/example/petshopdesktop/controllers/ChatController.java index 6911960d..bc343639 100644 --- a/src/main/java/org/example/petshopdesktop/controllers/ChatController.java +++ b/src/main/java/org/example/petshopdesktop/controllers/ChatController.java @@ -107,7 +107,7 @@ public class ChatController { realtimeClient.setConversationListener(conversation -> Platform.runLater(() -> upsertConversation(conversation))); realtimeClient.setMessageListener(message -> Platform.runLater(() -> appendMessageIfSelected(message))); realtimeClient.setStatusListener(status -> Platform.runLater(() -> lblChatStatus.setText(status))); - realtimeClient.connect(); + realtimeClient.subscribeToConversations(); loadCustomers(); loadConversations(); diff --git a/src/main/resources/org/example/petshopdesktop/main-layout-view.fxml b/src/main/resources/org/example/petshopdesktop/main-layout-view.fxml index e301357f..9daa91e1 100644 --- a/src/main/resources/org/example/petshopdesktop/main-layout-view.fxml +++ b/src/main/resources/org/example/petshopdesktop/main-layout-view.fxml @@ -12,7 +12,7 @@ - + @@ -47,7 +47,7 @@ - + diff --git a/src/main/resources/org/example/petshopdesktop/modelviews/analytics-view.fxml b/src/main/resources/org/example/petshopdesktop/modelviews/analytics-view.fxml index cdf1f90b..dec7a883 100644 --- a/src/main/resources/org/example/petshopdesktop/modelviews/analytics-view.fxml +++ b/src/main/resources/org/example/petshopdesktop/modelviews/analytics-view.fxml @@ -14,7 +14,7 @@ - + @@ -41,7 +41,7 @@ - + diff --git a/src/main/resources/org/example/petshopdesktop/modelviews/chat-view.fxml b/src/main/resources/org/example/petshopdesktop/modelviews/chat-view.fxml index f701a9b5..e425ec67 100644 --- a/src/main/resources/org/example/petshopdesktop/modelviews/chat-view.fxml +++ b/src/main/resources/org/example/petshopdesktop/modelviews/chat-view.fxml @@ -14,7 +14,7 @@ - + @@ -38,7 +38,7 @@ @@ -53,7 +53,7 @@ - + diff --git a/src/main/resources/org/example/petshopdesktop/styles/desktop-ui.css b/src/main/resources/org/example/petshopdesktop/styles/desktop-ui.css new file mode 100644 index 00000000..9b029a2a --- /dev/null +++ b/src/main/resources/org/example/petshopdesktop/styles/desktop-ui.css @@ -0,0 +1,119 @@ +.sidebar-scroll-pane { + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-padding: 0 4 0 0; +} + +.sidebar-scroll-pane > .viewport { + -fx-background-color: #2C3E50; +} + +.sidebar-scroll-pane .scroll-bar:vertical, +.chat-conversation-list .scroll-bar:vertical, +.chat-messages-scroll-pane .scroll-bar:vertical { + -fx-background-color: transparent; + -fx-pref-width: 10; + -fx-padding: 0; +} + +.sidebar-scroll-pane .scroll-bar:vertical .track, +.chat-conversation-list .scroll-bar:vertical .track, +.chat-messages-scroll-pane .scroll-bar:vertical .track { + -fx-background-color: rgba(148, 163, 184, 0.18); + -fx-background-radius: 999; +} + +.sidebar-scroll-pane .scroll-bar:vertical .thumb, +.chat-conversation-list .scroll-bar:vertical .thumb, +.chat-messages-scroll-pane .scroll-bar:vertical .thumb { + -fx-background-color: rgba(203, 213, 225, 0.52); + -fx-background-radius: 999; +} + +.sidebar-scroll-pane .scroll-bar:vertical .increment-button, +.sidebar-scroll-pane .scroll-bar:vertical .decrement-button, +.chat-conversation-list .scroll-bar:vertical .increment-button, +.chat-conversation-list .scroll-bar:vertical .decrement-button, +.chat-messages-scroll-pane .scroll-bar:vertical .increment-button, +.chat-messages-scroll-pane .scroll-bar:vertical .decrement-button { + -fx-padding: 0; + -fx-background-color: transparent; +} + +.sidebar-scroll-pane .scroll-bar:vertical .increment-arrow, +.sidebar-scroll-pane .scroll-bar:vertical .decrement-arrow, +.chat-conversation-list .scroll-bar:vertical .increment-arrow, +.chat-conversation-list .scroll-bar:vertical .decrement-arrow, +.chat-messages-scroll-pane .scroll-bar:vertical .increment-arrow, +.chat-messages-scroll-pane .scroll-bar:vertical .decrement-arrow { + -fx-shape: ''; + -fx-padding: 0; +} + +.analytics-tabs { + -fx-tab-min-height: 34; + -fx-tab-max-height: 34; +} + +.analytics-tabs > .tab-header-area { + -fx-padding: 0 0 8 0; +} + +.analytics-tabs > .tab-header-area > .headers-region > .tab { + -fx-background-color: transparent; + -fx-background-radius: 12 12 0 0; + -fx-border-color: transparent transparent rgba(148, 163, 184, 0.35) transparent; + -fx-border-width: 0 0 2 0; + -fx-padding: 8 16 8 16; +} + +.analytics-tabs > .tab-header-area > .headers-region > .tab:selected { + -fx-background-color: white; + -fx-border-color: transparent transparent #ff6b6b transparent; + -fx-effect: dropshadow(gaussian, rgba(15, 23, 42, 0.08), 10, 0.2, 0, 2); +} + +.analytics-tabs > .tab-header-area > .headers-region > .tab .tab-label { + -fx-text-fill: #64748b; + -fx-font-weight: 700; +} + +.analytics-tabs > .tab-header-area > .headers-region > .tab:selected .tab-label { + -fx-text-fill: #1f2937; +} + +.analytics-tabs > .tab-header-area > .tab-header-background { + -fx-background-color: transparent; +} + +.analytics-tabs > .tab-content-area { + -fx-background-color: transparent; + -fx-padding: 0; +} + +.chat-conversation-list { + -fx-background-insets: 0; + -fx-background-color: transparent; +} + +.chat-conversation-list .list-cell { + -fx-background-color: transparent; + -fx-background-radius: 14; + -fx-padding: 10 10 10 10; +} + +.chat-conversation-list .list-cell:filled:selected, +.chat-conversation-list .list-cell:filled:hover { + -fx-background-color: #eef2ff; +} + +.chat-conversation-list .list-cell:filled:selected { + -fx-border-color: #c7d2fe; + -fx-border-radius: 14; + -fx-background-insets: 0; +} + +.chat-messages-scroll-pane, +.chat-messages-scroll-pane > .viewport { + -fx-background-color: transparent; +}