allocationRow.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import {useState} from 'react';
  2. import {useTheme} from '@emotion/react';
  3. import styled from '@emotion/styled';
  4. import {Button} from 'sentry/components/button';
  5. import {Tooltip} from 'sentry/components/tooltip';
  6. import {IconDelete, IconEdit} from 'sentry/icons';
  7. import {t} from 'sentry/locale';
  8. import {space} from 'sentry/styles/space';
  9. import {displayPrice} from 'getsentry/views/amCheckout/utils';
  10. import type {BigNumUnits} from '../utils';
  11. import {bigNumFormatter} from '../utils';
  12. import {Centered, Divider, HalvedWithDivider} from './styles';
  13. import type {SpendAllocation} from './types';
  14. type AllocationRowProps = {
  15. allocation: SpendAllocation;
  16. deleteAction: (e: React.MouseEvent) => void;
  17. metricUnit: BigNumUnits;
  18. openForm: (e: React.MouseEvent) => void;
  19. };
  20. function AllocationRow({
  21. allocation,
  22. deleteAction,
  23. metricUnit,
  24. openForm,
  25. }: AllocationRowProps) {
  26. const [deleteHovered, setDeleteHovered] = useState(false);
  27. const [editHovered, setEditHovered] = useState(false);
  28. const theme = useTheme();
  29. return (
  30. <tr data-test-id="allocation-row">
  31. <TableData>{allocation.targetSlug}</TableData>
  32. <TableData />
  33. <TableData>
  34. <HalvedWithDivider>
  35. {allocation.costPerItem === 0 && (
  36. <Centered>
  37. <Tooltip title="Cost per event is unavailable for base plans">--</Tooltip>
  38. </Centered>
  39. )}
  40. {allocation.costPerItem > 0 && (
  41. <Centered>
  42. {displayPrice({
  43. cents: allocation.costPerItem * allocation.reservedQuantity,
  44. })}
  45. </Centered>
  46. )}
  47. <Centered>
  48. <Divider />
  49. </Centered>
  50. <Centered>
  51. <Tooltip title={allocation.reservedQuantity.toLocaleString()}>
  52. {bigNumFormatter(allocation.reservedQuantity, undefined, metricUnit)}
  53. </Tooltip>
  54. </Centered>
  55. </HalvedWithDivider>
  56. </TableData>
  57. <TableData />
  58. <TableData>
  59. <HalvedWithDivider>
  60. {allocation.costPerItem === 0 && (
  61. <Centered>
  62. <Tooltip title="Cost per event is unavailable for base plans">--</Tooltip>
  63. </Centered>
  64. )}
  65. {allocation.costPerItem > 0 && (
  66. <Centered>
  67. {displayPrice({
  68. cents: allocation.costPerItem * allocation.consumedQuantity,
  69. })}
  70. </Centered>
  71. )}
  72. <Centered>
  73. <Divider />
  74. </Centered>
  75. <Centered>
  76. <Tooltip
  77. title={(allocation.consumedQuantity > allocation.reservedQuantity
  78. ? `${allocation.consumedQuantity} (${
  79. allocation.consumedQuantity - allocation.reservedQuantity
  80. } over)`
  81. : allocation.consumedQuantity
  82. ).toLocaleString()}
  83. >
  84. <span
  85. style={
  86. allocation.consumedQuantity > allocation.reservedQuantity
  87. ? {color: theme.red400}
  88. : {}
  89. }
  90. >
  91. {bigNumFormatter(allocation.consumedQuantity, 2, metricUnit)}
  92. </span>
  93. </Tooltip>
  94. </Centered>
  95. </HalvedWithDivider>
  96. </TableData>
  97. <TableData style={{textAlign: 'right'}}>
  98. {allocation.targetType !== 'Organization' && (
  99. <Button
  100. aria-label={t('Edit')}
  101. icon={<IconEdit />}
  102. size="xs"
  103. onClick={openForm}
  104. style={
  105. editHovered
  106. ? {color: theme.gray300, marginRight: space(1)}
  107. : {marginRight: space(1)}
  108. }
  109. onMouseEnter={() => setEditHovered(true)}
  110. onMouseLeave={() => setEditHovered(false)}
  111. data-test-id="edit"
  112. />
  113. )}
  114. {allocation.targetType !== 'Organization' && (
  115. <Button
  116. aria-label={t('Delete')}
  117. icon={<IconDelete />}
  118. size="xs"
  119. onClick={deleteAction}
  120. priority="danger"
  121. style={deleteHovered ? {color: theme.red400} : {}}
  122. onMouseEnter={() => setDeleteHovered(true)}
  123. onMouseLeave={() => setDeleteHovered(false)}
  124. data-test-id="delete"
  125. />
  126. )}
  127. </TableData>
  128. </tr>
  129. );
  130. }
  131. export default AllocationRow;
  132. const TableData = styled('td')`
  133. padding: ${space(2)};
  134. `;