groupingComponentFrames.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import {Component, Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import Button from 'sentry/components/button';
  4. import {IconAdd, IconSubtract} from 'sentry/icons';
  5. import {tct} from 'sentry/locale';
  6. import space from 'sentry/styles/space';
  7. import {GroupingComponentListItem} from './groupingComponent';
  8. type DefaultProps = {
  9. maxVisibleItems: number;
  10. };
  11. type Props = DefaultProps & {
  12. items: React.ReactNode[];
  13. };
  14. type State = {
  15. collapsed: boolean;
  16. };
  17. class GroupingComponentFrames extends Component<Props, State> {
  18. static defaultProps: DefaultProps = {
  19. maxVisibleItems: 2,
  20. };
  21. state: State = {
  22. collapsed: true,
  23. };
  24. render() {
  25. const {items, maxVisibleItems} = this.props;
  26. const {collapsed} = this.state;
  27. const isCollapsible = items.length > maxVisibleItems;
  28. return (
  29. <Fragment>
  30. {items.map((item, index) => {
  31. if (!collapsed || index < maxVisibleItems) {
  32. return (
  33. <GroupingComponentListItem isCollapsible={isCollapsible} key={index}>
  34. {item}
  35. </GroupingComponentListItem>
  36. );
  37. }
  38. if (index === maxVisibleItems) {
  39. return (
  40. <GroupingComponentListItem key={index}>
  41. <ToggleCollapse
  42. size="sm"
  43. priority="link"
  44. icon={<IconAdd size="8px" />}
  45. onClick={() => this.setState({collapsed: false})}
  46. >
  47. {tct('show [numberOfFrames] similar', {
  48. numberOfFrames: items.length - maxVisibleItems,
  49. })}
  50. </ToggleCollapse>
  51. </GroupingComponentListItem>
  52. );
  53. }
  54. return null;
  55. })}
  56. {!collapsed && items.length > maxVisibleItems && (
  57. <GroupingComponentListItem>
  58. <ToggleCollapse
  59. size="sm"
  60. priority="link"
  61. icon={<IconSubtract size="8px" />}
  62. onClick={() => this.setState({collapsed: true})}
  63. >
  64. {tct('collapse [numberOfFrames] similar', {
  65. numberOfFrames: items.length - maxVisibleItems,
  66. })}
  67. </ToggleCollapse>
  68. </GroupingComponentListItem>
  69. )}
  70. </Fragment>
  71. );
  72. }
  73. }
  74. const ToggleCollapse = styled(Button)`
  75. margin: ${space(0.5)} 0;
  76. color: ${p => p.theme.linkColor};
  77. `;
  78. export default GroupingComponentFrames;