256 lines
8.0 KiB
TypeScript
256 lines
8.0 KiB
TypeScript
import { ScrollView, Text, View } from '@tarojs/components'
|
|
import Taro, { useDidShow } from '@tarojs/taro'
|
|
import React, { useCallback, useEffect, useMemo, useRef, useState, useTransition } from 'react'
|
|
import ProductBlock from '../productBlock'
|
|
import BottomBtn from '../bottomBtn'
|
|
import Operation from '../operation'
|
|
import type { listType } from '../search'
|
|
import Search from '../search'
|
|
import NoShop from '../noShop'
|
|
import RecommendOpen from '../RecommendOpen'
|
|
import styles from './index.module.scss'
|
|
import { DelShoppingCartApi, GetProductColorApi, GetShoppingCartV2Api } from '@/api/shopCart'
|
|
import type { ProductType } from '@/context/ContextShop'
|
|
import { useCurrenShop } from '@/context/ContextShop'
|
|
import type { saleModeType } from '@/common/enum'
|
|
import LoadingCard from '@/components/loadingCard'
|
|
import { alert, goLink } from '@/common/common'
|
|
import InfiniteScroll from '@/components/infiniteScroll'
|
|
import { dataLoadingStatus, throttle } from '@/common/util'
|
|
import { ApplyOrderAccessApi, GetAdminUserInfoApi } from '@/api/user'
|
|
import { setParam } from '@/common/system'
|
|
import type { SalesManDialogRef } from '@/components/bindSalesManDialog'
|
|
import BindSalesManDialog from '@/components/bindSalesManDialog'
|
|
import { useSelector } from '@/reducers/hooks'
|
|
import OrganizationNameModal from '@/components/organizationNameModal'
|
|
import useLogin from '@/use/useLogin'
|
|
import { companyDetailApi, companyUpdateApi } from '@/api/company'
|
|
|
|
interface FilterType {
|
|
abstract_sort_key: -1|1|2|-2
|
|
sale_mode: saleModeType
|
|
}
|
|
export default () => {
|
|
const { state, dispatch } = useCurrenShop()
|
|
const [filter, setFilter] = useState<FilterType>({
|
|
abstract_sort_key: -1,
|
|
sale_mode: 0,
|
|
})
|
|
|
|
const userInfo = useSelector(state => state.userInfo)
|
|
|
|
const [isPending, startTransition] = useTransition()
|
|
|
|
const { fetchData: getShoppingCartFetchData, state: shopState } = GetShoppingCartV2Api()
|
|
const getShoppingCart = async() => {
|
|
const res = await getShoppingCartFetchData(filter)
|
|
if (res.success) {
|
|
startTransition(() => {
|
|
dispatch({ type: 'setInitData', data: { list: JSON.parse(JSON.stringify(res?.data?.product_list)), sale_mode: filter.sale_mode } })
|
|
})
|
|
}
|
|
}
|
|
|
|
const [modeNumber, setModeNumber] = useState({
|
|
bulk_number: 0,
|
|
length_length: 0,
|
|
weight_number: 0,
|
|
})
|
|
const { fetchData: productSkuFetchData } = GetProductColorApi()
|
|
const getProductColorNum = async() => {
|
|
const res = await productSkuFetchData()
|
|
if (res.success) {
|
|
setModeNumber(res.data)
|
|
}
|
|
}
|
|
|
|
const initStatus = useRef(false)
|
|
useDidShow(() => {
|
|
getProductColorNum()
|
|
initStatus.current && getShoppingCart()
|
|
initStatus.current = true
|
|
})
|
|
|
|
const onSelect = useCallback((status) => {
|
|
state.list?.map((item) => {
|
|
item.checked = status
|
|
item.color_list?.map((citem) => {
|
|
citem.checked = status
|
|
})
|
|
})
|
|
dispatch({ type: 'updateProduct', data: { list: state.list } })
|
|
}, [state.list])
|
|
|
|
useEffect(() => {
|
|
getShoppingCart()
|
|
}, [filter])
|
|
|
|
const onSortChange = useCallback((val) => {
|
|
setFilter(e => ({ ...e, abstract_sort_key: val.value }))
|
|
}, [])
|
|
|
|
const getSelect = useCallback((val: listType) => {
|
|
setFilter(e => ({ ...e, sale_mode: val.value }))
|
|
}, [])
|
|
|
|
const logadingStatus = useMemo(() => {
|
|
return shopState.loading || isPending
|
|
}, [shopState.loading, isPending])
|
|
|
|
const [settingStatus, setSettingStatus] = useState(false)
|
|
const onChangeSetting = useCallback((val) => {
|
|
setSettingStatus(() => val)
|
|
}, [])
|
|
|
|
const { fetchData: delShopFetchData } = DelShoppingCartApi()
|
|
const onBtnClick = (model) => {
|
|
if (model) {
|
|
delShop()
|
|
}
|
|
else {
|
|
orderDetail()
|
|
}
|
|
}
|
|
|
|
const bindSalesManDialogRef = useRef<SalesManDialogRef | null>(null)
|
|
const [showModal, setShowModal] = useState(false)
|
|
|
|
// 去结算
|
|
const { fetchData: FetchData } = GetAdminUserInfoApi()
|
|
const { fetchData: applyOrderAccessFetchData } = ApplyOrderAccessApi()
|
|
const orderDetail = throttle(async() => {
|
|
const res = await FetchData()
|
|
if (res.data.order_access_status !== 3) {
|
|
if (res.data.order_access_status == 1) { applyOrderAccessFetchData() }
|
|
bindSalesManDialogRef.current?.handleChange(true)
|
|
return
|
|
}
|
|
// 检测是否修改过组织昵称
|
|
if (userInfo.adminUserInfo.first_change_name) {
|
|
setShowModal(true)
|
|
return
|
|
}
|
|
const SelectIds = getSelectIds()
|
|
if (SelectIds.length == 0) {
|
|
alert.error('请选择面料')
|
|
}
|
|
else {
|
|
const ids = SelectIds.join('-')
|
|
setParam({ ids, sale_mode: state.sale_mode }) // 临时存储
|
|
goLink('/pages/order/comfirm')
|
|
}
|
|
}, 500)
|
|
|
|
// 删除商品
|
|
const delShop = () => {
|
|
Taro.showModal({
|
|
content: '删除所选商品?',
|
|
async success(res) {
|
|
if (res.confirm) {
|
|
const ids = getSelectIds()
|
|
console.log('ids:::', ids)
|
|
const res = await delShopFetchData({ id: ids })
|
|
if (res.success) {
|
|
getShoppingCart()
|
|
getProductColorNum()
|
|
}
|
|
}
|
|
else if (res.cancel) {
|
|
console.log('用户点击取消')
|
|
}
|
|
},
|
|
})
|
|
}
|
|
|
|
// 弹出修改组织昵称弹窗
|
|
const handleBindSalesManSuccess = () => {
|
|
// 检测是否修改过组织昵称
|
|
if (userInfo.adminUserInfo.first_change_name) {
|
|
setShowModal(true)
|
|
}
|
|
}
|
|
|
|
// 获取面料选中的id
|
|
const getSelectIds = () => {
|
|
const ids: number[] = []
|
|
state.list.map((item) => {
|
|
item.color_list.map((citem) => {
|
|
citem.checked && ids.push(citem.id)
|
|
})
|
|
})
|
|
return ids
|
|
}
|
|
|
|
const handleClose = useCallback(() => {
|
|
setShowModal(false)
|
|
}, [])
|
|
const handleShowChange = useCallback((val: boolean) => {
|
|
setShowModal(val)
|
|
}, [])
|
|
|
|
const { getAdminUserInfo } = useLogin()
|
|
const { fetchData: saveFetch } = companyUpdateApi()
|
|
const { fetchData: getCompanyFetch } = companyDetailApi()
|
|
const handleOrganizationNameModalConfirm = useCallback(async(text: string) => {
|
|
const params = await getCompanyFetch()
|
|
const result = await saveFetch({
|
|
...params.data,
|
|
company_name: text,
|
|
})
|
|
if (result.success) {
|
|
getAdminUserInfo()
|
|
handleClose()
|
|
alert.success('保存成功')
|
|
}
|
|
else {
|
|
alert.none(result.msg)
|
|
}
|
|
}, [])
|
|
|
|
const onRecommendClose = useCallback(() => {
|
|
dispatch({ type: 'setRecommendId', data: { list: state.list, recommendId: 0 } })
|
|
}, [])
|
|
|
|
const onSubmitSuccess = useCallback(() => {
|
|
getProductColorNum()
|
|
getShoppingCart()
|
|
}, [])
|
|
|
|
// 当减到0时删除商品
|
|
useEffect(() => {
|
|
if (state.delCommendId) {
|
|
getShoppingCart()
|
|
getProductColorNum()
|
|
}
|
|
}, [state.delCommendId])
|
|
|
|
return <View className={styles.shop_main}>
|
|
<View className={styles.shop_header}>
|
|
<Operation onSelect={onSortChange} onChange={onChangeSetting} />
|
|
<View className={styles.search_title}>
|
|
<Search numberObj={modeNumber} defaultIndex={filter.sale_mode} onSelect={getSelect} />
|
|
</View>
|
|
</View>
|
|
<View className={styles.shop_con}>
|
|
{logadingStatus && <View className={styles.loading_card}><LoadingCard /></View>}
|
|
{(!logadingStatus && state.list && state.list.length > 0) && <ScrollView scrollY className={styles.scroll_view}>
|
|
{state.list?.map(item => (<ProductBlock productItem={item} key={item.product_id} />))}
|
|
<View style={{ height: '100rpx' }}></View>
|
|
</ScrollView>}
|
|
{(!logadingStatus && !state.list) && <NoShop />}
|
|
</View>
|
|
|
|
<BottomBtn onSelect={onSelect} model={settingStatus} onBtnClick={onBtnClick} />
|
|
<View>
|
|
<BindSalesManDialog ref={bindSalesManDialogRef} onSuccess={handleBindSalesManSuccess} />
|
|
</View>
|
|
<View>
|
|
<OrganizationNameModal showModal={showModal} onClose={handleClose} onShowModalChange={handleShowChange} onConfirm={handleOrganizationNameModalConfirm} />
|
|
</View>
|
|
<View>
|
|
<RecommendOpen shopId={state.recommendId || 0} onShow={!!state.recommendId} onClose={onRecommendClose} submitSuccess={onSubmitSuccess} />
|
|
</View>
|
|
<View className="common_safe_area_y"></View>
|
|
</View>
|
|
}
|