From 8bceffa67c0a28dbe4a45473a48262ce2aac9ed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20Rasie=C5=84ski?= Date: Wed, 17 Dec 2025 16:50:30 +0100 Subject: [PATCH] Implemented websockets in foodpal ctrl. --- .../client/scenes/FoodpalApplicationCtrl.java | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/client/src/main/java/client/scenes/FoodpalApplicationCtrl.java b/client/src/main/java/client/scenes/FoodpalApplicationCtrl.java index 0b3aeba..2cb8d85 100644 --- a/client/src/main/java/client/scenes/FoodpalApplicationCtrl.java +++ b/client/src/main/java/client/scenes/FoodpalApplicationCtrl.java @@ -13,10 +13,14 @@ import client.utils.DefaultRecipeFactory; import client.utils.LocaleAware; import client.utils.LocaleManager; import client.utils.ServerUtils; +import client.utils.WebSocketUtils; import commons.Recipe; +import commons.ws.Topics; +import commons.ws.messages.Message; import jakarta.inject.Inject; +import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Alert; @@ -32,6 +36,7 @@ import javafx.scene.text.Font; public class FoodpalApplicationCtrl implements LocaleAware { private final ServerUtils server; + private final WebSocketUtils webSocketUtils; private final LocaleManager localeManager; private final IngredientListCtrl ingredientListCtrl; private final RecipeStepListCtrl stepListCtrl; @@ -81,15 +86,42 @@ public class FoodpalApplicationCtrl implements LocaleAware { @Inject public FoodpalApplicationCtrl( ServerUtils server, + WebSocketUtils webSocketUtils, LocaleManager localeManager, IngredientListCtrl ingredientListCtrl, RecipeStepListCtrl stepListCtrl ) { this.server = server; + this.webSocketUtils = webSocketUtils; this.localeManager = localeManager; this.ingredientListCtrl = ingredientListCtrl; this.stepListCtrl = stepListCtrl; + + initializeWebSocket(); } + + private void initializeWebSocket() { + webSocketUtils.connect(() -> { + webSocketUtils.subscribe(Topics.RECIPES, (Message _) -> { + Platform.runLater(() -> { + Recipe selectedRecipe = recipeList.getSelectionModel().getSelectedItem(); + refresh(); // refresh the left list + if (selectedRecipe == null) { + return; + } + + // select last selected recipe if it still exists, first otherwise (done by refresh()) + Recipe recipeInList = recipeList.getItems().stream() + .filter(r -> r.getId().equals(selectedRecipe.getId())) + .findFirst() + .orElse(null); + + showRecipeDetails(recipeInList); + }); // runLater as it's on another non-FX thread. + }); + }); + } + @Override public void initializeComponents() { // TODO Reduce code duplication?? @@ -146,6 +178,7 @@ public class FoodpalApplicationCtrl implements LocaleAware { refresh(); } + private void showName(String name) { final int NAME_FONT_SIZE = 20; editableTitleArea.getChildren().clear(); @@ -153,6 +186,7 @@ public class FoodpalApplicationCtrl implements LocaleAware { nameLabel.setFont(new Font("System Bold", NAME_FONT_SIZE)); editableTitleArea.getChildren().add(nameLabel); } + @Override public void updateText() { addRecipeButton.setText(getLocaleString("menu.button.add.recipe")); @@ -206,11 +240,13 @@ public class FoodpalApplicationCtrl implements LocaleAware { } detailsScreen.visibleProperty().set(!recipes.isEmpty()); } + private void printError(String msg) { Alert alert = new Alert(Alert.AlertType.ERROR); alert.setContentText(msg); alert.showAndWait(); } + /** * Adds a recipe, by providing a default name "Untitled recipe (n)" * The UX flow is now: @@ -283,7 +319,7 @@ public class FoodpalApplicationCtrl implements LocaleAware { try { server.updateRecipe(selected); refresh(); - recipeList.getSelectionModel().select(selected); + //recipeList.getSelectionModel().select(selected); } catch (IOException | InterruptedException e) { // throw a nice blanket UpdateException throw new UpdateException("Error occurred when updating recipe name!"); @@ -294,7 +330,6 @@ public class FoodpalApplicationCtrl implements LocaleAware { edit.requestFocus(); } - // Language buttons @FXML private void switchLocale(ActionEvent event) {