Recent.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { Button, List } from "antd";
  2. import { useEffect, useState } from "react";
  3. import { useIntl } from "react-intl";
  4. import { Link } from "react-router";
  5. import { get } from "../../request";
  6. import type { IView, IViewListResponse } from "../../api/view";
  7. const RecentWidget = () => {
  8. const [listData, setListData] = useState<IView[]>([]);
  9. const intl = useIntl();
  10. useEffect(() => {
  11. const url = `/v2/view?view=user&limit=10`;
  12. get<IViewListResponse>(url).then((json) => {
  13. if (json.ok) {
  14. const items: IView[] = json.data.rows.map((item, id) => {
  15. return {
  16. sn: id + 1,
  17. id: item.id,
  18. title: item.title,
  19. subtitle: item.org_title,
  20. type: item.target_type,
  21. meta: JSON.parse(item.meta),
  22. updatedAt: item.updated_at,
  23. };
  24. });
  25. setListData(items);
  26. }
  27. });
  28. }, []);
  29. return (
  30. <div style={{ padding: 6 }}>
  31. <List
  32. itemLayout="vertical"
  33. header={intl.formatMessage({
  34. id: `labels.recent-scan`,
  35. })}
  36. size="small"
  37. dataSource={listData}
  38. renderItem={(item) => {
  39. let url = `/article/${item.type}/`;
  40. switch (item.type) {
  41. case "chapter":
  42. url += item.meta.book + "-" + item.meta.para;
  43. break;
  44. default:
  45. break;
  46. }
  47. return (
  48. <List.Item>
  49. <Link to={url} target="_blank">
  50. {item.title ? item.title : item.subtitle}
  51. </Link>
  52. </List.Item>
  53. );
  54. }}
  55. />
  56. <Button type="link">{intl.formatMessage({ id: "buttons.more" })}</Button>
  57. </div>
  58. );
  59. };
  60. export default RecentWidget;