InteractiveButton.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import { Divider, Space } from "antd";
  2. import SuggestionButton from "./SuggestionButton";
  3. import DiscussionButton from "../../discussion/DiscussionButton";
  4. import { ISentence } from "../SentEdit";
  5. import { MouseEventHandler, useEffect, useState } from "react";
  6. interface IWidget {
  7. data: ISentence;
  8. compact?: boolean;
  9. float?: boolean;
  10. hideCount?: boolean;
  11. hideInZero?: boolean;
  12. onMouseEnter?: MouseEventHandler | undefined;
  13. onMouseLeave?: MouseEventHandler | undefined;
  14. }
  15. const InteractiveButton = ({
  16. data,
  17. compact = false,
  18. float = false,
  19. hideCount = false,
  20. hideInZero = false,
  21. onMouseEnter,
  22. onMouseLeave,
  23. }: IWidget) => {
  24. const [left, setLeft] = useState(0);
  25. const [width, setWidth] = useState(0);
  26. useEffect(() => {
  27. // 获取目标元素
  28. const targetNode = document.getElementsByClassName("article_shell")[0];
  29. if (!targetNode) {
  30. return;
  31. }
  32. const rect = targetNode.getBoundingClientRect();
  33. setLeft(rect.left);
  34. setWidth(rect.width);
  35. // 创建ResizeObserver实例并传入回调函数
  36. const resizeObserver = new ResizeObserver((entries) => {
  37. for (let entry of entries) {
  38. const { width, height } = entry.contentRect;
  39. //console.log(`Element size: ${width}px x ${height}px`);
  40. setWidth((origin) => width);
  41. }
  42. });
  43. // 观察目标节点
  44. resizeObserver.observe(targetNode);
  45. // 定义一个函数来处理窗口大小变化
  46. function handleResize() {
  47. // 获取窗口宽度
  48. const windowWidth = window.innerWidth;
  49. // 在控制台中输出新的窗口宽度
  50. //console.log(`新的窗口宽度是:${windowWidth}px`);
  51. // 假设你有一个div元素,它的id是"myDiv"
  52. const myDiv = document.getElementsByClassName("article_shell")[0];
  53. if (!myDiv) {
  54. return;
  55. }
  56. // 使用getBoundingClientRect()方法获取元素的位置和大小
  57. const rect = myDiv.getBoundingClientRect();
  58. // 从返回的对象中获取left属性
  59. const leftPosition = rect.left;
  60. // 输出left位置
  61. //console.log(`div的left位置是:${leftPosition}px`);
  62. setLeft(leftPosition);
  63. // 在这里,你可以根据窗口宽度来调整页面布局或样式
  64. }
  65. // 为resize事件添加监听器
  66. window.addEventListener("resize", handleResize);
  67. }, []);
  68. const ButtonInner = (
  69. <Space
  70. size={"small"}
  71. onMouseEnter={onMouseEnter}
  72. onMouseLeave={onMouseLeave}
  73. >
  74. <SuggestionButton
  75. key={"SuggestionButton"}
  76. data={data}
  77. hideCount={hideCount}
  78. hideInZero={hideInZero}
  79. />
  80. {compact ? undefined : <Divider key={"Divider"} type="vertical" />}
  81. <DiscussionButton
  82. key={"DiscussionButton"}
  83. hideCount={hideCount}
  84. hideInZero={hideInZero}
  85. initCount={data.suggestionCount?.discussion}
  86. resId={data.id}
  87. />
  88. </Space>
  89. );
  90. return float ? (
  91. <span
  92. className="sent_read_interactive_button"
  93. style={{ position: "absolute", left: left + width }}
  94. >
  95. {ButtonInner}
  96. </span>
  97. ) : (
  98. ButtonInner
  99. );
  100. };
  101. export default InteractiveButton;