Skip to content

Commit

Permalink
chore: code cleanup & organization
Browse files Browse the repository at this point in the history
  • Loading branch information
cescoferraro committed May 5, 2022
1 parent 53c6151 commit b31a95b
Show file tree
Hide file tree
Showing 29 changed files with 460 additions and 369 deletions.
8 changes: 3 additions & 5 deletions web/src/components/Diagram/Diagram.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { ISpan } from '../../types/Span.types';
import { ITrace } from '../../types/Trace.types';
import {ISpan} from '../../types/Span.types';
import {ITrace} from '../../types/Trace.types';
import DAGComponent from './components/DAG';

export enum SupportedDiagrams {
Expand All @@ -17,10 +17,8 @@ const ComponentMap: Record<string, typeof DAGComponent> = {
[SupportedDiagrams.DAG]: DAGComponent,
};

const Diagram: React.FC<IDiagramProps> = ({type, ...props}) => {
export const Diagram: React.FC<IDiagramProps> = ({type, ...props}) => {
const Component = ComponentMap[type || ''] || DAGComponent;

return <Component type={type} {...props} />;
};

export default Diagram;
2 changes: 0 additions & 2 deletions web/src/components/Diagram/index.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import AssertionsResultTable from 'components/AssertionsTable/AssertionsTable';
import CreateAssertionModal from 'components/CreateAssertionModal';
import SkeletonTable from 'components/SkeletonTable';
import * as S from '../SpanDetail.styled';
import Attributes from '../../Trace/Attributes';
import {Attributes} from '../../Trace/TraceComponent/Attributes';
import TraceAnalyticsService from '../../../services/Analytics/TraceAnalytics.service';
import {useAppSelector} from '../../../redux/hooks';
import AssertionSelectors from '../../../selectors/Assertion.selectors';
Expand Down
181 changes: 32 additions & 149 deletions web/src/components/Trace/Trace.tsx
Original file line number Diff line number Diff line change
@@ -1,167 +1,50 @@
/* eslint-disable */
import React, {useCallback, useEffect, useState} from 'react';
import styled from 'styled-components';

import {useStoreActions} from 'react-flow-renderer';
import {isEmpty} from 'lodash';

import {Button, Typography} from 'antd';
import {CloseCircleFilled} from '@ant-design/icons';

import 'react-reflex/styles.css';

import {useGetResultByIdQuery, useGetTestByIdQuery, useRunTestMutation} from 'redux/apis/Test.api';
import Diagram from 'components/Diagram';
import React, {useState} from 'react';
import {useGetResultByIdQuery, useGetTestByIdQuery} from 'redux/apis/Test.api';

import {GuidedTours} from 'services/GuidedTour.service';
import useGuidedTour from 'hooks/useGuidedTour';
import * as S from './Trace.styled';
import {ISpan} from '../../types/Span.types';
import {ITestRunResult} from '../../types/TestRunResult.types';
import {TestState} from '../../constants/TestRunResult.constants';
import TraceAnalyticsService from '../../services/Analytics/TraceAnalytics.service';
import usePolling from '../../hooks/usePolling';
import {useAppDispatch} from '../../redux/hooks';
import {replace, updateTestResult} from '../../redux/slices/ResultList.slice';
import {SupportedDiagrams} from '../Diagram/Diagram';
import SpanDetail from '../SpanDetail';
import TraceTimeline from './TraceTimeline';
import {ResizableDrawer} from './ResizableDrawer';

const {onChangeTab} = TraceAnalyticsService;

const Grid = styled.div`
display: flex;
//height: calc(100vh - 200px);
//overflow-y: scroll;
`;
import {ITestRunResult} from 'types/TestRunResult.types';
import {useAppDispatch} from 'redux/hooks';
import {TestState} from 'constants/TestRunResult.constants';
import {TraceError} from 'components/Trace/TraceError/TraceError';
import {useGetResultByIdQueryPolling} from 'components/Trace/useGetResultByIdQueryPolling';
import {TraceComponent} from 'components/Trace/TraceComponent/TraceComponent';
import {useUpdateTestResultEffect} from 'components/Trace/useUpdateTestResultEffect';
import {useUpdateFirstLoadEffect} from 'components/Trace/useUpdateFirstLoadEffect';
import {visiblePortionFuction} from 'components/Trace/visiblePortionFuction';
import 'react-reflex/styles.css';

type TraceProps = {
interface TraceProps {
testId: string;
testResultId: string;

onDismissTrace(): void;

onRunTest(result: ITestRunResult): void;
};
}

const Trace: React.FC<TraceProps> = ({testId, testResultId, onDismissTrace, onRunTest}) => {
const [selectedSpan, setSelectedSpan] = useState<ISpan | undefined>();
export const Trace: React.FC<TraceProps> = ({testId, testResultId, onDismissTrace, onRunTest}): JSX.Element => {
const dispatch = useAppDispatch();
const {visiblePortion, height} = visiblePortionFuction();
const [isFirstLoad, setIsFirstLoad] = useState(true);
const {data: test} = useGetTestByIdQuery(testId);
const [runNewTest] = useRunTestMutation();
const dispatch = useAppDispatch();

const {
data: testResultDetails,
isError,
refetch: refetchTrace,
} = useGetResultByIdQuery({testId, resultId: testResultId});

const addSelected = useStoreActions(actions => actions.addSelectedElements);

const handleOnSpanSelected = useCallback(
(spanId: string) => {
addSelected([{id: spanId}]);
const span = testResultDetails?.trace?.spans.find(({spanId: id}) => id === spanId);
setSelectedSpan(span);
},
[addSelected, testResultDetails?.trace?.spans]
);

useGuidedTour(GuidedTours.Trace);
usePolling({
callback: refetchTrace,
delay: 1000,
isPolling:
isError ||
testResultDetails?.state === TestState.AWAITING_TRACE ||
testResultDetails?.state === TestState.EXECUTING,
});

useEffect(() => {
if (testResultDetails && test && !isFirstLoad) {
dispatch(
updateTestResult({
trace: testResultDetails.trace!,
resultId: testResultId,
test,
})
);
}
}, [test, dispatch]);

useEffect(() => {
if (testResultDetails && !isEmpty(testResultDetails.trace) && !testResultDetails?.assertionResult && test) {
setIsFirstLoad(false);
dispatch(
updateTestResult({
trace: testResultDetails.trace!,
resultId: testResultId,
test,
})
);
} else if (testResultDetails?.assertionResult && test) {
setIsFirstLoad(false);

dispatch(
replace({
resultId: testResultId,
assertionResult: testResultDetails?.assertionResult!,
test,
trace: testResultDetails?.trace!,
})
);
}
}, [testResultDetails, test, testResultId, testId, dispatch]);

const handleReRunTest = async () => {
const result = await runNewTest(testId).unwrap();
onRunTest(result);
};

if (isError || testResultDetails?.state === TestState.FAILED) {
return (
<S.FailedTrace>
<CloseCircleFilled style={{color: 'red', fontSize: 32}} />
<Typography.Title level={2}>Test Run Failed</Typography.Title>
<div style={{display: 'grid', gap: 8, gridTemplateColumns: '1fr 1fr'}}>
<Button onClick={handleReRunTest}>Rerun Test</Button>
<Button onClick={onDismissTrace}>Cancel</Button>
</div>
</S.FailedTrace>
);
}

const visiblePortion = 60;
const height = `calc(100% - ${visiblePortion}px)`;
const [max, setMax] = useState(600);
const query = useGetResultByIdQuery({testId, resultId: testResultId});
const displayError = query.isError || query.data?.state === TestState.FAILED;
useGetResultByIdQueryPolling(query.refetch, query.isError, query.data);
useUpdateTestResultEffect(query.data, test, isFirstLoad, dispatch, testResultId);
useUpdateFirstLoadEffect(query.data, test, setIsFirstLoad, dispatch, testResultId, testId);
return (
<>
<Grid style={{width: '100%', minHeight: height, maxHeight: height, height: height}}>
<div style={{flexBasis: '50%', paddingTop: 10, paddingLeft: 10}}>
<Diagram
type={SupportedDiagrams.DAG}
trace={testResultDetails?.trace!}
onSelectSpan={handleOnSpanSelected}
selectedSpan={selectedSpan}
/>
</div>
<div style={{flexBasis: '50%', overflowY: 'scroll', paddingTop: 10, paddingRight: 10}}>
<SpanDetail resultId={testResultDetails?.resultId} testId={test?.testId} span={selectedSpan} />
</div>
</Grid>
<ResizableDrawer min={visiblePortion} max={max}>
<TraceTimeline
min={visiblePortion}
max={max}
setMax={setMax}
visiblePortion={visiblePortion}
trace={testResultDetails?.trace!}
onSelectSpan={handleOnSpanSelected}
selectedSpan={selectedSpan}
/>
</ResizableDrawer>
<TraceError onRunTest={onRunTest} testId={testId} displayError={displayError} onDismissTrace={onDismissTrace} />
<TraceComponent
displayError={displayError}
minHeight={height}
testResultDetails={query.data}
test={test}
visiblePortion={visiblePortion}
/>
</>
);
};

export default Trace;
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import {Typography} from 'antd';
import SkeletonTable from 'components/SkeletonTable';
import {FC} from 'react';
import {ISpanFlatAttribute} from '../../types/Span.types';
import SpanAttributesTable from '../SpanAttributesTable/SpanAttributesTable';
import {ISpanFlatAttribute} from 'types/Span.types';
import * as S from './Attributes.styled';
import SpanAttributesTable from '../../SpanAttributesTable/SpanAttributesTable';

type TAttributesProps = {
interface TAttributesProps {
spanAttributeList?: ISpanFlatAttribute[];
};
}

const Attributes: FC<TAttributesProps> = ({spanAttributeList = []}) => {
export const Attributes: FC<TAttributesProps> = ({spanAttributeList = []}) => {
return (
<S.Container>
<S.Header>
Expand All @@ -21,5 +21,3 @@ const Attributes: FC<TAttributesProps> = ({spanAttributeList = []}) => {
</S.Container>
);
};

export default Attributes;
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,22 @@ import {Drawer} from 'antd';
interface IProps {
min: number;
max: number;
open: boolean;
children: React.ReactElement;
}

export const ResizableDrawer = ({children, min, max}: IProps): JSX.Element => {
export const ResizableDrawer = ({open, children, min, max}: IProps): JSX.Element => {
const [isResizing, setIsResizing] = useState(false);
const [height, setHeight] = useState(min);

const listener = (e: any) => {
e.preventDefault();
};
const onPointerDown: MouseEventHandler = useCallback(() => {
setIsResizing(true);
window.addEventListener('selectstart', listener);
window.addEventListener('selectstart', e => e.preventDefault());
}, [setIsResizing]);

const onMouseUp: EventListener = useCallback(() => {
setIsResizing(false);
window.removeEventListener('selectstart', listener);
window.removeEventListener('selectstart', e => e.preventDefault());
}, [setIsResizing]);

const onMouseMove: EventListener = useCallback(
Expand Down Expand Up @@ -52,7 +50,7 @@ export const ResizableDrawer = ({children, min, max}: IProps): JSX.Element => {
<Drawer
placement="bottom"
closable={false}
visible
visible={open}
height={height}
mask={false}
style={{overflow: 'hidden'}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import styled from 'styled-components';
import noResultsIcon from '../../assets/SpanAssertionsEmptyState.svg';
import styled, {css} from 'styled-components';
import noResultsIcon from '../../../assets/SpanAssertionsEmptyState.svg';

export const Header = styled.div`
display: flex;
Expand All @@ -10,6 +10,21 @@ export const Header = styled.div`
margin-bottom: 24px;
`;

export const TraceHeader = styled.div<{visiblePortion: number}>`
display: flex;
align-items: center;
align-content: center;
align-items: center;
cursor: grab;
width: 100%;
${props =>
css`
height: ${props.visiblePortion}px;
`}
margin: 0 16px;
color: rgb(213, 215, 224);
`;

export const Container = styled.div`
padding: 24px;
border: 1px solid rgba(0, 0, 0, 0.06);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import {Typography} from 'antd';
import {useSelector} from 'react-redux';
import SkeletonTable from 'components/SkeletonTable';
import {FC, useMemo} from 'react';
import {ITrace} from '../../types/Trace.types';
import TraceAssertionsResultTable from '../TraceAssertionsTable/TraceAssertionsTable';
import TraceService from '../../services/Trace.service';
import {ITrace} from 'types/Trace.types';
import * as S from './TestResults.styled';
import TestResultSelectors from '../../selectors/TestResult.selectors';
import TestResultSelectors from '../../../selectors/TestResult.selectors';
import TraceService from '../../../services/Trace.service';
import TraceAssertionsResultTable from '../../TraceAssertionsTable/TraceAssertionsTable';

type TTestResultsProps = {
trace?: ITrace;
Expand Down
File renamed without changes.
Loading

0 comments on commit b31a95b

Please sign in to comment.