ArticleDrawer.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { Button, Drawer, Space, Typography } from "antd";
  2. import React, { useEffect, useState } from "react";
  3. import { Link } from "react-router";
  4. import Article from "./Article";
  5. import type { IArticleDataResponse } from "../../api/Article";
  6. const { Text } = Typography;
  7. interface IWidget {
  8. trigger?: React.ReactNode;
  9. title?: string;
  10. type?: ArticleType;
  11. book?: string;
  12. para?: string;
  13. channelId?: string;
  14. articleId?: string;
  15. anthologyId?: string;
  16. mode?: ArticleMode;
  17. open?: boolean;
  18. onClose?: () => void;
  19. onTitleChange?: (value: string) => void;
  20. onArticleEdit?: (value: IArticleDataResponse) => void;
  21. }
  22. const ArticleDrawerWidget = ({
  23. trigger,
  24. title,
  25. type,
  26. book,
  27. para,
  28. channelId,
  29. articleId,
  30. anthologyId,
  31. mode,
  32. open,
  33. onClose,
  34. onTitleChange,
  35. onArticleEdit,
  36. }: IWidget) => {
  37. const [openDrawer, setOpenDrawer] = useState(open);
  38. const [drawerTitle, setDrawerTitle] = useState(title);
  39. useEffect(() => {
  40. setOpenDrawer(open);
  41. }, [open]);
  42. useEffect(() => {
  43. setDrawerTitle(title);
  44. }, [title]);
  45. const showDrawer = () => {
  46. setOpenDrawer(true);
  47. };
  48. const onDrawerClose = () => {
  49. setOpenDrawer(false);
  50. if (document.getElementsByTagName("body")[0].hasAttribute("style")) {
  51. document.getElementsByTagName("body")[0].removeAttribute("style");
  52. }
  53. if (typeof onClose !== "undefined") {
  54. onClose();
  55. }
  56. };
  57. const getUrl = (openMode?: string): string => {
  58. let url = `/article/${type}/${articleId}?mode=`;
  59. url += openMode ? openMode : mode ? mode : "read";
  60. url += channelId ? `&channel=${channelId}` : "";
  61. url += book ? `&book=${book}` : "";
  62. url += para ? `&par=${para}` : "";
  63. return url;
  64. };
  65. return (
  66. <>
  67. <span onClick={() => showDrawer()}>{trigger}</span>
  68. <Drawer
  69. title={
  70. <Text
  71. editable={{
  72. onChange: (value: string) => {
  73. setDrawerTitle(value);
  74. if (typeof onTitleChange !== "undefined") {
  75. onTitleChange(value);
  76. }
  77. },
  78. }}
  79. >
  80. {drawerTitle}
  81. </Text>
  82. }
  83. width={1000}
  84. placement="right"
  85. onClose={onDrawerClose}
  86. open={openDrawer}
  87. destroyOnHidden={true}
  88. extra={
  89. <Space>
  90. <Button>
  91. <Link to={getUrl()}>在单页面中打开</Link>
  92. </Button>
  93. <Button>
  94. <Link to={getUrl("edit")}>翻译模式</Link>
  95. </Button>
  96. </Space>
  97. }
  98. >
  99. <Article
  100. active={true}
  101. type={type as ArticleType}
  102. book={book}
  103. para={para}
  104. channelId={channelId}
  105. articleId={articleId}
  106. anthologyId={anthologyId}
  107. mode={mode}
  108. onArticleEdit={(value: IArticleDataResponse) => {
  109. setDrawerTitle(value.title_text);
  110. if (typeof onArticleEdit !== "undefined") {
  111. onArticleEdit(value);
  112. }
  113. }}
  114. />
  115. </Drawer>
  116. </>
  117. );
  118. };
  119. export default ArticleDrawerWidget;