SignUp.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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 type {
  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?: (data: ICourseMemberData) => void;
  28. }
  29. const SignUpWidget = ({
  30. courseId,
  31. signUpMessage,
  32. joinMode,
  33. expRequest,
  34. onStatusChanged,
  35. }: IWidget) => {
  36. const user = useAppSelector(_currentUser);
  37. const intl = useIntl();
  38. return (
  39. <Button
  40. type="primary"
  41. onClick={() => {
  42. confirm({
  43. title: "你想要报名课程吗?",
  44. icon: <ExclamationCircleFilled />,
  45. content: (
  46. <div>
  47. <div>
  48. {signUpMessage ? (
  49. <Marked text={signUpMessage} />
  50. ) : (
  51. intl.formatMessage({
  52. id: `course.join.mode.${joinMode}.message`,
  53. })
  54. )}
  55. </div>
  56. <Text type="danger">
  57. {intl.formatMessage({
  58. id: `course.exp.request.${expRequest}.message`,
  59. })}
  60. </Text>
  61. </div>
  62. ),
  63. onOk() {
  64. return post<ICourseMemberData, ICourseMemberResponse>(
  65. "/v2/course-member",
  66. {
  67. user_id: user?.id ? user?.id : "",
  68. role: "student",
  69. course_id: courseId ? courseId : "",
  70. operating: "sign_up",
  71. }
  72. )
  73. .then((json) => {
  74. console.log("add member", json);
  75. if (json.ok) {
  76. console.log("new", json.data);
  77. if (typeof onStatusChanged !== "undefined") {
  78. onStatusChanged(json.data);
  79. }
  80. message.success(
  81. intl.formatMessage({ id: "flashes.success" })
  82. );
  83. } else {
  84. message.error(json.message);
  85. }
  86. })
  87. .catch((error) => {
  88. message.error(error);
  89. });
  90. },
  91. });
  92. }}
  93. >
  94. 报名
  95. </Button>
  96. );
  97. };
  98. export default SignUpWidget;