SentWbw.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import { List, Space, message } from "antd";
  2. import { useEffect, useState } from "react";
  3. import { get } from "../../../request";
  4. import { ISentenceWbwListResponse } from "../../api/Corpus";
  5. import { IWidgetSentEditInner, SentEditInner } from "../SentEdit";
  6. import { useAppSelector } from "../../../hooks";
  7. import { courseInfo, memberInfo } from "../../../reducers/current-course";
  8. import { courseUser } from "../../../reducers/course-user";
  9. import User, { IUser } from "../../auth/User";
  10. interface IWidget {
  11. book: number;
  12. para: number;
  13. wordStart: number;
  14. wordEnd: number;
  15. channelsId?: string[];
  16. reload?: boolean;
  17. wbwProgress?: boolean;
  18. onReload?: Function;
  19. }
  20. const SentWbwWidget = ({
  21. book,
  22. para,
  23. wordStart,
  24. wordEnd,
  25. channelsId,
  26. reload = false,
  27. wbwProgress = false,
  28. onReload,
  29. }: IWidget) => {
  30. const [initLoading, setInitLoading] = useState(true);
  31. const [sentData, setSentData] = useState<IWidgetSentEditInner[]>([]);
  32. const course = useAppSelector(courseInfo);
  33. const courseMember = useAppSelector(memberInfo);
  34. const myCourse = useAppSelector(courseUser);
  35. const load = () => {
  36. let url = `/v2/wbw-sentence?view=sent-can-read`;
  37. url += `&book=${book}&para=${para}&wordStart=${wordStart}&wordEnd=${wordEnd}`;
  38. console.debug("wbw sentence load", myCourse, course);
  39. if (myCourse && course) {
  40. url += `&course=${course.courseId}`;
  41. if (myCourse.role === "student") {
  42. //学生,仅列出答案channel
  43. url += `&channels=${course.channelId}`;
  44. } else if (courseMember) {
  45. console.debug("course member", courseMember);
  46. const channels = courseMember
  47. .filter((value) => typeof value.channel_id === "string")
  48. .map((item) => item.channel_id);
  49. url += `&channels=${channels.join(",")}`;
  50. }
  51. } else {
  52. if (channelsId && channelsId.length > 0) {
  53. url += `&exclude=${channelsId[0]}`;
  54. }
  55. }
  56. console.log("wbw sentence api request", url);
  57. get<ISentenceWbwListResponse>(url)
  58. .then((json) => {
  59. if (json.ok) {
  60. console.log("sim load", json.data.count);
  61. setSentData(json.data.rows);
  62. } else {
  63. message.error(json.message);
  64. }
  65. })
  66. .finally(() => {
  67. setInitLoading(false);
  68. if (reload && typeof onReload !== "undefined") {
  69. onReload();
  70. }
  71. });
  72. };
  73. useEffect(() => {
  74. load();
  75. }, []);
  76. //没交作业的人
  77. let nonWbwUser: IUser[] = [];
  78. const isCourseAnswer = myCourse && course && myCourse.role !== "student";
  79. if (isCourseAnswer && courseMember) {
  80. const hasWbwUsers = sentData.map((item) =>
  81. item.translation ? item.translation[0].studio : undefined
  82. );
  83. courseMember
  84. .filter((value) => value.role === "student")
  85. .forEach((value) => {
  86. const curr = hasWbwUsers.find((value1) => value1?.id === value.user_id);
  87. if (!curr && value.user) {
  88. nonWbwUser.push(value.user);
  89. }
  90. });
  91. }
  92. console.debug("没交作业", courseMember, sentData, nonWbwUser);
  93. return (
  94. <>
  95. <List
  96. loading={initLoading}
  97. itemLayout="horizontal"
  98. split={false}
  99. dataSource={sentData}
  100. renderItem={(item, index) => (
  101. <List.Item key={index}>
  102. <SentEditInner {...item} wbwProgress={wbwProgress} />
  103. </List.Item>
  104. )}
  105. />
  106. <div>
  107. {isCourseAnswer ? (
  108. <Space>
  109. {"没交作业:"}
  110. {nonWbwUser.length > 0
  111. ? nonWbwUser.map((item, id) => {
  112. return <User {...item} />;
  113. })
  114. : "无"}
  115. </Space>
  116. ) : undefined}
  117. </div>
  118. </>
  119. );
  120. };
  121. export default SentWbwWidget;