diff --git a/frontend/app/components/Client/Integrations/BugsnagForm/BugsnagForm.js b/frontend/app/components/Client/Integrations/BugsnagForm/BugsnagForm.js index 15d8ddef1..f58154f91 100644 --- a/frontend/app/components/Client/Integrations/BugsnagForm/BugsnagForm.js +++ b/frontend/app/components/Client/Integrations/BugsnagForm/BugsnagForm.js @@ -3,31 +3,39 @@ import { tokenRE } from 'Types/integrations/bugsnagConfig'; import IntegrationForm from '../IntegrationForm'; import ProjectListDropdown from './ProjectListDropdown'; import DocLink from 'Shared/DocLink/DocLink'; +import IntegrationModalCard from 'Components/Client/Integrations/IntegrationModalCard'; const BugsnagForm = (props) => ( -
-

Bugsnag

-
-
How to integrate Bugsnag with OpenReplay and see backend errors alongside session recordings.
- -
- tokenRE.test(config.authorizationToken), - component: ProjectListDropdown, - }, - ]} - /> +
+ + +
+
How it works?
+
    +
  1. Generate Bugsnag Auth Token
  2. +
  3. Enter the token below
  4. +
  5. Propagate openReplaySessionToken
  6. +
+
+ tokenRE.test(config.authorizationToken), + component: ProjectListDropdown + } + ]} + /> +
); BugsnagForm.displayName = 'BugsnagForm'; diff --git a/frontend/app/components/Client/Integrations/CloudwatchForm/CloudwatchForm.js b/frontend/app/components/Client/Integrations/CloudwatchForm/CloudwatchForm.js index bd9604b01..ca4e6ae3b 100644 --- a/frontend/app/components/Client/Integrations/CloudwatchForm/CloudwatchForm.js +++ b/frontend/app/components/Client/Integrations/CloudwatchForm/CloudwatchForm.js @@ -4,43 +4,51 @@ import IntegrationForm from '../IntegrationForm'; import LogGroupDropdown from './LogGroupDropdown'; import RegionDropdown from './RegionDropdown'; import DocLink from 'Shared/DocLink/DocLink'; +import IntegrationModalCard from 'Components/Client/Integrations/IntegrationModalCard'; const CloudwatchForm = (props) => ( -
-

Cloud Watch

-
-
How to integrate CloudWatch with OpenReplay and see backend errors alongside session replays.
- -
- - config.awsSecretAccessKey.length === SECRET_ACCESS_KEY_LENGTH && - config.region !== '' && - config.awsAccessKeyId.length === ACCESS_KEY_ID_LENGTH, - }, - ]} - /> +
+ +
+
How it works?
+
    +
  1. Create a Service Account
  2. +
  3. Enter the details below
  4. +
  5. Propagate openReplaySessionToken
  6. +
+
+ + config.awsSecretAccessKey.length === SECRET_ACCESS_KEY_LENGTH && + config.region !== '' && + config.awsAccessKeyId.length === ACCESS_KEY_ID_LENGTH + } + ]} + /> +
); CloudwatchForm.displayName = 'CloudwatchForm'; diff --git a/frontend/app/components/Client/Integrations/DatadogForm.js b/frontend/app/components/Client/Integrations/DatadogForm.js index 46360259c..0835d135e 100644 --- a/frontend/app/components/Client/Integrations/DatadogForm.js +++ b/frontend/app/components/Client/Integrations/DatadogForm.js @@ -1,30 +1,37 @@ import React from 'react'; import IntegrationForm from './IntegrationForm'; import DocLink from 'Shared/DocLink/DocLink'; +import IntegrationModalCard from 'Components/Client/Integrations/IntegrationModalCard'; const DatadogForm = (props) => ( -
-

Datadog

-
-
How to integrate Datadog with OpenReplay and see backend errors alongside session recordings.
- -
- +
+ +
+
How it works?
+
    +
  1. Generate Datadog API Key & Application Key
  2. +
  3. Enter the API key below
  4. +
  5. Propagate openReplaySessionToken
  6. +
+
+ +
); 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?
+
    +
  1. Create a new Elastic API key
  2. +
  3. Enter the API key below
  4. +
  5. Propagate openReplaySessionToken
  6. +
+ +
+ +
+ ); + } } 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 : - ({integration.header})} + {/*{integration.icon.length ?*/} + {/* integration :*/} + {/* ({integration.header})}*/} +
+ integration +

{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 ( +
+
+ integration +
+
+

{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?
+
    +
  1. Create a new API token
  2. +
  3. Enter the token below
  4. +
+
+
- ) +
+ + + +
+ ); }; 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?
+
    +
  1. Create Query Key
  2. +
  3. Enter the details below
  4. +
  5. Propagate openReplaySessionToken
  6. +
+
+ +
); 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?
+
    +
  1. Create Rollbar Access Tokens
  2. +
  3. Enter the token below
  4. +
  5. Propagate openReplaySessionToken
  6. +
+
+ +
); 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?
+
    +
  1. Generate Sentry Auth Token
  2. +
  3. Enter the token below
  4. +
  5. Propagate openReplaySessionToken
  6. +
+
+ +
); 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?
+
    +
  1. Create Google Cloud Service Account
  2. +
  3. Enter the details below
  4. +
  5. Propagate openReplaySessionToken
  6. +
+
+ +
); 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?
+
    +
  1. Create a new Access ID and Access Key
  2. +
  3. Enter the details below
  4. +
  5. Propagate openReplaySessionToken
  6. +
+
+ +
); 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 (
-