CourseInvite.tsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import { PlusOutlined } from "@ant-design/icons";
  2. import {
  3. type ProFormInstance,
  4. ProFormSelect,
  5. StepsForm,
  6. } from "@ant-design/pro-components";
  7. import { Alert, Button, Modal, Result, message } from "antd";
  8. import { useRef, useState } from "react";
  9. import { useIntl } from "react-intl";
  10. import { get, post } from "../../request";
  11. import type {
  12. ICourseMemberData,
  13. ICourseMemberResponse,
  14. } from "../../api/Course";
  15. import type { IUserListResponse } from "../../api/Auth";
  16. interface IFormData {
  17. userId: string;
  18. role: string;
  19. }
  20. interface IWidget {
  21. courseId?: string;
  22. onCreated?: Function;
  23. }
  24. const CourseInviteWidget = ({ courseId, onCreated }: IWidget) => {
  25. const intl = useIntl();
  26. const [visible, setVisible] = useState(false);
  27. const [curr, setCurr] = useState<ICourseMemberData>();
  28. const [userId, setUserId] = useState<string>();
  29. const formRef = useRef<ProFormInstance | undefined>(undefined);
  30. return (
  31. <>
  32. <Button type="primary" onClick={() => setVisible(true)}>
  33. <PlusOutlined />
  34. 邀请
  35. </Button>
  36. <Modal
  37. title="邀请"
  38. width={600}
  39. onCancel={() => setVisible(false)}
  40. open={visible}
  41. footer={false}
  42. destroyOnClose
  43. >
  44. <StepsForm<IFormData>
  45. formRef={formRef}
  46. onFinish={async (values) => {
  47. console.log(values);
  48. setVisible(false);
  49. message.success("提交成功");
  50. }}
  51. formProps={{
  52. validateMessages: {
  53. required: "此项为必填项",
  54. },
  55. }}
  56. >
  57. <StepsForm.StepForm
  58. name="base"
  59. title="选择用户"
  60. onFinish={async (values) => {
  61. setUserId(values.userId);
  62. const url = `/v2/course-member/${courseId}?user_uid=${values.userId}`;
  63. console.info("api request", url, values);
  64. const json = await get<ICourseMemberResponse>(url);
  65. if (json.ok) {
  66. setCurr(json.data);
  67. } else {
  68. setCurr(undefined);
  69. }
  70. return true;
  71. }}
  72. >
  73. <ProFormSelect
  74. width="sm"
  75. name="userId"
  76. label={intl.formatMessage({ id: "forms.fields.user.label" })}
  77. showSearch
  78. debounceTime={300}
  79. request={async ({ keyWords }) => {
  80. console.log("keyWord", keyWords);
  81. const json = await get<IUserListResponse>(
  82. `/v2/user?view=key&key=${keyWords}`
  83. );
  84. const userList = json.data.rows.map((item) => {
  85. return {
  86. value: item.id,
  87. label: `${item.userName}-${item.nickName}`,
  88. };
  89. });
  90. console.log("json", userList);
  91. return userList;
  92. }}
  93. placeholder={intl.formatMessage({
  94. id: "forms.message.user.required",
  95. })}
  96. rules={[
  97. {
  98. required: true,
  99. message: intl.formatMessage({
  100. id: "forms.message.user.required",
  101. }),
  102. },
  103. ]}
  104. />
  105. </StepsForm.StepForm>
  106. <StepsForm.StepForm
  107. name="checkbox"
  108. title="选择身份"
  109. onFinish={async (values) => {
  110. if (typeof courseId !== "undefined" && userId) {
  111. const url = "/v2/course-member";
  112. const data: ICourseMemberData = {
  113. user_id: userId,
  114. role: values.role,
  115. course_id: courseId,
  116. status: "invited",
  117. };
  118. console.info("api request", url, data);
  119. const json = await post<
  120. ICourseMemberData,
  121. ICourseMemberResponse
  122. >(url, data);
  123. console.info("add member api response", json);
  124. if (json.ok) {
  125. if (typeof onCreated !== "undefined") {
  126. onCreated();
  127. }
  128. } else {
  129. console.error(json.message);
  130. return false;
  131. }
  132. } else {
  133. return false;
  134. }
  135. return true;
  136. }}
  137. >
  138. {curr ? (
  139. <Alert
  140. message={`用户 ${curr?.user?.nickName} 身份 ${curr?.role} 状态 ${curr?.status} `}
  141. />
  142. ) : (
  143. <></>
  144. )}
  145. <ProFormSelect
  146. width="sm"
  147. name="role"
  148. label={intl.formatMessage({ id: "forms.fields.type.label" })}
  149. valueEnum={{
  150. student: intl.formatMessage({
  151. id: "forms.fields.student.label",
  152. }),
  153. assistant: intl.formatMessage({
  154. id: "forms.fields.assistant.label",
  155. }),
  156. manager: intl.formatMessage({
  157. id: "auth.role.manager",
  158. }),
  159. }}
  160. />
  161. </StepsForm.StepForm>
  162. <StepsForm.StepForm name="time" title="完成">
  163. <Result status="success" title="已经成功邀请" />
  164. </StepsForm.StepForm>
  165. </StepsForm>
  166. </Modal>
  167. </>
  168. );
  169. };
  170. export default CourseInviteWidget;