infoBox.tsx 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import {Dispatch, SetStateAction, useState} from 'react';
  2. import {Manager, Reference} from 'react-popper';
  3. import styled from '@emotion/styled';
  4. import space from 'sentry/styles/space';
  5. import IconPopper from './popper';
  6. import IconSample from './sample';
  7. import {ExtendedIconData, SelectedIcon} from './searchPanel';
  8. type Props = {
  9. icon: ExtendedIconData;
  10. selectedIcon: SelectedIcon;
  11. setSelectedIcon: Dispatch<SetStateAction<SelectedIcon>>;
  12. groupId: string;
  13. };
  14. const IconInfoBox = ({icon, selectedIcon, setSelectedIcon, groupId}: Props) => {
  15. const isSelected = selectedIcon.group === groupId && selectedIcon.icon === icon.id;
  16. const [boxRef, setBoxRef] = useState(null);
  17. return (
  18. <Manager>
  19. <Reference>
  20. {({ref: popperRef}) => (
  21. <BoxWrap
  22. ref={ref => {
  23. setBoxRef(ref);
  24. popperRef(ref);
  25. }}
  26. selected={isSelected}
  27. onClick={() =>
  28. setSelectedIcon(
  29. isSelected ? {group: '', icon: ''} : {group: groupId, icon: icon.id}
  30. )
  31. }
  32. >
  33. <IconSample
  34. name={icon.name}
  35. size="xl"
  36. color="gray500"
  37. {...icon.defaultProps}
  38. />
  39. <Name>{icon.name}</Name>
  40. </BoxWrap>
  41. )}
  42. </Reference>
  43. {isSelected && (
  44. <IconPopper icon={icon} setSelectedIcon={setSelectedIcon} boxRef={boxRef} />
  45. )}
  46. </Manager>
  47. );
  48. };
  49. export default IconInfoBox;
  50. const BoxWrap = styled('div')<{selected: boolean}>`
  51. grid-column-end: span 1;
  52. text-align: center;
  53. justify-content: center;
  54. padding: ${space(2)};
  55. border: solid 1px transparent;
  56. border-radius: ${p => p.theme.borderRadius};
  57. cursor: pointer;
  58. &:hover {
  59. border-color: ${p => p.theme.innerBorder};
  60. }
  61. ${p =>
  62. p.selected &&
  63. `
  64. border-color: ${p.theme.blue200};
  65. background: ${p.theme.blue100};
  66. &:hover {
  67. border-color: ${p.theme.blue200};
  68. }
  69. `}
  70. `;
  71. const Name = styled('p')`
  72. position: relative;
  73. margin-top: ${space(1)};
  74. margin-bottom: 0;
  75. font-size: 0.875rem;
  76. text-transform: capitalize;
  77. `;