SignUp.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /**
  2. * 报名按钮
  3. * 已经报名显示报名状态
  4. * 未报名显示报名按钮以及必要的提示
  5. */
  6. import { Button, message, Modal, Typography } from "antd";
  7. import { useIntl } from "react-intl";
  8. import { ExclamationCircleFilled } from "@ant-design/icons";
  9. import { useAppSelector } from "../../hooks";
  10. import { currentUser as _currentUser } from "../../reducers/current-user";
  11. import { post } from "../../request";
  12. import {
  13. ICourseMemberData,
  14. ICourseMemberResponse,
  15. TCourseExpRequest,
  16. TCourseJoinMode,
  17. } from "../api/Course";
  18. import Marked from "../general/Marked";
  19. const { confirm } = Modal;
  20. const { Text } = Typography;
  21. interface IWidget {
  22. courseId: string;
  23. startAt?: string;
  24. signUpMessage?: string | null;
  25. joinMode?: TCourseJoinMode;
  26. expRequest?: TCourseExpRequest;
  27. onStatusChanged?: Function;
  28. }
  29. const SignUpWidget = ({
  30. courseId,
  31. signUpMessage,
  32. joinMode,
  33. startAt,
  34. expRequest,
  35. onStatusChanged,
  36. }: IWidget) => {
  37. const user = useAppSelector(_currentUser);
  38. const intl = useIntl();
  39. return (
  40. <Button
  41. type="primary"
  42. onClick={() => {
  43. confirm({
  44. title: "你想要报名课程吗?",
  45. icon: <ExclamationCircleFilled />,
  46. content: (
  47. <div>
  48. <div>
  49. {signUpMessage ? (
  50. <Marked text={signUpMessage} />
  51. ) : (
  52. intl.formatMessage({
  53. id: `course.join.mode.${joinMode}.message`,
  54. })
  55. )}
  56. </div>
  57. <Text type="danger">
  58. {intl.formatMessage({
  59. id: `course.exp.request.${expRequest}.message`,
  60. })}
  61. </Text>
  62. </div>
  63. ),
  64. onOk() {
  65. return post<ICourseMemberData, ICourseMemberResponse>(
  66. "/v2/course-member",
  67. {
  68. user_id: user?.id ? user?.id : "",
  69. role: "student",
  70. course_id: courseId ? courseId : "",
  71. operating: "sign_up",
  72. }
  73. )
  74. .then((json) => {
  75. console.log("add member", json);
  76. if (json.ok) {
  77. console.log("new", json.data);
  78. if (typeof onStatusChanged !== "undefined") {
  79. onStatusChanged(json.data);
  80. }
  81. message.success(
  82. intl.formatMessage({ id: "flashes.success" })
  83. );
  84. } else {
  85. message.error(json.message);
  86. }
  87. })
  88. .catch((error) => {
  89. message.error(error);
  90. });
  91. },
  92. });
  93. }}
  94. >
  95. 报名
  96. </Button>
  97. );
  98. };
  99. export default SignUpWidget;