foodDetails.jsx 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. import Taro, { useShareAppMessage } from "@tarojs/taro";
  2. import CustomNav from "@/components/CustomNav";
  3. import withLayout from "@/layouts";
  4. import {
  5. getShopDetail,
  6. getShopPackage,
  7. getExtendContent,
  8. } from "@/services/home";
  9. import { getVerifyTargetList } from "@/services/payOrder";
  10. import { useState, useEffect, useRef } from "react";
  11. import { Button, Swiper, SwiperItem } from "@tarojs/components";
  12. import Star from "@/components/Star/Star.jsx";
  13. import NoData from '@/components/NoData'
  14. import Cards from "@/components/foodCards/foodCards.jsx";
  15. import SpinBox from "@/components/Spin/SpinBox";
  16. import TabIcon from "@/components/HorTabbar/TabIcon";
  17. import ax from "@/assets/icons/housemantj/onlove.png";
  18. import yysj from "@/assets/icons/housemantj/openTime.png";
  19. import dw from "@/assets/icons/housemantj/loc.png";
  20. import zhuandao from "@/assets/icons/housemantj/backTop.png";
  21. import titlezs from "@/assets/icons/housemantj/titleTip.png";
  22. import showMore from "@/assets/icons/housemantj/setMore.png";
  23. import share from "@/assets/icons/housemantj/touristShare.png";
  24. import good from "@/assets/icons/housemantj/touristGood.png";
  25. import baozan from "@/assets/icons/housemantj/bgood.png";
  26. import weibaozan from "@/assets/icons/housemantj/unLike.png";
  27. import useSave from "@/utils/hooks/useSave";
  28. import useLike from "@/utils/hooks/useLike";
  29. import Extend from "../components/Extend/extend";
  30. import "./foodDetails.less";
  31. export default withLayout((props) => {
  32. const { router, person, location } = props;
  33. const { id, subOrderId, scene } = props.router.params;
  34. useEffect(() => {
  35. if (id && (scene || subOrderId)) {
  36. getVerifyTargetList({
  37. shopId: id,
  38. isMine: true,
  39. isVerified: 0,
  40. }).then((res) => {
  41. if (res?.records?.length > 0) {
  42. Taro.navigateTo({
  43. url: `/pages/TobeShop/index?id=${id}&subOrderId=${subOrderId}`,
  44. });
  45. }
  46. });
  47. }
  48. }, [id, scene, subOrderId]);
  49. //商铺基础信息
  50. const [loading, setLoading] = useState(false)
  51. const [detail, setDetail] = useState({});
  52. //商铺套餐
  53. const [spackage, setPackage] = useState([]);
  54. //banner图集数组
  55. const [imglist, setimglist] = useState([]);
  56. const [index, setIndex] = useState(0);
  57. const handchange = (e) => {
  58. setIndex(e.detail.current);
  59. };
  60. const [isSaved, toggleSave] = useSave(detail.isSaved, "shop", id);
  61. const [isLike, toggleLike] = useLike(detail.isLike, "shop", id);
  62. //当前套餐总数
  63. const [newpgNum, setNewpgNum] = useState(0);
  64. //全部套餐个数
  65. const [AllpgNum, setAllpgNum] = useState(0);
  66. //套餐当前页数
  67. const [page, setpage] = useState(2);
  68. const pgMore = () => {
  69. setpage(page + 1);
  70. getShopPackage(id, { pageNum: page }).then((res) => {
  71. setPackage([...spackage, ...res.records]);
  72. setNewpgNum(newpgNum + res.records.length);
  73. });
  74. };
  75. //本店指南
  76. const [extend, setExtend] = useState([]);
  77. //当前指南总数
  78. const [newextNum, setNewextNum] = useState(0);
  79. //全部指南个数
  80. const [AllextNum, setAllextNum] = useState(0);
  81. //指南当前页数
  82. const [epage, setepage] = useState(2);
  83. const extendMore = () => {
  84. setepage(epage + 1);
  85. getExtendContent("shop", id, { pageNum: epage }).then((res) => {
  86. setExtend([...extend, ...res.records]);
  87. setNewextNum(newextNum + res.records.length);
  88. });
  89. };
  90. const openMap = () => {
  91. Taro.openLocation({
  92. longitude: log.current - 0,
  93. latitude: lat.current - 0,
  94. name: detail.shopName,
  95. address: detail.address,
  96. scale: 12,
  97. });
  98. };
  99. const log = useRef("");
  100. const lat = useRef("");
  101. useEffect(() => {
  102. if (id) {
  103. setLoading(true)
  104. getShopDetail(id, { location }).then((res) => {
  105. setDetail(res);
  106. log.current = res.locaton.toString().split(",")[0];
  107. lat.current = res.locaton.toString().split(",")[1];
  108. setimglist(res.imageList || []);
  109. setLoading(false)
  110. }).catch(() => setLoading(false));
  111. getShopPackage(id).then((res) => {
  112. setPackage(res.records || []);
  113. setNewpgNum(res.records.length);
  114. setAllpgNum(res.total);
  115. });
  116. getExtendContent("shop", id).then((res) => {
  117. setExtend(res.records || []);
  118. setAllextNum(res.total);
  119. setNewextNum(res.records.length);
  120. });
  121. }
  122. }, [id]);
  123. const star = parseFloat(
  124. (
  125. (detail.sweetScore + detail.environmentScore + detail.serviceScore) / 3).toFixed(1)
  126. );
  127. // 分享
  128. useShareAppMessage(() => {
  129. return {
  130. title: detail.shopName,
  131. path: `/pages/details/foodDetails/foodDetails?id=${id}&subOrderId=${subOrderId}`,
  132. imageUrl: detail.poster,
  133. };
  134. });
  135. return (
  136. <view className='page-index'>
  137. <view className='index-navbar'>
  138. <CustomNav title='十公里' />
  139. </view>
  140. <SpinBox loading={loading} className='index-container' style={{ padding: '0 30rpx' }}>
  141. <scroll-view
  142. scrollY
  143. style={{ height: '100%' }}
  144. >
  145. <view className='storeDetails'>
  146. <Swiper
  147. className='swiper'
  148. circular
  149. current={index}
  150. onChange={handchange}
  151. >
  152. {imglist.map((item, inx) => (
  153. <SwiperItem key={inx}>
  154. <image src={item.url} mode='aspectFit' className='storeImage'>
  155. <view className='tpPage'>
  156. <text>
  157. {index + 1}/{imglist.length}
  158. </text>
  159. </view>
  160. </image>
  161. </SwiperItem>
  162. ))}
  163. </Swiper>
  164. <view className='storeJs'>
  165. <view style={{ overflow: "hidden" }}>
  166. <view className='storeName'>{detail.shopName}</view>
  167. <view className='sprice'>
  168. <text className='t1'>¥</text>
  169. {detail.averagePrice / 100}/人
  170. <view className='bzRight'>
  171. <image
  172. src={baozan}
  173. style={{
  174. width: "15px",
  175. height: "15px",
  176. marginRight: "11rpx",
  177. marginBottom: "-2px",
  178. }}
  179. />
  180. 爆赞{detail.likeNum}
  181. </view>
  182. </view>
  183. </view>
  184. <view className='appraise'>
  185. <Star star={star} />
  186. {star}
  187. <view style={{ float: "right", marginTop: "5px" }}>
  188. <text className='comment'>点评:</text>
  189. <text className='t1'>口味:{detail.sweetScore}</text>
  190. <text className='t1'>环境:{detail.environmentScore}</text>
  191. <text className='t1'>服务:{detail.serviceScore}</text>
  192. </view>
  193. </view>
  194. <view className='yysj'>
  195. <image src={yysj} className='yysjImg' />
  196. 营业时间:{detail.businessHours}
  197. </view>
  198. <view className='dpPosition' onClick={openMap}>
  199. <image src={dw} className='dwTip' />
  200. <view>
  201. {detail.address}
  202. <image src={zhuandao} className='zhuandao' />
  203. </view>
  204. </view>
  205. </view>
  206. </view>
  207. {
  208. spackage == '' && extend == "" ?
  209. <NoData /> :
  210. <>
  211. <view
  212. style={{
  213. position: "relative",
  214. display: spackage == "" ? "none" : "",
  215. }}
  216. >
  217. <view className='title'>
  218. <image src={titlezs} />
  219. <text>返现套餐</text>
  220. </view>
  221. {(spackage || []).map((item) => (
  222. <Cards key={item.packageId} editable='1' st={star} goshop='1' item={item} det={detail} />
  223. ))}
  224. <view
  225. className='showMore'
  226. style={{ display: newpgNum == AllpgNum ? "none" : "" }}
  227. onClick={pgMore}
  228. >
  229. <view>查看更多</view>
  230. <image src={showMore} className='moreTip' />
  231. </view>
  232. </view>
  233. <view
  234. style={{
  235. position: "relative",
  236. marginTop: '1em',
  237. display: extend == "" ? "none" : "",
  238. }}
  239. >
  240. <view className='title' style={{ margin: '50px 0 0 0' }} >
  241. <image src={titlezs} />
  242. <text>本店指南</text>
  243. </view>
  244. {(extend || []).map((item) => (
  245. <Extend key={item.extId} item={item} />
  246. ))}
  247. <view
  248. className='showMore'
  249. style={{ display: newextNum == AllextNum ? "none" : "" }}
  250. onClick={extendMore}
  251. >
  252. <view>查看更多</view>
  253. <image src={showMore} className='moreTip' />
  254. </view>
  255. </view>
  256. <view
  257. className='botton'
  258. style={{ display: newextNum == AllextNum ? "" : "none" }}
  259. >
  260. 这是我的底线
  261. </view>
  262. </>
  263. }
  264. </scroll-view>
  265. </SpinBox>
  266. <view className='index-tabber weui-tabbar' style={{ background: '#fff' }}>
  267. <view className='weui-tabbar__item'>
  268. <Button openType='share' className='purebtn'><TabIcon icon={share} text='分享' /></Button>
  269. </view>
  270. <view className='weui-tabbar__item' onClick={toggleLike}>
  271. <TabIcon icon={isLike > 0 ? baozan : weibaozan} text={isLike > 0 ? "已爆赞" : "爆赞"} />
  272. </view>
  273. <view className='weui-tabbar__item' onClick={toggleSave}>
  274. <TabIcon icon={isSaved > 0 ? ax : good} text={isSaved > 0 ? "已收藏" : "加入收藏"} />
  275. </view>
  276. </view>
  277. </view>
  278. );
  279. });