index.jsx 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import { useState, useEffect, useCallback } from "react";
  2. import { useSelector } from "react-redux";
  3. import Taro from "@tarojs/taro";
  4. import { ScrollView } from "@tarojs/components";
  5. import withLayout from "@/layout";
  6. import ProjectListItem from "@/components/ProjectListItem/index";
  7. // import ShareToCircle from '@/components/ShareToCircle/index'
  8. import FirstScreen from "@/components/FirstScreen";
  9. import { fetch } from "@/utils/request";
  10. import { API_BANNER_LIST, API_INDEX_PROJECTS } from "@/constants/api";
  11. import useParams from "@/utils/hooks/useParams";
  12. import useShare from "@/utils/hooks/useShare";
  13. import useScreen from "@/utils/hooks/useScreen";
  14. import nav2Target from "@/utils/nav2Target";
  15. import ChatIcon from "@/components/ChatIcon/index";
  16. import { ROLE_CODE } from "@/constants/user";
  17. import Location from "./components/Location/index";
  18. import Banner from "./components/Banner/index";
  19. import Menu from "./components/Menu/index";
  20. import HotRecommend from "./components/HotRecommend/index";
  21. import NewestNnews from "./components/NewestNnews/index";
  22. import LiveSale from "./components/LiveSale/index";
  23. import ColumnTitle from "./components/ColumnTitle/index";
  24. import useIndexShareContent from "./useIndexShareContent";
  25. import "./index.scss";
  26. export default withLayout(props => {
  27. const { city, router, person, trackData, page, mode } = props;
  28. const isSinglePage = mode === "singlePage";
  29. // 本页面分享或者海报参数
  30. const paramsRef = useParams({ person, from: `${page.type}_share` });
  31. const { miniApp } = useSelector(s => s.user.userInfo);
  32. const [BannerList, setBannerList] = useState([]);
  33. const [ProjectList, setProjectList] = useState([]);
  34. const [ShowHotRecommend, setShowHotRecommend] = useState(false);
  35. const [ShowNewestNnews, setShowNewestNnews] = useState(false);
  36. const [ShowLive, setShowLive] = useState(false);
  37. const shareContent = useIndexShareContent(miniApp, paramsRef, router);
  38. // 开屏广告
  39. const [screenInfo, screenVisible, toggleShowScreen] = useScreen(
  40. city.id,
  41. person
  42. );
  43. // 分享
  44. useShare(shareContent, trackData);
  45. const GetBanner = () => {
  46. // 获取banner
  47. fetch({
  48. url: `${API_BANNER_LIST}/banner`,
  49. method: "get",
  50. payload: { cityId: city.id, showPosition: "index" }
  51. }).then(res => {
  52. setBannerList(res || []);
  53. });
  54. };
  55. const GetProjectList = () => {
  56. // 获取项目列表
  57. fetch({
  58. url: API_INDEX_PROJECTS,
  59. method: "get",
  60. payload: { cityId: city.id, pageNum: 1, pageSize: 20 }
  61. }).then(res => {
  62. setProjectList(res.records || []);
  63. });
  64. };
  65. const HotRecommendChange = e => {
  66. setShowHotRecommend(e);
  67. };
  68. const NewestNnewsChange = e => {
  69. setShowNewestNnews(e);
  70. };
  71. const LiveChange = e => {
  72. setShowLive(e);
  73. };
  74. const handleScreen = () => {
  75. toggleShowScreen();
  76. if (person.personType === ROLE_CODE.BROKER) {
  77. if (screenInfo.linkPage) {
  78. const queryStr = screenInfo.pageParam ? screenInfo.pageParam : "";
  79. Taro.navigateTo({ url: `${screenInfo.linkPage}?${queryStr}` });
  80. }
  81. } else {
  82. nav2Target(screenInfo);
  83. }
  84. };
  85. useEffect(() => {
  86. if (city?.id) {
  87. GetBanner();
  88. GetProjectList();
  89. }
  90. }, [city?.id]);
  91. const toBuilingList = useCallback(
  92. () => Taro.navigateTo({ url: `/pages/index/buildingList/index` }),
  93. []
  94. );
  95. return (
  96. <view className="Page Index">
  97. <ChatIcon />
  98. {/* 开屏广告 */}
  99. <FirstScreen
  100. info={screenInfo}
  101. visible={screenVisible && !isSinglePage}
  102. onClick={handleScreen}
  103. onClose={toggleShowScreen}
  104. />
  105. <ScrollView scroll-y>
  106. <view className="PageContent">
  107. {/* 定位 */}
  108. <view className="Location">
  109. <Location></Location>
  110. </view>
  111. {/* banner */}
  112. <view className="Banner">
  113. <view>
  114. <view>
  115. <Banner List={BannerList}></Banner>
  116. </view>
  117. </view>
  118. </view>
  119. {/* 菜单 */}
  120. <view className="Menu">
  121. <Menu></Menu>
  122. </view>
  123. {/* 成交喜报 */}
  124. {person?.personType === ROLE_CODE.BROKER && (
  125. <view
  126. className="NewestNnews"
  127. style={{ display: ShowNewestNnews ? "block" : "none" }}
  128. >
  129. {/* <ColumnTitle Name='热门推荐' Icon='icon-shoucang'></ColumnTitle> */}
  130. <NewestNnews change={NewestNnewsChange}></NewestNnews>
  131. </view>
  132. )}
  133. {/* 热门推荐 */}
  134. <view
  135. className="HotRecommend"
  136. style={{ display: ShowHotRecommend ? "block" : "none" }}
  137. >
  138. <ColumnTitle Name="热门推荐" Icon="icon-shoucang"></ColumnTitle>
  139. <HotRecommend change={HotRecommendChange}></HotRecommend>
  140. </view>
  141. {/* 直播购房 */}
  142. <view
  143. className="LiveSale"
  144. style={{ display: ShowLive ? "block" : "none" }}
  145. >
  146. <ColumnTitle
  147. Name="直播购房"
  148. Icon="icon-yinpin"
  149. ShowMore
  150. ToMore={() => {
  151. Taro.switchTab({ url: `/pages/video/index` });
  152. }}
  153. ></ColumnTitle>
  154. <LiveSale change={LiveChange}></LiveSale>
  155. </view>
  156. {/* 全部项目 */}
  157. <view className="AllProject">
  158. <ColumnTitle
  159. Name="推荐楼盘"
  160. Icon="icon-aixin"
  161. ShowMore
  162. ToMore={toBuilingList}
  163. ></ColumnTitle>
  164. <view className="ProjectList">
  165. {ProjectList.map((item, index) => (
  166. <ProjectListItem
  167. Data={item}
  168. key={`ProjectListItem-${index}`}
  169. ></ProjectListItem>
  170. ))}
  171. </view>
  172. </view>
  173. {/* bottom */}
  174. <view className="PageBottom" onClick={toBuilingList}>
  175. <text>点击查看更多</text>
  176. </view>
  177. </view>
  178. </ScrollView>
  179. </view>
  180. );
  181. });