191 lines
5.7 KiB
Vue
191 lines
5.7 KiB
Vue
<script setup lang="ts">
|
|
import {appCouponExchangeCouponPost, appCouponUserCouponListPost} from "@/service";
|
|
|
|
const { t, locale } = useI18n();
|
|
import { throttle } from "throttle-debounce";
|
|
import Config from "@/config";
|
|
import {dayjs} from "@/plugin";
|
|
|
|
function isEnLocale() {
|
|
return String(locale.value || '').toLowerCase().startsWith('en')
|
|
}
|
|
|
|
function formatMoney(value: unknown) {
|
|
const n = Number(value)
|
|
if (!Number.isFinite(n)) return '0.00'
|
|
return n.toFixed(2)
|
|
}
|
|
|
|
function formatCouponDetail(item: any) {
|
|
const type = Number(item?.snapshotType)
|
|
const discount = Number(item?.snapshotDiscount)
|
|
const minAmount = Number(item?.snapshotMinAmount)
|
|
|
|
// 1-折扣券(percentage), 2-满减券(amount off with minimum spend)
|
|
if (type === 2) {
|
|
const hasMin = Number.isFinite(minAmount) && minAmount > 0
|
|
const discountText = `$${formatMoney(discount)}`
|
|
if (hasMin) {
|
|
const minText = `$${formatMoney(minAmount)}`
|
|
return isEnLocale()
|
|
? `Min ${minText} · Off ${discountText}`
|
|
: `满${minText}减${discountText}`
|
|
}
|
|
return isEnLocale() ? `Off ${discountText}` : `立减${discountText}`
|
|
}
|
|
|
|
if (type === 1) {
|
|
const pct = Number.isFinite(discount) ? Number(discount * 100).toFixed(0) : '0'
|
|
return `${pct}% ${t('pages-store.store.discount')}`
|
|
}
|
|
|
|
return t('pages-store.store.discount')
|
|
}
|
|
|
|
function getList(pageNum: number, pageSize: number) {
|
|
return appCouponUserCouponListPost({
|
|
params: {
|
|
pageNum,
|
|
pageSize,
|
|
}
|
|
}) as any
|
|
}
|
|
|
|
const {paging, loading, firstLoaded, dataList, queryList} = usePage<any>(getList)
|
|
|
|
|
|
const keyword = ref<string>("");
|
|
// 输入框是否聚焦
|
|
const isSearch = ref<boolean>(false);
|
|
// 是否禁用兑换按钮
|
|
const isDisabled = computed(() => {
|
|
return !keyword.value;
|
|
});
|
|
|
|
function handleClearSearch() {
|
|
isSearch.value = false;
|
|
}
|
|
function search(event: any) {
|
|
if (!event.value) {
|
|
isSearch.value = false;
|
|
} else {
|
|
}
|
|
}
|
|
const handleSearch = throttle(Config.throttleShortTime, search, {
|
|
noLeading: true,
|
|
noTrailing: false,
|
|
});
|
|
|
|
// 兑换
|
|
function handleSubmit() {
|
|
console.log("兑换");
|
|
appCouponExchangeCouponPost({
|
|
body: {
|
|
couponCode: keyword.value,
|
|
}
|
|
}).then(res=> {
|
|
paging.value?.refresh()
|
|
uni.showToast({
|
|
title: t('toast.redemptionSuccessful'),
|
|
icon: 'none'
|
|
})
|
|
})
|
|
}
|
|
</script>
|
|
<template>
|
|
<z-paging
|
|
ref="paging"
|
|
:default-page-size="10"
|
|
v-model="dataList"
|
|
@query="queryList"
|
|
bg-color="#fff"
|
|
>
|
|
<template #top>
|
|
<navbar :title="t('pages-user.coupon.title')" />
|
|
<view class="px-30rpx pb-42rpx">
|
|
<!-- <view class="text-46rpx text-#333 font-bold lh-46rpx mb-36rpx mt-10rpx">
|
|
{{ t("pages-user.coupon.title") }}</view
|
|
> -->
|
|
<view
|
|
class="flex items-center h-88rpx px-30rpx bg-#F2F3F6 rounded-88rpx box-border"
|
|
>
|
|
<image
|
|
class="w-28rpx h-28rpx shrink-0"
|
|
src="@img/chef/105.png"
|
|
></image>
|
|
<wd-input
|
|
no-border
|
|
focus-when-clear
|
|
type="text"
|
|
v-model="keyword"
|
|
:maxlength="120"
|
|
:placeholder="t('pages-user.coupon.search-placeholder')"
|
|
placeholderStyle="font-size: 30rpx;line-height: 42rpx;color: #4A4A4A;"
|
|
custom-class="flex-1 ml-16rpx !bg-transparent"
|
|
@clear="handleClearSearch"
|
|
@input="handleSearch"
|
|
@focus="isSearch = true"
|
|
@blur="isSearch = false"
|
|
/>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<view class="px-30rpx my-34rpx" style="position: fixed; bottom: 10rpx; left: 0; right: 0; z-index: 100;" v-if="isSearch">
|
|
<wd-button
|
|
block
|
|
custom-class="!h-98rpx !text-32rpx !rounded-46rpx"
|
|
style="background-color: #000;"
|
|
:disabled="isDisabled"
|
|
@click="handleSubmit"
|
|
>
|
|
{{ t("pages-user.coupon.redeem-now") }}
|
|
</wd-button>
|
|
</view>
|
|
|
|
<template v-for="item in dataList" :key="item.id">
|
|
<view class="coupon-item h-328rpx mx-36rpx flex flex-col mb-30rpx last:mb-0">
|
|
<view class="flex-1 pt-40rpx px-58rpx">
|
|
<view class="line-clamp-1 text-34rpx lh-34rpx text-#333 font-bold">
|
|
{{ item.snapshotNameZh }}
|
|
</view>
|
|
<view class="text-24rpx lh-32rpx text-#999 my-18rpx">
|
|
{{ item.snapshotMerchantId ? t('pages-user.coupon.merchant-specific') : t('pages-user.coupon.all-merchants') }}
|
|
</view>
|
|
<view class="text-24rpx lh-32rpx text-#999 my-18rpx">
|
|
{{ dayjs(Number(item.snapshotValidEnd)).format('YYYY-MM-DD HH:mm') }}{{ isEnLocale() ? ' expires' : '到期' }}
|
|
</view>
|
|
<view class="text-28rpx lh-28rpx text-#333 flex items-center">
|
|
<image
|
|
class="w-36rpx h-36rpx shrink-0 mr-10rpx"
|
|
src="@img/chef/106.png"
|
|
></image>
|
|
{{ formatCouponDetail(item) }}
|
|
</view>
|
|
</view>
|
|
<view class="h-84rpx lh-84rpx text-center text-28rpx text-#fff">
|
|
{{ t('common.confirm') }}
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<!-- <view-->
|
|
<!-- v-if="dataList.length === 0 && !isSearch"-->
|
|
<!-- class="flex flex-col items-center mt-88rpx"-->
|
|
<!-- >-->
|
|
<!-- <image class="w-552rpx h-552rpx" src="@img/chef/104.png"></image>-->
|
|
<!-- <text class="text-28rpx text-#9E9E9E mt--100rpx"-->
|
|
<!-- >{{ t('pages-user.coupon.no-coupons') }}</text-->
|
|
<!-- >-->
|
|
<!-- </view>-->
|
|
</z-paging>
|
|
</template>
|
|
<style scoped lang="scss">
|
|
.coupon-item {
|
|
background-image: url('@img/chef/103.png');
|
|
background-size: 100% 100%;
|
|
background-repeat: no-repeat;
|
|
background-position: center;
|
|
}
|
|
</style>
|