2
0

SentCart.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { Badge, Button, List, Popover, Tooltip, Typography } from "antd";
  2. import { useEffect, useState } from "react";
  3. import { ShoppingCartOutlined, DeleteOutlined } from "@ant-design/icons";
  4. import "./style.css";
  5. const { Text } = Typography;
  6. export interface ISentCart {
  7. id: string;
  8. text: string;
  9. }
  10. export const addToCart = (add: ISentCart[]): number => {
  11. const oldText = localStorage.getItem("cart/text");
  12. let cartText: ISentCart[] = [];
  13. if (oldText) {
  14. cartText = JSON.parse(oldText);
  15. }
  16. cartText = [...cartText, ...add];
  17. localStorage.setItem("cart/text", JSON.stringify(cartText));
  18. return cartText.length;
  19. };
  20. const SentCartWidget = () => {
  21. const [count, setCount] = useState<number>();
  22. const [sentences, setSentences] = useState<ISentCart[]>();
  23. const query = () => {
  24. const cartText = localStorage.getItem("cart/text");
  25. if (cartText) {
  26. const sent: ISentCart[] = JSON.parse(cartText);
  27. setSentences(sent);
  28. } else {
  29. setSentences([]);
  30. }
  31. };
  32. useEffect(() => {
  33. if (sentences) {
  34. setCount(sentences.length);
  35. localStorage.setItem("cart/text", JSON.stringify(sentences));
  36. }
  37. }, [sentences]);
  38. useEffect(() => {
  39. query();
  40. const timer = setInterval(query, 1000 * 2);
  41. return () => {
  42. clearInterval(timer);
  43. };
  44. }, []);
  45. return (
  46. <>
  47. <Popover
  48. placement="bottomRight"
  49. arrowPointAtCenter
  50. destroyTooltipOnHide
  51. getTooltipContainer={(_node: HTMLElement) =>
  52. document.getElementsByClassName("toolbar_center")[0] as HTMLElement
  53. }
  54. content={
  55. <div>
  56. <div style={{ display: "flex", justifyContent: "space-between" }}>
  57. <div>{"复制句子编号"}</div>
  58. <div>
  59. <Text
  60. disabled={!sentences || sentences.length === 0}
  61. copyable={{
  62. text: sentences?.map((item) => item.id).join("\n"),
  63. }}
  64. />
  65. <Tooltip title="清空列表保留剪贴板数据">
  66. <Button
  67. disabled={!sentences || sentences.length === 0}
  68. type="link"
  69. danger
  70. icon={<DeleteOutlined />}
  71. onClick={() => {
  72. setSentences([]);
  73. }}
  74. />
  75. </Tooltip>
  76. </div>
  77. </div>
  78. <div style={{ width: 450, height: 300, overflowY: "auto" }}>
  79. <List
  80. size="small"
  81. dataSource={sentences}
  82. renderItem={(item, index) => (
  83. <List.Item key={index} className="cart_item">
  84. <List.Item.Meta title={item.id} description={item.text} />
  85. <Button
  86. className="cart_delete"
  87. type="link"
  88. danger
  89. icon={<DeleteOutlined />}
  90. onClick={() => {
  91. if (sentences) {
  92. const newArr = [...sentences];
  93. newArr.splice(index, 1);
  94. console.debug("delete", index, newArr);
  95. setSentences(newArr);
  96. }
  97. }}
  98. />
  99. </List.Item>
  100. )}
  101. />
  102. </div>
  103. </div>
  104. }
  105. trigger="click"
  106. >
  107. <Badge style={{ cursor: "pointer" }} count={count} size="small">
  108. <span style={{ color: "white", cursor: "pointer" }}>
  109. <ShoppingCartOutlined />
  110. </span>
  111. </Badge>
  112. </Popover>
  113. </>
  114. );
  115. };
  116. export default SentCartWidget;