AddToAnthology.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { message } from "antd";
  2. import React, { useState } from "react";
  3. import { post } from "../../request";
  4. import AnthologyModal from "../anthology/AnthologyModal";
  5. import type {
  6. IArticleMapAddRequest,
  7. IArticleMapAddResponse,
  8. } from "../../api/Article";
  9. import { useAppSelector } from "../../hooks";
  10. import { currentUser } from "../../reducers/current-user";
  11. interface IWidget {
  12. trigger?: React.ReactNode;
  13. studioName?: string;
  14. articleIds?: string[];
  15. open?: boolean; // 外部控制
  16. onClose?: (open: boolean) => void;
  17. onFinally?: () => void;
  18. }
  19. const AddToAnthologyWidget = ({
  20. trigger,
  21. studioName,
  22. open,
  23. articleIds,
  24. onClose,
  25. onFinally,
  26. }: IWidget) => {
  27. const user = useAppSelector(currentUser);
  28. /** 是否受控 */
  29. const isControlled = open !== undefined;
  30. /** 内部状态(仅非受控使用) */
  31. const [innerOpen, setInnerOpen] = useState(false);
  32. /** 最终状态来源 */
  33. const isOpen = isControlled ? open : innerOpen;
  34. /** 状态修改统一入口 */
  35. const setOpen = (next: boolean) => {
  36. if (!isControlled) {
  37. setInnerOpen(next);
  38. }
  39. onClose?.(next);
  40. };
  41. /** 选择文集 */
  42. const handleSelect = (id: string) => {
  43. if (!articleIds) return;
  44. post<IArticleMapAddRequest, IArticleMapAddResponse>("/v2/article-map", {
  45. anthology_id: id,
  46. article_id: articleIds,
  47. operation: "add",
  48. })
  49. .then((json) => {
  50. if (json.ok) {
  51. message.success(json.data);
  52. setOpen(false); // 成功后关闭
  53. } else {
  54. message.error(json.message);
  55. }
  56. })
  57. .catch(console.error)
  58. .finally(() => {
  59. onFinally?.();
  60. });
  61. };
  62. return (
  63. <AnthologyModal
  64. studioName={studioName ?? user?.realName}
  65. trigger={trigger && <span onClick={() => setOpen(true)}>{trigger}</span>}
  66. open={isOpen}
  67. onClose={setOpen}
  68. onSelect={handleSelect}
  69. />
  70. );
  71. };
  72. export default AddToAnthologyWidget;