|
|
|
@@ -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,8 +391,10 @@ const loadInitialSpacePoints = async () => {
|
|
|
|
icon: 'none'
|
|
|
|
icon: 'none'
|
|
|
|
})
|
|
|
|
})
|
|
|
|
} finally {
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
if (requestSeq === searchRequestSeq) {
|
|
|
|
isLoading.value = false
|
|
|
|
isLoading.value = false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const focusSearchInput = async () => {
|
|
|
|
const focusSearchInput = async () => {
|
|
|
|
@@ -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,8 +641,10 @@ 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) => {
|
|
|
|
|