import React, { useEffect, useRef, useMemo } from 'react' import { useSelector, useDispatch } from 'react-redux' import Taro, { getCurrentInstance, useShareAppMessage, useShareTimeline, useReady } from '@tarojs/taro' import { View, Text, Swiper, SwiperItem, Video, Canvas, ScrollView } from '@tarojs/components' import { useImmer } from 'use-immer' import { AtCountdown, AtAccordion, AtIcon } from 'taro-ui' import { SpPrice, SpCell, SpImage, SpLoading, SpRecommend, SpHtml, SpPage, SpSkuSelectNew, SpPoster, SpLogin, SpFloatMenuItem, SpChat, SpGoodsPrice, SpGoodsItem } from '@/components' import api from '@/api' import req from '@/api/req' import { log, calcTimer, isArray, canvasExp, normalizeQuerys, isAlipay, isWeixin, isWeb, linkPage, pickBy, classNames, navigateTo, VERSION_PLATFORM, isAPP } from '@/utils' import { fetchUserFavs } from '@/store/slices/user' import doc from '@/doc' import entryLaunch from '@/utils/entryLaunch' import qs from 'qs' import S from '@/spx' import { Tracker } from '@/service' import { useNavigation, useLogin } from '@/hooks' import { ACTIVITY_LIST } from '@/consts' import CompActivityBar from './comps/comp-activitybar' import CompVipGuide from './comps/comp-vipguide' import CompCouponList from './comps/comp-couponlist' import CompStore from './comps/comp-store' import CompPackageList from './comps/comp-packagelist' import CompEvaluation from './comps/comp-evaluation' import CompBuytoolbar from './comps/comp-buytoolbar' import CompShare from './comps/comp-share' import CompPromation from './comps/comp-promation' import CompGroup from './comps/comp-group' import { WgtFilm, WgtSlider, WgtWriting, WgtGoods, WgtHeading, WgtHeadline } from '../home/wgts' import './espier-detail.scss' const MSpSkuSelect = React.memo(SpSkuSelectNew) const initialState = { id: null, type: null, dtid: null, info: null, curImgIdx: 0, play: false, isDefault: false, defaultMsg: '', promotionPackage: [], // 组合优惠 mainGoods: {}, makeUpGoods: [], // 组合商品 packageOpen: false, skuPanelOpen: false, promotionOpen: false, promotionActivity: [], sharePanelOpen: false, posterModalOpen: false, skuText: '', // sku选择器类型 selectType: 'picker', evaluationList: [], evaluationTotal: 0, // 多规格商品选中的规格 curItem: null, recommendList: [], showSaleTotal: false, showSku: true, isOpen: false, } function EspierDetail (props) { const $instance = getCurrentInstance() // const { type, id, dtid } = $instance.router.params // const { type, id, dtid } = await entryLaunch.getRouteParams() const { getUserInfoAuth } = useLogin() const pageRef = useRef() const { userInfo } = useSelector((state) => state.user) const { colorPrimary, openRecommend } = useSelector((state) => state.sys) const { setNavigationBarTitle } = useNavigation() const dispatch = useDispatch() const skuSelectRef = useRef() const [state, setState] = useImmer(initialState) const { info, play, isDefault, defaultMsg, evaluationList, curImgIdx, promotionPackage, packageOpen, skuPanelOpen, promotionOpen, promotionActivity, sharePanelOpen, posterModalOpen, mainGoods, makeUpGoods, skuText, selectType, id, type, dtid, curItem, recommendList, showSaleTotal, showSku, isOpen } = state useEffect(() => { init() }, []) useEffect(() => { const { path } = $instance.router if (id && path === '/pages/item/espier-detail') { fetch() } }, [userInfo]) useEffect(() => { if (id) { fetch() getPackageList() getEvaluationList() } }, [id]) useEffect(() => { let video if (isWeixin) { video = Taro.createVideoContext('goods-video') } else if (isWeb) { video = document.getElementById('goods-video') } if (!video) { return } if (play) { setTimeout(() => { console.log('video:', video) video.play() }, 200) } else { isWeixin ? video.stop() : video.pause() } }, [play]) useEffect(() => { if (packageOpen || skuPanelOpen || sharePanelOpen || posterModalOpen || promotionOpen) { pageRef.current.pageLock() } else { pageRef.current.pageUnLock() } }, [packageOpen, skuPanelOpen, sharePanelOpen, posterModalOpen, promotionOpen]) useShareAppMessage(async (res) => { return getAppShareInfo() }) useShareTimeline(async (res) => { return getAppShareInfo() }) const getAppShareInfo = () => { const { itemName, imgs } = {} = info const query = { id, dtid } if (userInfo) { query['uid'] = userInfo.user_id } const path = `/pages/item/espier-detail?${qs.stringify(query)}` log.debug(`share path----getAppShareInfo: ${path}`) return { title: itemName, imageUrl: imgs.length > 0 ? imgs[0] : [], path } } const init = async () => { const { type, id, dtid } = await entryLaunch.getRouteParams() console.log("🚀 ~ type, id, dtid :", type, id, dtid) setState((draft) => { draft.id = id draft.type = type draft.dtid = dtid }) if (S.getAuthToken()) { await dispatch(fetchUserFavs()) } } const fetch = async () => { let data if (type == 'pointitem') { } else { try { const itemDetail = await api.item.detail(id, { showError: false, distributor_id: dtid }) data = pickBy(itemDetail, doc.goods.GOODS_INFO) if (data.approveStatus == 'instock') { setState((draft) => { draft.isDefault = true draft.defaultMsg = '商品已下架' }) } } catch (e) { setState((draft) => { draft.isDefault = true draft.defaultMsg = e.res.data.data.message }) console.log(e.res) } } // 是否订阅 const { user_id: subscribe = false } = await api.user.isSubscribeGoods(id, { distributor_id: dtid }) setNavigationBarTitle(data?.itemName) console.log(ACTIVITY_LIST[data.activityType]) if (ACTIVITY_LIST[data.activityType]) { Taro.setNavigationBarColor({ frontColor: '#ffffff', backgroundColor: colorPrimary, animation: { duration: 400, timingFunc: 'easeIn' } }) } setState((draft) => { draft.info = { ...data, subscribe } draft.promotionActivity = data.promotionActivity }) if (isAPP() && userInfo) { try { Taro.SAPPShare.init({ title: data?.itemName, content: data.brief, pic: `${data.img}?time=${new Date().getTime()}`, link: `${process.env.APP_CUSTOM_SERVER}/pages/item/espier-detail?id=${data.itemId}&dtid=${data.distributorId}&company_id=${data.companyId}`, path: `/pages/item/espier-detail?company_id=${data.company_id}&id=${data.v}&dtid=${data.distributor_id}&uid=${userInfo.user_id}`, price: data.price, weibo: false, miniApp: true }) log.debug('app share init success...') } catch (e) { console.error(e) } } if (openRecommend == 1) { getRecommendList() // 猜你喜欢 } } const getRecommendList = async () => { const { list } = await api.cart.likeList({ page: 1, pageSize: 30 }) setState((draft) => { draft.recommendList = list }) } // 获取包裹 const getPackageList = async () => { const { list } = await api.item.packageList({ item_id: id, showError: false }) setState((draft) => { draft.promotionPackage = list }) } // 获取评论 const getEvaluationList = async () => { const { list, total_count } = await api.item.evaluationList({ page: 1, pageSize: 2, item_id: id }) setState((draft) => { draft.evaluationList = list draft.evaluationTotal = total_count }) } // 领券 const handleReceiveCoupon = () => { const { itemId, distributorId } = info Taro.navigateTo({ url: `/subpages/marketing/coupon-center?item_id=${itemId}&distributor_id=${distributorId}` }) } const onChangeSwiper = (e) => { setState((draft) => { draft.curImgIdx = e.detail.current }) } const onChangeToolBar = (key) => { setState((draft) => { draft.skuPanelOpen = true draft.selectType = key }) if (key === 'addcart') { skuSelectRef.current?.addToCart?.() } else if (key === 'fastbuy') { skuSelectRef.current?.fastBuy?.() } } const { windowWidth } = Taro.getSystemInfoSync() let sessionFrom = {} if (info) { sessionFrom['商品'] = info?.itemName if (userInfo) { sessionFrom['昵称'] = userInfo.username } } const handleClickStore = (item) => { const url = `/subpages/store/index?id=${item.distributor_info?.distributor_id || item.goods_id}` Taro.navigateTo({ url }) } return ( { Taro.navigateTo({ url: '/subpages/member/index' }) }} > } renderFooter={ { fetch() }} /> } > {/* */} {!info && } {info && ( { // console.log('e', e.detail) const { scrollTop } = e.detail if (scrollTop >= 640) { setState((draft) => { draft.isShowScroll = true }) } else { setState((draft) => { draft.isShowScroll = false }) } }}> {console.log('info', info)} {info.imgs.map((img, idx) => ( {false && ( ))} {info.imgs.length > 1 && ( {`${curImgIdx + 1}/${info.imgs.length}`} )} {info.video && play && ( )} {info.video && ( { setState((draft) => { play ? (draft.play = false) : (draft.play = true) }) }} > {/* play2.png */} {!play && } {/* {play ? '退出视频' : '播放视频'} */} )} {/* 拼团、秒杀、限时特惠显示活动价 */} {ACTIVITY_LIST[info.activityType] && ( { fetch() }} > )} 3 ? info.couponList.list.slice(0, 3) : info.couponList.list } onClick={handleReceiveCoupon} /> {info?.itemName} {/* {info.brief} */} {/* {(isWeixin || isAPP()) && ( // {( { if (isAPP()) { Taro.SAPPShare.open() } else { await getUserInfoAuth() setState((draft) => { draft.sharePanelOpen = true }) } }} > 分享 )} */} {/* 拼团、秒杀、限时特惠不显示 */} {!ACTIVITY_LIST[info.activityType] && ( )} {showSaleTotal && {/* */} {info.salesSetting && {`销量:${info.sales || 0}`}} {info.store_setting && 库存:{info.store}} } {/* { !info.nospec && ( { setState((draft) => { draft.skuPanelOpen = true draft.selectType = 'picker' }) }} > {skuText} )} */} {/* {promotionPackage.length > 0 && ( { Taro.navigateTo({ url: `/subpages/marketing/package-list?id=${info.itemId}&distributor_id=${info.distributorId}` }) // setState((draft) => { // draft.packageOpen = true // }) }} > {`共${promotionPackage.length}种组合随意搭配`} )} {promotionActivity.length > 0 && ( { setState((draft) => { draft.promotionOpen = true }) }} > {promotionActivity.map((item, index) => ( {item.promotionTag} ))} )} */} {/* {info.itemParams.length > 0 && 商品参数 {info.itemParams.map((item, index) => ( {`${item.attribute_name}:`} {item.attribute_value_name} ))} } */} {/* 商品评价 */} {/* */} {/* 店铺 */} {VERSION_PLATFORM && } {/* Sku选择器列表 */} {/* Sku选择器 */} { setState((draft) => { draft.skuPanelOpen = false }) }} onChange={(skuText, curItem) => { setState((draft) => { draft.skuText = skuText draft.curItem = curItem }) }} /> {info?.itemName} {isArray(info.intro) ? ( {info.intro.map((item, idx) => ( {item.name === 'film' && } {item.name === 'slider' && } {item.name === 'writing' && } {/* {item.name === 'heading' && } */} {item.name === 'headline' && } {item.name === 'goods' && } ))} ) : ( <> {/* */} )} {[{ open: false }, { open: false }, {}, {}, {}, {}, {}, {}].map((item, index) => { setState((draft) => { draft.isOpen = !draft.isOpen }) }} title={'标题' + (index + 1)} > 内容一 内容二 内容三 内容三 内容三 内容三 {/* */} { setState((draft) => { draft.isOpen = !draft.isOpen }) }}> {isOpen ? : } {isOpen ? <> : } )} 浏览历史 {[ { brief: "副标题", itemName: "测试商品1", price: "1099", goods_id: 6, pic: 'https://espier-oss-cdn.oss-cn-shanghai.aliyuncs.com/default_project/image/1/2024/01/15/46fe6ca52277038e39ee2c026a4af3c9xHQuJ96YIcZWtjRS0HBCTzp7dzXIs2pl' }, { brief: "副标题", itemName: "测试商品2", price: "1099", goods_id: 6, pic: 'https://espier-oss-cdn.oss-cn-shanghai.aliyuncs.com/default_project/image/1/2024/01/15/801c18d59d95ea26930fefc43bf66febTQjxb65cpnCqVLaOsYmiHdkDdYqBnXVm' }, { brief: "副标题", itemName: "测试商品3", price: "1099", goods_id: 6, pic: 'https://espier-oss-cdn.oss-cn-shanghai.aliyuncs.com/default_project/image/1/2024/01/15/46fe6ca52277038e39ee2c026a4af3c90XruENsSSAhRiz0HPI3PjR8XQNVgbxHb' }, ].map((item, idx) => ( ))} )} {/* 组合优惠 */} { setState((draft) => { draft.packageOpen = false }) }} info={{ mainGoods, makeUpGoods }} /> {/* 促销优惠活动 */} { setState((draft) => { draft.promotionOpen = false }) }} /> {/* Sku选择器 */} {/* { setState((draft) => { draft.skuPanelOpen = false }) }} onChange={(skuText, curItem) => { setState((draft) => { draft.skuText = skuText draft.curItem = curItem }) }} /> */} {/* 分享 */} { setState((draft) => { draft.sharePanelOpen = false }) }} onCreatePoster={() => { setState((draft) => { draft.sharePanelOpen = false draft.posterModalOpen = true }) }} onShareEdit={() => { const { itemId, companyId, distributorId } = info Taro.navigateTo({ url: `/subpage/pages/editShare/index?id=${itemId}&dtid=${distributorId}&company_id=${companyId}` }) }} /> {/* 海报 */} {posterModalOpen && ( { setState((draft) => { draft.posterModalOpen = false }) }} /> )} ) } export default EspierDetail