PaliTextToc.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import type { Key } from "antd/lib/table/interface";
  2. import { useState, useEffect } from "react";
  3. import { get } from "../../request";
  4. import type { IPaliTocListResponse } from "../../api/Corpus";
  5. import type { ListNodeData } from "./EditableTree";
  6. import TocTree from "./TocTree";
  7. import { Skeleton } from "antd";
  8. interface IWidget {
  9. book?: number;
  10. para?: number;
  11. series?: string;
  12. channel?: string;
  13. onSelect?: Function;
  14. onClick?: Function;
  15. }
  16. const PaliTextTocWidget = ({
  17. book,
  18. para,
  19. series,
  20. onSelect,
  21. onClick,
  22. }: IWidget) => {
  23. const [tocList, setTocList] = useState<ListNodeData[]>([]);
  24. const [selectedKeys, setSelectedKeys] = useState<Key[]>();
  25. const [expandedKeys, setExpandedKeys] = useState<Key[]>();
  26. const [loading, setLoading] = useState(true);
  27. useEffect(() => {
  28. let url = `/v2/palitext?view=book-toc`;
  29. if (series) {
  30. url += `&series=${series}`;
  31. } else {
  32. url += `&book=${book}&para=${para}`;
  33. }
  34. setLoading(true);
  35. console.info("api request", url);
  36. get<IPaliTocListResponse>(url)
  37. .then((json) => {
  38. console.info("api response", json);
  39. const toc = json.data.rows.map((item, _id) => {
  40. return {
  41. key: `${item.book}-${item.paragraph}`,
  42. title: item.toc,
  43. level: parseInt(item.level),
  44. };
  45. });
  46. setTocList(toc);
  47. if (json.data.rows.length > 0) {
  48. const path: string[] = [];
  49. for (let index = json.data.rows.length - 1; index >= 0; index--) {
  50. const element = json.data.rows[index];
  51. if (element.book === book && para && element.paragraph <= para) {
  52. path.push(`${element.book}-${element.paragraph}`);
  53. break;
  54. }
  55. }
  56. setExpandedKeys(path);
  57. setSelectedKeys(path);
  58. }
  59. })
  60. .finally(() => setLoading(false));
  61. }, [book, para, series]);
  62. return loading ? (
  63. <Skeleton active />
  64. ) : (
  65. <TocTree
  66. treeData={tocList}
  67. selectedKeys={selectedKeys}
  68. expandedKeys={expandedKeys}
  69. onSelect={(selectedKeys: Key[]) => {
  70. if (typeof onSelect !== "undefined") {
  71. onSelect(selectedKeys);
  72. }
  73. }}
  74. onClick={(
  75. id: string,
  76. e: React.MouseEvent<HTMLSpanElement, MouseEvent>
  77. ) => {
  78. if (typeof onClick !== "undefined") {
  79. onClick(id, e);
  80. }
  81. }}
  82. />
  83. );
  84. };
  85. export default PaliTextTocWidget;