lastCommit.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import UserAvatar from 'sentry/components/avatar/userAvatar';
  2. import TimeSince from 'sentry/components/timeSince';
  3. import {t} from 'sentry/locale';
  4. import {AvatarUser, Commit} from 'sentry/types';
  5. type Props = {
  6. commit: Commit;
  7. headerClass: string;
  8. };
  9. const unknownUser: AvatarUser = {
  10. id: '',
  11. name: '',
  12. username: '??',
  13. email: '',
  14. avatarUrl: '',
  15. avatar: {
  16. avatarUuid: '',
  17. avatarType: 'letter_avatar',
  18. },
  19. ip_address: '',
  20. };
  21. function LastCommit({commit, headerClass}: Props) {
  22. function renderMessage(message: Commit['message']) {
  23. if (!message) {
  24. return t('No message provided');
  25. }
  26. const firstLine = message.split(/\n/)[0];
  27. if (firstLine.length > 100) {
  28. let truncated = firstLine.substr(0, 90);
  29. const words = truncated.split(/ /);
  30. // try to not have ellipsis mid-word
  31. if (words.length > 1) {
  32. words.pop();
  33. truncated = words.join(' ');
  34. }
  35. return `${truncated}\u2026`;
  36. }
  37. return firstLine;
  38. }
  39. const commitAuthor = commit?.author;
  40. return (
  41. <div>
  42. <h6 className={headerClass}>Last commit</h6>
  43. <div className="commit">
  44. <div className="commit-avatar">
  45. <UserAvatar user={commitAuthor || unknownUser} />
  46. </div>
  47. <div className="commit-message truncate">{renderMessage(commit.message)}</div>
  48. <div className="commit-meta">
  49. <strong>{commitAuthor?.name || t('Unknown Author')}</strong>
  50. &nbsp;
  51. <TimeSince date={commit.dateCreated} />
  52. </div>
  53. </div>
  54. </div>
  55. );
  56. }
  57. export default LastCommit;