UserAction.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /**
  2. * 学生接受课程管理员的邀请 参加课程
  3. */
  4. import { Button, Modal } from "antd";
  5. import { useIntl } from "react-intl";
  6. import { ExclamationCircleFilled } from "@ant-design/icons";
  7. import {
  8. type ICourseMemberData,
  9. type ICourseMemberResponse,
  10. type TCourseMemberAction,
  11. type TCourseMemberStatus,
  12. actionMap,
  13. } from "../../api/Course";
  14. import type { IUser } from "../auth/User";
  15. import { post, put } from "../../request";
  16. import Marked from "../general/Marked";
  17. export interface ISetStatus {
  18. courseMemberId?: string;
  19. courseId?: string;
  20. courseName?: string;
  21. user?: IUser;
  22. message?: string;
  23. status: TCourseMemberStatus;
  24. onSuccess?: Function;
  25. onError?: Function;
  26. }
  27. const statusQuery = ({
  28. courseMemberId,
  29. courseId,
  30. user,
  31. status,
  32. }: ISetStatus) => {
  33. let url = "/v2/course-member/";
  34. let data: ICourseMemberData;
  35. if (courseMemberId) {
  36. //修改现有数据
  37. url += courseMemberId;
  38. data = {
  39. user_id: "",
  40. course_id: "",
  41. status: status,
  42. };
  43. console.info("api request", url, data);
  44. return put<ICourseMemberData, ICourseMemberResponse>(url, data);
  45. } else {
  46. //新增数据
  47. data = {
  48. user_id: user?.id ? user?.id : "",
  49. role: "student",
  50. course_id: courseId ? courseId : "",
  51. status: status,
  52. };
  53. console.info("api request", url, data);
  54. return post<ICourseMemberData, ICourseMemberResponse>(url, data);
  55. }
  56. };
  57. export const setStatus = ({
  58. status,
  59. courseMemberId,
  60. courseId,
  61. user,
  62. message,
  63. onSuccess,
  64. onError,
  65. }: ISetStatus) => {
  66. Modal.confirm({
  67. icon: <ExclamationCircleFilled />,
  68. content: <Marked text={message} />,
  69. onOk() {
  70. const query: ISetStatus = {
  71. status: status,
  72. courseMemberId: courseMemberId,
  73. courseId: courseId,
  74. user: user,
  75. };
  76. return statusQuery(query)
  77. .then((json) => {
  78. console.debug("AcceptCourse api response", json);
  79. if (json.ok) {
  80. console.debug("accepted", json.data);
  81. if (typeof onSuccess !== "undefined") {
  82. onSuccess(json.data);
  83. }
  84. } else {
  85. if (typeof onError !== "undefined") {
  86. onError(json.message);
  87. }
  88. }
  89. })
  90. .catch((error) => {
  91. console.error(error);
  92. if (typeof onError !== "undefined") {
  93. onError(error);
  94. }
  95. });
  96. },
  97. });
  98. };
  99. interface IWidget {
  100. action: TCourseMemberAction;
  101. currUser?: ICourseMemberData;
  102. courseId?: string;
  103. courseName?: string;
  104. signUpMessage?: string | null;
  105. user?: IUser;
  106. onStatusChanged?: Function;
  107. }
  108. const UserActionWidget = ({
  109. action,
  110. currUser,
  111. courseId,
  112. courseName,
  113. signUpMessage,
  114. user,
  115. onStatusChanged,
  116. }: IWidget) => {
  117. const intl = useIntl();
  118. const statusChange = (status: ICourseMemberData | undefined) => {
  119. if (typeof onStatusChanged !== "undefined") {
  120. onStatusChanged(status);
  121. }
  122. };
  123. const status = actionMap(action);
  124. let buttonDisable: boolean;
  125. if (!currUser?.id && !(courseId && user)) {
  126. buttonDisable = true;
  127. } else {
  128. buttonDisable = false;
  129. }
  130. let courseMessage = intl.formatMessage(
  131. {
  132. id: `course.member.status.${action}.message`,
  133. },
  134. { course: courseName }
  135. );
  136. if (action === "apply" || action === "join") {
  137. if (signUpMessage) {
  138. courseMessage = signUpMessage;
  139. }
  140. }
  141. return (
  142. <>
  143. {status ? (
  144. <Button
  145. disabled={buttonDisable}
  146. type={
  147. action === "join" || action === "apply" || action === "agree"
  148. ? "primary"
  149. : undefined
  150. }
  151. danger={action === "disagree" || action === "leave" ? true : false}
  152. onClick={() => {
  153. console.debug("currUser", currUser);
  154. const actionParam: ISetStatus = {
  155. courseMemberId: currUser?.id,
  156. courseId: courseId,
  157. user: user,
  158. message: courseMessage,
  159. status: status,
  160. onSuccess: (data: ICourseMemberData) => {
  161. statusChange(data);
  162. },
  163. };
  164. setStatus(actionParam);
  165. }}
  166. >
  167. {intl.formatMessage({
  168. id: `course.member.status.${action}.button`,
  169. })}
  170. </Button>
  171. ) : (
  172. <></>
  173. )}
  174. </>
  175. );
  176. };
  177. export default UserActionWidget;