修复点位搜索快捷入口联动响应
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
lyf
2026-07-07 02:16:59 +08:00
parent d7c3e399c7
commit 6d369a6c59

View File

@@ -234,6 +234,7 @@ const activeFloor = ref('1F')
const pois = ref<MuseumPoi[]>([]) const pois = ref<MuseumPoi[]>([])
const isLoading = ref(false) const isLoading = ref(false)
const initialSpaceLoadError = ref('') const initialSpaceLoadError = ref('')
let searchRequestSeq = 0
const showSearchContent = computed(() => props.variant === 'page' || homeExpanded.value) const showSearchContent = computed(() => props.variant === 'page' || homeExpanded.value)
const collapseDragThreshold = 48 const collapseDragThreshold = 48
@@ -313,6 +314,24 @@ const syncActiveFloor = () => {
|| displayFloors.value[0].label || displayFloors.value[0].label
} }
const syncActiveFloorToResults = (items: MuseumPoi[]) => {
if (!displayFloors.value.length) {
activeFloor.value = ''
return
}
const resultFloorLabels = new Set(items.map((poi) => poi.floorLabel).filter(Boolean))
if (activeFloor.value && resultFloorLabels.has(activeFloor.value)) return
const firstFloorWithResult = displayFloors.value.find((floor) => resultFloorLabels.has(floor.label))
if (firstFloorWithResult) {
activeFloor.value = firstFloorWithResult.label
return
}
syncActiveFloor()
}
const loadFloors = async () => { const loadFloors = async () => {
try { try {
floors.value = await guideUseCase.getFloors() floors.value = await guideUseCase.getFloors()
@@ -325,12 +344,18 @@ const loadFloors = async () => {
} }
const loadPois = async (keyword = '') => { const loadPois = async (keyword = '') => {
const requestSeq = ++searchRequestSeq
isLoading.value = true isLoading.value = true
initialSpaceLoadError.value = '' initialSpaceLoadError.value = ''
pois.value = []
try { try {
const result = await guideUseCase.searchPois(keyword) const result = await guideUseCase.searchPois(keyword)
pois.value = result.filter(isVisiblePoi) if (requestSeq !== searchRequestSeq) return
const visiblePois = result.filter(isVisiblePoi)
pois.value = visiblePois
syncActiveFloorToResults(visiblePois)
} catch (error) { } catch (error) {
if (requestSeq !== searchRequestSeq) return
console.error('加载点位搜索结果失败:', error) console.error('加载点位搜索结果失败:', error)
pois.value = [] pois.value = []
uni.showToast({ uni.showToast({
@@ -338,18 +363,26 @@ const loadPois = async (keyword = '') => {
icon: 'none' icon: 'none'
}) })
} finally { } finally {
if (requestSeq === searchRequestSeq) {
isLoading.value = false isLoading.value = false
} }
} }
}
const loadInitialSpacePoints = async () => { const loadInitialSpacePoints = async () => {
const requestSeq = ++searchRequestSeq
isLoading.value = true isLoading.value = true
initialSpaceLoadError.value = '' initialSpaceLoadError.value = ''
pois.value = []
try { try {
const result = await guideUseCase.getInitialSearchSpacePoints() const result = await guideUseCase.getInitialSearchSpacePoints()
pois.value = result.filter(isVisiblePoi) if (requestSeq !== searchRequestSeq) return
const visiblePois = result.filter(isVisiblePoi)
pois.value = visiblePois
syncActiveFloorToResults(visiblePois)
} catch (error) { } catch (error) {
if (requestSeq !== searchRequestSeq) return
console.error('加载 SDK 空间点位失败:', error) console.error('加载 SDK 空间点位失败:', error)
pois.value = [] pois.value = []
initialSpaceLoadError.value = '空间点位读取失败' initialSpaceLoadError.value = '空间点位读取失败'
@@ -358,9 +391,11 @@ const loadInitialSpacePoints = async () => {
icon: 'none' icon: 'none'
}) })
} finally { } finally {
if (requestSeq === searchRequestSeq) {
isLoading.value = false isLoading.value = false
} }
} }
}
const focusSearchInput = async () => { const focusSearchInput = async () => {
searchInputFocused.value = false searchInputFocused.value = false
@@ -581,17 +616,24 @@ const handleSearchConfirm = async (event?: any) => {
} }
const searchShortcut = async (shortcut: PoiSearchShortcut) => { const searchShortcut = async (shortcut: PoiSearchShortcut) => {
const requestSeq = ++searchRequestSeq
searchKeyword.value = shortcut.label searchKeyword.value = shortcut.label
searchDraftKeyword.value = shortcut.label searchDraftKeyword.value = shortcut.label
expandHomePanel() expandHomePanel()
isLoading.value = true isLoading.value = true
initialSpaceLoadError.value = ''
pois.value = []
try { try {
const groups = await Promise.all(shortcut.keywords.map((keyword) => guideUseCase.searchPois(keyword))) const groups = await Promise.all(shortcut.keywords.map((keyword) => guideUseCase.searchPois(keyword)))
pois.value = dedupePois(groups.flat()) if (requestSeq !== searchRequestSeq) return
const matchedPois = dedupePois(groups.flat())
.filter(isVisiblePoi) .filter(isVisiblePoi)
.filter((poi) => isPoiMatchingKeywords(poi, shortcut.keywords)) .filter((poi) => isPoiMatchingKeywords(poi, shortcut.keywords))
pois.value = matchedPois
syncActiveFloorToResults(matchedPois)
} catch (error) { } catch (error) {
if (requestSeq !== searchRequestSeq) return
console.error('加载点位分类搜索结果失败:', error) console.error('加载点位分类搜索结果失败:', error)
pois.value = [] pois.value = []
uni.showToast({ uni.showToast({
@@ -599,9 +641,11 @@ const searchShortcut = async (shortcut: PoiSearchShortcut) => {
icon: 'none' icon: 'none'
}) })
} finally { } finally {
if (requestSeq === searchRequestSeq) {
isLoading.value = false isLoading.value = false
} }
} }
}
const handleFacilityShortcut = (shortcut: ShortcutItem) => { const handleFacilityShortcut = (shortcut: ShortcutItem) => {
void searchShortcut(shortcut) void searchShortcut(shortcut)