TaskLog.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import { Button, Skeleton, Timeline } from "antd";
  2. import _React, { useEffect, useState } from "react";
  3. import { get } from "../../request";
  4. import type { ICommentApiData, ICommentListResponse } from "../../api/Comment";
  5. import TimeShow from "../general/TimeShow";
  6. import { StatusButtons, type TTaskStatus } from "../../api/task";
  7. import { TaskStatusColor } from "./TaskStatus";
  8. import User from "../auth/User";
  9. interface IWidget {
  10. taskId?: string;
  11. onMore?: () => void;
  12. }
  13. const TaskLog = ({ taskId, onMore }: IWidget) => {
  14. const [data, setData] = useState<ICommentApiData[]>();
  15. const [total, setTotal] = useState<number>(0);
  16. const [loading, setLoading] = useState(false);
  17. useEffect(() => {
  18. const url: string = `/v2/discussion?type=discussion&res_type=task&view=question&id=${taskId}&limit=5&offset=0&status=active`;
  19. console.info("api request", url);
  20. setLoading(true);
  21. get<ICommentListResponse>(url)
  22. .then((json) => {
  23. if (json.ok) {
  24. console.debug("discussion api response", json);
  25. setData(json.data.rows);
  26. setTotal(json.data.count);
  27. }
  28. })
  29. .finally(() => setLoading(false));
  30. }, [taskId]);
  31. function findKeywordInTitle(title?: string): string | undefined {
  32. if (!title) {
  33. return undefined;
  34. }
  35. const keywords = StatusButtons;
  36. for (const keyword of keywords) {
  37. if (title.includes(keyword)) {
  38. return keyword;
  39. }
  40. }
  41. return undefined;
  42. }
  43. return (
  44. <>
  45. <Timeline>
  46. {loading && <Skeleton paragraph={{ rows: 1 }} active avatar />}
  47. {data?.map((item, id) => {
  48. const status = findKeywordInTitle(item.title);
  49. return (
  50. <Timeline.Item
  51. key={id}
  52. color={TaskStatusColor(status as TTaskStatus)}
  53. dot={<User {...item.editor} showName={false} />}
  54. >
  55. <div>
  56. <TimeShow
  57. showLabel={false}
  58. showIcon={false}
  59. createdAt={item.created_at}
  60. />
  61. </div>
  62. <div>{item.title}</div>
  63. </Timeline.Item>
  64. );
  65. })}
  66. {total > 5 && (
  67. <Timeline.Item>
  68. <Button type="link" onClick={onMore}>
  69. 更多
  70. </Button>
  71. </Timeline.Item>
  72. )}
  73. </Timeline>
  74. </>
  75. );
  76. };
  77. export default TaskLog;