Merge remote-tracking branch 'origin/main'
# Conflicts: # src/views/login/components/Register.vue
This commit is contained in:
+3
-3
@@ -17,7 +17,7 @@
|
||||
right: 20px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
background-color: #25D366;
|
||||
background-color: #ffffff;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
@@ -42,8 +42,8 @@
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="/src/main.ts"></script>
|
||||
<a href="https://wa.me/989390624220" target="_blank" id="whatsapp-button">
|
||||
<img class="p-2" src="/whatsapp.png" alt="" />
|
||||
<a href="https://web.rubika.ir/#c=u0I8F1U0a939b0df5ba9f73618d33d7c" target="_blank" id="whatsapp-button">
|
||||
<img class="p-2" src="/src/assets/img/rubika.webp" alt="" />
|
||||
</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 6.9 KiB |
+3
-3
@@ -73,8 +73,8 @@ function goToLogin(to: RouteLocationNormalized, next: NavigationGuardNext) {
|
||||
}
|
||||
|
||||
function goToHome(to: RouteLocationNormalized, next: NavigationGuardNext) {
|
||||
if (to.name !== 'home') {
|
||||
return next({ name: 'home' }) // Redirect to login
|
||||
if (to.name !== 'buyProduct') {
|
||||
return next({ name: 'buyProduct' }) // Redirect to login
|
||||
} else {
|
||||
return next() // If already on the login page, don't redirect
|
||||
}
|
||||
@@ -151,7 +151,7 @@ router.beforeEach(async (to, from, next) => {
|
||||
if (fingerPosition) {
|
||||
if (getToken()) {
|
||||
if (to.name === 'login') {
|
||||
return next({ name: from.name || 'home' }) // Redirect to home if trying to access login after authentication
|
||||
return next({ name: from.name || 'buyProduct' }) // Redirect to home if trying to access login after authentication
|
||||
}
|
||||
return next() // Proceed to the intended route
|
||||
} else {
|
||||
|
||||
@@ -26,6 +26,7 @@ export interface Product {
|
||||
description: string
|
||||
wallet: Wallet
|
||||
similar?:Product[]
|
||||
inventory:number
|
||||
}
|
||||
|
||||
export interface PInventory {
|
||||
|
||||
@@ -169,6 +169,39 @@ const checkNumber = async (_rule: Rule, value: number) => {
|
||||
return Promise.resolve()
|
||||
}
|
||||
|
||||
}
|
||||
const checkNumber2 = async (_rule: Rule, value: number) => {
|
||||
|
||||
|
||||
if (!value) {
|
||||
return Promise.reject('تعداد محصول را مشخص کنید')
|
||||
}
|
||||
if (value % 1 !== 0) {
|
||||
return Promise.reject('استفاده از اعداد اعشاری مجاز نمی باشد')
|
||||
}
|
||||
if (isBuyP) {
|
||||
// Skip wallet balance check if gateway is enabled
|
||||
if (!gatewayP && isToken()) {
|
||||
// if (!walletCash?.walletInfo?.cash && methodP == 'cash') {
|
||||
// return Promise.reject('موجودی کیف پول ناکافی است')
|
||||
// }
|
||||
// if (!walletCash?.walletInfo?.gold && methodP == 'gold') {
|
||||
// return Promise.reject('موجودی کیف طلا ناکافی است')
|
||||
// }
|
||||
// if (priceP * value > walletCash?.walletInfo?.cash && methodP == 'cash')
|
||||
// return Promise.reject('موجودی کیف پول ناکافی است')
|
||||
// if (amountP * value > walletCash?.walletInfo?.gold && methodP == 'gold')
|
||||
// return Promise.reject('موجودی کیف طلا ناکافی است')
|
||||
}
|
||||
return Promise.resolve()
|
||||
} else {
|
||||
if (value > NumP)
|
||||
|
||||
return Promise.reject('موجودی محصول ناکافی است')
|
||||
else
|
||||
return Promise.resolve()
|
||||
}
|
||||
|
||||
}
|
||||
export const justNumber2 = (price: number, method?: string, amount?: number, isBuy?: boolean, gateway?: boolean) => {
|
||||
priceP = price
|
||||
@@ -193,6 +226,17 @@ export const justNumber3 = (price: number, Num?: number, isBuy?: boolean) => {
|
||||
trigger: 'change'
|
||||
}
|
||||
|
||||
}
|
||||
export const justNumber4 = (price: number, Num?: number, isBuy?: boolean) => {
|
||||
priceP = price
|
||||
NumP = Num
|
||||
isBuyP = isBuy
|
||||
return {
|
||||
required: true,
|
||||
validator: checkNumber2,
|
||||
trigger: 'change'
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export const ruleNumber = () => {
|
||||
|
||||
@@ -66,12 +66,12 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wrap-fix bottom-0 px-10 py-6 flex gap-2 bg-white">
|
||||
<a class="w-full" href="tel:09128081392">
|
||||
<div class="wrap-fix bottom-0 px-10 py-6 flex gap-2 bg-white items-center">
|
||||
<a class="w-full" href="https://web.rubika.ir/#c=u0I8F1U0a939b0df5ba9f73618d33d7c">
|
||||
<BasicButton class="w-full" type="primary">تماس با پشتیبانی</BasicButton>
|
||||
</a>
|
||||
<a href="https://t.me/ghatreh">
|
||||
<img src="@/assets/img/telegram.png" alt="" class="h-10 w-10"/>
|
||||
<a href="https://web.rubika.ir/#c=u0I8F1U0a939b0df5ba9f73618d33d7c">
|
||||
<img src="@/assets/img/rubika.webp" alt="" class=" w-12"/>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
>
|
||||
<div class="flex gap-4">
|
||||
<!-- Product Image -->
|
||||
<div class="bg-gray-100 rounded-lg flex justify-center items-center p-3 min-w-[80px] h-[80px]">
|
||||
<div class="bg-gray-100 rounded-lg flex justify-center items-center p-1 min-w-[80px] h-[80px]">
|
||||
<img
|
||||
:src="getProductImage(item.product)"
|
||||
class="max-w-full max-h-full object-contain"
|
||||
@@ -152,7 +152,7 @@ watch(lastPrice, () => {
|
||||
|
||||
// Update item price and total price
|
||||
item.price = newPrice + (product.cash_fee_buy ?? 0)
|
||||
item.totalPrice = item.price * item.quantity
|
||||
item.totalPrice = parseInt(item.price * item.quantity)
|
||||
})
|
||||
|
||||
// Save updated prices to storage
|
||||
@@ -162,7 +162,7 @@ watch(lastPrice, () => {
|
||||
|
||||
// Computed total price that updates with price changes
|
||||
const totalPrice = computed(() => {
|
||||
return cartStore.cartItems.reduce((sum, item) => sum + item.totalPrice, 0)
|
||||
return parseInt(cartStore.cartItems.reduce((sum, item) => sum + item.totalPrice, 0))
|
||||
})
|
||||
|
||||
function getProductImage(product: any) {
|
||||
@@ -255,7 +255,7 @@ async function handleCheckout() {
|
||||
// Check wallet balance for cash method items (without gateway)
|
||||
const cashItemsTotal = cartStore.cartItems
|
||||
.filter(item => item.method === 'cash' && !item.gateway)
|
||||
.reduce((sum, item) => sum + item.totalPrice, 0)
|
||||
.reduce((sum, item) => parseInt(sum + item.totalPrice), 0)
|
||||
|
||||
if (cashItemsTotal > 0) {
|
||||
// Ensure wallet info is loaded
|
||||
@@ -308,7 +308,7 @@ async function handleCheckout() {
|
||||
return {
|
||||
direction: 1, // 1 for buy (cart items are always buy orders)
|
||||
price: productPrice,
|
||||
amount: item.quantity,
|
||||
amount: product.amount,
|
||||
gateway: item.gateway,
|
||||
product_id: product.id,
|
||||
method: item.method,
|
||||
@@ -374,7 +374,7 @@ async function initPrice() {
|
||||
|
||||
// Update item price and total price
|
||||
item.price = newPrice + (product.cash_fee_buy ?? 0)
|
||||
item.totalPrice = item.price * item.quantity
|
||||
item.totalPrice =parseInt(item.price * item.quantity)
|
||||
})
|
||||
|
||||
// Save updated prices to storage
|
||||
|
||||
+28
-24
@@ -22,27 +22,27 @@
|
||||
<div>حساب کاربری</div>
|
||||
</div>
|
||||
</BasicButton>
|
||||
<BasicButton v-if="isToken()" icon-size="16" class="!font-bold w-15rem"
|
||||
@click="$router.push({name: 'notifyTrigger'}); popVisible = false">
|
||||
<div class="flex gap-2 items-center">
|
||||
<BasicIcon icon="vuesax-linear:bill" size="16" class="absolute right-2" />
|
||||
<div>هشدار قیمت</div>
|
||||
</div>
|
||||
</BasicButton>
|
||||
<BasicButton v-if="isToken()" icon-size="16" class="!font-bold w-15rem"
|
||||
@click="$router.push({name: 'transfer'}); popVisible = false">
|
||||
<div class="flex gap-2 items-center">
|
||||
<BasicIcon icon="vuesax-linear:card-send" size="16" class="absolute right-2" />
|
||||
<div>انتقال قطره</div>
|
||||
</div>
|
||||
</BasicButton>
|
||||
<BasicButton v-if="isToken()" icon-size="16" class="!font-bold w-15rem"
|
||||
@click="$router.push({name: 'physicalReceive'}); popVisible = false">
|
||||
<div class="flex gap-2 items-center">
|
||||
<BasicIcon icon="vuesax-linear:direct-inbox" size="16" class="absolute right-2" />
|
||||
<div>دریافت طلای فیزیکی</div>
|
||||
</div>
|
||||
</BasicButton>
|
||||
<!-- <BasicButton v-if="isToken()" icon-size="16" class="!font-bold w-15rem"-->
|
||||
<!-- @click="$router.push({name: 'notifyTrigger'}); popVisible = false">-->
|
||||
<!-- <div class="flex gap-2 items-center">-->
|
||||
<!-- <BasicIcon icon="vuesax-linear:bill" size="16" class="absolute right-2" />-->
|
||||
<!-- <div>هشدار قیمت</div>-->
|
||||
<!-- </div>-->
|
||||
<!-- </BasicButton>-->
|
||||
<!-- <BasicButton v-if="isToken()" icon-size="16" class="!font-bold w-15rem"-->
|
||||
<!-- @click="$router.push({name: 'transfer'}); popVisible = false">-->
|
||||
<!-- <div class="flex gap-2 items-center">-->
|
||||
<!-- <BasicIcon icon="vuesax-linear:card-send" size="16" class="absolute right-2" />-->
|
||||
<!-- <div>انتقال قطره</div>-->
|
||||
<!-- </div>-->
|
||||
<!-- </BasicButton>-->
|
||||
<!-- <BasicButton v-if="isToken()" icon-size="16" class="!font-bold w-15rem"-->
|
||||
<!-- @click="$router.push({name: 'physicalReceive'}); popVisible = false">-->
|
||||
<!-- <div class="flex gap-2 items-center">-->
|
||||
<!-- <BasicIcon icon="vuesax-linear:direct-inbox" size="16" class="absolute right-2" />-->
|
||||
<!-- <div>دریافت طلای فیزیکی</div>-->
|
||||
<!-- </div>-->
|
||||
<!-- </BasicButton>-->
|
||||
<BasicButton v-if="isToken()" icon-size="16" class="!font-bold w-15rem"
|
||||
@click="$router.push({name: 'buyProduct'}); popVisible = false">
|
||||
<div class="flex gap-2 items-center">
|
||||
@@ -100,9 +100,13 @@
|
||||
<!-- <canvas ref="canvas" id="canvas1" width="400" height="80" class="w-full"></canvas>-->
|
||||
<div v-if="isToken()" class="bottom-appbar w-auto mx-auto">
|
||||
<div class="tabs">
|
||||
<div :class="setNavColor('home')" class="tab" @click="setRoute('home')">
|
||||
<Icon icon="vuesax-linear:home" />
|
||||
<div class="text-xs mt-1 font-bold">صفحه اصلی</div>
|
||||
<!-- <div :class="setNavColor('home')" class="tab" @click="setRoute('home')">-->
|
||||
<!-- <Icon icon="vuesax-linear:home" />-->
|
||||
<!-- <div class="text-xs mt-1 font-bold">صفحه اصلی</div>-->
|
||||
<!-- </div>-->
|
||||
<div :class="setNavColor('buyProduct')" class="tab" @click="setRoute('buyProduct')">
|
||||
<Icon icon="vuesax-linear:coin" />
|
||||
<div class="text-xs mt-1 font-bold">فروشگاه</div>
|
||||
</div>
|
||||
<div :class="setNavColor('transactions')" class="tab" @click="setRoute('transactions')">
|
||||
<Icon icon="vuesax-linear:receipt-item" />
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
</a-form-item>
|
||||
|
||||
<a-form-item v-if="isBuy" name="goldValue"
|
||||
:rules="[justNumber2(props?.ProductItem?.price , form.method , props?.ProductItem?.amount, true, form.gateway)]">
|
||||
:rules="[justNumber4(props?.ProductItem?.price , form.method , props?.ProductItem?.amount, true, form.gateway)]">
|
||||
<BasicInput v-model:value="form.goldValue" addon-before="تعداد" addon-bg-color="#521620"
|
||||
addon-text-color="white"
|
||||
place-holder="تعداد"
|
||||
@@ -253,7 +253,7 @@ import type { Price } from '@/models/home'
|
||||
import Icon from '@/components/BasicPacks/BasicIcon.vue'
|
||||
import { useUserStore } from '@/store/userStore'
|
||||
import BasicActionSheet from '@/components/BasicPacks/BasicActionSheet.vue'
|
||||
import { justNumber, justNumber2, justNumber3, required, ruleNumber } from '@/utils/inputRules'
|
||||
import {justNumber, justNumber2, justNumber3, justNumber4, required, ruleNumber} from '@/utils/inputRules'
|
||||
import GoldSkeleton from '@/views/base/gold/components/GoldSkeleton.vue'
|
||||
import GoldLoading from '@/components/GoldLoading.vue'
|
||||
// import {update} from 'lodash'
|
||||
@@ -274,10 +274,10 @@ const typeDeal: SelectItem[] = [
|
||||
value: 'نقدی',
|
||||
key: 'cash'
|
||||
},
|
||||
{
|
||||
value: ' طلایی',
|
||||
key: 'gold'
|
||||
}
|
||||
// {
|
||||
// value: ' طلایی',
|
||||
// key: 'gold'
|
||||
// }
|
||||
|
||||
]
|
||||
const infoVisible = ref(false)
|
||||
@@ -558,9 +558,9 @@ const limitedPrice = computed(() => {
|
||||
|
||||
function calculateCash(val: number) {
|
||||
priceErrorVisible.value = false
|
||||
// console.log(val)
|
||||
console.log("val",val,props?.ProductItem)
|
||||
if (price.value) {
|
||||
form.value.goldVazn = parseFloat((val * (( props?.ProductItem?.price) + (props?.ProductItem?.cash_fee_buy)))/lastPrice.value?.buy).toFixed(1)
|
||||
form.value.goldVazn = parseFloat((val * props?.ProductItem?.amount).toFixed(3))
|
||||
console.log(val,props?.ProductItem?.price,props?.ProductItem?.cash_fee_buy,lastPrice.value?.buy)
|
||||
if (isBuy.value) {
|
||||
if (val){
|
||||
@@ -579,7 +579,7 @@ console.log(val,props?.ProductItem?.price,props?.ProductItem?.cash_fee_buy,lastP
|
||||
form.value.goldVazn = 0
|
||||
}
|
||||
}
|
||||
console.log(form.value.goldVazn)
|
||||
console.log('goldVazn',form.value.goldVazn)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
</div>
|
||||
|
||||
<span
|
||||
v-if="!props.ProductItem.show"
|
||||
v-if="!props.ProductItem?.inventory || props.ProductItem?.inventory==0"
|
||||
class="text-xs bg-gray-300 text-gray-600 px-2 py-0.5 rounded-md"
|
||||
>
|
||||
ناموجود
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
</div>
|
||||
|
||||
<span
|
||||
v-if="!props.ProductItem.show"
|
||||
v-if="!props.ProductItem?.inventory || props.ProductItem?.inventory==0"
|
||||
class="text-xs bg-gray-300 text-gray-600 px-2 py-0.5 rounded-md"
|
||||
>
|
||||
ناموجود
|
||||
|
||||
@@ -18,11 +18,10 @@
|
||||
</div>
|
||||
|
||||
<div class="mx-5 pb-30 pt-2 grid grid-cols-2 gap-2" style="color: #1b2b07">
|
||||
<div class="mt-3 gap-2 " :class="!viewVertical?'col-span-2':''" v-for="item in items">
|
||||
<ProductItemVertical v-if="viewVertical" :ProductItem="item" @click="clickProduct(item)"></ProductItemVertical>
|
||||
<ProductItem v-else class="col-span-2" :ProductItem="item" @click="clickProduct(item)"></ProductItem>
|
||||
<div class="mt-3 gap-2 " :class="!viewVertical?'col-span-2':''" v-for="item in items?.filter(i => i.show)">
|
||||
<ProductItemVertical v-if="viewVertical" :ProductItem="item" @click="clickProduct(item)"></ProductItemVertical>
|
||||
<ProductItem v-else class="col-span-2" :ProductItem="item" @click="clickProduct(item)"></ProductItem>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<template>
|
||||
<div class="bottom-0 fixed top-0">
|
||||
<img :src="img" alt="" class="w-inherit" :style="{ backgroundRepeat: 'repeat' }" />
|
||||
<img :src="img" alt="" class="w-inherit" :style="{ backgroundRepeat: 'repeat' }"/>
|
||||
</div>
|
||||
<a-spin :spinning="loading">
|
||||
<div class="!h-full overflow-y-scroll">
|
||||
<div class="mx-5 pb-30 pt-5" style="color: #1b2b07">
|
||||
<!-- Product Image -->
|
||||
<div class="bg-gray-100 rounded-lg w-full flex justify-center p-8 mb-4">
|
||||
<img :src="getProductImage(product)" class="max-w-full h-auto" />
|
||||
<div class="bg-gray-100 rounded-lg w-full flex justify-center mb-4">
|
||||
<img :src="getProductImage(product)" class="max-w-full h-auto"/>
|
||||
</div>
|
||||
|
||||
<!-- Product Title -->
|
||||
@@ -20,7 +20,7 @@
|
||||
<div class="flex-1">
|
||||
<!-- Buy Button -->
|
||||
<BasicButton
|
||||
v-if="product?.show && product?.open_buy"
|
||||
v-if="product?.show && product?.open_buy &&(product?.inventory || product?.inventory >0)"
|
||||
class="w-full py-3 "
|
||||
type="primary"
|
||||
size="large"
|
||||
@@ -34,6 +34,9 @@
|
||||
<div v-else-if="!product?.open_buy" class="text-center text-gray-500 py-4">
|
||||
خرید این محصول در حال حاضر امکان پذیر نیست
|
||||
</div>
|
||||
<div v-else-if="!product?.inventory || product?.inventory==0" class="text-center text-gray-500 py-4">
|
||||
ناموجود
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -44,30 +47,30 @@
|
||||
<div v-if="product?.description" class="mb-6">
|
||||
<div class="text-lg font-semibold mb-2">توضیحات محصول:</div>
|
||||
<div class="text-base text-gray-700 whitespace-pre-line">{{ product?.description }}</div>
|
||||
<!-- <div class="text-base text-gray-700 whitespace-pre-line">شمش طلای نقش برجسته ونوس ۱ گرمی انتخابی ظریف و ارزشمند برای سرمایهگذاری و هدیه است. این شمش از طلای خالص با عیار بالا ساخته شده و نقش برجستهی الهه ونوس، نمادی از زیبایی و ظرافت، جلوهای هنری و خاص به آن بخشیده است. وزن دقیق ۱ گرم، ابعاد مناسب و بستهبندی شکیل، این محصول را به گزینهای ایدهآل برای نگهداری ارزش، هدیههای خاص و کلکسیونهای طلا تبدیل میکند. </div>-->
|
||||
<!-- <div class="text-base text-gray-700 whitespace-pre-line">شمش طلای نقش برجسته ونوس ۱ گرمی انتخابی ظریف و ارزشمند برای سرمایهگذاری و هدیه است. این شمش از طلای خالص با عیار بالا ساخته شده و نقش برجستهی الهه ونوس، نمادی از زیبایی و ظرافت، جلوهای هنری و خاص به آن بخشیده است. وزن دقیق ۱ گرم، ابعاد مناسب و بستهبندی شکیل، این محصول را به گزینهای ایدهآل برای نگهداری ارزش، هدیههای خاص و کلکسیونهای طلا تبدیل میکند. </div>-->
|
||||
</div>
|
||||
<!-- Similar Products -->
|
||||
<div v-if="product?.similar?.length" class="mt-8">
|
||||
<div class="text-lg font-semibold mb-4">محصولات مشابه</div>
|
||||
|
||||
<swiper
|
||||
:slides-per-view="2.25"
|
||||
:space-between="16"
|
||||
class="similar-products-swiper"
|
||||
:slides-per-view="2.25"
|
||||
:space-between="16"
|
||||
class="similar-products-swiper"
|
||||
>
|
||||
<swiper-slide
|
||||
v-for="item in product.similar"
|
||||
:key="item.id"
|
||||
v-for="item in product.similar"
|
||||
:key="item.id"
|
||||
>
|
||||
<div
|
||||
class="bg-white rounded-lg shadow p-4 cursor-pointer h-full"
|
||||
@click="goToProduct(item.id)"
|
||||
class="bg-white rounded-lg shadow p-4 cursor-pointer h-full"
|
||||
@click="goToProduct(item.id)"
|
||||
>
|
||||
<!-- Image -->
|
||||
<div class="bg-gray-100 rounded-md flex justify-center p-4 mb-2">
|
||||
<img
|
||||
:src="getProductImage(item)"
|
||||
class="h-20 object-contain"
|
||||
:src="getProductImage(item)"
|
||||
class="h-20 object-contain"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -75,11 +78,17 @@
|
||||
<div class="text-sm font-semibold mb-1 line-clamp-2">
|
||||
{{ item.title }}
|
||||
</div>
|
||||
|
||||
<!-- Price -->
|
||||
<div class="text-sm text-primary font-bold">
|
||||
<div class="text-sm text-primary font-bold mb-3">
|
||||
{{ usePrice((item.price ?? 0) + (item.cash_fee_buy ?? 0)) }}
|
||||
</div>
|
||||
<span
|
||||
v-if="item.inventory || item.inventory==0"
|
||||
class="text-xs bg-gray-300 text-gray-600 px-1 py-0.5 rounded-md "
|
||||
>
|
||||
ناموجود
|
||||
</span>
|
||||
|
||||
</div>
|
||||
</swiper-slide>
|
||||
</swiper>
|
||||
@@ -101,24 +110,24 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import {onMounted, onUnmounted, ref, computed, watch} from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import {useRoute, useRouter} from 'vue-router'
|
||||
import {getProductById, getProducts} from '@/api/products'
|
||||
import { loading, getToken } from '@/utils'
|
||||
import type { Product } from '@/models/products'
|
||||
import {loading, getToken} from '@/utils'
|
||||
import type {Product} from '@/models/products'
|
||||
import BasicActionSheet from '@/components/BasicPacks/BasicActionSheet.vue'
|
||||
import indexGold from '@/views/base/gold/index.vue'
|
||||
import DealProduct from '@/views/base/products/components/DealProduct.vue'
|
||||
import { cloneDeep } from 'lodash'
|
||||
import {cloneDeep} from 'lodash'
|
||||
import img from '@/assets/img/user_ly1.svg'
|
||||
import { message } from 'ant-design-vue'
|
||||
import {message} from 'ant-design-vue'
|
||||
import BasicButton from '@/components/BasicPacks/BasicButton.vue'
|
||||
import { usePrice } from '@/utils/usePrice'
|
||||
import {usePrice} from '@/utils/usePrice'
|
||||
import {
|
||||
getLastPrices,
|
||||
lastPrice,
|
||||
stopPriceInterval
|
||||
} from '@/utils/price'
|
||||
import { Swiper, SwiperSlide } from 'swiper/vue'
|
||||
import {Swiper, SwiperSlide} from 'swiper/vue'
|
||||
import 'swiper/swiper-bundle.css'
|
||||
|
||||
// Image imports
|
||||
@@ -143,10 +152,11 @@ watch(
|
||||
(newId, oldId) => {
|
||||
if (newId && newId !== oldId) {
|
||||
loadProduct()
|
||||
window.scrollTo({ top: 0, behavior: 'smooth' })
|
||||
window.scrollTo({top: 0, behavior: 'smooth'})
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
async function loadProduct() {
|
||||
try {
|
||||
loading.value = true
|
||||
@@ -155,7 +165,7 @@ async function loadProduct() {
|
||||
const foundProduct = products
|
||||
if (!foundProduct) {
|
||||
message.error('محصول یافت نشد')
|
||||
router.push({ name: 'buyProduct' })
|
||||
router.push({name: 'buyProduct'})
|
||||
return
|
||||
}
|
||||
product.value = foundProduct
|
||||
@@ -164,7 +174,7 @@ async function loadProduct() {
|
||||
console.log(e)
|
||||
if (e?.response?.status === 401) {
|
||||
message.warning('برای مشاهده محصولات، لطفا ابتدا وارد حساب کاربری خود شوید')
|
||||
router.push({ name: 'login' })
|
||||
router.push({name: 'login'})
|
||||
} else {
|
||||
message.error('خطا در بارگذاری محصول')
|
||||
}
|
||||
@@ -173,6 +183,25 @@ async function loadProduct() {
|
||||
}
|
||||
}
|
||||
|
||||
watch(lastPrice, async () => {
|
||||
// console.log(items);
|
||||
if (lastPrice.value && product.value.similar) {
|
||||
product.value.similar.forEach((val) => {
|
||||
// console.log(lastPrice.value)
|
||||
if (val.group_type == 'آبشده') {
|
||||
val.price = lastPrice.value?.price_last
|
||||
val.sellPrice = lastPrice.value?.sell
|
||||
} else {
|
||||
val.price = parseInt(val.amount * lastPrice.value?.price_last)
|
||||
val.sellPrice = parseInt(val.amount * lastPrice.value?.sell)
|
||||
|
||||
// console.log(lastPrice.value?.price_last + "*" + val.amount + ' ' + val.price)
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
}, {deep: true})
|
||||
|
||||
async function initPrice() {
|
||||
try {
|
||||
await getLastPrices()
|
||||
@@ -197,7 +226,7 @@ function handleBuyClick() {
|
||||
if (!product.value?.show) {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
// // Check if user is logged in
|
||||
// if (!getToken()) {
|
||||
// message.warning('برای خرید یا فروش محصولات، لطفا ابتدا وارد حساب کاربری خود شوید')
|
||||
@@ -216,8 +245,9 @@ onMounted(() => {
|
||||
onUnmounted(() => {
|
||||
stopPriceInterval()
|
||||
})
|
||||
|
||||
function goToProduct(id: number) {
|
||||
router.push({ name: 'productDetail', params: { id } })
|
||||
router.push({name: 'productDetail', params: {id}})
|
||||
}
|
||||
|
||||
function getProductImage(product: any) {
|
||||
@@ -225,7 +255,7 @@ function getProductImage(product: any) {
|
||||
if (product?.file?.src) {
|
||||
return product.file.src
|
||||
}
|
||||
|
||||
|
||||
// Fallback to local images based on group_type if file is empty or doesn't exist
|
||||
const type = product?.group_type
|
||||
switch (type) {
|
||||
|
||||
@@ -154,15 +154,15 @@
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="wrap-fix bottom-0 px-10 py-6 flex gap-2 bg-white">
|
||||
<a class="w-full" href="tel:09128081392">
|
||||
<div class="wrap-fix bottom-0 px-10 py-6 flex gap-2 bg-white items-center">
|
||||
<a class="w-full" href="https://web.rubika.ir/#c=u0I8F1U0a939b0df5ba9f73618d33d7c">
|
||||
<BasicButton class="w-full" type="primary">تماس با پشتیبانی</BasicButton>
|
||||
</a>
|
||||
<!-- <BasicButton type="primary" @click="$router.push({name: 'permissions'})">
|
||||
<div>مجوز ها</div>
|
||||
</BasicButton>-->
|
||||
<a href="https://t.me/ghatreh">
|
||||
<img src="@/assets/img/telegram.png" alt="" class="h-10 w-10"/>
|
||||
<a href="https://web.rubika.ir/#c=u0I8F1U0a939b0df5ba9f73618d33d7c">
|
||||
<img src="@/assets/img/rubika.webp" alt="" class="w-12"/>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -93,16 +93,16 @@
|
||||
<div>آدرس ها</div>
|
||||
</div>
|
||||
</BasicButton>-->
|
||||
<BasicButton
|
||||
class="w-full mt-2"
|
||||
size="large"
|
||||
@click="$router.push({ name: 'notifyTrigger' })"
|
||||
>
|
||||
<div class="flex">
|
||||
<BasicIcon icon="vuesax-linear:bill" class="absolute right-8" />
|
||||
<div>هشدار قیمت</div>
|
||||
</div>
|
||||
</BasicButton>
|
||||
<!-- <BasicButton-->
|
||||
<!-- class="w-full mt-2"-->
|
||||
<!-- size="large"-->
|
||||
<!-- @click="$router.push({ name: 'notifyTrigger' })"-->
|
||||
<!-- >-->
|
||||
<!-- <div class="flex">-->
|
||||
<!-- <BasicIcon icon="vuesax-linear:bill" class="absolute right-8" />-->
|
||||
<!-- <div>هشدار قیمت</div>-->
|
||||
<!-- </div>-->
|
||||
<!-- </BasicButton>-->
|
||||
<BasicButton
|
||||
class="mt-2 w-full"
|
||||
icon=""
|
||||
@@ -151,22 +151,61 @@
|
||||
<div>مجوز ها</div>
|
||||
</div>
|
||||
</BasicButton>-->
|
||||
<!-- <BasicButton-->
|
||||
<!-- class="mt-2 w-full"-->
|
||||
<!-- icon=""-->
|
||||
<!-- iconSize="18"-->
|
||||
<!-- size="large"-->
|
||||
<!-- @click="$router.push({ name: 'earnMoney' })"-->
|
||||
<!-- >-->
|
||||
<!-- <div class="flex">-->
|
||||
<!-- <BasicIcon icon="vuesax-linear:dollar-circle" class="absolute right-8" />-->
|
||||
<!-- <div>کسب درآمد</div>-->
|
||||
<!-- </div>-->
|
||||
<!-- </BasicButton>-->
|
||||
<BasicButton
|
||||
class="mt-2 w-full"
|
||||
icon=""
|
||||
iconSize="18"
|
||||
size="large"
|
||||
@click="$router.push({ name: 'earnMoney' })"
|
||||
class="mt-2 w-full"
|
||||
icon=""
|
||||
iconSize="18"
|
||||
size="large"
|
||||
@click="showLogoutConfirm=!showLogoutConfirm"
|
||||
>
|
||||
<div class="flex">
|
||||
<BasicIcon icon="vuesax-linear:dollar-circle" class="absolute right-8" />
|
||||
<div>کسب درآمد</div>
|
||||
<Icon
|
||||
:color="y > 50 ? '' : ''"
|
||||
class="color-transition absolute right-8"
|
||||
icon="vuesax-linear:logout"
|
||||
@click="showLogoutConfirm = true"
|
||||
/>
|
||||
<div>خروج از حساب کاربری</div>
|
||||
</div>
|
||||
</BasicButton>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<DialogVant v-model:show="showLogoutConfirm" :closeOnClickOverlay="false" :timeOut="-1">
|
||||
<!-- <template v-slot:img>
|
||||
<img :src="registerDelayImage" alt="" class="opacity-80">
|
||||
</template>-->
|
||||
|
||||
<template v-slot:title>
|
||||
<div class="flex flex-col items-center">
|
||||
<DotLottieVue
|
||||
class="w-11rem h-11rem"
|
||||
autoplay
|
||||
src="https://lottie.host/129cf3a1-df84-4758-a856-58c133ae6013/R5RqclXA8G.json"
|
||||
/>
|
||||
<div class="p-5 text-sm">آیا از خروج خود اطمینان دارید؟</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<template v-slot:button>
|
||||
<div class="text-center text-red flex items-center justify-center" @click="logout">
|
||||
<a-spin :spinning="logoutLoading" size="small"> خروج</a-spin>
|
||||
</div>
|
||||
<div class="text-center" @click="showLogoutConfirm = false">انصراف</div>
|
||||
</template>
|
||||
</DialogVant>
|
||||
<BasicActionSheet v-model:show="editPassVisible">
|
||||
<div class="flex justify-center justify-between">
|
||||
<div class="font-bold text-lg">ویرایش اطلاعات</div>
|
||||
@@ -257,7 +296,7 @@
|
||||
import { onMounted, reactive, ref, computed } from 'vue'
|
||||
import img from '@/assets/img/user_ly1.svg'
|
||||
import gr_bottom from './assets/img/gr_bottom_white.svg'
|
||||
import { loading } from '@/utils'
|
||||
import {loading, removeToken} from '@/utils'
|
||||
import BasicButton from '@/components/BasicPacks/BasicButton.vue'
|
||||
import BasicActionSheet from '@/components/BasicPacks/BasicActionSheet.vue'
|
||||
import {
|
||||
@@ -277,6 +316,11 @@ import { message } from 'ant-design-vue'
|
||||
import { updateMe, updatePass } from '@/api/me'
|
||||
import { useUserStore } from '@/store/userStore'
|
||||
import BaseDatePicker from '@/components/BasicPacks/BaseDatePicker'
|
||||
import {DotLottieVue} from "@lottiefiles/dotlottie-vue";
|
||||
import DialogVant from "@/components/DialogVant.vue";
|
||||
import {useWalletStore} from "@/store/walletStore";
|
||||
import Icon from "@/components/BasicPacks/BasicIcon.vue";
|
||||
import {useWindowScroll} from "@vueuse/core/index";
|
||||
const userFormState = ref<User>({
|
||||
fname: '',
|
||||
lname: '',
|
||||
@@ -291,11 +335,29 @@ const userPassForm = ref<Password>({
|
||||
const formRef = ref<FormInstance>()
|
||||
const formPassRef = ref<FormInstance>()
|
||||
const userStore = useUserStore()
|
||||
const showLogoutConfirm = ref<boolean>()
|
||||
const walletStore=useWalletStore()
|
||||
const logoutLoading = ref<boolean>(false)
|
||||
const { x, y } = useWindowScroll()
|
||||
|
||||
// const editPassVisible = ref<boolean>(false)
|
||||
const editPassVisible = ref<boolean>(false)
|
||||
const editPasswordVisible = ref<boolean>(false)
|
||||
|
||||
async function logout() {
|
||||
logoutLoading.value = true
|
||||
// baseConfirm('آیا از حساب کاربری خارج می شوید؟',async () => {
|
||||
userStore.userInfo = undefined
|
||||
walletStore.walletInfo = undefined
|
||||
/* userStore.$reset()
|
||||
walletStore.$reset()*/
|
||||
removeToken()
|
||||
await router.push({ name: 'login' })
|
||||
logoutLoading.value = true
|
||||
window.location.reload()
|
||||
// console.log('salam')
|
||||
// })
|
||||
}
|
||||
function setForm() {
|
||||
userFormState.value = userStore.userInfo
|
||||
}
|
||||
|
||||
@@ -302,7 +302,7 @@
|
||||
<span>جهت شارژ حساب کاربری خود، کلمه "شماره حساب" را برای پشتیبانی ارسال نمایید.</span>
|
||||
</div>
|
||||
<BasicButton class="mt-4">
|
||||
<a class="w-full" href="https://wa.me/989390624220">
|
||||
<a class="w-full" href="https://web.rubika.ir/#c=u0I8F1U0a939b0df5ba9f73618d33d7c">
|
||||
پیام به پشتیبانی
|
||||
</a>
|
||||
</BasicButton>
|
||||
|
||||
@@ -203,7 +203,7 @@ async function enterFingerPrint() {
|
||||
const fingerPrint = await authenticateWithFingerprint()
|
||||
if (fingerPrint) {
|
||||
setTruth()
|
||||
await router.push({ name: 'home' })
|
||||
await router.push({ name: 'buyProduct' })
|
||||
} else {
|
||||
message.error('خطا در اعتبارسنجی')
|
||||
}
|
||||
@@ -234,7 +234,7 @@ async function login(accessToken: string | undefined) {
|
||||
/* if (userStore.userInfo?.type === (URLUserType() === 'customer' ? 1 : 2)) {*/
|
||||
await walletStore.getMyWallet()
|
||||
setTruth()
|
||||
await router.push({ name: 'home' })
|
||||
await router.push({ name: 'buyProduct' })
|
||||
/* } else {
|
||||
removeToken()
|
||||
userStore.removeInformation()
|
||||
|
||||
@@ -43,7 +43,7 @@ const userFormState = ref<UserMobile>({
|
||||
})
|
||||
|
||||
function phoneVerification() {
|
||||
router.push({name: 'home' })
|
||||
router.push({name: 'buyProduct' })
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user