From 712ebe646311442466a8547ee6fa2128b2644288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=88=90?= Date: Sun, 9 Nov 2025 00:48:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=97=A5=E6=9C=9F=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/container/listCustomNavbar/index.tsx | 21 ++++- src/store/listStore.ts | 97 +++++++++++++++++++++++- types/list/types.ts | 1 + 3 files changed, 116 insertions(+), 3 deletions(-) diff --git a/src/container/listCustomNavbar/index.tsx b/src/container/listCustomNavbar/index.tsx index 5bb8b17..c964395 100644 --- a/src/container/listCustomNavbar/index.tsx +++ b/src/container/listCustomNavbar/index.tsx @@ -21,7 +21,7 @@ interface IProps { } function CityPicker(props) { - const { visible, setVisible, cities, area, setArea } = props; + const { visible, setVisible, cities, area, setArea, onCityChange } = props; console.log(cities, "cities"); const [value, setValue] = useState(area); @@ -29,6 +29,10 @@ function CityPicker(props) { console.log(value, "value"); setValue(value); setArea(value); + // 切换城市时触发接口调用 + if (onCityChange) { + onCityChange(value); + } } return ( visible && ( @@ -48,7 +52,7 @@ const ListHeader = (props: IProps) => { const { config } = props; const { showInput = false, inputLeftIcon, leftIconClick } = config || {}; const { getLocationLoading, statusNavbarHeightInfo } = useGlobalState(); - const { gamesNum, searchValue, cities, area, updateArea } = useListState(); + const { gamesNum, searchValue, cities, area, updateArea, getMatchesData, fetchGetGamesCount, refreshBothLists } = useListState(); const { navBarHeight } = statusNavbarHeightInfo; const [cityPopupVisible, setCityPopupVisible] = useState(false); @@ -107,6 +111,18 @@ const ListHeader = (props: IProps) => { const area_city = area.at(-1); + // 处理城市切换 + const handleCityChange = async (newArea: any) => { + // 切换城市后,同时更新两个列表接口获取数据 + if (refreshBothLists) { + await refreshBothLists(); + } + // 更新球局数量 + if (fetchGetGamesCount) { + await fetchGetGamesCount(); + } + }; + return ( @@ -176,6 +192,7 @@ const ListHeader = (props: IProps) => { cities={cities} area={area} setArea={updateArea} + onCityChange={handleCityChange} /> )} diff --git a/src/store/listStore.ts b/src/store/listStore.ts index ef62239..847458b 100644 --- a/src/store/listStore.ts +++ b/src/store/listStore.ts @@ -177,6 +177,28 @@ export const useListStore = create()((set, get) => ({ // 全城和快捷筛选 const distanceQuickFilter = currentPageState?.distanceQuickFilter || {}; const { distanceFilter, order } = distanceQuickFilter || {}; + + // 从 area 中获取省份和城市名称(area 格式: ["中国", 省份, 城市]) + const province = state.area?.[1] || ""; // area[1] 是省份 + const city = state.area?.at(-1) || ""; // area[2] 是城市(虽然参数名是 city,但实际是城市名称) + + // 处理 dateRange,确保始终有两个值 + let dateRange: [string, string] = defaultDateRange; + const filterDateRange = filterOptions?.dateRange; + if (Array.isArray(filterDateRange)) { + if (filterDateRange.length === 0) { + // 如果没有选择日期,使用默认值 + dateRange = defaultDateRange; + } else if (filterDateRange.length === 1) { + // 如果只选择了一个日期,转换为两个相同的值 + const singleDate = filterDateRange[0] as string; + dateRange = [singleDate, singleDate]; + } else if (filterDateRange.length >= 2) { + // 如果选择了两个或更多日期,取前两个 + // 如果两个日期相同,保持两个相同的值 + dateRange = [filterDateRange[0] as string, filterDateRange[1] as string]; + } + } const params = { pageOption: currentPageState?.pageOption, @@ -185,8 +207,10 @@ export const useListStore = create()((set, get) => ({ title: state.searchValue, ntrpMin: filterOptions?.ntrp?.[0], ntrpMax: filterOptions?.ntrp?.[1], - dateRange: filterOptions?.dateRange, + dateRange: dateRange, // 确保始终是两个值的数组 distanceFilter: distanceFilter, + province: province, // 添加省份参数 + city: city, // 添加区县参数(虽然叫 city,但实际是区县) }, order: order, lat: state?.location?.latitude, @@ -289,6 +313,77 @@ export const useListStore = create()((set, get) => ({ return await fetchMatches({}, true); // 第一次进入页面,传入 isFirstLoad = true }, + // 同时更新两个列表接口(常规列表和智能排序列表) + refreshBothLists: async () => { + const state = get(); + const { getSearchParams, setListData } = state; + const { getGamesList, getGamesIntegrateList } = await import("../services/listApi"); + + try { + const searchParams = getSearchParams() || {}; + + // 调用常规列表接口 + const listParams = { + ...searchParams, + order: searchParams.order || "distance", + }; + const listRes = await getGamesList(listParams); + + // 调用智能排序列表接口 + const integrateParams = { + ...searchParams, + order: "", + seachOption: { + ...searchParams.seachOption, + isRefresh: true, + }, + }; + const integrateRes = await getGamesIntegrateList(integrateParams); + + // 根据当前排序方式更新对应的数据 + const currentPageState = state.isSearchResult ? state.searchPageState : state.listPageState; + const distanceQuickFilter = currentPageState?.distanceQuickFilter || {}; + const isIntegrate = distanceQuickFilter?.order === "0"; + + if (listRes?.code === 0 && listRes?.data) { + const { count, rows } = listRes.data; + if (!isIntegrate) { + // 如果当前是常规排序,更新常规列表数据 + setListData({ + error: '', + data: rows || [], + loading: false, + count, + isAppend: false, + }); + } + } + + if (integrateRes?.code === 0 && integrateRes?.data) { + const { count, rows, recommendList } = integrateRes.data; + if (isIntegrate) { + // 如果当前是智能排序,更新智能排序列表数据 + setListData({ + error: '', + data: rows || [], + loading: false, + count, + isAppend: false, + }); + } + // 无论当前排序方式如何,都更新推荐列表 + state.updateCurrentPageState({ + recommendList: recommendList || [], + }); + } + + return Promise.resolve(); + } catch (error) { + console.error("更新列表数据失败:", error); + return Promise.reject(error); + } + }, + // 获取球局数量 fetchGetGamesCount: async () => { const { getSearchParams } = get(); diff --git a/types/list/types.ts b/types/list/types.ts index 927661f..2559366 100644 --- a/types/list/types.ts +++ b/types/list/types.ts @@ -120,6 +120,7 @@ export interface ListActions { getCities: () => Promise; getCityQrCode: () => Promise; updateArea: (payload: [string, string, string]) => void; + refreshBothLists: () => Promise; } export interface IPayload {