TaskStatus.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { Progress, Tag, Tooltip } from "antd";
  2. import type { ITaskData, ITaskResponse, TTaskStatus } from "../../api/task";
  3. import { useIntl } from "react-intl";
  4. import { useEffect, useState } from "react";
  5. import { get } from "../../request";
  6. const taskStatusColors: Record<TTaskStatus, string> = {
  7. pending: "default",
  8. published: "orange",
  9. running: "processing",
  10. done: "success",
  11. restarted: "warning",
  12. requested_restart: "warning",
  13. closed: "error",
  14. canceled: "error",
  15. expired: "error",
  16. queue: "default",
  17. stop: "error",
  18. quit: "error",
  19. pause: "warning",
  20. };
  21. export const TaskStatusColor = (status: TTaskStatus = "pending"): string => {
  22. return taskStatusColors[status];
  23. };
  24. interface IWidget {
  25. task?: ITaskData;
  26. }
  27. const TaskStatus = ({ task }: IWidget) => {
  28. const intl = useIntl();
  29. const [progress, setProgress] = useState(task?.progress);
  30. useEffect(() => {
  31. if (!task?.id) {
  32. return;
  33. }
  34. if (task.status !== "running") {
  35. return;
  36. }
  37. const query = () => {
  38. const url = `/v2/task/${task?.id}`;
  39. console.info("api request", url);
  40. get<ITaskResponse>(url).then((json) => {
  41. console.log("api response", json);
  42. if (json.ok) {
  43. setProgress(json.data.progress);
  44. }
  45. });
  46. };
  47. const timer = setInterval(query, 1000 * (60 + Math.random() * 10));
  48. return () => {
  49. clearInterval(timer);
  50. };
  51. }, [task]);
  52. const color = TaskStatusColor(task?.status);
  53. return (
  54. <>
  55. <Tag color={color}>
  56. {intl.formatMessage({
  57. id: `labels.task.status.${task?.status}`,
  58. defaultMessage: "unknown",
  59. })}
  60. </Tag>
  61. {task?.status === "running" && task?.executor?.roles?.includes("ai") ? (
  62. <div style={{ display: "inline-block", width: 80 }}>
  63. <Tooltip title={`${progress}%`}>
  64. <Progress percent={progress ?? 0} size="small" showInfo={false} />
  65. </Tooltip>
  66. </div>
  67. ) : (
  68. <></>
  69. )}
  70. </>
  71. );
  72. };
  73. export default TaskStatus;