import { Text, View } from '@tarojs/components' import Taro, { usePullDownRefresh, useReady, useRouter } from '@tarojs/taro' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import SelectData from './components/selectData' import styles from './searchList.module.scss' import Search from '@/components/search' import Filter from '@/components/filter' import InfiniteScroll from '@/components/infiniteScroll' import type { SortBtnRef, SortParam } from '@/components/sortBtn' import SortBtn from '@/components/sortBtn' import { goLink } from '@/common/common' import { formatHashTag, formatPriceDiv } from '@/common/fotmat' import { dataLoadingStatus, getFilterData } from '@/common/util' import useLogin from '@/use/useLogin' import LabAndImg from '@/components/LabAndImg' import IconFont from '@/components/iconfont/iconfont' import Tag from '@/components/tag' import { EnumAllLabelApi, GetLabelProductsApi, HomePageJumpApi } from '@/api/search' enum FilterOptions { RECOMMEND = 1, SALES = 2, PRICE = 3, } export default () => { const isFirst = useRef(true) useLogin() const router = useRouter() const { fetchData } = HomePageJumpApi() // 获取指定的标签组的标签列表 const getLabelsWithHomeJump = async() => { await getAllLabel() if (router.params.pageJump) { const res = await fetchData({ page_jump: router.params.pageJump || 1 }) const labelIds = res.data.list.map(item => item.product_label_id) setLabelIds(labelIds) setSearchField(prev => ({ ...prev, label_ids: labelIds.join(',') })) } else { setLabelIds([]) setSearchField(prev => ({ ...prev, label_ids: '' })) } isFirst.current = false } // 获取所有标签列表 const { fetchData: getAllLabelApi } = EnumAllLabelApi() const getAllLabel = async() => { const res = await getAllLabelApi() const labelList = res.data.list.map(item => ({ id: item.id, name: item.name })) setLabelList(labelList) } // 搜索参数 const [searchField, setSearchField] = useState({ code_or_name: router.params.key, page: 1, size: 10, filter_type: 1, // 综合推荐 width: '', weight_density: '', label_ids: router.params?.label_ids || '', component: '', // 成分 abstract_sort_key: '', }) // 获取面料列表 const [materialList, setMaterialList] = useState<{ list: any[]; total: number }>({ list: [], total: 0 }) const { fetchData: materialFetchData, state: materialState } = GetLabelProductsApi() const getProductList = async() => { const { data } = await materialFetchData(getFilterData(searchField)) setMaterialList({ list: data.list, total: data.total }) setRefresherTriggeredStatus(false) } useEffect(() => { getLabelsWithHomeJump() }, []) // 监听筛选条件变化 useEffect(() => { // 首次进入页面不执行 if (!isFirst.current) { getProductList() } }, [searchField, isFirst.current]) // 上拉加载数据 const pageNum = useRef({ size: searchField.size, page: searchField.page }) const getScrolltolower = () => { if (materialList.list.length < materialList.total) { pageNum.current.page++ const size = pageNum.current.size * pageNum.current.page setSearchField(prev => ({ ...prev, size })) } } // 数据加载状态 const statusMore = useMemo(() => { return dataLoadingStatus({ list: materialList.list, total: materialList.total, status: materialState.loading }) }, [materialList, materialState]) // 输入了搜索关键字 const getSearchData = useCallback((e) => { console.log('e', e) pageNum.current.page = 1 setSearchField(val => ({ ...val, code_or_name: e, size: 10 })) pageNum.current = { size: 10, page: 1 } }, []) const handleInput = (e) => { if (e === '') { getSearchData(e) } } const goLinkPage = (item) => { goLink('/pages/details/index', { id: item.id }) } const [labelIds, setLabelIds] = useState([]) // 获取筛选条件 const getFilter = (e) => { console.log('e', e) pageNum.current.page = 1 setSearchField(prev => ({ ...prev, width: e?.width, weight_density: e?.weight_density, size: 10, component: e?.component, label_ids: e?.label_ids.join(','), })) setLabelIds([...e?.label_ids]) } // 排序 const sortCollectionRef = useRef(null) const [sortStatus, setSortStatus] = useState('none') const changeSort = () => { setCurrentOption(FilterOptions.PRICE) if (sortCollectionRef.current) { const { status, value } = sortCollectionRef.current.changeSort() setSortStatus(status) // 如果状态为none,就是综合推荐 if (status === 'none') { setSearchField(e => ({ ...e, filter_type: FilterOptions.RECOMMEND, size: 10, page: 1 })) setCurrentOption(FilterOptions.RECOMMEND) } else { setSearchField(e => ({ ...e, filter_type: value as number, size: 10, page: 1 })) } } pageNum.current = { size: 10, page: 1 } } const labAndImgObj = useCallback( (item) => { const img = item ? item.texture_url.split(',')[0] : '' return { lab: item.lab, rgb: item.rgb, texture_url: img } }, [materialList], ) const [currentOption, setCurrentOption] = useState(FilterOptions.RECOMMEND) const handleSelectFilterOptions = (key: FilterOptions) => { if (key === currentOption) { return } setSearchField(e => ({ ...e, filter_type: key, size: 10, page: 1 })) setSortStatus('none') setCurrentOption(key) } const [labelList, setLabelList] = useState([]) const [selected, setSelected] = useState([]) const handleClickTag = (ids: number[]) => { console.log('ids', ids) setSelected([...ids]) setSearchField(prev => ({ ...prev, label_ids: ids.join(','), })) } // 列表下拉刷新 const [refresherTriggeredStatus, setRefresherTriggeredStatus] = useState(false) const getRefresherRefresh = async() => { pageNum.current.page = 1 pageNum.current.size = 10 setRefresherTriggeredStatus(true) setSearchField(val => ({ ...val, size: 10 })) } return ( handleSelectFilterOptions(FilterOptions.RECOMMEND)}> 综合推荐 handleSelectFilterOptions(FilterOptions.SALES)}> 销量 价格 getFilter(e)} /> { !!labelList.length && } {materialList.list?.map((item) => { return ( goLinkPage(item)}> {item.product_color_count}色 {formatHashTag(item.code, item.name)} {item.is_favorite && } {item.width} {item.weight_density} { !!item.product_screw_id && 配套螺纹 } {item.component} ¥ {formatPriceDiv(item.lowest_price).toLocaleString()}起 ) })} ) }