CommunityChapter.tsx 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { useEffect, useState } from "react";
  2. import { Divider, Space, Typography } from "antd";
  3. import { TagOutlined } from "@ant-design/icons";
  4. import ChapterFilter from "./ChapterFilter";
  5. import ChapterList from "./ChapterList";
  6. import ChapterTag from "./ChapterTag";
  7. import ChapterAppendTag from "./ChapterAppendTag";
  8. const { Title } = Typography;
  9. interface IWidget {
  10. studioName?: string;
  11. channelId?: string;
  12. tag?: string[];
  13. }
  14. const CommunityChapterWidget = ({ studioName, tag = [] }: IWidget) => {
  15. const [tags, setTags] = useState<string[]>(tag);
  16. const [searchKey, setSearchKey] = useState<string>();
  17. const [progress, setProgress] = useState<number>(0.9);
  18. const [lang, setLang] = useState<string>("zh");
  19. const [type, setType] = useState<string>("translation");
  20. useEffect(() => {
  21. setTags(tag);
  22. }, [tag]);
  23. return (
  24. <>
  25. <ChapterFilter
  26. onSearch={setSearchKey}
  27. onProgressChange={(value: string) => setProgress(parseFloat(value))}
  28. onLangChange={setLang}
  29. onTypeChange={setType}
  30. />
  31. <Divider />
  32. <Title level={3}>
  33. <Space wrap>
  34. <TagOutlined />
  35. {tags.map((item) => (
  36. <ChapterTag
  37. key={item} // ✅ v6 推荐稳定 key
  38. data={{
  39. key: item,
  40. title: item,
  41. }}
  42. closable
  43. onTagClose={() => {
  44. setTags((prev) => prev.filter((x) => x !== item)); // ✅ 避免闭包旧值
  45. }}
  46. />
  47. ))}
  48. <ChapterAppendTag
  49. tags={tags}
  50. progress={progress}
  51. lang={lang}
  52. type={type}
  53. onTagClick={(tag: string) => {
  54. setTags((prev) => (prev.includes(tag) ? prev : [...prev, tag]));
  55. }}
  56. />
  57. </Space>
  58. </Title>
  59. <ChapterList
  60. studioName={studioName}
  61. searchKey={searchKey}
  62. tags={tags}
  63. progress={progress}
  64. lang={lang}
  65. type={type}
  66. onTagClick={(tag: string) => {
  67. setTags([tag]);
  68. }}
  69. />
  70. </>
  71. );
  72. };
  73. export default CommunityChapterWidget;