Files
2024-02-22 18:37:23 +08:00

228 lines
4.9 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!--
@name: shopSelect
@author: kahu4
@date: 2024-01-19 17:47
@descriptionshopSelect
@update: 2024-01-19 17:47
-->
<script setup>
import Header from "@/components/Header/index.vue"
import { onMounted, ref } from "vue";
import {
emptyCollectIcon,
shopLocation,
shopLocation1,
shopLocationGrey,
shopPhone,
shopPhoneGrey,
shopTime
} from "@/utils/images";
import { getShopList } from "@/api/address";
import { onLoad } from "@dcloudio/uni-app";
import { useRouter } from "@/hooks/useRouter";
import { mapUtils, openMap } from "@/utils/mapUtils";
import { emitter } from "@/utils/emitter";
import Empty from "@/components/Empty/index.vue";
const {getParams, goBack} = useRouter()
onMounted(() => {
})
const shopSelectId = ref('')
const shopList = ref([])
async function doGetShopList() {
uni.showLoading({title: '加载中'})
uni.getLocation({
success: async (res) => {
console.log(res)
shopList.value = await getShopList({lat: res.latitude, lon: res.longitude})
},
complete: () => {
uni.hideLoading()
},
fail: (err) => {
console.error(err)
}
})
}
function handleSelectShop(shop) {
shopSelectId.value = shop.id
emitter.emit('selectShop', shop)
goBack()
}
const showMapSelect = ref(false)
let shopSelect = null
function handleConfirmMapSelect(e) {
shopSelect.type = e.name
openMap(shopSelect)
}
function handleMapSelectClose() {
shopSelect = null
showMapSelect.value = false
}
function handleNavigation(shop) {
// #ifdef H5
shopSelect = shop
showMapSelect.value = true
// #endif
// #ifndef H5
openMap(shop)
// #endif
}
function handleCall(shop) {
uni.makePhoneCall({
phoneNumber: shop.storePhone
})
}
onMounted(() => {
doGetShopList()
})
onLoad((options) => {
const params = getParams(options);
// 默认选中
if (params && params.shopSelect) {
shopSelectId.value = params.shopSelect.id
}
})
</script>
<template>
<view>
<Header
system-bar-area-bg="#fff"
header-area-bg="#fff"> 选择门店
</Header>
<view class="shop-list">
<template v-if="shopList.length>0">
<view
class="shop-item"
:class="{current:shopSelectId === shop.id}"
v-for="shop in shopList"
:key="shop.id"
@click="handleSelectShop(shop)">
<view class="row-box">
<view class="title-row">
<view class="name">{{ shop.storeIntro }}</view>
<view class="sub">距离 {{ shop.distance }} m</view>
</view>
<view class="sub-row address-row">
<image :src="shopLocation1" />
{{ shop.address }}
</view>
<view class="sub-row time-row">
<image :src="shopTime" />
{{ shop.businessStartTime }} - {{ shop.businessEndTime }}
</view>
</view>
<view class="bottom-row">
<view
class="button-item"
@click.stop="handleCall(shop)">
<image :src="shopSelectId === shop.id?shopPhone:shopPhoneGrey" />
门店电话
</view>
<view
class="button-item"
@click.stop="handleNavigation(shop)">
<image :src="shopSelectId === shop.id?shopLocation:shopLocationGrey" />
导航
</view>
</view>
</view>
</template>
<template v-else>
<Empty
:iconSrc="emptyCollectIcon"
>
当前暂无门店~
</Empty>
</template>
</view>
<uv-action-sheet
:actions="mapUtils.mapList"
:show="showMapSelect"
cancelText="取消"
@select="handleConfirmMapSelect"
@close="handleMapSelectClose" />
</view>
</template>
<style
scoped
lang="scss">
.shop-list {
@include usePadding(32, 32);
.shop-item {
width: 100%;
border: 1rpx solid #E6E6E6;
overflow: hidden;
border-radius: 15rpx;
margin-bottom: 20rpx;
.row-box {
@include usePadding(40, 40);
}
.title-row {
font-size: 34rpx;
font-weight: bold;
@include useFlex(space-between, center);
.sub {
font-weight: normal;
color: #999;
font-size: 24rpx;
}
}
.sub-row, .bottom-row {
image {
width: 30rpx;
height: 30rpx;
margin-right: 15rpx;
}
}
.sub-row {
@include useFlex(flex-start, center);
font-size: 24rpx;
margin: 10rpx 0;
}
.bottom-row {
background: #e6e6e6;
color: #A1A1A1;
font-size: 30rpx;
@include useFlex(space-between, center);
@include usePadding(0, 24);
.button-item {
@include useFlex(center, center);
width: 50%;
}
}
}
.current {
border: 1rpx solid $primary-color;
.bottom-row {
background: $primary-color;
color: #fff;
}
}
}
</style>