CourseHead.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //课程详情图片标题按钮主讲人组合
  2. import { Link } from "react-router-dom";
  3. import { Image, Space, Col, Row, Breadcrumb } from "antd";
  4. import { Typography } from "antd";
  5. import { HomeOutlined } from "@ant-design/icons";
  6. import { IUser } from "../auth/User";
  7. import { API_HOST } from "../../request";
  8. import UserName from "../auth/UserName";
  9. import JoinCourse from "./JoinCourse";
  10. import { TCourseExpRequest, TCourseJoinMode } from "../api/Course";
  11. import { useIntl } from "react-intl";
  12. const { Title, Text } = Typography;
  13. interface IWidget {
  14. id?: string;
  15. title?: string;
  16. subtitle?: string;
  17. coverUrl?: string;
  18. startAt?: string;
  19. endAt?: string;
  20. teacher?: IUser;
  21. join?: TCourseJoinMode;
  22. exp?: TCourseExpRequest;
  23. }
  24. const Widget = ({
  25. id,
  26. title,
  27. subtitle,
  28. coverUrl,
  29. teacher,
  30. startAt,
  31. endAt,
  32. join,
  33. exp,
  34. }: IWidget) => {
  35. const intl = useIntl();
  36. const today = new Date();
  37. const courseStart = new Date(startAt ? startAt : 0);
  38. let labelJoin = "";
  39. switch (join) {
  40. case "open":
  41. labelJoin = "公开课程,开放报名。";
  42. break;
  43. case "manual":
  44. labelJoin = "报名后需要组织者审核。";
  45. break;
  46. case "invite":
  47. labelJoin = "内部邀请课程";
  48. break;
  49. default:
  50. break;
  51. }
  52. return (
  53. <>
  54. <Row>
  55. <Col flex="auto"></Col>
  56. <Col flex="960px">
  57. <Space direction="vertical">
  58. <Breadcrumb>
  59. <Breadcrumb.Item>
  60. <HomeOutlined />
  61. </Breadcrumb.Item>
  62. <Breadcrumb.Item>
  63. <Link to="/course/list">课程</Link>
  64. </Breadcrumb.Item>
  65. <Breadcrumb.Item>{title}</Breadcrumb.Item>
  66. </Breadcrumb>
  67. <Space>
  68. <Image
  69. width={200}
  70. style={{ borderRadius: 12 }}
  71. src={API_HOST + "/" + coverUrl}
  72. fallback={`${API_HOST}/app/course/img/default.jpg`}
  73. />
  74. <Space direction="vertical">
  75. <Title level={3}>{title}</Title>
  76. <Title level={5}>{subtitle}</Title>
  77. <Text>
  78. {startAt}——{endAt}
  79. </Text>
  80. <Text>
  81. {intl.formatMessage({
  82. id: `course.join.mode.${join}.message`,
  83. })}
  84. </Text>
  85. <JoinCourse
  86. courseId={id ? id : ""}
  87. expRequest={exp}
  88. joinMode={join}
  89. startAt={startAt}
  90. />
  91. </Space>
  92. </Space>
  93. <div>
  94. 主讲人: <UserName {...teacher} />
  95. </div>
  96. </Space>
  97. </Col>
  98. <Col flex="auto"></Col>
  99. </Row>
  100. </>
  101. );
  102. };
  103. export default Widget;
  104. /*
  105. <Button type="primary">关注</Button>
  106. <Button type="primary" disabled>
  107. 已关注
  108. </Button>
  109. */