feathers-debugger
Version:
FeathersJS Debugger Chrome Extension
129 lines (117 loc) • 2.7 kB
JSX
import React from 'react';
import stc from 'string-to-color';
import styled from 'styled-components';
import ms from 'ms';
import ReactTooltip from 'react-tooltip';
import { ErrorTriangle } from '../../assets';
const Root = styled.div`
padding: 4px 0;
&:first-child {
margin-top: 2px;
}
padding-top: 0;
display: flex;
border-top: 1px solid ${p => p.theme.border};
transition: 0.3s background, opacity 0.3s;
&:hover {
background: ${p => p.theme.background};
cursor: pointer;
}
&:active {
* {
color: white;
}
background: ${p => p.theme.primary};
}
`;
const DurationBar = styled.div`
height: 3px;
transform: translateY(-2px);
transition: width 0.3s;
`;
const Item = styled.div`
font-size: 11.5px;
color: #333;
small {
opacity: 0.5;
}
white-space: nowrap;
`;
const Duration = styled.div`
margin: 0 5px;
font-weight: bold;
display: inline-block;
`;
const Method = styled.div`
display: inline-block;
line-height: 1.2;
color: #0631ef;
border-radius: 3px;
text-transform: uppercase;
letter-spacing: 1px;
font-size: 9px;
font-weight: bold;
margin-right: 5px;
${p =>
p.method &&
`color: ${p.theme.methods[p.method] || p.theme.methods.default};`}
`;
const RequestError = styled(ErrorTriangle)`
width: 9px;
height: 9px;
margin-right: 3px;
fill: ${p => p.theme.danger};
`;
const Gap = styled.div`
transition: width 0.3s;
animation: fadeIn 1s;
`;
export default function WaterfallItem({
item,
zoomFactor,
start,
previousItem,
condensed,
index,
opacity,
}) {
let prevOffset = 0;
if (previousItem && previousItem.end <= item.ts) {
prevOffset = item.ts - previousItem.end;
} else if (previousItem && previousItem.end > item.ts) {
prevOffset = item.ts - previousItem.ts;
}
let gapWidth = (item.ts - start) * zoomFactor;
if (condensed) {
gapWidth = index * 10;
}
const color = stc(item.path);
return (
<Root style={{ opacity }}>
<ReactTooltip
delayShow={200}
place="bottom"
type="dark"
effect="solid"
id="item-tooltip"
className="tooltip"
/>
<Gap style={{ width: gapWidth }} />
<Item>
<DurationBar
style={{
width: item.duration * zoomFactor,
background: color,
}}
/>
{item.error && (
<RequestError data-tip={item.error} data-for="item-tooltip" />
)}
<Method method={item.method}>{item.method}</Method>
{item.path}
<Duration style={{ color }}>{item.duration}ms</Duration>
{previousItem && <small>+{ms(prevOffset)}</small>}
</Item>
</Root>
);
}