openreplay/frontend/app/components/Client/Integrations/Integrations.tsx
Shekar Siri 0c0dd30a73
Preferences - UI and API improvements (#654)
* fix(tracker): fix assist typings

* fix(tracker): fix assist typings

* change(ui) - preferences - removed old

* change(ui) - preferences - wip

* change(ui) - preferences - list

* change(ui) - right box mardings

* change(ui) - preferences - integration item paddings

* change(ui) - preferences - integration icons

* change(ui) - preferences - integration icons

* change(ui) - preferences - integration - check status

* change(ui) - preferences - integration - check status

* change(ui) - preferences - metadata - move the delete button inside the modal

* change(ui) - preferences - webhooks - modal and delete btn changes

* change(ui) - preferences - modalContext updates

* change(ui) - input field forward refs

* change(ui) - metadata - modal

* change(ui) - metadata - set deleting item to null

* change(ui) - integrations

* change(ui) - hoc withcopy

* change(ui) - projects

* change(ui) - users list modal

* change(ui) - projects remove border for the last

* change(ui) - integrations new api changes

* change(ui) - github and jira changes

* change(ui) - github and jira changes

Co-authored-by: sylenien <nikita@openreplay.com>
2022-08-04 12:21:25 +02:00

166 lines
7.3 KiB
TypeScript

import { useModal } from 'App/components/Modal';
import React, { useEffect } from 'react';
import BugsnagForm from './BugsnagForm';
import CloudwatchForm from './CloudwatchForm';
import DatadogForm from './DatadogForm';
import ElasticsearchForm from './ElasticsearchForm';
import GithubForm from './GithubForm';
import IntegrationItem from './IntegrationItem';
import JiraForm from './JiraForm';
import NewrelicForm from './NewrelicForm';
import RollbarForm from './RollbarForm';
import SentryForm from './SentryForm';
import SlackForm from './SlackForm';
import StackdriverForm from './StackdriverForm';
import SumoLogicForm from './SumoLogicForm';
import { fetch, init } from 'Duck/integrations/actions';
import { fetchIntegrationList, setSiteId } from 'Duck/integrations/integrations';
import { connect } from 'react-redux';
import SiteDropdown from 'Shared/SiteDropdown';
import ReduxDoc from './ReduxDoc';
import VueDoc from './VueDoc';
import GraphQLDoc from './GraphQLDoc';
import NgRxDoc from './NgRxDoc';
import MobxDoc from './MobxDoc';
import FetchDoc from './FetchDoc';
import ProfilerDoc from './ProfilerDoc';
import AxiosDoc from './AxiosDoc';
import AssistDoc from './AssistDoc';
interface Props {
fetch: (name: string, siteId: string) => void;
init: () => void;
fetchIntegrationList: (siteId: any) => void;
integratedList: any;
initialSiteId: string;
setSiteId: (siteId: string) => void;
siteId: string;
}
function Integrations(props: Props) {
const { initialSiteId } = props;
const { showModal } = useModal();
const [loading, setLoading] = React.useState(true);
const [integratedList, setIntegratedList] = React.useState([]);
// const [siteId, setSiteId] = React.useState(props.siteId || initialSiteId);
useEffect(() => {
const list = props.integratedList.filter((item: any) => item.integrated).map((item: any) => item.name);
setIntegratedList(list);
}, [props.integratedList]);
useEffect(() => {
if (!props.siteId) {
props.setSiteId(initialSiteId);
props.fetchIntegrationList(initialSiteId);
} else {
props.fetchIntegrationList(props.siteId);
}
}, []);
useEffect(() => {
if (loading) {
return;
}
}, [loading]);
const onClick = (integration: any) => {
if (integration.slug) {
props.fetch(integration.slug, props.siteId);
}
showModal(integration.component, { right: true });
};
const onChangeSelect = ({ value }: any) => {
props.setSiteId(value.value);
props.fetchIntegrationList(value.value);
};
return (
<div className="mb-4">
{integrations.map((cat: any) => (
<div className="mb-2 border-b last:border-none py-3">
<div className="flex items-center">
<h2 className="font-medium text-lg">{cat.title}</h2>
{cat.isProject && (
<div className="flex flex-wrap ml-4">
<SiteDropdown value={props.siteId} onChange={onChangeSelect} />
</div>
)}
</div>
<div className="">{cat.description}</div>
<div className="flex flex-wrap mt-4">
{cat.integrations.map((integration: any) => (
<IntegrationItem
integrated={integratedList.includes(integration.slug)}
key={integration.name}
integration={integration}
onClick={() => onClick(integration)}
hide={(integration.slug === 'github' && integratedList.includes('jira') || integration.slug === 'jira' && integratedList.includes('github'))}
/>
))}
</div>
</div>
))}
</div>
);
}
export default connect(
(state: any) => ({
initialSiteId: state.getIn(['site', 'siteId']),
integratedList: state.getIn(['integrations', 'list']),
siteId: state.getIn(['integrations', 'siteId']),
}),
{ fetch, init, fetchIntegrationList, setSiteId }
)(Integrations);
const integrations = [
{
title: 'Issue Reporting and Collaborations',
description: 'Seamlessly report issues or share issues with your team right from OpenReplay.',
integrations: [
{ title: 'Jira', slug: 'jira', category: 'Errors', icon: 'integrations/jira', component: <JiraForm /> },
{ title: 'Github', slug: 'github', category: 'Errors', icon: 'integrations/github', component: <GithubForm /> },
{ title: 'Slack', category: 'Errors', icon: 'integrations/slack', component: <SlackForm /> },
],
},
{
title: 'Backend Logging',
isProject: true,
description: 'Sync your backend errors with sessions replays and see what happened front-to-back.',
integrations: [
{ title: 'Sentry', slug: 'sentry', icon: 'integrations/sentry', component: <SentryForm /> },
{ title: 'Datadog', slug: 'datadog', icon: 'integrations/datadog', component: <BugsnagForm /> },
{ title: 'Rollbar', slug: 'rollbar', icon: 'integrations/rollbar', component: <RollbarForm /> },
{ title: 'Elasticsearch', slug: 'elasticsearch', icon: 'integrations/elasticsearch', component: <ElasticsearchForm /> },
{ title: 'Datadog', slug: 'datadog', icon: 'integrations/datadog', component: <DatadogForm /> },
{ title: 'Sumo Logic', slug: 'sumologic', icon: 'integrations/sumologic', component: <SumoLogicForm /> },
{
title: 'Google Cloud',
slug: 'stackdriver',
subtitle: '(Stackdriver)',
icon: 'integrations/google-cloud',
component: <StackdriverForm />,
},
{ title: 'AWS', slug: 'cloudwatch', subtitle: '(CloudWatch)', icon: 'integrations/aws', component: <CloudwatchForm /> },
{ title: 'Newrelic', slug: 'newrelic', icon: 'integrations/newrelic', component: <NewrelicForm /> },
],
},
{
title: 'Plugins',
description:
"Reproduce issues as if they happened in your own browser. Plugins help capture your application's store, HTTP requeets, GraphQL queries, and more.",
integrations: [
{ title: 'Redux', slug: '', icon: 'integrations/redux', component: <ReduxDoc /> },
{ title: 'VueX', slug: '', icon: 'integrations/vuejs', component: <VueDoc /> },
{ title: 'GraphQL', slug: '', icon: 'integrations/graphql', component: <GraphQLDoc /> },
{ title: 'NgRx', slug: '', icon: 'integrations/ngrx', component: <NgRxDoc /> },
{ title: 'MobX', slug: '', icon: 'integrations/mobx', component: <MobxDoc /> },
{ title: 'Fetch', slug: '', icon: 'integrations/openreplay', component: <FetchDoc /> },
{ title: 'Profiler', slug: '', icon: 'integrations/openreplay', component: <ProfilerDoc /> },
{ title: 'Axios', slug: '', icon: 'integrations/openreplay', component: <AxiosDoc /> },
{ title: 'Assist', slug: '', icon: 'integrations/openreplay', component: <AssistDoc /> },
],
},
];