bookmarkStar.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import * as React from 'react';
  2. import styled from '@emotion/styled';
  3. import {addErrorMessage} from 'sentry/actionCreators/indicator';
  4. import {update} from 'sentry/actionCreators/projects';
  5. import {IconStar} from 'sentry/icons';
  6. import {t} from 'sentry/locale';
  7. import {Organization, Project} from 'sentry/types';
  8. import {defined} from 'sentry/utils';
  9. import useApi from 'sentry/utils/useApi';
  10. type Props = {
  11. organization: Organization;
  12. project: Project;
  13. className?: string;
  14. /* used to override when under local state */
  15. isBookmarked?: boolean;
  16. onToggle?: (isBookmarked: boolean) => void;
  17. };
  18. const BookmarkStar = ({
  19. isBookmarked: isBookmarkedProp,
  20. className,
  21. organization,
  22. project,
  23. onToggle,
  24. }: Props) => {
  25. const api = useApi();
  26. const isBookmarked = defined(isBookmarkedProp)
  27. ? isBookmarkedProp
  28. : project.isBookmarked;
  29. const toggleProjectBookmark = (event: React.MouseEvent) => {
  30. update(api, {
  31. orgId: organization.slug,
  32. projectId: project.slug,
  33. data: {isBookmarked: !isBookmarked},
  34. }).catch(() => {
  35. addErrorMessage(t('Unable to toggle bookmark for %s', project.slug));
  36. });
  37. // needed to dismiss tooltip
  38. (document.activeElement as HTMLElement).blur();
  39. // prevent dropdowns from closing
  40. event.stopPropagation();
  41. if (onToggle) {
  42. onToggle(!isBookmarked);
  43. }
  44. };
  45. return (
  46. <Star
  47. isBookmarked={isBookmarked}
  48. isSolid={isBookmarked}
  49. onClick={toggleProjectBookmark}
  50. className={className}
  51. />
  52. );
  53. };
  54. const Star = styled(IconStar, {shouldForwardProp: p => p !== 'isBookmarked'})<{
  55. isBookmarked: boolean;
  56. }>`
  57. color: ${p => (p.isBookmarked ? p.theme.yellow300 : p.theme.gray200)};
  58. cursor: pointer;
  59. `;
  60. export default BookmarkStar;