2023-02-22 20:46:47 +08:00

174 lines
6.1 KiB
TypeScript

import { Image, Text, View } from '@tarojs/components'
import Taro, { getCurrentPages, useDidShow } from '@tarojs/taro'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import classNames from 'classnames'
import styles from './index.module.scss'
import type { ParamItem } from './components/productItem'
import ProductItem from './components/productItem'
import type { ColorItem } from '@/components/popupSelectColor'
import PopupSelectColor from '@/components/popupSelectColor'
import InfiniteScroll from '@/components/infiniteScroll'
import Search from '@/components/search'
import { dataLoadingStatus, getFilterData } from '@/common/util'
import { GetSampleOrderProductApi } from '@/api/cutSample'
import { alert, goLink } from '@/common/common'
export default () => {
const { fetchData, state: cardState } = GetSampleOrderProductApi()
const [orderData, setOrderData] = useState<{ list: ParamItem[]; total: number }>({
list: [],
total: 0,
})
const [searchData, setSearchData] = useState<{ product_ids?: string; product_code_and_name?: string; page: number; size: number }>({
page: 1,
size: 10,
})
const shopColorCardData = useRef<ParamItem[]>([])
// 获取数据
const getGetColorCard = async() => {
const { data } = await fetchData(getFilterData({ ...searchData }))
setOrderData(() => ({ list: data.list, total: data.total }))
setRefresherTriggeredStatus(() => false)
}
useEffect(() => {
getGetColorCard()
}, [searchData])
useEffect(() => {
if (Taro.getStorageSync('cutSample')) {
const res = Taro.getStorageSync('cutSample') ? JSON.parse(Taro.getStorageSync('cutSample')) : []
const selectProsuctIds: number[] = []
res.map((item) => {
selectProsuctIds.push(item.id)
})
setSelectProsuctIds(selectProsuctIds)
setSelectProcutColors(res)
if (selectProsuctIds.length > 0) {
setSearchData(e => ({ ...e, product_ids: selectProsuctIds.join(',') }))
}
}
}, [])
const getSearch = (con) => {
setSearchData(e => ({ ...e, product_code_and_name: con }))
}
const onReset = () => {
setSearchData(e => ({ ...e, product_code_and_name: '' }))
}
// 数据加载状态
const statusMore = useMemo(() => {
return dataLoadingStatus({ list: orderData.list, total: cardState.total, status: cardState.loading })
}, [orderData, cardState])
// 上拉加载数据
const pageNum = useRef({ size: searchData.size, page: searchData.page })
const getScrolltolower = useCallback(() => {
if (orderData.list.length < orderData.total) {
pageNum.current.page++
const size = pageNum.current.size * pageNum.current.page
setSearchData(e => ({ ...e, size }))
}
}, [orderData])
// 列表下拉刷新
const [refresherTriggeredStatus, setRefresherTriggeredStatus] = useState(false)
const getRefresherRefresh = async() => {
pageNum.current.size = 10
pageNum.current.page = 1
setRefresherTriggeredStatus(true)
setSearchData(val => ({ ...val, size: 10 }))
}
const onSubmit = () => {
if (selectProcutColors.length <= 0) { return alert.none('请选择剪样') }
Taro.setStorageSync('cutSample', JSON.stringify([...selectProcutColors]))
const pages = getCurrentPages()
const current = pages[pages.length - 2]
if (current?.route === 'pages/cutSampleListOrder/index') {
Taro.navigateBack()
}
else {
Taro.redirectTo({
url: '/pages/cutSampleListOrder/index',
})
}
}
const [showColorList, setShowColorList] = useState(false)
const [selectItem, setSelectItem] = useState<ParamItem>()
const onSelectData = (val: ParamItem) => {
setShowColorList(true)
setSelectItem(val)
// 获取该面料下的颜色数据
const index = selectProsuctIds.indexOf(val.id)
if (index !== -1) {
const colorIds: number[] = []
selectProcutColors[index].colors?.map((citem) => {
colorIds.push(citem.id)
})
setSelectColorIds(colorIds)
}
}
const onClose = () => {
setShowColorList(false)
}
const [selectProcutColors, setSelectProcutColors] = useState < (ParamItem & { colors: ColorItem[] })[] > ([])
const [selectProsuctIds, setSelectProsuctIds] = useState<number[]>([])
const [selectColorIds, setSelectColorIds] = useState<number[]>([])
const onSelected = (val: ColorItem[]) => {
val.map((item) => {
if (!item.count) { item.count = 1 }
})
const pIndex = selectProcutColors?.findIndex(item => item.id === selectItem?.id)
if (pIndex === -1) {
const data: any = { ...selectItem }
data.colors = val
selectProcutColors.push(data)
}
else {
selectProcutColors[pIndex].colors = val
}
if (selectItem?.id && !selectProsuctIds.includes(selectItem?.id)) {
selectProsuctIds.push(selectItem?.id)
setSelectProsuctIds(selectProsuctIds)
}
setSelectProcutColors(selectProcutColors)
setShowColorList(false)
}
return <View className={styles.main}>
<View className={styles.search}>
<Search defaultValue={searchData?.product_code_and_name} placeholder="请输入搜索面料" changeOnSearch={getSearch} debounceTime={500} />
<View className={styles.btn_reset} onClick={onReset}></View>
</View>
<View className={styles.get_card_con}>
<InfiniteScroll
selfonScrollToLower={getScrolltolower}
refresherTriggered={refresherTriggeredStatus}
statusMore={statusMore}
refresherEnabled
selfOnRefresherRefresh={getRefresherRefresh}
>
{orderData.list?.map((item) => {
return (
<View className={styles.get_card_list} key={item.id}>
<ProductItem selected={selectProsuctIds.includes(item.id)} productItem={item} onSelect={onSelectData} />
</View>
)
})}
</InfiniteScroll>
</View>
<View className={styles.get_card_btn} onClick={onSubmit}>
<Text className={classNames(selectProsuctIds.length > 0 ? styles.selected : '')}></Text>
</View>
<PopupSelectColor defaultValueIds={selectColorIds} onSelected={onSelected} show={showColorList} product_id={selectItem?.id || 0} onClose={onClose} />
</View>
}