visuddhinanda 1 год назад
Родитель
Сommit
bf3f67a2dd
1 измененных файлов с 174 добавлено и 0 удалено
  1. 174 0
      dashboard/src/components/course/CourseInvite.tsx

+ 174 - 0
dashboard/src/components/course/CourseInvite.tsx

@@ -0,0 +1,174 @@
+import { PlusOutlined } from "@ant-design/icons";
+import {
+  ProFormInstance,
+  ProFormSelect,
+  StepsForm,
+} from "@ant-design/pro-components";
+import { Alert, Button, Modal, Result, message } from "antd";
+import { useRef, useState } from "react";
+import { useIntl } from "react-intl";
+import { get, post } from "../../request";
+import { ICourseMemberData, ICourseMemberResponse } from "../api/Course";
+import { IUserListResponse } from "../api/Auth";
+
+interface IFormData {
+  userId: string;
+  role: string;
+}
+
+interface IWidget {
+  courseId?: string;
+  onCreated?: Function;
+}
+
+const CourseInviteWidget = ({ courseId, onCreated }: IWidget) => {
+  const intl = useIntl();
+  const [visible, setVisible] = useState(false);
+  const [curr, setCurr] = useState<ICourseMemberData>();
+  const [userId, setUserId] = useState<string>();
+
+  const formRef = useRef<ProFormInstance>();
+
+  return (
+    <>
+      <Button type="primary" onClick={() => setVisible(true)}>
+        <PlusOutlined />
+        邀请
+      </Button>
+      <Modal
+        title="邀请"
+        width={600}
+        onCancel={() => setVisible(false)}
+        open={visible}
+        footer={false}
+        destroyOnClose
+      >
+        <StepsForm<IFormData>
+          formRef={formRef}
+          onFinish={async (values) => {
+            console.log(values);
+            setVisible(false);
+            message.success("提交成功");
+          }}
+          formProps={{
+            validateMessages: {
+              required: "此项为必填项",
+            },
+          }}
+        >
+          <StepsForm.StepForm
+            name="base"
+            title="选择用户"
+            onFinish={async (values) => {
+              setUserId(values.userId);
+              const url = `/v2/course-member/${courseId}?user_uid=${values.userId}`;
+              console.info("api request", url, values);
+              const json = await get<ICourseMemberResponse>(url);
+              if (json.ok) {
+                setCurr(json.data);
+              } else {
+                setCurr(undefined);
+              }
+              return true;
+            }}
+          >
+            <ProFormSelect
+              width="sm"
+              name="userId"
+              label={intl.formatMessage({ id: "forms.fields.user.label" })}
+              showSearch
+              debounceTime={300}
+              request={async ({ keyWords }) => {
+                console.log("keyWord", keyWords);
+                const json = await get<IUserListResponse>(
+                  `/v2/user?view=key&key=${keyWords}`
+                );
+                const userList = json.data.rows.map((item) => {
+                  return {
+                    value: item.id,
+                    label: `${item.userName}-${item.nickName}`,
+                  };
+                });
+                console.log("json", userList);
+                return userList;
+              }}
+              placeholder={intl.formatMessage({
+                id: "forms.message.user.required",
+              })}
+              rules={[
+                {
+                  required: true,
+                  message: intl.formatMessage({
+                    id: "forms.message.user.required",
+                  }),
+                },
+              ]}
+            />
+          </StepsForm.StepForm>
+          <StepsForm.StepForm
+            name="checkbox"
+            title="选择身份"
+            onFinish={async (values) => {
+              if (typeof courseId !== "undefined" && userId) {
+                const url = "/v2/course-member";
+                const data: ICourseMemberData = {
+                  user_id: userId,
+                  role: values.role,
+                  course_id: courseId,
+                  status: "invited",
+                };
+                console.info("api request", url, data);
+                const json = await post<
+                  ICourseMemberData,
+                  ICourseMemberResponse
+                >(url, data);
+
+                console.info("add member api response", json);
+                if (json.ok) {
+                  if (typeof onCreated !== "undefined") {
+                    onCreated();
+                  }
+                } else {
+                  console.error(json.message);
+                  return false;
+                }
+              } else {
+                return false;
+              }
+              return true;
+            }}
+          >
+            {curr ? (
+              <Alert
+                message={`用户 ${curr?.user?.nickName} 身份 ${curr?.role} 状态 ${curr?.status} `}
+              />
+            ) : (
+              <></>
+            )}
+            <ProFormSelect
+              width="sm"
+              name="role"
+              label={intl.formatMessage({ id: "forms.fields.type.label" })}
+              valueEnum={{
+                student: intl.formatMessage({
+                  id: "forms.fields.student.label",
+                }),
+                assistant: intl.formatMessage({
+                  id: "forms.fields.assistant.label",
+                }),
+                manager: intl.formatMessage({
+                  id: "auth.role.manager",
+                }),
+              }}
+            />
+          </StepsForm.StepForm>
+          <StepsForm.StepForm name="time" title="完成">
+            <Result status="success" title="已经成功邀请" />
+          </StepsForm.StepForm>
+        </StepsForm>
+      </Modal>
+    </>
+  );
+};
+
+export default CourseInviteWidget;