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

320 lines
6.8 KiB
Vue

<template>
<layout>
<Header :scroll-top="scrollTop">
{{ title }}
</Header>
<view class="addressList">
<template v-if=" main.address.length>0">
<uv-swipe-action>
<uv-swipe-action-item
v-for="(item, index) in main.address"
:key="index"
:options="options"
@click="showModal( item)"
>
<view
:class="{ address: true, noBorder: index == 0 }"
@tap="handleClick(item)"
>
<view class="address-main">
<view class="address-header">
<view class="address-name">{{ item.realName }}</view>
<view class="address-phone">{{ item.phone }}</view>
</view>
<view class="address-content">
<view
class="address-default"
v-if="item.isDefault"
>
<uv-tags
text="默认"
plain
size="mini"
></uv-tags>
</view>
<view class="address-desc">{{ item.province }}-{{ item.city }}-{{ item.district }} {{
item.detail
}}
</view>
</view>
</view>
<view class="address-actions">
<view
class="address-actions-edit"
@tap.stop="goEditorAddress(item)"
>
<image
class="image"
:src="addressEditIcon"
alt=""
></image>
</view>
</view>
</view>
</uv-swipe-action-item>
</uv-swipe-action>
</template>
<Empty
:iconSrc="emptyAddressIcon"
v-else
>
您还没有新增地址~
</Empty>
</view>
<view class="form-buttons">
<view class="btn">
<uv-button
round
block
type="primary"
@tap="goCreateAddress"
>
新增地址
</uv-button>
</view>
</view>
<ReturnTop :scroll-top="scrollTop" />
<Modal
ref="modalRef"
content="确认要删除地址吗?"
@confirm="doDeleteRequest" />
</layout>
</template>
<script setup>
import { ref, unref } from 'vue'
import { onLoad, onReachBottom } from '@dcloudio/uni-app'
import { useMainStore } from '@/store/modules/useMainStore'
import Empty from '@/components/Empty/index.vue'
import { addressEditIcon, emptyAddressIcon } from "@/utils/images";
import { getAddressDel, } from '@/api/address'
import { useRouter } from "@/hooks/useRouter";
import Header from "@/components/Header/index.vue"
import ReturnTop from "@/components/ReturnTop/index.vue";
import { useScroll } from "@/hooks/useScroll";
import Modal from "@/components/Modal/index.vue";
const {push, goBack} = useRouter()
const {scrollTop} = useScroll()
const title = ref('')
const main = useMainStore()
const moreLoding = ref(true)
const actionType = ref('')
const page = ref(1)
const selectCartId = ref(undefined)
const options = ref([{
text: '删除',
style: {
backgroundColor: '#EE6D46'
}
}])
onReachBottom((e) => {
if (main.moreLoading) {
page.value = page.value + 1
main.getAddressList(page.value)
}
})
const goCreateAddress = () => {
let addressData = {};
if (actionType.value === 'select') {
addressData.type = 'select';
}
push({url: '/pages/createAddress/createAddress'}, {data: addressData})
}
const goEditorAddress = (address) => {
let addressData = {
id: address.id
};
if (actionType.value === 'select') {
addressData.type = 'select';
}
push({url: '/pages/createAddress/createAddress'}, {data: addressData})
}
const handleClick = (item) => {
if (actionType.value === 'select') {
main.setSelectAddress(item.id)
goBack()
// push({url: '/pages/submitOrder/submitOrder'}, {
// data: {cartId: unref(selectCartId) || main.cartId},
// type: 'redirectTo'
// })
}
}
const {getParams} = useRouter()
onLoad((option) => {
main.restAddress()
const params = getParams(option)
params.cartId ? main.cartId = params.cartId : void (0)
if (params.type) {
actionType.value = params.type
title.value = '选择地址'
selectCartId.value = params.cartId
} else {
title.value = '地址管理'
}
main.getAddressList(page.value)
})
const modalRef = ref()
const prepareData = ref({})
/**
* 打开弹窗
*/
function showModal(data) {
prepareData.value = data
unref(modalRef).show()
}
/**
* 删除地址
*/
async function doDeleteRequest() {
await getAddressDel(prepareData.value)
await main.restAddress()
await main.getAddressList(1)
if (main.selectAddress && prepareData.value.id === main.selectAddress.id) {
main.clearSelectAddress()
}
}
</script>
<style lang="scss">
@import "../../style/images";
.address {
padding: 25rpx 35rpx;
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
&-actions {
&-edit {
width: 33rpx;
height: 33rpx;
.image {
width: 100%;
height: 100%;
display: block;
}
}
}
&.noBorder {
&::after {
display: none;
}
}
&::after {
content: '';
position: absolute;
left: 35rpx;
top: 0;
right: 0;
height: 1rpx;
background: #E6E6E6;
}
background: #fff;
&-header {
display: flex;
align-items: center;
margin-bottom: 8rpx;
}
&-name {
line-height: 40rpx;
font-size: 28rpx;
color: #333333;
margin-right: 30rpx;
}
&-phone {
line-height: 40rpx;
font-size: 28rpx;
color: #333333;
}
&-content {
display: flex;
align-items: center;
padding-right: 10rpx;
}
&-default {
width: 80rpx;
margin-right: 20rpx;
}
&-desc {
flex: 1;
line-height: 33rpx;
font-size: 24rpx;
color: #999999;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
}
.addressList {
padding-bottom: 100rpx;
}
.form-buttons {
position: fixed;
bottom: env(safe-area-inset-bottom);
left: 0;
z-index: 999;
width: 100%;
padding: 0;
}
.form-buttons .btn {
width: 90%;
margin: 0 auto;
}
.address-default :deep(.uv-tags) {
justify-content: center;
white-space: nowrap;
}
.addressList :deep(.uv-swipe-action-item__right__button__wrapper) {
position: relative;
&:before {
position: absolute;
content: '';
background: $addDelIcon no-repeat center center;
width: 50rpx;
height: 50rpx;
background-size: contain;
}
}
.addressList :deep(.uv-swipe-action-item__right__button__wrapper__text) {
visibility: hidden;
}
</style>