page.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import React from 'react';
  2. import './index.less';
  3. import Assets from '@src/components/Assets';
  4. import Page from '@src/containers/Page';
  5. import { getMap } from '@src/services/Tools';
  6. import Button from '../../../components/Button';
  7. import { SingleItem } from '../../../components/Item';
  8. import Footer from '../../../components/Footer';
  9. import { Contact } from '../../../components/Other';
  10. import { Main } from '../../../stores/main';
  11. import { Course } from '../../../stores/course';
  12. import { User } from '../../../stores/user';
  13. import { Order } from '../../../stores/order';
  14. import { ServiceKey, ServiceParamMap } from '../../../../Constant';
  15. const serviceIconMap = {
  16. textbook: 'mokao',
  17. vip: 'VIP_1',
  18. qx_cat: 'jijing',
  19. };
  20. export default class extends Page {
  21. constructor(props) {
  22. props.size = 10;
  23. super(props);
  24. }
  25. init() {
  26. Main.getBase()
  27. .then(result => {
  28. this.setState({ base: result });
  29. });
  30. }
  31. initData() {
  32. const { id } = this.params;
  33. Course.getPackage(id)
  34. .then(result => {
  35. this.setState({ data: result });
  36. });
  37. }
  38. buy() {
  39. const { data } = this.props;
  40. User.needLogin().then(() => {
  41. Order.speedPay({ productType: 'course_package', productId: data.id })
  42. .then(result => {
  43. User.needPay(result)
  44. .then(() => {
  45. linkTo('/my/course');
  46. });
  47. });
  48. });
  49. }
  50. add() {
  51. const { data } = this.props;
  52. User.needLogin().then(() => {
  53. Order.addCheckout({ productType: 'course_package', productId: data.id })
  54. .then(() => {
  55. this.setState({ add: true });
  56. });
  57. });
  58. }
  59. renderView() {
  60. const { data = {}, base = {}, add } = this.state;
  61. return (
  62. <div>
  63. <div className="top content t-8">
  64. 千行课堂 > 全部套餐 > {data.title} > <span className="t-1">套餐详情</span>
  65. </div>
  66. <div className="center content">
  67. <div className="t-1 t-s-20 m-b-2">
  68. {data.title}
  69. <div className="action f-r">
  70. <Button className="m-r-1" radius size="lager" onClick={() => this.buy()}>
  71. 立即购买
  72. </Button>
  73. <Button theme="default" radius size="lager" disabled={data.add || add} onClick={() => this.add()}>
  74. <Assets name="add" />
  75. </Button>
  76. </div>
  77. </div>
  78. <div className="t-7 t-s-18 f-w-b m-b-1">套餐价: ¥ {data.price}</div>
  79. <div className="t-1 t-s-16 desc">{data.description}</div>
  80. <div className="main-title">包含课程</div>
  81. <div className="list">
  82. {(data.courses || []).map(item => {
  83. return <SingleItem noAction data={item} />;
  84. })}
  85. </div>
  86. <div className="main-title">配套服务</div>
  87. <div className="list">
  88. <div className="other-item d-i-b">
  89. <Assets name="" />
  90. </div>
  91. <div className="other-item d-i-b">
  92. <Assets name="" />
  93. </div>
  94. </div>
  95. <div className="main-title">赠送服务</div>
  96. <div className="list">
  97. {data.gift &&
  98. ServiceKey.map(row => {
  99. if (!data.gift[row.value]) return null;
  100. const list = ServiceParamMap[row.value];
  101. const map = getMap(list || [], 'value', 'label');
  102. return <div className="service-item d-i-b">
  103. <Assets name={serviceIconMap[row.value]} />
  104. <div className="t t-13 t-s-20 f-w-b">{row.label}</div>
  105. <div className="t-13">{list ? map[data.gift[row.value]] : data.gift[row.value]}</div>
  106. </div>;
  107. })}
  108. </div>
  109. </div>
  110. <Contact data={base.contact} />
  111. <Footer />
  112. </div>
  113. );
  114. }
  115. }