import Search from '@/components/search' import { View } from '@tarojs/components' import Taro, { useDidShow } from '@tarojs/taro' import { FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useTransition } from 'react' import styles from './index.module.scss' import classnames from 'classnames' import IconText from '@/components/iconText' import InfiniteScroll from '@/components/infiniteScroll' import ItemList from './components/shoppingCartItem/index' import { formatPriceDiv } from '@/common/format' import BottomSettleBar from './components/bottomSettleBar' import BottomEditBar from './components/bottomEditBar' import { ShoppingCartDeleteApi, ShoppingCartListApi } from '@/api/index' import { dataLoadingStatus, debounce, getFilterData } from '@/common/util' import { ShoppingProvider } from './components/shoppingCart/index' import { Goods, ShoppingDispatchType, useShoppingDispatch, useShoppingState } from './context' import { alert, goLink, isEmptyObject } from '@/common/common' export const Shopping: FC = memo(() => { // 计算总的预估金额 const handleTriggerCheckbox = ({ multipleSelection, setSelectedAmount }) => { console.log('handleTriggerCheckbox==>', multipleSelection) if (multipleSelection) { const result = Object.values(multipleSelection).reduce((prev: number , value: Goods) => { return prev + Number(formatPriceDiv(value.estimate_amount)) }, 0) as number // 同步修改上下文的 预估金额 setSelectedAmount(result) } else { setSelectedAmount(0) } } return ( ) }) interface SearchOptions { short_name_or_phone?: string } const ShoppingCartContainer: FC = () => { let isFirst = useRef(true) const { isMultipleSelection, isManageStatus, selectedAmount, currentCheckedPurchaserId, currentCheckedSaleMode, colorStore } = useShoppingState() const dispatch = useShoppingDispatch() // 管理 const onStartToManage = () => { // if (isManageStatus) { // handleSelectAllCheckbox(false) // 取消全选 // } dispatch({ type: ShoppingDispatchType.UPDATE_MANAGE_STATUS, data: !isManageStatus }) } const listHeightRef = useRef('auto') // 强制刷新 const [, setForceUpdate] = useState({}) const { fetchData, state } = ShoppingCartListApi() const [searchOptions, setSearchOptions] = useState({}) useDidShow(() => { // 第二次进入该页面时触发 if (!isFirst.current) { // 重新刷新 // setShoppingCartData({ list: [], total: 0 }) fetchData(getFilterData(searchOptions)) } }) useEffect(() => { console.log('useEffect fetchData', getFilterData(searchOptions)) if (!isFirst.current) { fetchData(getFilterData(searchOptions)) } }, [searchOptions]) // 输入了搜索关键字 const getSearchData = useCallback(e => { console.log('getSearchData===>',e); setSearchOptions({ short_name_or_phone: e }) }, []) const [shoppingCartData, setShoppingCartData] = useState<{ list: ShoppingCartData[] total: number }>({ list: [], total: 0 }) //数据加载状态 const statusMore = useMemo(() => { console.log('shoppingCartData==>', shoppingCartData, state) const status = dataLoadingStatus({ list: shoppingCartData.list, total: shoppingCartData.total, status: state.loading!, }) console.log('status==>', status) return status }, [shoppingCartData, state]) // useLayoutEffect 执行在DOM更新之后,浏览器绘制之前 如果放在 useEffect 里面会产生多一次不必要的回流和重绘,可能会引起视图闪现 useLayoutEffect(() => { ;(async () => { console.log('useLayoutEffect') await fetchData(getFilterData(searchOptions)) isFirst.current = false let query = Taro.createSelectorQuery() console.log('query', query) query.select('#shoppingContainer').boundingClientRect() query.select('#topBar').boundingClientRect() query.select('#bottomBar').boundingClientRect() query.exec(res => { console.log('res==>', res) const containerHeight = res[0].height const topBarHeight = res[1].height const bottomBarHeight = res[2].height const listHeight = containerHeight - topBarHeight - bottomBarHeight listHeightRef.current = listHeight + 'px' // 强制刷新 setForceUpdate({}) }) })() }, []) useEffect(() => { if (state.success) { console.log('fetch success', state); setShoppingCartData({ list: state.data.list, total: state.data.total }) } }, [state]) // 结算 const handleSettleAccount = debounce(() => { const multipleSelection = colorStore?.[currentCheckedPurchaserId]?.['multipleSelection'] if (!multipleSelection) return alert.error('请先选择客户') const checkedGoodsKind = Object.values(multipleSelection).reduce((prev, item: Goods) => { return [...prev, item.id] }, []) if (checkedGoodsKind.length === 0) return alert.error('请先选择商品') goLink('/pages/submitOrder/index', { purchaser_id: currentCheckedPurchaserId, sale_mode: currentCheckedSaleMode, shopping_cart_product_color_list: JSON.stringify(checkedGoodsKind), purchaser_name: shoppingCartData?.list.find(item => item.purchaser_id === currentCheckedPurchaserId)?.purchaser_name, }) }, 400) const { fetchData: deleteApi } = ShoppingCartDeleteApi() // 批量某个客户的删除商品 const handleDelete = async () => { const multipleSelection = colorStore?.[currentCheckedPurchaserId].multipleSelection let checked: Goods[] = Object.values(multipleSelection!) if (checked.length === 0) { return alert.error('请选择商品') } console.log('checked==>', checked) Taro.showModal({ title: '要删除这些商品吗?', success: async function(res) { if (res.confirm) { alert.showLoading('删除中') const res = await deleteApi({ ids: checked.map(item => item.id).join(','), }) if (res.success) { alert.hideLoading() alert.success('删除成功') // 清空多选 dispatch({ type: ShoppingDispatchType.UPDATE_CHANGED_CHECKBOX, data: { purchaserId: currentCheckedPurchaserId, goodsKind: colorStore?.[currentCheckedPurchaserId].goodsKind, multipleSelection: {}, }, }) fetchData(searchOptions) // Observer.notify(currentCheckedPurchaserId) } else { alert.hideLoading() alert.none(res.msg) } } }, }) } // 全选 const handleSelectAllCheckbox = (isSelectAll: boolean) => { const targetGoodsKind = colorStore?.[currentCheckedPurchaserId].goodsKind if (!targetGoodsKind) return alert.error('请先选择客户') const tempObject = { ...targetGoodsKind } dispatch({ type: ShoppingDispatchType.UPDATE_CHANGED_CHECKBOX, data: { purchaserId: currentCheckedPurchaserId, multipleSelection: isSelectAll ? tempObject : {}, }, }) } // 加载刷新数据 const [refreshStatus, setRefreshStatus] = useState(false) // 下拉刷新 const handleRefresh = async () => { setRefreshStatus(true) const res = await fetchData(getFilterData(searchOptions)) if (res.success) { setRefreshStatus(false) alert.success('刷新成功') } else { alert.error('刷新失败') setRefreshStatus(false) } } // const [isPending, startTransition] = useTransition() return ( {isManageStatus ? ( ) : ( )} { !!shoppingCartData?.list?.length && shoppingCartData?.list?.map((item, index) => { return }) } {isManageStatus ? ( handleSelectAllCheckbox(isAll)}> ) : ( )} ) } export default Shopping