2
0

InteractiveButton.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import { Divider, Space } from "antd";
  2. import SuggestionButton from "./SuggestionButton";
  3. import DiscussionButton from "../../discussion/DiscussionButton";
  4. import type { ISentence } from "../SentEdit";
  5. import { type 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 (const entry of entries) {
  38. const { width } = entry.contentRect;
  39. setWidth(width);
  40. }
  41. });
  42. // 观察目标节点
  43. resizeObserver.observe(targetNode);
  44. // 定义一个函数来处理窗口大小变化
  45. function handleResize() {
  46. // 获取窗口宽度
  47. // 在控制台中输出新的窗口宽度
  48. //console.log(`新的窗口宽度是:${windowWidth}px`);
  49. // 假设你有一个div元素,它的id是"myDiv"
  50. const myDiv = document.getElementsByClassName("article_shell")[0];
  51. if (!myDiv) {
  52. return;
  53. }
  54. // 使用getBoundingClientRect()方法获取元素的位置和大小
  55. const rect = myDiv.getBoundingClientRect();
  56. // 从返回的对象中获取left属性
  57. const leftPosition = rect.left;
  58. // 输出left位置
  59. //console.log(`div的left位置是:${leftPosition}px`);
  60. setLeft(leftPosition);
  61. // 在这里,你可以根据窗口宽度来调整页面布局或样式
  62. }
  63. // 为resize事件添加监听器
  64. window.addEventListener("resize", handleResize);
  65. }, []);
  66. const ButtonInner = (
  67. <Space
  68. size={"small"}
  69. onMouseEnter={onMouseEnter}
  70. onMouseLeave={onMouseLeave}
  71. >
  72. <SuggestionButton
  73. key={"SuggestionButton"}
  74. data={data}
  75. hideCount={hideCount}
  76. hideInZero={hideInZero}
  77. />
  78. {compact ? undefined : <Divider key={"Divider"} type="vertical" />}
  79. <DiscussionButton
  80. key={"DiscussionButton"}
  81. hideCount={hideCount}
  82. hideInZero={hideInZero}
  83. initCount={data.suggestionCount?.discussion}
  84. resId={data.id}
  85. />
  86. </Space>
  87. );
  88. return float ? (
  89. <span
  90. className="sent_read_interactive_button"
  91. style={{ position: "absolute", left: left + width }}
  92. >
  93. {ButtonInner}
  94. </span>
  95. ) : (
  96. ButtonInner
  97. );
  98. };
  99. export default InteractiveButton;