CourseHead.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. //课程详情图片标题按钮主讲人组合
  2. import { Link } from "react-router";
  3. import { Image, Space, Col, Row, Breadcrumb, Tag } from "antd";
  4. import { Typography } from "antd";
  5. import { HomeOutlined } from "@ant-design/icons";
  6. import { API_HOST } from "../../request";
  7. import type { ICourseDataResponse } from "../../api/Course";
  8. import { useIntl } from "react-intl";
  9. import Status from "./Status";
  10. import moment from "moment";
  11. import User from "../auth/User";
  12. const { Title, Text } = Typography;
  13. const courseDuration = (startAt?: string, endAt?: string) => {
  14. let labelDuration = "";
  15. if (moment().isBefore(startAt)) {
  16. labelDuration = "未开始";
  17. } else if (moment().isBefore(endAt)) {
  18. labelDuration = "进行中";
  19. } else {
  20. labelDuration = "已经结束";
  21. }
  22. return <Tag>{labelDuration}</Tag>;
  23. };
  24. interface IWidget {
  25. data?: ICourseDataResponse;
  26. }
  27. const CourseHeadWidget = ({ data }: IWidget) => {
  28. const intl = useIntl();
  29. const duration = courseDuration(data?.start_at, data?.end_at);
  30. let signUp = "";
  31. if (moment().isBefore(moment(data?.sign_up_start_at))) {
  32. signUp = "未开始";
  33. } else if (
  34. moment().isBetween(
  35. moment(data?.sign_up_start_at),
  36. moment(data?.sign_up_end_at)
  37. )
  38. ) {
  39. signUp = "可报名";
  40. } else if (moment().isAfter(moment(data?.sign_up_end_at))) {
  41. signUp = "已结束";
  42. }
  43. return (
  44. <>
  45. <Row>
  46. <Col flex="auto"></Col>
  47. <Col flex="960px">
  48. <Space orientation="vertical">
  49. <Breadcrumb>
  50. <Breadcrumb.Item>
  51. <HomeOutlined />
  52. </Breadcrumb.Item>
  53. <Breadcrumb.Item>
  54. <Link to="/course/list">
  55. <Text>课程</Text>
  56. </Link>
  57. </Breadcrumb.Item>
  58. <Breadcrumb.Item>{data?.title}</Breadcrumb.Item>
  59. </Breadcrumb>
  60. <Space>
  61. <Image
  62. width={200}
  63. style={{ borderRadius: 12 }}
  64. src={
  65. data?.cover_url && data?.cover_url.length > 1
  66. ? data?.cover_url[1]
  67. : undefined
  68. }
  69. preview={{
  70. src:
  71. data?.cover_url && data?.cover_url.length > 0
  72. ? data?.cover_url[0]
  73. : undefined,
  74. }}
  75. fallback={`${API_HOST}/app/course/img/default.jpg`}
  76. />
  77. <Space orientation="vertical">
  78. <Title level={3}>{data?.title}</Title>
  79. <Title level={5}>{data?.subtitle}</Title>
  80. <Text>
  81. <Space>
  82. {"报名时间:"}
  83. {moment(data?.sign_up_start_at).format("YYYY-MM-DD")}——
  84. {moment(data?.sign_up_end_at).format("YYYY-MM-DD")}
  85. <Tag>{signUp}</Tag>
  86. </Space>
  87. </Text>
  88. <Text>
  89. <Space>
  90. {"课程时间:"}
  91. {moment(data?.start_at).format("YYYY-MM-DD")}——
  92. {moment(data?.end_at).format("YYYY-MM-DD")}
  93. {duration}
  94. </Space>
  95. </Text>
  96. <Text>
  97. {data?.join
  98. ? intl.formatMessage({
  99. id: `course.join.mode.${data.join}.message`,
  100. })
  101. : undefined}
  102. </Text>
  103. <Status data={data} />
  104. </Space>
  105. </Space>
  106. <Space>
  107. <Text>主讲人:</Text>{" "}
  108. <Text>
  109. <User {...data?.teacher} showAvatar={false} />
  110. </Text>
  111. </Space>
  112. </Space>
  113. </Col>
  114. <Col flex="auto"></Col>
  115. </Row>
  116. </>
  117. );
  118. };
  119. export default CourseHeadWidget;