/**
* Copyright 2010 Daniel Guermeur and Amy Unruh
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* 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.
*
* See http://connectrapp.appspot.com/ for a demo, and links to more information
* about this app and the book that it accompanies.
*/
package com.casamind.adware.client.presenter;
import com.casamind.adware.client.Adware;
import com.casamind.adware.client.event.LoginEvent;
import com.casamind.adware.client.event.LoginEventHandler;
import com.casamind.adware.client.event.ProfileEditEvent;
import com.casamind.adware.client.helper.RPCCall;
import com.casamind.adware.client.service.LoginServiceAsync;
import com.casamind.adware.shared.AccessLevels;
import com.casamind.adware.shared.AuthTypes;
import com.casamind.adware.shared.EntityTypes;
import com.casamind.adware.shared.model.UserAccountDTO;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.SimpleEventBus;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
public class UserBadgePresenter implements Presenter {
public interface Display {
Anchor getLogoutLink();
Anchor getAccountLink();
HasText getUsernameLabel();
Widget asWidget();
}
private final LoginServiceAsync rpcService;
private final SimpleEventBus eventBus;
private final Display display;
private UserAccountDTO currentUser;
public UserBadgePresenter(LoginServiceAsync rpcService, SimpleEventBus eventBus, Display display) {
this.rpcService = rpcService;
this.eventBus = eventBus;
this.display = display;
}
public void bind() {
this.display.getLogoutLink().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
// doLogout();
}
});
this.display.getAccountLink().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
if (Adware.get().getCurrentUser().getAccessLevel() == AccessLevels.Company) {
eventBus.fireEvent(new ProfileEditEvent(Adware.get().getCurrentUser(), EntityTypes.Company));
} else if (Adware.get().getCurrentUser().getAccessLevel() == AccessLevels.Publisher) {
eventBus.fireEvent(new ProfileEditEvent(Adware.get().getCurrentUser(), EntityTypes.Publisher));
} else if (Adware.get().getCurrentUser().getAccessLevel() == AccessLevels.Administrator) {
eventBus.fireEvent(new ProfileEditEvent(Adware.get().getCurrentUser(), EntityTypes.Entity));
}
}
});
// Listen to login events
eventBus.addHandler(LoginEvent.TYPE, new LoginEventHandler() {
@Override
public void onLogin(LoginEvent event) {
currentUser = event.getUser();
doLogin();
}
});
}
private void doLogout() {
new RPCCall<Void>() {
@Override
protected void callService(AsyncCallback<Void> cb) {
if (facebookUser()) {
Window.Location.assign("/facebooklogout.jsp");
} else {
rpcService.logout(cb);
}
}
@Override
public void onSuccess(Void result) {
// logout event already fired by RPCCall
}
@Override
public void onFailure(Throwable caught) {
Window.alert("An error occurred: " + caught.toString());
}
}.retry(3);
}
private boolean facebookUser() {
return currentUser.getUniqueId().endsWith(AuthTypes.FACEBOOK.toString());
}
private void doLogin() {
UserBadgePresenter.this.display.getUsernameLabel().setText(currentUser.getDisplayName());
UserBadgePresenter.this.display.getLogoutLink().setHref(currentUser.getLogoutUrl());
}
public void go(final HasWidgets container) {
container.clear();
container.add(display.asWidget());
bind();
}
@Override
public void go(DeckPanel container) {
// TODO Auto-generated method stub
}
}