You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
5.5 KiB
205 lines
5.5 KiB
<template>
|
|
<View>
|
|
<MapControl @handleMapIcon="handleMapIcon" :mapIdx="mapIdx" v-if="showMap"></MapControl>
|
|
<Teleport to="body">
|
|
<Transition appear enter-active-class="animate__animated animate__fadeIn" leave-active-class="animate__animated animate__fadeOut">
|
|
<div class="hide-map" v-if="showMap" @click="showMap = false">
|
|
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<g>
|
|
<path id="Vector" d="M24 22.1L33.9 32L36.728 29.172L24 16.444L11.272 29.172L14.1 32L24 22.1Z" fill="currentColor" />
|
|
</g>
|
|
</svg>
|
|
<div v-if="isH">
|
|
<div>点击</div>
|
|
<div>收起地图</div>
|
|
</div>
|
|
<div v-else>点击收起地图</div>
|
|
</div></Transition
|
|
>
|
|
<div class="brand-wrapper" :class="showMap ? 'showMap' : ''">
|
|
<BrandScroll class="brand" :class="showMap ? 'showMap' : ''" :shop="shop" @click="handleShop" :list="selectedList" :isFood="isFood" :config="config" />
|
|
</div>
|
|
</Teleport>
|
|
</View>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { ref, computed, watch, onBeforeMount, onBeforeUnmount } from 'vue'
|
|
import { storeToRefs } from 'pinia'
|
|
import { useStore } from '@/store/root'
|
|
import { getBrandListByFloor } from '@/http/brand/api'
|
|
import View from '@/layouts/View.vue'
|
|
import BrandScroll from '@/components/BrandScroll/BrandScroll.vue'
|
|
import { hideMapDialog, setShopActive, setShopInactive } from '@/composables/useInitMap'
|
|
import MapControl from '@/components/MapControl/MapControl.vue'
|
|
import { RESET, DIRECTION } from '@/components/MapControl/list'
|
|
import { useMediaQuery } from '@vueuse/core'
|
|
|
|
const store = useStore()
|
|
const storeRefs = storeToRefs(store)
|
|
const { config, indexList, foodIndustryMap, shop, currentFloor, showMap, showSearch, path } = storeRefs
|
|
const mapIdx = ref(-1)
|
|
const mapTimer = ref(null)
|
|
const mapIconTimer = ref(null)
|
|
const selectedList = ref([])
|
|
const isFood = computed(() => path.value === '/foods')
|
|
const isH = useMediaQuery('(min-aspect-ratio: 1/1)')
|
|
|
|
Promise.all([getBrandListByFloor()]).then(([_brandList]) => {
|
|
if (storeRefs.shop.value) shop.value = storeRefs.shop.value
|
|
if (isFood.value) {
|
|
const list = _brandList.data.list.map(item => ({
|
|
name: item.name,
|
|
shopList: item.shopList.filter(({ industryFatherCode }) => foodIndustryMap.value[industryFatherCode])
|
|
}))
|
|
selectedList.value = list
|
|
} else {
|
|
const recMap = indexList.value.recommendList.reduce((acc, { shopCode }) => ({ ...acc, [shopCode]: true }), {})
|
|
const list = _brandList.data.list
|
|
selectedList.value = list.map(({ name, shopList: _shopList }) => ({ name, shopList: _shopList.filter(({ shopCode }) => recMap[shopCode]) }))
|
|
}
|
|
})
|
|
onBeforeMount(() => {
|
|
store.SET_SHOW_MAP(false)
|
|
})
|
|
|
|
onBeforeUnmount(() => {
|
|
if (!showSearch.value) store.SET_SHOP(null)
|
|
})
|
|
function handleShop(item) {
|
|
if (shop.value?.shopCode === item.shopCode) {
|
|
if (showMap.value) {
|
|
window.Map_QM.pathNode({ floor: shop.value.floorOrder, node: shop.value.yaxis })
|
|
} else store.SET_SHOW_MAP(true)
|
|
}
|
|
mapIdx.value = -1
|
|
store.SET_SHOP(item)
|
|
}
|
|
|
|
//我的位置
|
|
function onClickDeviceSite() {
|
|
hideMapDialog()
|
|
window.Map_QM.onShowDeviceSite()
|
|
}
|
|
function handleMapIcon(item, index) {
|
|
store.SET_SHOP(null)
|
|
clearTimeout(mapIconTimer.value)
|
|
window.Map_QM.changeStateShopPro(false)
|
|
mapIdx.value = index
|
|
switch (item.name) {
|
|
case RESET:
|
|
onClickDeviceSite()
|
|
window.Map_QM.showFloor(currentFloor.value.floorOrder)
|
|
break
|
|
case DIRECTION:
|
|
window.Map_QM.onShowMeDir()
|
|
break
|
|
default:
|
|
break
|
|
}
|
|
clearTimeout(mapTimer.value)
|
|
if (item.name === RESET) {
|
|
mapTimer.value = setTimeout(() => {
|
|
mapIdx.value = -1
|
|
mapTimer.value = -1
|
|
clearTimeout(mapTimer.value)
|
|
}, 300)
|
|
}
|
|
}
|
|
|
|
watch(showMap, v => {
|
|
if (v) {
|
|
window?.Map_QM?.startRender()
|
|
if (shop.value) {
|
|
store.SET_SHOW_MAP(true)
|
|
window.Map_QM.pathNode({ floor: shop.value.floorOrder, node: shop.value.yaxis })
|
|
}
|
|
} else {
|
|
window?.Map_QM?.cancelRender()
|
|
}
|
|
})
|
|
|
|
watch(shop, nxt => {
|
|
if (!nxt) {
|
|
setShopInactive()
|
|
} else if (nxt && showMap.value) {
|
|
setShopActive(nxt)
|
|
window.Map_QM.pathNode({ floor: nxt.floorOrder, node: nxt.yaxis })
|
|
}
|
|
})
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.hide-map {
|
|
position: absolute;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
padding-top: 4px;
|
|
height: 100px;
|
|
left: 0;
|
|
right: 0;
|
|
background: var(--guide-floorBg);
|
|
color: var(--guide-floorColor);
|
|
top: 1050px;
|
|
font-size: 24px;
|
|
font-weight: 700;
|
|
line-height: normal;
|
|
svg {
|
|
width: 48px;
|
|
height: 48px;
|
|
}
|
|
}
|
|
.brand-wrapper {
|
|
position: absolute;
|
|
top: 408px;
|
|
height: 1512px;
|
|
z-index: 20;
|
|
background: var(--global-background);
|
|
transition: all 0.5s ease-in-out;
|
|
&.showMap {
|
|
height: 770px;
|
|
top: 1150px;
|
|
.brand {
|
|
height: 770px;
|
|
}
|
|
}
|
|
.brand {
|
|
height: 1512px;
|
|
}
|
|
}
|
|
@media (min-aspect-ratio: 1/1) {
|
|
.hide-map {
|
|
left: 1310px;
|
|
right: 510px;
|
|
height: 800px;
|
|
top: 280px;
|
|
align-items: center;
|
|
text-align: center;
|
|
justify-content: center;
|
|
font-size: 20px;
|
|
svg {
|
|
transform: rotate(-90deg);
|
|
margin-bottom: 27px;
|
|
}
|
|
}
|
|
.brand-wrapper {
|
|
top: 280px;
|
|
width: 100vw;
|
|
right: 0;
|
|
height: 800px;
|
|
.brand {
|
|
height: 800px;
|
|
}
|
|
&.showMap {
|
|
width: 510px;
|
|
top: 280px;
|
|
height: 800px;
|
|
.brand {
|
|
width: 456px;
|
|
height: 800px;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|
|
|