LiveTailButton.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import React from 'react';
  2. import classNames from 'classnames';
  3. import { css } from 'emotion';
  4. import memoizeOne from 'memoize-one';
  5. import { GrafanaTheme, GrafanaThemeType, useTheme } from '@grafana/ui';
  6. import tinycolor from 'tinycolor2';
  7. const orangeDark = '#FF780A';
  8. const orangeDarkLighter = tinycolor(orangeDark)
  9. .lighten(10)
  10. .toString();
  11. const orangeLight = '#ED5700';
  12. const orangeLightLighter = tinycolor(orangeLight)
  13. .lighten(10)
  14. .toString();
  15. const getStyles = memoizeOne((theme: GrafanaTheme) => {
  16. const orange = theme.type === GrafanaThemeType.Dark ? orangeDark : orangeLight;
  17. const orangeLighter = theme.type === GrafanaThemeType.Dark ? orangeDarkLighter : orangeLightLighter;
  18. const textColor = theme.type === GrafanaThemeType.Dark ? theme.colors.white : theme.colors.black;
  19. return {
  20. noRightBorderStyle: css`
  21. label: noRightBorderStyle;
  22. border-right: 0;
  23. `,
  24. isLive: css`
  25. label: isLive;
  26. border-color: ${orange};
  27. color: ${orange};
  28. background: transparent;
  29. &:focus {
  30. border-color: ${orange};
  31. color: ${orange};
  32. }
  33. &:active,
  34. &:hover {
  35. border-color: ${orangeLighter};
  36. color: ${orangeLighter};
  37. }
  38. `,
  39. isPaused: css`
  40. label: isPaused;
  41. border-color: ${orange};
  42. background: transparent;
  43. animation: pulse 2s ease-out 0s infinite normal forwards;
  44. &:focus {
  45. border-color: ${orange};
  46. }
  47. &:active,
  48. &:hover {
  49. border-color: ${orangeLighter};
  50. }
  51. @keyframes pulse {
  52. 0% {
  53. color: ${textColor};
  54. }
  55. 50% {
  56. color: ${orange};
  57. }
  58. 100% {
  59. color: ${textColor};
  60. }
  61. }
  62. `,
  63. };
  64. });
  65. type LiveTailButtonProps = {
  66. start: () => void;
  67. stop: () => void;
  68. pause: () => void;
  69. resume: () => void;
  70. isLive: boolean;
  71. isPaused: boolean;
  72. };
  73. export function LiveTailButton(props: LiveTailButtonProps) {
  74. const { start, pause, resume, isLive, isPaused, stop } = props;
  75. const theme = useTheme();
  76. const styles = getStyles(theme);
  77. const onClickMain = isLive ? (isPaused ? resume : pause) : start;
  78. return (
  79. <div className="explore-toolbar-content-item">
  80. <button
  81. className={classNames('btn navbar-button', {
  82. [`btn--radius-right-0 ${styles.noRightBorderStyle}`]: isLive,
  83. [styles.isLive]: isLive && !isPaused,
  84. [styles.isPaused]: isLive && isPaused,
  85. })}
  86. onClick={onClickMain}
  87. >
  88. <i className={classNames('fa', isPaused || !isLive ? 'fa-play' : 'fa-pause')} />
  89. &nbsp; Live tailing
  90. </button>
  91. {isLive && (
  92. <button className={`btn navbar-button navbar-button--attached ${styles.isLive}`} onClick={stop}>
  93. <i className={'fa fa-stop'} />
  94. </button>
  95. )}
  96. </div>
  97. );
  98. }