index.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { Button, Tooltip, Popconfirm } from 'antd';
  2. import type { TooltipProps, PopconfirmProps, ButtonProps } from 'antd';
  3. import usePermissions from '@/hooks/permission';
  4. import { useCallback } from 'react';
  5. import { useIntl } from '@@/plugin-locale/localeExports';
  6. interface PermissionButtonProps extends ButtonProps {
  7. tooltip?: TooltipProps;
  8. popConfirm?: PopconfirmProps;
  9. isPermission?: boolean;
  10. noButton?: boolean;
  11. }
  12. /**
  13. * 权限按钮
  14. * @param props
  15. * @example 引入改组件,使用组件内部 usePermission 获取相应权限
  16. */
  17. const PermissionButton = (props: PermissionButtonProps) => {
  18. const { tooltip, popConfirm, isPermission, ...buttonProps } = props;
  19. const _isPermission =
  20. 'isPermission' in props && props.isPermission
  21. ? 'disabled' in buttonProps
  22. ? buttonProps.disabled
  23. : false
  24. : true;
  25. const intl = useIntl();
  26. const isButton = 'noButton' in props && props.noButton;
  27. const defaultButton = isButton ? (
  28. props.children
  29. ) : (
  30. <Button {...buttonProps} disabled={_isPermission} />
  31. );
  32. const isTooltip = tooltip ? <Tooltip {...tooltip}>{defaultButton}</Tooltip> : null;
  33. const noPermission = (
  34. <Tooltip
  35. title={intl.formatMessage({
  36. id: 'pages.data.option.noPermission',
  37. defaultMessage: '没有权限',
  38. })}
  39. >
  40. {<Button {...buttonProps} disabled={_isPermission} />}
  41. </Tooltip>
  42. );
  43. const init = useCallback(() => {
  44. // 如果有权限
  45. if (isPermission) {
  46. if (popConfirm) {
  47. popConfirm.children = tooltip ? isTooltip : defaultButton;
  48. return <Popconfirm disabled={!isPermission} {...popConfirm} />;
  49. } else if (tooltip && !popConfirm) {
  50. return isTooltip;
  51. } else {
  52. return defaultButton;
  53. }
  54. }
  55. return noPermission;
  56. }, [props, isPermission]);
  57. return <>{init()}</>;
  58. };
  59. PermissionButton.usePermission = usePermissions;
  60. export default PermissionButton;