Skip to content

Commit

Permalink
New news page (#1706)
Browse files Browse the repository at this point in the history
Fixes #1738
  • Loading branch information
BlackYps committed May 30, 2020
1 parent 6d0e27d commit c63f253
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 186 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ public static class Website {
private String baseUrl;
private String forgotPasswordUrl;
private String createAccountUrl;
private String newsHubUrl;
}

@Data
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public void configureWebView(WebView webView) {
webView.addEventHandler(MouseEvent.MOUSE_MOVED, moveHandler);

engine.setUserDataDirectory(preferencesService.getCacheDirectory().toFile());
engine.setUserAgent("downlords-faf-client"); // removes faforever.com header and footer
uiService.registerWebView(webView);
JavaFxUtil.addListener(engine.getLoadWorker().stateProperty(), (observable, oldValue, newValue) -> {
if (newValue != State.SUCCEEDED) {
Expand Down
82 changes: 17 additions & 65 deletions src/main/java/com/faforever/client/news/NewsController.java
Original file line number Diff line number Diff line change
@@ -1,57 +1,38 @@
package com.faforever.client.news;

import com.faforever.client.config.ClientProperties;
import com.faforever.client.config.ClientProperties.Website;
import com.faforever.client.fx.AbstractViewController;
import com.faforever.client.fx.WebViewConfigurer;
import com.faforever.client.i18n.I18n;
import com.faforever.client.main.event.NavigateEvent;
import com.faforever.client.main.event.ShowLadderMapsEvent;
import com.faforever.client.preferences.PreferencesService;
import com.faforever.client.theme.UiService;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import com.google.common.io.CharStreams;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.concurrent.Worker;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.Control;
import javafx.scene.control.ListView;
import javafx.scene.layout.Pane;
import javafx.scene.web.WebView;
import lombok.SneakyThrows;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;

import java.io.InputStreamReader;
import java.io.Reader;

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class NewsController extends AbstractViewController<Node> {

private static final ClassPathResource NEWS_DETAIL_HTML_RESOURCE = new ClassPathResource("/theme/news_detail.html");
private final PreferencesService preferencesService;
private final I18n i18n;
private final NewsService newsService;
private final UiService uiService;
private final EventBus eventBus;
private final WebViewConfigurer webViewConfigurer;
private final ClientProperties clientProperties;
public Pane newsRoot;
public WebView newsDetailWebView;
public Button showLadderMapsButton;
public ListView<NewsItem> newsListView;
public WebView newsWebView;
public Control loadingIndicator;
private ChangeListener<Boolean> loadingIndicatorListener;

public NewsController(PreferencesService preferencesService, I18n i18n, NewsService newsService, UiService uiService, EventBus eventBus, WebViewConfigurer webViewConfigurer) {
this.preferencesService = preferencesService;
this.i18n = i18n;
this.newsService = newsService;
this.uiService = uiService;
public NewsController(EventBus eventBus, WebViewConfigurer webViewConfigurer, ClientProperties clientProperties) {
this.eventBus = eventBus;
this.webViewConfigurer = webViewConfigurer;
this.clientProperties = clientProperties;

loadingIndicatorListener = (observable, oldValue, newValue)
-> loadingIndicator.getParent().getChildrenUnmodifiable().stream()
Expand All @@ -62,15 +43,20 @@ public NewsController(PreferencesService preferencesService, I18n i18n, NewsServ

@Override
public void initialize() {
newsListView.setCellFactory(param -> new NewsItemListCell(uiService));
newsListView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> displayNewsItem(newValue));
newsWebView.setContextMenuEnabled(false);
webViewConfigurer.configureWebView(newsWebView);

loadingIndicator.managedProperty().bind(loadingIndicator.visibleProperty());
loadingIndicator.visibleProperty().addListener(loadingIndicatorListener);
loadingIndicatorListener.changed(loadingIndicator.visibleProperty(), null, true);

loadingIndicator.getParent().getChildrenUnmodifiable()
.forEach(node -> node.managedProperty().bind(node.visibleProperty()));
newsWebView.getEngine().getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
if (newState == Worker.State.SUCCEEDED) {
onLoadingStop();
}
});
}

private void onLoadingStart() {
Expand All @@ -83,17 +69,7 @@ private void onLoadingStop() {

@Override
protected void onDisplay(NavigateEvent navigateEvent) {
if (!newsListView.getItems().isEmpty()) {
return;
}

eventBus.post(new UnreadNewsEvent(false));

showLadderMapsButton.managedProperty().bind(showLadderMapsButton.visibleProperty());
showLadderMapsButton.setVisible(false);
newsDetailWebView.setContextMenuEnabled(false);
webViewConfigurer.configureWebView(newsDetailWebView);

onLoadingStart();
loadNews();
}
Expand All @@ -108,38 +84,14 @@ public void onUnreadNewsEvent(UnreadNewsEvent unreadNewsEvent) {


private void loadNews() {
newsService.fetchNews().thenAccept(newsItems -> {
Platform.runLater(() -> {
newsListView.getItems().setAll(newsItems);
onLoadingStop();
if (!newsItems.isEmpty()) {
NewsItem mostRecentItem = newsItems.get(0);
preferencesService.getPreferences().getNews().setLastReadNewsUrl(mostRecentItem.getLink());
preferencesService.storeInBackground();
}
newsListView.getSelectionModel().selectFirst();
});
Platform.runLater(() -> {
Website website = clientProperties.getWebsite();
newsWebView.getEngine().load(website.getNewsHubUrl());
});
}

@SneakyThrows
private void displayNewsItem(NewsItem newsItem) {
showLadderMapsButton.setVisible(newsItem.getNewsCategory().equals(NewsCategory.LADDER));

try (Reader reader = new InputStreamReader(NEWS_DETAIL_HTML_RESOURCE.getInputStream())) {
String html = CharStreams.toString(reader).replace("{title}", newsItem.getTitle())
.replace("{content}", newsItem.getContent())
.replace("{authored}", i18n.get("news.authoredFormat", newsItem.getAuthor(), newsItem.getDate()));

Platform.runLater(() -> newsDetailWebView.getEngine().loadContent(html));
}
}

public Node getRoot() {
return newsRoot;
}

public void showLadderMaps() {
eventBus.post(new ShowLadderMapsEvent());
}
}
89 changes: 0 additions & 89 deletions src/main/java/com/faforever/client/news/NewsService.java

This file was deleted.

1 change: 1 addition & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ faf-client:
website:
forgot-password-url: ${faf-client.website.base-url}/account/password/reset
create-account-url: ${faf-client.website.base-url}/account/register
news-hub-url: ${faf-client.website.base-url}/newshub

imgur:
upload:
Expand Down
22 changes: 5 additions & 17 deletions src/main/resources/theme/news.fxml
Original file line number Diff line number Diff line change
@@ -1,30 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>

<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXListView?>
<?import com.jfoenix.controls.JFXSpinner?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.web.WebView?>
<HBox xmlns:fx="http://javafx.com/fxml/1" fx:id="newsRoot" alignment="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="0.0" minWidth="0.0" xmlns="http://javafx.com/javafx/8.0.141" fx:controller="com.faforever.client.news.NewsController">
<?import javafx.scene.layout.StackPane?>
<StackPane xmlns:fx="http://javafx.com/fxml/1" fx:id="newsRoot" alignment="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="0.0" minWidth="0.0" xmlns="http://javafx.com/javafx/8.0.141" fx:controller="com.faforever.client.news.NewsController">
<children>
<SplitPane dividerPositions="0.2" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" HBox.hgrow="ALWAYS">
<items>
<JFXListView fx:id="newsListView" styleClass="news-list" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minWidth="100.0" prefWidth="240.0" />
<AnchorPane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308">
<children>
<WebView fx:id="newsDetailWebView" prefHeight="-1.0" prefWidth="-1.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
<JFXButton fx:id="showLadderMapsButton" onAction="#showLadderMaps" text="%news.showLadderMaps" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
</items>
</SplitPane>
<WebView fx:id="newsWebView" prefHeight="-1.0" prefWidth="-1.0"/>
<Label fx:id="loadingIndicator" contentDisplay="TOP" text="%loading" HBox.hgrow="ALWAYS">
<graphic>
<JFXSpinner maxHeight="80.0" maxWidth="80.0" />
<JFXSpinner maxHeight="80.0" maxWidth="80.0"/>
</graphic>
</Label>
</children>
</HBox>
</StackPane>
15 changes: 0 additions & 15 deletions src/main/resources/theme/news_detail.html

This file was deleted.

0 comments on commit c63f253

Please sign in to comment.