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.

292 lines
9.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<!-- Header Start -->
<header class="header">
<div class="logo-wrap">
<i class="icon-arrow-left-bold-box icli" @click="$router.go(-1)"></i>
<h1 class="title-color font-md">選擇收貨地址</h1>
</div>
</header>
<!-- Header End -->
<!-- Main Start -->
<main class="main-wrap address2-page mb-xxl">
<!-- Address Section Start -->
<section class="pt-0">
<button class="d-block btn-outline-grey" @click="showOffcanvas = true">+ 增加新地址</button>
<div class="address-wrap">
<!-- Address Star -->
<div
class="address-box"
:class="{ active: ua.is_default }"
v-for="(ua, index) in userAddr"
:key="ua.address_id"
@click="handleSetDefault(ua.address_id)"
>
<div class="conten-box">
<div class="heading">
<div class="heading-left">
<i class="icon-home icli"></i>
<h2 class="title-color font-md">{{ ua.address_name }}</h2>
<span class="badges-round font-white bg-theme-theme font-xs" v-if="ua.is_default"
>預設</span
>
</div>
<div class="heading-right">
<i class="icon-trash" @click.stop="handleDelete(ua.address_id)"></i>
</div>
</div>
<h3 class="title-color font-sm">{{ ua.consignee }}</h3>
<h3 class="title-color font-sm">{{ ua.tel }}</h3>
<p class="content-color font-sm">{{ua.city + '' + ua.district + '' + ua.address }}</p>
</div>
<!-- <img src="/src/assets/images/map/map.jpg" alt="map" /> -->
</div>
<!-- Address End -->
</div>
</section>
<!-- Address Section End -->
</main>
<!-- Main End -->
<!-- Footer Start -->
<!-- <footer class="footer-wrap footer-button">
<a href="payment.html" class="font-md">Proceed to Payment</a>
</footer> -->
<!-- Footer End -->
<!-- Add New Address Off Canvas Start -->
<van-popup v-model:show="showOffcanvas" round closeable position="bottom">
<div class="offcanvas-header">
<h5 class="title-color font-md fw-600">增加住址</h5>
</div>
<van-form @submit="onSubmit" ref="addrForm">
<div class="offcanvas-body small">
<van-cell-group inset>
<van-field
v-model="form.name"
name="name"
label="住址名稱"
placeholder="自己可以識別的名稱"
:rules="[{ required: true, message: '請填寫住址名稱' }]"
/>
<van-field
v-model="form.consignee"
name="consignee"
label="聯絡人"
placeholder="聯絡人"
:rules="[{ required: true, message: '請填寫聯絡人姓名' }]"
/>
<van-field
v-model="form.tel"
name="tel"
label="聯絡電話"
placeholder="聯絡電話"
:rules="[{ required: true, message: '請填寫聯絡電話' }]"
/>
<van-field
v-model="fieldValue"
is-link
readonly
name="area"
label="地區"
placeholder="請選擇區域"
@click="showPicker = true"
/>
<van-popup v-model:show="showPicker" position="bottom">
<van-picker
name="selectedValue"
v-model="selectedValue"
:columns="columns"
@confirm="onConfirm"
@cancel="showPicker = false"
confirm-button-text="確認"
cancel-button-text="取消"
/>
</van-popup>
<van-field v-model="form.zipcode" name="zipcode" label="郵遞區號" placeholder="郵遞區號" />
<van-field
v-model="form.address"
name="address"
label="詳細地址"
placeholder="詳細地址"
:rules="[{ required: true, message: '請填寫詳細地址' }]"
/>
<van-field name="is_default" label="是否為預設">
<template #input>
<van-switch v-model="form.is_default" />
</template>
</van-field>
</van-cell-group>
</div>
<div style="margin: 16px">
<van-button round block type="primary" native-type="submit"> </van-button>
</div>
</van-form>
</van-popup>
<!-- Add New Address Off Canvas End -->
</template>
<script setup>
import { ref, onMounted } from "vue";
import { useRouter, useRoute } from "vue-router";
import { useOrderStore } from "@/store/Order";
import { showToast } from "vant";
import "vant/es/toast/style";
import { getArea } from "@/services/shop";
import { getUserAddress, addUserAddress, delUserAddress, setUserAddressDefault } from "@/services/user";
const route = useRoute();
const router = useRouter();
const orderStore = useOrderStore();
const showPicker = ref(false);
const showOffcanvas = ref(false);
const fieldValue = ref("");
const userAddr = ref([]);
const columns = ref([]);
const addrForm = ref();
const form = ref({
name: "住家",
consignee: '',
tel: '',
city: '',
district: '',
zipcode: '',
address: '',
is_default: false,
});
const selectedValue = ref(["0"])
onMounted(async () => {
let addrRes = await getUserAddress();
if (addrRes.code === 200) {
userAddr.value = addrRes.data;
}
let areaRes = await getArea();
if (areaRes.code === 200) {
columns.value = areaRes.data;
}
});
const onConfirm = ({ selectedOptions }) => {
showPicker.value = false;
let selectedArea = selectedOptions[0].text;
if (selectedOptions[1]) {
selectedArea += "-" + selectedOptions[1].text;
}
if (selectedOptions[2]) {
selectedArea += "-" + selectedOptions[2].text;
}
fieldValue.value = selectedArea;
form.value.city = selectedOptions[0].text;
form.value.district = selectedOptions[1].text;
};
const handleSubmit = () => {
// addrForm.value.submit()
};
const handleClose = () => {
addrForm.value.resetValidation();
};
const onSubmit = async () => {
let res = await addUserAddress(form.value);
showOffcanvas.value = false;
if (res.code === 200) {
userAddr.value = res.data;
return showToast("新增成功");
} else {
return showToast("新增失敗");
}
};
const handleDelete = async (id) => {
let res = await delUserAddress(id);
if (res.code === 200) {
userAddr.value = userAddr.value.filter((item) => {
if (item.address_id !== id) {
return item;
}
});
showToast("刪除成功");
} else {
showToast("刪除失敗");
}
};
const handleSetDefault = async (id) => {
let res = await setUserAddressDefault(id);
if (res.code === 200) {
// userAddr.value = res.data
userAddr.value = userAddr.value.map((item) => {
if (item.address_id === id) {
item.is_default = true;
} else {
item.is_default = false;
}
return item;
});
//判斷是否從order頁面過來是的話就寫入piana及跳回checkout page
if (route.query.from === "order") {
let addr = userAddr.value.find((item) => {
if (item.address_id === id) {
return item;
}
});
orderStore.shipping = {
shipping_code: "shipping",
extra_data: {
address: addr.address,
consignee: addr.consignee,
tel: addr.tel,
},
};
router.replace("/checkout");
}
}
};
</script>
<style lang="less" scoped>
.conten-box {
width: 100%;
}
.heading {
display: flex;
justify-content: space-between;
.heading-left {
display: flex;
h2 {
margin: 0 10px;
}
}
.heading-right {
}
}
</style>