/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kie.workbench.common.screens.social.hp.client.userpage;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import com.google.gwt.user.client.ui.Image;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.common.client.api.RemoteCallback;
import org.jboss.errai.ioc.client.api.AfterInitialization;
import org.jboss.errai.security.shared.api.identity.User;
import org.ext.uberfire.social.activities.client.gravatar.GravatarBuilder;
import org.ext.uberfire.social.activities.client.widgets.item.model.LinkCommandParams;
import org.ext.uberfire.social.activities.client.widgets.pagination.Next;
import org.ext.uberfire.social.activities.client.widgets.timeline.simple.model.SimpleSocialTimelineWidgetModel;
import org.ext.uberfire.social.activities.client.widgets.userbox.UserBoxView;
import org.ext.uberfire.social.activities.model.SocialPaged;
import org.ext.uberfire.social.activities.model.SocialUser;
import org.ext.uberfire.social.activities.service.SocialUserImageRepositoryAPI;
import org.ext.uberfire.social.activities.service.SocialUserRepositoryAPI;
import org.ext.uberfire.social.activities.service.SocialUserServiceAPI;
import org.kie.workbench.common.screens.social.hp.client.homepage.DefaultSocialLinkCommandGenerator;
import org.kie.workbench.common.screens.social.hp.client.homepage.events.LoadUserPageEvent;
import org.kie.workbench.common.screens.social.hp.client.homepage.events.UserEditedEvent;
import org.kie.workbench.common.screens.social.hp.client.homepage.events.UserHomepageSelectedEvent;
import org.kie.workbench.common.screens.social.hp.client.resources.i18n.Constants;
import org.kie.workbench.common.screens.social.hp.client.userpage.main.MainPresenter;
import org.kie.workbench.common.screens.social.hp.client.userpage.main.header.HeaderPresenter;
import org.kie.workbench.common.screens.social.hp.client.util.IconLocator;
import org.kie.workbench.common.screens.social.hp.predicate.UserTimeLineOnlyUserActivityPredicate;
import org.uberfire.client.annotations.WorkbenchPartTitle;
import org.uberfire.client.annotations.WorkbenchPartView;
import org.uberfire.client.annotations.WorkbenchScreen;
import org.uberfire.client.mvp.PlaceManager;
import org.uberfire.client.mvp.UberView;
import org.uberfire.client.workbench.events.ChangeTitleWidgetEvent;
import org.uberfire.lifecycle.OnStartup;
import org.uberfire.mvp.ParameterizedCommand;
import org.uberfire.mvp.PlaceRequest;
@ApplicationScoped
@WorkbenchScreen( identifier = "UserHomePageMainPresenter" )
public class UserHomePageMainPresenter {
private PlaceRequest place;
public interface View extends UberView<UserHomePageMainPresenter> {
void setHeader( final HeaderPresenter header );
void setMain( MainPresenter main );
}
@Inject
private IconLocator iconLocator;
@Inject
private Event<ChangeTitleWidgetEvent> changeTitleWidgetEvent;
@Inject
private View view;
@Inject
private HeaderPresenter header;
@Inject
private MainPresenter mainPresenter;
@Inject
Caller<SocialUserRepositoryAPI> socialUserRepositoryAPI;
@Inject
Caller<SocialUserServiceAPI> socialUserServiceAPI;
@Inject
private User loggedUser;
@Inject
private PlaceManager placeManager;
@Inject
private Event<UserHomepageSelectedEvent> userHomepageSelectedEvent;
@Inject
private DefaultSocialLinkCommandGenerator linkCommandGenerator;
//control race conditions due to assync system (cdi x UF lifecycle)
private String lastUserOnpage;
@AfterInitialization
public void loadContent() {
initHeader();
}
private void initHeader() {
view.setHeader( header );
view.setMain( mainPresenter );
}
@OnStartup
public void onStartup( final PlaceRequest place ) {
this.place = place;
this.lastUserOnpage = loggedUser.getIdentifier();
setupUser( loggedUser.getIdentifier() );
}
public void watchLoadUserPageEvent( @Observes LoadUserPageEvent event ) {
this.lastUserOnpage = event.getSocialUserName();
setupUser( event.getSocialUserName() );
}
public void watchUserHomepageSelectedEvent( @Observes UserHomepageSelectedEvent event ) {
this.lastUserOnpage = event.getSocialUserName();
setupUser( event.getSocialUserName() );
}
public void watchUserHomepageSelectedEvent( @Observes UserEditedEvent event ) {
this.lastUserOnpage = event.getSocialUserName();
setupUser( event.getSocialUserName() );
}
private boolean isThisUserStillCurrentActiveUser( SocialUser socialUser ) {
return socialUser.getUserName().equalsIgnoreCase( lastUserOnpage );
}
private void setupUser( final String username ) {
final SocialPaged socialPaged = new SocialPaged( 5 );
socialUserRepositoryAPI.call( new RemoteCallback<SocialUser>() {
public void callback( SocialUser socialUser ) {
if ( isThisUserStillCurrentActiveUser( socialUser ) ) {
generateConnectionsList( socialUser );
setupMainWidget( socialUser, socialPaged );
}
}
} ).findSocialUser( username );
}
private void setupMainWidget( SocialUser socialUser,
SocialPaged socialPaged ) {
String userName = ( socialUser != null && socialUser.getRealName() != null && !socialUser.getRealName().isEmpty() ) ? socialUser.getRealName() : socialUser.getUserName();
String title = Constants.INSTANCE.UserNameRecentActivities( userName );
changeTitleWidgetEvent.fire( new ChangeTitleWidgetEvent( place, title ) );
SimpleSocialTimelineWidgetModel model = new SimpleSocialTimelineWidgetModel( socialUser, new UserTimeLineOnlyUserActivityPredicate( socialUser ), placeManager, socialPaged )
.withIcons( iconLocator.getResourceTypes() )
.withOnlyMorePagination( new Next() {{
setText( Constants.INSTANCE.PaginationMore() );
}} )
.withLinkCommand( generateLinkCommand() );
mainPresenter.setup( model );
}
private ParameterizedCommand<LinkCommandParams> generateLinkCommand() {
return linkCommandGenerator.generateLinkCommand();
}
private void generateConnectionsList( final SocialUser socialUser ) {
header.clear();
for ( final String follower : socialUser.getFollowingName() ) {
socialUserRepositoryAPI.call( new RemoteCallback<SocialUser>() {
public void callback( final SocialUser follower ) {
if ( isThisUserStillCurrentActiveUser( socialUser ) ) {
setupFollowerWidget( follower );
}
}
} ).findSocialUser( follower );
}
if ( isThisUserStillCurrentActiveUser( socialUser ) & thereIsNoFollowers( socialUser ) ) {
header.noConnection();
}
}
private void setupFollowerWidget( SocialUser socialUser ) {
Image followerImage = GravatarBuilder.generate( socialUser, SocialUserImageRepositoryAPI.ImageSize.SMALL );
UserBoxView.RelationType relationType = findRelationTypeWithLoggedUser( socialUser );
header.addConnection( socialUser, relationType, followerImage, onClickEvent(), generateFollowUnfollowCommand( relationType ) );
}
private ParameterizedCommand<String> onClickEvent() {
return new ParameterizedCommand<String>() {
@Override
public void execute( String parameter ) {
userHomepageSelectedEvent.fire( new UserHomepageSelectedEvent( parameter ) );
}
};
}
private ParameterizedCommand<String> generateFollowUnfollowCommand( final UserBoxView.RelationType relationType ) {
return new ParameterizedCommand<String>() {
@Override
public void execute( final String parameter ) {
if ( relationType == UserBoxView.RelationType.CAN_FOLLOW ) {
socialUserServiceAPI.call().userFollowAnotherUser( loggedUser.getIdentifier(), parameter );
} else {
socialUserServiceAPI.call().userUnfollowAnotherUser( loggedUser.getIdentifier(), parameter );
}
userHomepageSelectedEvent.fire( new UserHomepageSelectedEvent( lastUserOnpage ) );
}
};
}
private UserBoxView.RelationType findRelationTypeWithLoggedUser( SocialUser socialUser ) {
if ( socialUser.getUserName().equalsIgnoreCase( loggedUser.getIdentifier() ) ) {
return UserBoxView.RelationType.ME;
} else {
return socialUser.getFollowersName().contains( loggedUser.getIdentifier() ) ?
UserBoxView.RelationType.UNFOLLOW : UserBoxView.RelationType.CAN_FOLLOW;
}
}
private boolean thereIsNoFollowers( SocialUser socialUser ) {
return socialUser.getFollowingName() == null || socialUser.getFollowingName().isEmpty();
}
@WorkbenchPartTitle
public String getTitle() {
return "UserHomePageMainPresenter";
}
@WorkbenchPartView
public UberView<UserHomePageMainPresenter> getView() {
return view;
}
}