MessagesView.java
package com.privacydashboard.application.views.messages;
import com.privacydashboard.application.data.entity.User;
import com.privacydashboard.application.data.service.CommunicationService;
import com.privacydashboard.application.data.service.DataBaseService;
import com.privacydashboard.application.security.AuthenticatedUser;
import com.privacydashboard.application.views.MainLayout;
import com.privacydashboard.application.views.usefulComponents.MyDialog;
import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.avatar.Avatar;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.GridVariant;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.html.Span;
import com.vaadin.flow.component.orderedlayout.FlexComponent;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.value.ValueChangeMode;
import com.vaadin.flow.router.*;
import javax.annotation.security.PermitAll;
import java.util.List;
@PageTitle("Messages")
@Route(value="messages", layout = MainLayout.class)
@PermitAll
public class MessagesView extends Div implements AfterNavigationObserver{
private final DataBaseService dataBaseService;
private final AuthenticatedUser authenticatedUser;
private final CommunicationService communicationService;
private final Grid<User> grid=new Grid<>();
private final TextField searchText=new TextField();
private final Button newMessageButton=new Button("New Message");
private final HorizontalLayout headerLayout=new HorizontalLayout(searchText, newMessageButton);
private final MyDialog newMessageDialog=new MyDialog();
private final ComboBox<User> contactComboBox= new ComboBox<>("Contacts");
public MessagesView(DataBaseService dataBaseService, AuthenticatedUser authenticatedUser, CommunicationService communicationService) {
this.dataBaseService= dataBaseService;
this.authenticatedUser= authenticatedUser;
this.communicationService= communicationService;
addClassName("grid-view");
initializeHeaderLayout();
initializeGrid();
initializeNewMessageDialog();
add(headerLayout, grid);
}
private void initializeGrid(){
grid.addThemeVariants(GridVariant.LUMO_NO_BORDER, GridVariant.LUMO_NO_ROW_BORDERS);
grid.addComponentColumn(this::showContact);
}
private void initializeHeaderLayout(){
newMessageButton.addClickListener(e-> newMessageDialog.open());
searchText.setPlaceholder("Search...");
searchText.setValueChangeMode(ValueChangeMode.LAZY);
searchText.addValueChangeListener(e-> updateGrid());
searchText.addClassName("search");
headerLayout.setAlignItems(FlexComponent.Alignment.CENTER);
}
private void initializeNewMessageDialog(){
contactComboBox.setItems(dataBaseService.getAllContactsFromUser(authenticatedUser.getUser()));
contactComboBox.setItemLabelGenerator(User::getName);
Button newMessageButton=new Button("Continue", e-> confirmNewMessage());
newMessageDialog.setTitle("Select a contact");
newMessageDialog.setContent(new VerticalLayout(contactComboBox));
newMessageDialog.setContinueButton(newMessageButton);
}
private void confirmNewMessage(){
if(contactComboBox.getValue()==null){
return;
}
newMessageDialog.close();
goToConversation(contactComboBox.getValue());
}
private HorizontalLayout showContact(User contact){
Avatar avatar = new Avatar(contact.getName(), contact.getProfilePictureUrl());
Span name= new Span(contact.getName());
name.addClassName("name");
HorizontalLayout card = new HorizontalLayout(avatar, name);
card.addClassName("card");
card.addClassName("canOpen");
card.addClickListener(e-> goToConversation(contact));
return card;
}
private void goToConversation(User contact){
communicationService.setContact(contact);
UI.getCurrent().navigate(SingleConversationView.class);
}
private void updateGrid(){
List<User> usersConversation;
if(searchText.getValue()==null || searchText.getValue().length()==0){
usersConversation=dataBaseService.getUserConversationFromUser(authenticatedUser.getUser());
}
else{
usersConversation=dataBaseService.getUserConversationFromUserFilterByName(authenticatedUser.getUser(), searchText.getValue());
}
grid.setItems(usersConversation);
}
@Override
public void afterNavigation(AfterNavigationEvent event) {
updateGrid();
}
}