Skip to content

Commit

Permalink
Merge pull request #5515 from jay-hodgson/PORTALS-3204
Browse files Browse the repository at this point in the history
PORTALS-3204: Use SynapseChat from SRC (when available)
  • Loading branch information
jay-hodgson committed Sep 12, 2024
2 parents c72c7e0 + a285fa0 commit ef5c163
Show file tree
Hide file tree
Showing 10 changed files with 198 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.sagebionetworks.web.client.presenter.BulkPresenterProxy;
import org.sagebionetworks.web.client.presenter.ChallengeOverviewPresenter;
import org.sagebionetworks.web.client.presenter.ChangeUsernamePresenter;
import org.sagebionetworks.web.client.presenter.ChatPresenter;
import org.sagebionetworks.web.client.presenter.ComingSoonPresenter;
import org.sagebionetworks.web.client.presenter.DataAccessApprovalTokenPresenter;
import org.sagebionetworks.web.client.presenter.DataAccessManagementPresenter;
Expand Down Expand Up @@ -896,4 +897,5 @@ public interface PortalGinInjector extends Ginjector {
FeatureFlagConfig getFeatureFlagConfig();

TrustCenterPresenter getTrustCenterPresenter();
ChatPresenter getChatPresenter();
}
Original file line number Diff line number Diff line change
Expand Up @@ -968,6 +968,7 @@ protected void configure() {
bind(IntendedDataUseReportWidgetView.class)
.to(IntendedDataUseReportWidgetViewImpl.class);
bind(DialogView.class).to(Dialog.class);
bind(ChatView.class).to(ChatViewImpl.class);

bind(FollowingPageView.class)
.to(FollowingPageViewImpl.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ public static class SynapseComponents {
public static ReactComponentType<
EntityAclEditorModalProps
> EntityAclEditorModal;
public static ReactComponentType<SynapseChatProps> SynapseChat;

/**
* Pushes a global toast message. In SWC, you should use {@link DisplayUtils#notify}, rather than calling this method directly.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.sagebionetworks.web.client.jsinterop;

import jsinterop.annotations.JsNullable;
import jsinterop.annotations.JsOverlay;
import jsinterop.annotations.JsPackage;
import jsinterop.annotations.JsType;

@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object")
public class SynapseChatProps extends ReactComponentProps {

@JsNullable
public String initialMessage;

@JsNullable
public String agentId;

@JsNullable
public String chatbotName;

@JsOverlay
public static SynapseChatProps create(
String initialMessage,
String agentId,
String chatbotName
) {
SynapseChatProps props = new SynapseChatProps();
if (initialMessage != null) {
props.initialMessage = initialMessage;
}
if (agentId != null) {
props.agentId = agentId;
}
if (chatbotName != null) {
props.chatbotName = chatbotName;
}
return props;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.sagebionetworks.web.client.place.Account;
import org.sagebionetworks.web.client.place.Challenges;
import org.sagebionetworks.web.client.place.ChangeUsername;
import org.sagebionetworks.web.client.place.ChatPlace;
import org.sagebionetworks.web.client.place.ComingSoon;
import org.sagebionetworks.web.client.place.DataAccessApprovalTokenPlace;
import org.sagebionetworks.web.client.place.DataAccessManagementPlace;
Expand Down Expand Up @@ -98,6 +99,7 @@
TwoFactorAuthPlace.Tokenizer.class,
FollowingPlace.Tokenizer.class,
TrustCenterPlace.Tokenizer.class,
ChatPlace.Tokenizer.class,
}
)
public interface AppPlaceHistoryMapper extends PlaceHistoryMapper {}
29 changes: 29 additions & 0 deletions src/main/java/org/sagebionetworks/web/client/place/ChatPlace.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.sagebionetworks.web.client.place;

import com.google.gwt.place.shared.PlaceTokenizer;
import com.google.gwt.place.shared.Prefix;

public class ChatPlace extends ParameterizedPlace {

public static final String INITIAL_MESSAGE = "initialMessage";
public static final String AGENT_ID = "agentId";
public static final String CHATBOT_NAME = "chatbotName";

public ChatPlace(String token) {
super(token);
}

@Prefix("Chat")
public static class Tokenizer implements PlaceTokenizer<ChatPlace> {

@Override
public String getToken(ChatPlace place) {
return place.toToken();
}

@Override
public ChatPlace getPlace(String token) {
return new ChatPlace(token);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.sagebionetworks.web.client.place.Account;
import org.sagebionetworks.web.client.place.Challenges;
import org.sagebionetworks.web.client.place.ChangeUsername;
import org.sagebionetworks.web.client.place.ChatPlace;
import org.sagebionetworks.web.client.place.ComingSoon;
import org.sagebionetworks.web.client.place.DataAccessApprovalTokenPlace;
import org.sagebionetworks.web.client.place.DataAccessManagementPlace;
Expand Down Expand Up @@ -883,6 +884,23 @@ public void onSuccess() {
presenter.start(panel, eventBus);
}

@Override
public void onFailure(Throwable caught) {
loadError(caught);
}
}
);
} else if (place instanceof ChatPlace) {
GWT.runAsync(
ChatPlace.class,
new RunAsyncCallback() {
@Override
public void onSuccess() {
ChatPresenter presenter = ginjector.getChatPresenter();
presenter.setPlace((ChatPlace) place);
presenter.start(panel, eventBus);
}

@Override
public void onFailure(Throwable caught) {
loadError(caught);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.sagebionetworks.web.client.presenter;

import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.inject.Inject;
import org.sagebionetworks.web.client.place.ChatPlace;
import org.sagebionetworks.web.client.view.ChatView;

public class ChatPresenter
extends AbstractActivity
implements Presenter<ChatPlace> {

private ChatPlace place;
private ChatView view;

@Inject
public ChatPresenter(ChatView view) {
this.view = view;
view.scrollToTop();
}

@Override
public void start(AcceptsOneWidget panel, EventBus eventBus) {
// Install the view
panel.setWidget(view);
}

@Override
public void setPlace(ChatPlace place) {
this.place = place;
String initialMessage = place.getParam(ChatPlace.INITIAL_MESSAGE);
String agentId = place.getParam(ChatPlace.AGENT_ID);
String chatbotName = place.getParam(ChatPlace.CHATBOT_NAME);

view.render(initialMessage, agentId, chatbotName);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.sagebionetworks.web.client.view;

import com.google.gwt.user.client.ui.IsWidget;

public interface ChatView extends IsWidget {
void render(String initMessage, String agentId, String chatbotName);
void scrollToTop();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package org.sagebionetworks.web.client.view;

import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.inject.Inject;
import org.sagebionetworks.web.client.GlobalApplicationState;
import org.sagebionetworks.web.client.context.SynapseReactClientFullContextPropsProvider;
import org.sagebionetworks.web.client.jsinterop.React;
import org.sagebionetworks.web.client.jsinterop.ReactElement;
import org.sagebionetworks.web.client.jsinterop.SRC;
import org.sagebionetworks.web.client.jsinterop.SynapseChatProps;
import org.sagebionetworks.web.client.jsinterop.SynapseHomepageV2Props;
import org.sagebionetworks.web.client.widget.ReactComponent;
import org.sagebionetworks.web.client.widget.header.Header;

public class ChatViewImpl extends Composite implements ChatView {

ReactComponent container;

private Header headerWidget;
private SynapseReactClientFullContextPropsProvider propsProvider;
private GlobalApplicationState globalAppState;

@Inject
public ChatViewImpl(
Header headerWidget,
final SynapseReactClientFullContextPropsProvider propsProvider,
GlobalApplicationState globalAppState
) {
this.headerWidget = headerWidget;
this.propsProvider = propsProvider;
this.globalAppState = globalAppState;
headerWidget.configure();
container = new ReactComponent();
initWidget(container);
}

@Override
public void render(String initMessage, String agentId, String chatbotName) {
headerWidget.configure();
headerWidget.refresh();
scrollToTop();
SynapseChatProps props = SynapseChatProps.create(
initMessage,
agentId,
chatbotName
);
ReactElement component = React.createElementWithSynapseContext(
SRC.SynapseComponents.SynapseChat,
props,
propsProvider.getJsInteropContextProps()
);

container.render(component);
}

@Override
public void scrollToTop() {
Window.scrollTo(0, 0);
}
}

0 comments on commit ef5c163

Please sign in to comment.