tooltipStore.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. type TooltipStoreInterface = {
  2. addTooltip(tooltip: React.Component): void;
  3. closeAllTooltips(): void;
  4. getOpenableSingleTooltips(): React.Component[];
  5. init(): TooltipStoreInterface;
  6. openAllTooltips(): boolean;
  7. removeTooltip(tooltip: React.Component): void;
  8. tooltips: React.Component[];
  9. };
  10. const MAX_TOOLTIPS_TO_OPEN = 100;
  11. const TooltipStore: TooltipStoreInterface = {
  12. tooltips: [],
  13. getOpenableSingleTooltips() {
  14. return this.tooltips.filter(tooltip => {
  15. // Filtering out disabled tooltips and lists of tooltips (which cause rendering issues for snapshots) using the internal 'key'
  16. const _internals =
  17. (tooltip as any)._reactInternalFiber || (tooltip as any)._reactInternals;
  18. return (
  19. !(tooltip.props as any).disabled &&
  20. !_internals.key &&
  21. !(tooltip.props as any).disableForVisualTest
  22. );
  23. });
  24. },
  25. /**
  26. * Called via window.__openAllTooltips in selenium tests to check tooltip snapshots
  27. */
  28. openAllTooltips() {
  29. const tooltips = this.getOpenableSingleTooltips();
  30. if (!tooltips.length || tooltips.length > MAX_TOOLTIPS_TO_OPEN) {
  31. // Pages with too many tooltip components will take too long to render and it isn't likely helpful anyway.
  32. return false;
  33. }
  34. tooltips.forEach(tooltip => {
  35. tooltip.setState({
  36. isOpen: true,
  37. usesGlobalPortal: false,
  38. });
  39. });
  40. return true;
  41. },
  42. /**
  43. * Called via window.__closeAllTooltips in selenium tests to cleanup tooltips after taking a snapshot
  44. */
  45. closeAllTooltips() {
  46. const tooltips = this.getOpenableSingleTooltips();
  47. tooltips.forEach(tooltip => {
  48. tooltip.setState({
  49. isOpen: false,
  50. usesGlobalPortal: true,
  51. });
  52. });
  53. },
  54. init(): TooltipStoreInterface {
  55. window.__openAllTooltips = this.openAllTooltips.bind(this);
  56. window.__closeAllTooltips = this.closeAllTooltips.bind(this);
  57. return this;
  58. },
  59. addTooltip(tooltip: React.Component) {
  60. this.tooltips.push(tooltip);
  61. },
  62. removeTooltip(tooltip: React.Component) {
  63. this.tooltips = this.tooltips.filter(t => t !== tooltip);
  64. },
  65. };
  66. export default TooltipStore.init();