-
Datadog
-
-
How to integrate Datadog with OpenReplay and see backend errors alongside session recordings.
-
-
-
+
+
+
+
How it works?
+
+ - Generate Datadog API Key & Application Key
+ - Enter the API key below
+ - Propagate openReplaySessionToken
+
+
+
+
);
DatadogForm.displayName = 'DatadogForm';
diff --git a/frontend/app/components/Client/Integrations/ElasticsearchForm.js b/frontend/app/components/Client/Integrations/ElasticsearchForm.js
index ad33b6302..2c30cea47 100644
--- a/frontend/app/components/Client/Integrations/ElasticsearchForm.js
+++ b/frontend/app/components/Client/Integrations/ElasticsearchForm.js
@@ -4,85 +4,94 @@ import IntegrationForm from './IntegrationForm';
import { withRequest } from 'HOCs';
import { edit } from 'Duck/integrations/actions';
import DocLink from 'Shared/DocLink/DocLink';
+import IntegrationModalCard from 'Components/Client/Integrations/IntegrationModalCard';
@connect(
- (state) => ({
- config: state.getIn(['elasticsearch', 'instance']),
- }),
- { edit }
+ (state) => ({
+ config: state.getIn(['elasticsearch', 'instance'])
+ }),
+ { edit }
)
@withRequest({
- dataName: 'isValid',
- initialData: false,
- dataWrapper: (data) => data.state,
- requestName: 'validateConfig',
- endpoint: '/integrations/elasticsearch/test',
- method: 'POST',
+ dataName: 'isValid',
+ initialData: false,
+ dataWrapper: (data) => data.state,
+ requestName: 'validateConfig',
+ endpoint: '/integrations/elasticsearch/test',
+ method: 'POST'
})
export default class ElasticsearchForm extends React.PureComponent {
- componentWillReceiveProps(newProps) {
- const {
- config: { host, port, apiKeyId, apiKey },
- } = this.props;
- const { loading, config } = newProps;
- const valuesChanged = host !== config.host || port !== config.port || apiKeyId !== config.apiKeyId || apiKey !== config.apiKey;
- if (!loading && valuesChanged && newProps.config.validateKeys() && newProps) {
- this.validateConfig(newProps);
- }
+ componentWillReceiveProps(newProps) {
+ const {
+ config: { host, port, apiKeyId, apiKey }
+ } = this.props;
+ const { loading, config } = newProps;
+ const valuesChanged = host !== config.host || port !== config.port || apiKeyId !== config.apiKeyId || apiKey !== config.apiKey;
+ if (!loading && valuesChanged && newProps.config.validateKeys() && newProps) {
+ this.validateConfig(newProps);
}
+ }
- validateConfig = (newProps) => {
- const { config } = newProps;
- this.props
- .validateConfig({
- host: config.host,
- port: config.port,
- apiKeyId: config.apiKeyId,
- apiKey: config.apiKey,
- })
- .then((res) => {
- const { isValid } = this.props;
- this.props.edit('elasticsearch', { isValid: isValid });
- });
- };
+ validateConfig = (newProps) => {
+ const { config } = newProps;
+ this.props
+ .validateConfig({
+ host: config.host,
+ port: config.port,
+ apiKeyId: config.apiKeyId,
+ apiKey: config.apiKey
+ })
+ .then((res) => {
+ const { isValid } = this.props;
+ this.props.edit('elasticsearch', { isValid: isValid });
+ });
+ };
- render() {
- const props = this.props;
- return (
-
-
Elasticsearch
-
-
How to integrate Elasticsearch with OpenReplay and see backend errors alongside session recordings.
-
-
-
-
- );
- }
+ render() {
+ const props = this.props;
+ return (
+
+
+
+
+
How it works?
+
+ - Create a new Elastic API key
+ - Enter the API key below
+ - Propagate openReplaySessionToken
+
+
+
+
+
+ );
+ }
}
diff --git a/frontend/app/components/Client/Integrations/GithubForm.js b/frontend/app/components/Client/Integrations/GithubForm.js
index 7d140732b..b54343c5f 100644
--- a/frontend/app/components/Client/Integrations/GithubForm.js
+++ b/frontend/app/components/Client/Integrations/GithubForm.js
@@ -1,29 +1,31 @@
import React from 'react';
import IntegrationForm from './IntegrationForm';
import DocLink from 'Shared/DocLink/DocLink';
+import IntegrationModalCard from 'Components/Client/Integrations/IntegrationModalCard';
const GithubForm = (props) => (
-
-
Github
-
-
Integrate GitHub with OpenReplay and create issues directly from the recording page.
-
-
-
-
-
+
+
+
+
Integrate GitHub with OpenReplay and create issues directly from the recording page.
+
+
+
+
+
);
GithubForm.displayName = 'GithubForm';
diff --git a/frontend/app/components/Client/Integrations/IntegrationItem.tsx b/frontend/app/components/Client/Integrations/IntegrationItem.tsx
index cd8b5f005..27f518c5c 100644
--- a/frontend/app/components/Client/Integrations/IntegrationItem.tsx
+++ b/frontend/app/components/Client/Integrations/IntegrationItem.tsx
@@ -15,14 +15,17 @@ const IntegrationItem = (props: Props) => {
const { integration, integrated, hide = false } = props;
return hide ? <>> : (
props.onClick(e)}
style={{ height: '126px' }}
>
- {integration.icon.length ?
-

:
- (
{integration.header})}
+ {/*{integration.icon.length ?*/}
+ {/*

:*/}
+ {/* (
{integration.header})}*/}
+
+

+
{integration.title}
{integration.subtitle && integration.subtitle}
diff --git a/frontend/app/components/Client/Integrations/IntegrationModalCard.tsx b/frontend/app/components/Client/Integrations/IntegrationModalCard.tsx
new file mode 100644
index 000000000..4864b092b
--- /dev/null
+++ b/frontend/app/components/Client/Integrations/IntegrationModalCard.tsx
@@ -0,0 +1,26 @@
+import React from 'react';
+import { Icon } from 'UI';
+import DocLink from 'Shared/DocLink';
+
+interface Props {
+ title: string;
+ icon: string;
+ description: string;
+}
+
+function IntegrationModalCard(props: Props) {
+ const { title, icon, description } = props;
+ return (
+
+
+

+
+
+
{title}
+
{description}
+
+
+ );
+}
+
+export default IntegrationModalCard;
\ No newline at end of file
diff --git a/frontend/app/components/Client/Integrations/Integrations.tsx b/frontend/app/components/Client/Integrations/Integrations.tsx
index 444c77da3..1c6d0f58a 100644
--- a/frontend/app/components/Client/Integrations/Integrations.tsx
+++ b/frontend/app/components/Client/Integrations/Integrations.tsx
@@ -251,7 +251,7 @@ const integrations = [
component:
},
{
- title: 'Stackdriver',
+ title: 'Google Cloud',
subtitle: 'Integrate Google Cloud to view backend logs and errors in conjunction with session replay',
slug: 'stackdriver',
icon: 'integrations/google-cloud',
diff --git a/frontend/app/components/Client/Integrations/JiraForm/JiraForm.js b/frontend/app/components/Client/Integrations/JiraForm/JiraForm.js
index 906794155..c417f0626 100644
--- a/frontend/app/components/Client/Integrations/JiraForm/JiraForm.js
+++ b/frontend/app/components/Client/Integrations/JiraForm/JiraForm.js
@@ -2,43 +2,55 @@ import React from 'react';
import IntegrationForm from '../IntegrationForm';
import DocLink from 'Shared/DocLink/DocLink';
import { useModal } from 'App/components/Modal';
+import { Icon } from 'UI';
+import IntegrationModalCard from 'Components/Client/Integrations/IntegrationModalCard';
const JiraForm = (props) => {
- const { hideModal } = useModal();
- return (
-
-
Jira
-
-
How to integrate Jira Cloud with OpenReplay.
-
-
-
-
-
+ const { hideModal } = useModal();
+ return (
+
+
+
+
+
+
How it works?
+
+ - Create a new API token
+ - Enter the token below
+
+
+
- )
+
+
+
+
+
+ );
};
JiraForm.displayName = 'JiraForm';
diff --git a/frontend/app/components/Client/Integrations/NewrelicForm/NewrelicForm.js b/frontend/app/components/Client/Integrations/NewrelicForm/NewrelicForm.js
index 670656583..3d3d829b1 100644
--- a/frontend/app/components/Client/Integrations/NewrelicForm/NewrelicForm.js
+++ b/frontend/app/components/Client/Integrations/NewrelicForm/NewrelicForm.js
@@ -1,34 +1,41 @@
import React from 'react';
import IntegrationForm from '../IntegrationForm';
import DocLink from 'Shared/DocLink/DocLink';
+import IntegrationModalCard from 'Components/Client/Integrations/IntegrationModalCard';
const NewrelicForm = (props) => (
-
-
New Relic
-
-
How to integrate NewRelic with OpenReplay and see backend errors alongside session recordings.
-
-
-
+
+
+
+
How it works?
+
+ - Create Query Key
+ - Enter the details below
+ - Propagate openReplaySessionToken
+
+
+
+
);
NewrelicForm.displayName = 'NewrelicForm';
diff --git a/frontend/app/components/Client/Integrations/RollbarForm.js b/frontend/app/components/Client/Integrations/RollbarForm.js
index 441819323..624ec9bf2 100644
--- a/frontend/app/components/Client/Integrations/RollbarForm.js
+++ b/frontend/app/components/Client/Integrations/RollbarForm.js
@@ -1,25 +1,32 @@
import React from 'react';
import IntegrationForm from './IntegrationForm';
import DocLink from 'Shared/DocLink/DocLink';
+import IntegrationModalCard from 'Components/Client/Integrations/IntegrationModalCard';
const RollbarForm = (props) => (
-
-
Rollbar
-
-
How to integrate Rollbar with OpenReplay and see backend errors alongside session replays.
-
-
-
+
+
+
+
How it works?
+
+ - Create Rollbar Access Tokens
+ - Enter the token below
+ - Propagate openReplaySessionToken
+
+
+
+
);
RollbarForm.displayName = 'RollbarForm';
diff --git a/frontend/app/components/Client/Integrations/SentryForm.js b/frontend/app/components/Client/Integrations/SentryForm.js
index bd119ba31..506aec48c 100644
--- a/frontend/app/components/Client/Integrations/SentryForm.js
+++ b/frontend/app/components/Client/Integrations/SentryForm.js
@@ -1,33 +1,40 @@
import React from 'react';
import IntegrationForm from './IntegrationForm';
import DocLink from 'Shared/DocLink/DocLink';
+import IntegrationModalCard from 'Components/Client/Integrations/IntegrationModalCard';
const SentryForm = (props) => (
-
-
Sentry
-
-
How to integrate Sentry with OpenReplay and see backend errors alongside session recordings.
-
-
-
+
+
+
+
How it works?
+
+ - Generate Sentry Auth Token
+ - Enter the token below
+ - Propagate openReplaySessionToken
+
+
+
+
);
SentryForm.displayName = 'SentryForm';
diff --git a/frontend/app/components/Client/Integrations/StackdriverForm.js b/frontend/app/components/Client/Integrations/StackdriverForm.js
index ce137bd99..92935e67b 100644
--- a/frontend/app/components/Client/Integrations/StackdriverForm.js
+++ b/frontend/app/components/Client/Integrations/StackdriverForm.js
@@ -1,30 +1,38 @@
import React from 'react';
import IntegrationForm from './IntegrationForm';
import DocLink from 'Shared/DocLink/DocLink';
+import IntegrationModalCard from 'Components/Client/Integrations/IntegrationModalCard';
const StackdriverForm = (props) => (
-
-
Stackdriver
-
-
How to integrate Stackdriver with OpenReplay and see backend errors alongside session recordings.
-
-
-
+
+
+
+
How it works?
+
+ - Create Google Cloud Service Account
+ - Enter the details below
+ - Propagate openReplaySessionToken
+
+
+
+
);
StackdriverForm.displayName = 'StackdriverForm';
diff --git a/frontend/app/components/Client/Integrations/SumoLogicForm/SumoLogicForm.js b/frontend/app/components/Client/Integrations/SumoLogicForm/SumoLogicForm.js
index 6aea9fe6e..af72ccbcf 100644
--- a/frontend/app/components/Client/Integrations/SumoLogicForm/SumoLogicForm.js
+++ b/frontend/app/components/Client/Integrations/SumoLogicForm/SumoLogicForm.js
@@ -2,34 +2,41 @@ import React from 'react';
import IntegrationForm from '../IntegrationForm';
import RegionDropdown from './RegionDropdown';
import DocLink from 'Shared/DocLink/DocLink';
+import IntegrationModalCard from 'Components/Client/Integrations/IntegrationModalCard';
const SumoLogicForm = (props) => (
-
-
Sumologic
-
-
How to integrate SumoLogic with OpenReplay and see backend errors alongside session recordings.
-
-
-
+
+
+
+
How it works?
+
+ - Create a new Access ID and Access Key
+ - Enter the details below
+ - Propagate openReplaySessionToken
+
+
+
+
);
SumoLogicForm.displayName = 'SumoLogicForm';
diff --git a/frontend/app/components/shared/DocLink/DocLink.js b/frontend/app/components/shared/DocLink/DocLink.js
index 004f154ef..3647e79e5 100644
--- a/frontend/app/components/shared/DocLink/DocLink.js
+++ b/frontend/app/components/shared/DocLink/DocLink.js
@@ -8,7 +8,7 @@ export default function DocLink({ className = '', url, label }) {
return (
-