门店信息
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
import { useCallback, useEffect, useRef, useState } from 'react'
|
||||
import Taro, { useDidShow } from '@tarojs/taro'
|
||||
import { View, Text, Image, Textarea, ScrollView } from '@tarojs/components'
|
||||
import { Button, Empty, Popup, Stepper } from '@antmjs/vantui'
|
||||
import { Button, Empty, Icon, Popup, Stepper } from '@antmjs/vantui'
|
||||
import useCartStore from '@/stores/cart/useCartStore'
|
||||
import { createOrderApi } from '@/services/order'
|
||||
import { getStoreInfoApi } from '@/services/store'
|
||||
import type { CartItem } from '@/types/cart'
|
||||
import type { StoreDetail } from '@/types/store'
|
||||
import './index.less'
|
||||
|
||||
export default function CartPage() {
|
||||
@@ -27,12 +29,27 @@ export default function CartPage() {
|
||||
const [remark, setRemark] = useState('')
|
||||
const [submitting, setSubmitting] = useState(false)
|
||||
|
||||
/** 配送信息(下单弹层展示,打开时拉取) */
|
||||
const [storeInfo, setStoreInfo] = useState<StoreDetail | null>(null)
|
||||
const [storeLoading, setStoreLoading] = useState(false)
|
||||
|
||||
/** 可购项(status=1) */
|
||||
const purchasable = items.filter(item => item.status === 1)
|
||||
const hasInvalid = items.length > 0 && purchasable.length < items.length
|
||||
|
||||
/** 拉取门店配送信息 */
|
||||
const fetchStoreInfo = useCallback(() => {
|
||||
setStoreLoading(true)
|
||||
getStoreInfoApi()
|
||||
.then(res => setStoreInfo(res.data))
|
||||
.catch(() => setStoreInfo(null))
|
||||
.finally(() => setStoreLoading(false))
|
||||
}, [])
|
||||
|
||||
useDidShow(() => {
|
||||
fetchCart().catch(() => {})
|
||||
// 从门店信息编辑页返回且弹层仍打开时 → 刷新配送信息
|
||||
if (showOrder) fetchStoreInfo()
|
||||
})
|
||||
|
||||
/** 同步本地编辑数量:删除不存在的项,保留在编数量 */
|
||||
@@ -106,14 +123,24 @@ export default function CartPage() {
|
||||
})
|
||||
}, [clearCart])
|
||||
|
||||
/** 打开下单弹层 */
|
||||
/** 打开下单弹层(同时拉取配送信息) */
|
||||
const handleOrderTap = useCallback(() => {
|
||||
if (!purchasable.length) {
|
||||
Taro.showToast({ title: '没有可购买的商品', icon: 'none' })
|
||||
return
|
||||
}
|
||||
setShowOrder(true)
|
||||
}, [purchasable.length])
|
||||
fetchStoreInfo()
|
||||
}, [purchasable.length, fetchStoreInfo])
|
||||
|
||||
/** 配送信息点击:拉取失败时重试,否则前往门店信息编辑页 */
|
||||
const handleDeliveryTap = useCallback(() => {
|
||||
if (!storeLoading && !storeInfo) {
|
||||
fetchStoreInfo()
|
||||
return
|
||||
}
|
||||
Taro.navigateTo({ url: '/pages/store-info/index' })
|
||||
}, [storeLoading, storeInfo, fetchStoreInfo])
|
||||
|
||||
/** 提交订单(金额一律服务端重算) */
|
||||
const handleSubmitOrder = useCallback(async () => {
|
||||
@@ -240,12 +267,43 @@ export default function CartPage() {
|
||||
>
|
||||
<View className='order-popup'>
|
||||
<Text className='order-popup__title'>确认下单</Text>
|
||||
|
||||
{/* 配送信息(点击前往修改门店信息) */}
|
||||
<View className='order-popup__delivery' onClick={handleDeliveryTap}>
|
||||
<Icon name='location-o' size={20} color='#ee0a24' className='order-popup__delivery-icon' />
|
||||
{storeLoading ? (
|
||||
<Text className='order-popup__delivery-tip'>配送信息加载中...</Text>
|
||||
) : storeInfo ? (
|
||||
<View className='order-popup__delivery-info'>
|
||||
<View className='order-popup__delivery-head'>
|
||||
<Text className='order-popup__delivery-name'>{storeInfo.name}</Text>
|
||||
{(storeInfo.contact || storeInfo.phone) && (
|
||||
<Text className='order-popup__delivery-contact'>
|
||||
{storeInfo.contact} {storeInfo.phone}
|
||||
</Text>
|
||||
)}
|
||||
</View>
|
||||
{storeInfo.address ? (
|
||||
<Text className='order-popup__delivery-address'>{storeInfo.address}</Text>
|
||||
) : (
|
||||
<Text className='order-popup__delivery-warn'>收货地址未填写,点击完善配送信息</Text>
|
||||
)}
|
||||
</View>
|
||||
) : (
|
||||
<Text className='order-popup__delivery-tip'>未获取到门店信息,点击重试</Text>
|
||||
)}
|
||||
<Text className='order-popup__delivery-arrow'>›</Text>
|
||||
</View>
|
||||
|
||||
<ScrollView scrollY className='order-popup__list'>
|
||||
{purchasable.map(item => (
|
||||
<View key={item.id} className='order-popup__item'>
|
||||
<View className='order-popup__item-info'>
|
||||
<Text className='order-popup__item-name'>{item.name}</Text>
|
||||
<Text className='order-popup__item-spec'>{item.spec} / {item.unit}</Text>
|
||||
<Image className='order-popup__item-image' src={item.image} mode='aspectFill' lazyLoad />
|
||||
<View className='order-popup__item-title'>
|
||||
<Text className='order-popup__item-name'>{item.name}</Text>
|
||||
<Text className='order-popup__item-spec'>{item.spec} / {item.unit}</Text>
|
||||
</View>
|
||||
</View>
|
||||
<View className='order-popup__item-right'>
|
||||
<Text className='order-popup__item-qty'>×{displayQty(item)}</Text>
|
||||
|
||||
Reference in New Issue
Block a user