Browse Source

把fetch移动到这里

visuddhinanda 2 years ago
parent
commit
74cf503ce3
1 changed files with 124 additions and 18 deletions
  1. 124 18
      dashboard/src/components/course/UserAction.tsx

+ 124 - 18
dashboard/src/components/course/UserAction.tsx

@@ -1,26 +1,119 @@
 /**
  * 学生接受课程管理员的邀请 参加课程
  */
-import { Button } from "antd";
+import { Button, Modal } from "antd";
 import { useIntl } from "react-intl";
+import { ExclamationCircleFilled } from "@ant-design/icons";
 
 import {
   ICourseMemberData,
+  ICourseMemberResponse,
   TCourseMemberAction,
+  TCourseMemberStatus,
   actionMap,
 } from "../api/Course";
-import { ISetStatus, setStatus } from "./Status";
+
+import { IUser } from "../auth/User";
+import { post, put } from "../../request";
+
+export interface ISetStatus {
+  courseMemberId?: string;
+  courseId?: string;
+  courseName?: string;
+  user?: IUser;
+  message?: string;
+  status: TCourseMemberStatus;
+  onSuccess?: Function;
+  onError?: Function;
+}
+
+const statusQuery = ({
+  courseMemberId,
+  courseId,
+  user,
+  status,
+}: ISetStatus) => {
+  let url = "/v2/course-member/";
+  let data: ICourseMemberData;
+  if (courseMemberId) {
+    //修改现有数据
+    url += courseMemberId;
+    data = {
+      user_id: "",
+      course_id: "",
+      status: status,
+    };
+    console.info("api request", url, data);
+    return put<ICourseMemberData, ICourseMemberResponse>(url, data);
+  } else {
+    //新增数据
+    data = {
+      user_id: user?.id ? user?.id : "",
+      role: "student",
+      course_id: courseId ? courseId : "",
+      status: status,
+    };
+    console.info("api request", url, data);
+    return post<ICourseMemberData, ICourseMemberResponse>(url, data);
+  }
+};
+export const setStatus = ({
+  status,
+  courseMemberId,
+  courseId,
+  user,
+  message,
+  onSuccess,
+  onError,
+}: ISetStatus) => {
+  Modal.confirm({
+    icon: <ExclamationCircleFilled />,
+    content: message,
+    onOk() {
+      const query: ISetStatus = {
+        status: status,
+        courseMemberId: courseMemberId,
+        courseId: courseId,
+        user: user,
+      };
+      return statusQuery(query)
+        .then((json) => {
+          console.debug("AcceptCourse api response", json);
+          if (json.ok) {
+            console.debug("accepted", json.data);
+            if (typeof onSuccess !== "undefined") {
+              onSuccess(json.data);
+            }
+          } else {
+            if (typeof onError !== "undefined") {
+              onError(json.message);
+            }
+          }
+        })
+        .catch((error) => {
+          console.error(error);
+          if (typeof onError !== "undefined") {
+            onError(error);
+          }
+        });
+    },
+  });
+};
 
 interface IWidget {
   action: TCourseMemberAction;
   currUser?: ICourseMemberData;
+  courseId?: string;
   courseName?: string;
+  user?: IUser;
   onStatusChanged?: Function;
 }
 const UserActionWidget = ({
   action,
   currUser,
+  courseId,
   courseName,
+  user,
   onStatusChanged,
 }: IWidget) => {
   const intl = useIntl();
@@ -31,28 +124,41 @@ const UserActionWidget = ({
     }
   };
   const status = actionMap(action);
+  let buttonDisable: boolean;
+  if (!currUser?.id && !(courseId && user)) {
+    buttonDisable = true;
+  } else {
+    buttonDisable = false;
+  }
   return (
     <>
       {status ? (
         <Button
-          type={action === "join" || action === "apply" ? "primary" : undefined}
+          disabled={buttonDisable}
+          type={
+            action === "join" || action === "apply" || action === "agree"
+              ? "primary"
+              : undefined
+          }
+          danger={action === "disagree" || action === "leave" ? true : false}
           onClick={() => {
-            if (currUser?.id) {
-              const actionParam: ISetStatus = {
-                courseMemberId: currUser.id,
-                message: intl.formatMessage(
-                  {
-                    id: `course.member.status.${action}.message`,
-                  },
-                  { course: courseName }
-                ),
-                status: status,
-                onSuccess: (data: ICourseMemberData) => {
-                  statusChange(data);
+            console.debug("currUser", currUser);
+            const actionParam: ISetStatus = {
+              courseMemberId: currUser?.id,
+              courseId: courseId,
+              user: user,
+              message: intl.formatMessage(
+                {
+                  id: `course.member.status.${action}.message`,
                 },
-              };
-              setStatus(actionParam);
-            }
+                { course: courseName }
+              ),
+              status: status,
+              onSuccess: (data: ICourseMemberData) => {
+                statusChange(data);
+              },
+            };
+            setStatus(actionParam);
           }}
         >
           {intl.formatMessage({