import React, { useState, useEffect, useContext } from "react"; import { ListView } from "antd-mobile"; import Modal from "react-modal"; import "./Malls.scss"; import search from "./search.png"; import pos from "./pos.png"; import close_white from "./close_white.png"; import up from "./up.png"; import { Mall, cityMallsGetter, CityMall, } from "../../js/helpers/data-helper.js"; import { MallCode } from "../../pages/Index/Index"; const getSectionData = (dataBlob, sectionID) => dataBlob[sectionID]; const getRowData = (dataBlob, sectionID, rowID) => dataBlob[rowID]; function genData(ds, cityMalls) { const dataBlob = {}; const sectionIDs = []; const rowIDs = []; const groupByIndex = (list) => list.reduce((acc, nxt) => { acc[nxt.index] = acc[nxt.index] ? [...acc[nxt.index], nxt] : [nxt]; return acc; }, {}); const data = groupByIndex(cityMalls); Object.keys(data).forEach((item, index) => { sectionIDs.push(item); dataBlob[item] = item; rowIDs[index] = []; data[item].forEach((city) => { rowIDs[index].push(city.name); dataBlob[city.name] = city; }); }); return ds.cloneWithRowsAndSections(dataBlob, sectionIDs, rowIDs); } const Malls = ({ isOpen, onRequestClose, setMallCode }) => { const [q, setQ] = useState(""); const [showList, setShowList] = useState(false); const [cities, setCities] = useState([]); const [currentMall, setCurrentMall] = useState(null); const [currentCity, setCurrentCity] = useState(null); const [currentMalls, setCurrentMalls] = useState([]); const [isMallExpand, setIsMallExpand] = useState(false); const [dataSource, setDataSource] = useState( new ListView.DataSource({ getRowData, getSectionHeaderData: getSectionData, rowHasChanged: (row1, row2) => row1 !== row2, sectionHeaderHasChanged: (s1, s2) => s1 !== s2, }) ); const mallCode = useContext(MallCode); const setDefaultCityMall = (list) => { setCurrentCity(list[0]); setCurrentMall(list[0].malls[0]); setCurrentMalls(list[0].malls); }; useEffect(() => { document.title = "城市商场选择"; cityMallsGetter().then((cityMalls) => { setCities(cityMalls); setDataSource(genData(dataSource, cityMalls)); if (cityMalls.length) { const city = cityMalls.find(({ malls }) => malls.find(({ code }) => mallCode === code) ); if (city) { setCurrentCity(city); const mall = city.malls.find(({ code }) => mallCode === code); if (mall) setCurrentMall(mall); setCurrentMalls(city.malls); } else setDefaultCityMall(cityMalls); } }); }, [mallCode]); return ( onRequestClose()} >
setIsMallExpand(false)}>
setQ(e.target.value)} onFocus={() => setShowList(true)} onBlur={() => !q && setShowList(false)} >
{q && ( setQ("")} /> )} {showList && (
{cities .filter(({ name }) => name.includes(q)) .map((city) => (
{ setCurrentCity(city); setCurrentMall(city.malls[0]); setCurrentMalls(city.malls); setShowList(false); }} > {city.name}
))}
)} {!showList && (
{currentCity && {currentCity.name}}    {currentMall && {currentMall.name}}
当前定位城市
切换商场
{ setIsMallExpand(false); }} >
{ e.stopPropagation(); }} > {currentMalls.map((mall) => ( { console.log("setMallCode", mall.code); setCurrentMall(mall); setIsMallExpand(false); setMallCode(mall.code); onRequestClose(); // Taro.reLaunch({ // url: `/pages/index/index?mallId=${mall.id}` // }); }} > {mall.name} ))} {!isMallExpand && (
{ e.stopPropagation(); setIsMallExpand(true); }} > 更多
)} {isMallExpand && ( { e.stopPropagation(); setIsMallExpand(false); }} > )}
(
{sectionData}
)} renderHeader={() => (
切换城市
{cities.map((city) => (
{ setCurrentCity(city); setCurrentMall(city.malls[0]); setCurrentMalls(city.malls); }} > {city.name}
))}
)} renderRow={(rowData) => (
{ setCurrentCity(rowData); setCurrentMalls(rowData.malls); setCurrentMall(rowData.malls[0]); }} > {rowData.name}
)} quickSearchBarStyle={{ position: "absolute", top: 25, }} delayTime={10} delayActivityIndicator={
rendering...
} />
)}
); }; export default Malls;