|
|
@@ -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({
|