previewHeader.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import React, { forwardRef } from "react";
  2. import { IconClose } from "@douyinfe/semi-icons";
  3. import { cssClasses } from "@douyinfe/semi-foundation/image/constants";
  4. import cls from "classnames";
  5. import { HeaderProps } from "./interface";
  6. import { PreviewContext } from "./previewContext";
  7. const prefixCls = `${cssClasses.PREFIX}-preview-header`;
  8. const Header = forwardRef(({ onClose, titleStyle, className, renderHeader, closable, renderCloseIcon }: HeaderProps, ref: React.LegacyRef<HTMLElement>) => (
  9. <PreviewContext.Consumer>
  10. {({ currentIndex, titles }) => {
  11. let title;
  12. if (titles && typeof currentIndex === "number") {
  13. title = titles[currentIndex];
  14. }
  15. const closeIcon = typeof renderCloseIcon === 'function' ? renderCloseIcon?.() : renderCloseIcon;
  16. //warning
  17. if (typeof closeIcon !== 'undefined' && !React.isValidElement(closeIcon)) {
  18. console.warn(`[Semi ImagePreview] RenderCloseIcon should be a valid react element or a function that returns a react element`);
  19. }
  20. return (
  21. <section ref={ref} className={cls(prefixCls, className)}>
  22. <section className={`${prefixCls}-title`} style={titleStyle}>{renderHeader ? renderHeader(title) : title}</section>
  23. {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */}
  24. {closable && <section className={`${prefixCls}-close`} onMouseUp={onClose}>
  25. {React.isValidElement(closeIcon) ? closeIcon : <IconClose />}
  26. </section>}
  27. </section>
  28. );
  29. }}
  30. </PreviewContext.Consumer>
  31. ));
  32. export default Header;