You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

NavLink.tsx 2.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2023 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. import React from 'react';
  21. import { NavLink as RouterNavLink, NavLinkProps as RouterNavLinkProps } from 'react-router-dom';
  22. export interface NavLinkProps extends RouterNavLinkProps {
  23. blurAfterClick?: boolean;
  24. disabled?: boolean;
  25. onClick?: (event: React.MouseEvent<HTMLAnchorElement>) => void;
  26. preventDefault?: boolean;
  27. stopPropagation?: boolean;
  28. }
  29. // Styling this component directly with Emotion should be avoided due to conflicts with react-router's classname.
  30. // Use NavBarTabs as an example of this exception.
  31. function NavLinkWithRef(props: NavLinkProps, ref: React.ForwardedRef<HTMLAnchorElement>) {
  32. const {
  33. blurAfterClick,
  34. children,
  35. disabled,
  36. onClick,
  37. preventDefault,
  38. stopPropagation,
  39. ...otherProps
  40. } = props;
  41. const handleClick = React.useCallback(
  42. (event: React.MouseEvent<HTMLAnchorElement>) => {
  43. if (blurAfterClick) {
  44. // explicitly lose focus after click
  45. event.currentTarget.blur();
  46. }
  47. if (preventDefault || disabled) {
  48. event.preventDefault();
  49. }
  50. if (stopPropagation) {
  51. event.stopPropagation();
  52. }
  53. if (onClick && !disabled) {
  54. onClick(event);
  55. }
  56. },
  57. [onClick, blurAfterClick, preventDefault, stopPropagation, disabled]
  58. );
  59. return (
  60. <RouterNavLink onClick={handleClick} ref={ref} {...otherProps}>
  61. {children}
  62. </RouterNavLink>
  63. );
  64. }
  65. const NavLink = React.forwardRef(NavLinkWithRef);
  66. export default NavLink;