From 69c895e47ab4d7073f60721ad98bcddb7cde691a Mon Sep 17 00:00:00 2001 From: Jay Hodgson Date: Tue, 10 Sep 2024 16:08:16 -0700 Subject: [PATCH 1/3] PORTALS-3204: add new Chat place (parameterized token) --- .../web/client/PortalGinInjector.java | 2 + .../web/client/PortalGinModule.java | 2 +- .../web/client/jsinterop/SRC.java | 1 + .../client/jsinterop/SynapseChatProps.java | 38 ++++++++++++ .../web/client/mvp/AppPlaceHistoryMapper.java | 2 + .../web/client/place/ChatPlace.java | 29 +++++++++ .../client/presenter/BulkPresenterProxy.java | 18 ++++++ .../web/client/presenter/ChatPresenter.java | 38 ++++++++++++ .../web/client/view/ChatView.java | 8 +++ .../web/client/view/ChatViewImpl.java | 61 +++++++++++++++++++ 10 files changed, 198 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/sagebionetworks/web/client/jsinterop/SynapseChatProps.java create mode 100644 src/main/java/org/sagebionetworks/web/client/place/ChatPlace.java create mode 100644 src/main/java/org/sagebionetworks/web/client/presenter/ChatPresenter.java create mode 100644 src/main/java/org/sagebionetworks/web/client/view/ChatView.java create mode 100644 src/main/java/org/sagebionetworks/web/client/view/ChatViewImpl.java diff --git a/src/main/java/org/sagebionetworks/web/client/PortalGinInjector.java b/src/main/java/org/sagebionetworks/web/client/PortalGinInjector.java index e57ee108be..97710e2899 100644 --- a/src/main/java/org/sagebionetworks/web/client/PortalGinInjector.java +++ b/src/main/java/org/sagebionetworks/web/client/PortalGinInjector.java @@ -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; @@ -896,4 +897,5 @@ public interface PortalGinInjector extends Ginjector { FeatureFlagConfig getFeatureFlagConfig(); TrustCenterPresenter getTrustCenterPresenter(); + ChatPresenter getChatPresenter(); } diff --git a/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java b/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java index 0939cf9b8f..ccfa831e0f 100644 --- a/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java +++ b/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java @@ -967,7 +967,7 @@ protected void configure() { .in(Singleton.class); bind(IntendedDataUseReportWidgetView.class) .to(IntendedDataUseReportWidgetViewImpl.class); - bind(DialogView.class).to(Dialog.class); + bind(ChatView.class).to(ChatViewImpl.class); bind(FollowingPageView.class) .to(FollowingPageViewImpl.class) diff --git a/src/main/java/org/sagebionetworks/web/client/jsinterop/SRC.java b/src/main/java/org/sagebionetworks/web/client/jsinterop/SRC.java index 7cfa47f90d..ca4ba15b6d 100644 --- a/src/main/java/org/sagebionetworks/web/client/jsinterop/SRC.java +++ b/src/main/java/org/sagebionetworks/web/client/jsinterop/SRC.java @@ -121,6 +121,7 @@ public static class SynapseComponents { public static ReactComponentType< EntityAclEditorModalProps > EntityAclEditorModal; + public static ReactComponentType SynapseChat; /** * Pushes a global toast message. In SWC, you should use {@link DisplayUtils#notify}, rather than calling this method directly. diff --git a/src/main/java/org/sagebionetworks/web/client/jsinterop/SynapseChatProps.java b/src/main/java/org/sagebionetworks/web/client/jsinterop/SynapseChatProps.java new file mode 100644 index 0000000000..e535cc0df1 --- /dev/null +++ b/src/main/java/org/sagebionetworks/web/client/jsinterop/SynapseChatProps.java @@ -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; + } +} diff --git a/src/main/java/org/sagebionetworks/web/client/mvp/AppPlaceHistoryMapper.java b/src/main/java/org/sagebionetworks/web/client/mvp/AppPlaceHistoryMapper.java index 1ab260ec92..c7094effbd 100644 --- a/src/main/java/org/sagebionetworks/web/client/mvp/AppPlaceHistoryMapper.java +++ b/src/main/java/org/sagebionetworks/web/client/mvp/AppPlaceHistoryMapper.java @@ -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; @@ -98,6 +99,7 @@ TwoFactorAuthPlace.Tokenizer.class, FollowingPlace.Tokenizer.class, TrustCenterPlace.Tokenizer.class, + ChatPlace.Tokenizer.class, } ) public interface AppPlaceHistoryMapper extends PlaceHistoryMapper {} diff --git a/src/main/java/org/sagebionetworks/web/client/place/ChatPlace.java b/src/main/java/org/sagebionetworks/web/client/place/ChatPlace.java new file mode 100644 index 0000000000..ac1bd87f49 --- /dev/null +++ b/src/main/java/org/sagebionetworks/web/client/place/ChatPlace.java @@ -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 = "initalMessage"; + 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 { + + @Override + public String getToken(ChatPlace place) { + return place.toToken(); + } + + @Override + public ChatPlace getPlace(String token) { + return new ChatPlace(token); + } + } +} diff --git a/src/main/java/org/sagebionetworks/web/client/presenter/BulkPresenterProxy.java b/src/main/java/org/sagebionetworks/web/client/presenter/BulkPresenterProxy.java index 0da422e2da..ea0c09f7ef 100644 --- a/src/main/java/org/sagebionetworks/web/client/presenter/BulkPresenterProxy.java +++ b/src/main/java/org/sagebionetworks/web/client/presenter/BulkPresenterProxy.java @@ -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; @@ -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); diff --git a/src/main/java/org/sagebionetworks/web/client/presenter/ChatPresenter.java b/src/main/java/org/sagebionetworks/web/client/presenter/ChatPresenter.java new file mode 100644 index 0000000000..f65b10c396 --- /dev/null +++ b/src/main/java/org/sagebionetworks/web/client/presenter/ChatPresenter.java @@ -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 { + + 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); + } +} diff --git a/src/main/java/org/sagebionetworks/web/client/view/ChatView.java b/src/main/java/org/sagebionetworks/web/client/view/ChatView.java new file mode 100644 index 0000000000..6b54f3b085 --- /dev/null +++ b/src/main/java/org/sagebionetworks/web/client/view/ChatView.java @@ -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(); +} diff --git a/src/main/java/org/sagebionetworks/web/client/view/ChatViewImpl.java b/src/main/java/org/sagebionetworks/web/client/view/ChatViewImpl.java new file mode 100644 index 0000000000..2159a6bedd --- /dev/null +++ b/src/main/java/org/sagebionetworks/web/client/view/ChatViewImpl.java @@ -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); + } +} From 5a507fce872e875a7391824d0e8b1d84339dcd68 Mon Sep 17 00:00:00 2001 From: Jay Hodgson Date: Tue, 10 Sep 2024 16:30:47 -0700 Subject: [PATCH 2/3] add accidental deletion --- .../java/org/sagebionetworks/web/client/PortalGinModule.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java b/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java index ccfa831e0f..7df3908a9d 100644 --- a/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java +++ b/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java @@ -967,6 +967,7 @@ protected void configure() { .in(Singleton.class); bind(IntendedDataUseReportWidgetView.class) .to(IntendedDataUseReportWidgetViewImpl.class); + bind(DialogView.class).to(Dialog.class); bind(ChatView.class).to(ChatViewImpl.class); bind(FollowingPageView.class) From a285fa0f52230c3cc4ca8f2a403bca2f96fe59ad Mon Sep 17 00:00:00 2001 From: Jay Hodgson Date: Wed, 11 Sep 2024 07:32:13 -0700 Subject: [PATCH 3/3] Update src/main/java/org/sagebionetworks/web/client/place/ChatPlace.java Co-authored-by: Nick Grosenbacher --- .../java/org/sagebionetworks/web/client/place/ChatPlace.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/sagebionetworks/web/client/place/ChatPlace.java b/src/main/java/org/sagebionetworks/web/client/place/ChatPlace.java index ac1bd87f49..05c5d575e7 100644 --- a/src/main/java/org/sagebionetworks/web/client/place/ChatPlace.java +++ b/src/main/java/org/sagebionetworks/web/client/place/ChatPlace.java @@ -5,7 +5,7 @@ public class ChatPlace extends ParameterizedPlace { - public static final String INITIAL_MESSAGE = "initalMessage"; + public static final String INITIAL_MESSAGE = "initialMessage"; public static final String AGENT_ID = "agentId"; public static final String CHATBOT_NAME = "chatbotName";