diff --git a/src/models/products.ts b/src/models/products.ts index 244426a..a4a7f16 100644 --- a/src/models/products.ts +++ b/src/models/products.ts @@ -10,6 +10,7 @@ export interface Product { unit: string active: boolean show: boolean + trade_open?: boolean show_in_assets?: boolean show_on_tv?: boolean open_sell: boolean diff --git a/src/utils/productTradeOpen.ts b/src/utils/productTradeOpen.ts index ef599ef..53633ed 100644 --- a/src/utils/productTradeOpen.ts +++ b/src/utils/productTradeOpen.ts @@ -24,6 +24,19 @@ export function isProductTradeOpen(product: TradeOpenProduct, isBuy: boolean) { return isBuy ? isProductBuyOpen(product) : isProductSellOpen(product) } +/** ساعت کاری محصول از استریم (trade_open) — نه ساعت دستگاه */ +export function isProductTradingHoursOpen( + product?: { show?: boolean; trade_open?: boolean } | null, +) { + if (!product) return false + if (typeof product.trade_open === 'boolean') return product.trade_open + return product.show === true +} + +export function productHoursClosedMessage() { + return 'این محصول در حال حاضر خارج از ساعت کاری است.' +} + /** تب اولیه با توجه به query و وضعیت باز/بسته خرید و فروش */ export function resolveProductTradeIsBuy(product: TradeOpenProduct, routeState?: string | null) { const wantSell = routeState === 'sell' diff --git a/src/utils/storeHours.ts b/src/utils/storeHours.ts index 1e8a2c6..e50890c 100644 --- a/src/utils/storeHours.ts +++ b/src/utils/storeHours.ts @@ -225,20 +225,11 @@ export function isStoreClosedBySchedule(now = new Date()): boolean { return isOutsideTimeWindow(now, start, end) } +/** باز/بسته بودن فروشگاه فقط از استریم last.closed — نه ساعت دستگاه کاربر */ export function isStoreClosed(): boolean { - void productTradingHoursVersion.value - const { closePriceEnabled } = getStoreTradingHours() - - if (closePriceEnabled) { - if (lastPrice.value?.closed === true) { - return true - } - - return isStoreClosedBySchedule() - } - - // وقتی close_price خاموش است، صفر بودن قیمت مرجع به معنی بسته بودن فروشگاه نیست. - return isStoreClosedBySchedule() + void lastPriceReady.value + void lastPrice.value + return lastPrice.value?.closed === true } export function getStoreClosedMessage(): string { @@ -306,7 +297,7 @@ export function getPriceDisplayState(): PriceDisplayState { return serverStatus } - if (isOutsideGlobalStoreHours()) { + if (p?.closed === true) { if (!shouldShowHomePriceWhenClosed()) return 'closed' return hasShowableHomePrice(p) ? 'open' : 'no_quote' } diff --git a/src/views/base/gold/index.vue b/src/views/base/gold/index.vue index 0cf25e1..182d9a8 100644 --- a/src/views/base/gold/index.vue +++ b/src/views/base/gold/index.vue @@ -300,6 +300,8 @@ import { isProductBuyOpen, isProductSellOpen, isProductTradeOpen, + isProductTradingHoursOpen, + productHoursClosedMessage, productTradeClosedMessage, resolveProductTradeIsBuy, } from '@/utils/productTradeOpen' @@ -468,6 +470,7 @@ const priceUnavailable = computed(() => { const disableTransaction = computed(() => loading.value || isStoreClosed() || + !isProductTradingHoursOpen(props.ProductItem) || !isProductTradeOpen(props.ProductItem, isBuy.value) || form.value?.goldValue === undefined || form.value?.goldValue === '' || @@ -763,6 +766,10 @@ function okConfirm() { message.warning(getStoreClosedMessage()) return } + if (!isProductTradingHoursOpen(props.ProductItem)) { + message.warning(productHoursClosedMessage()) + return + } if (!isProductTradeOpen(props.ProductItem, isBuy.value)) { message.warning(productTradeClosedMessage(isBuy.value)) return @@ -782,6 +789,10 @@ async function ok() { message.warning(getStoreClosedMessage()) return } + if (!isProductTradingHoursOpen(props.ProductItem)) { + message.warning(productHoursClosedMessage()) + return + } if (!isProductTradeOpen(props.ProductItem, isBuy.value)) { message.warning(productTradeClosedMessage(isBuy.value)) return diff --git a/src/views/base/products/components/DealProduct.vue b/src/views/base/products/components/DealProduct.vue index 0293a52..03f53b8 100644 --- a/src/views/base/products/components/DealProduct.vue +++ b/src/views/base/products/components/DealProduct.vue @@ -274,6 +274,8 @@ import { SelectItem } from '@/models/SelectItem' import Bg_main from '@/components/bg_main.vue' import { useWalletAssets } from '@/composables/useWalletAssets' import { useCartStore } from '@/store/cartStore' +import { getStoreClosedMessage, isStoreClosed } from '@/utils/storeHours' +import { isProductTradingHoursOpen, productHoursClosedMessage } from '@/utils/productTradeOpen' const typeDeal: SelectItem[] = [ { @@ -346,6 +348,9 @@ const finalPrice = computed(() => (form.value?.goldValue * (isBuy.value ? props. const payablePrice = computed(() => finalPrice.value) const disableTransaction = computed(() => { + if (isStoreClosed() || !isProductTradingHoursOpen(props.ProductItem)) { + return true + } // If gateway is enabled, skip wallet balance checks if (isBuy.value && form.value?.gateway) { return ( @@ -662,6 +667,14 @@ async function initPrice() { async function okConfirm() { try { + if (isStoreClosed()) { + message.warning(getStoreClosedMessage()) + return + } + if (!isProductTradingHoursOpen(props.ProductItem)) { + message.warning(productHoursClosedMessage()) + return + } console.log('okConfirm called, form values:', form.value) console.log('disableTransaction:', disableTransaction.value) await refInput.value?.validateFields() @@ -703,6 +716,14 @@ async function okConfirm() { async function ok() { console.log('ok() function called') try { + if (isStoreClosed()) { + message.warning(getStoreClosedMessage()) + return + } + if (!isProductTradingHoursOpen(props.ProductItem)) { + message.warning(productHoursClosedMessage()) + return + } loading.value = true infoVisible.value = true const data = await createOrder({ diff --git a/src/views/base/products/components/ProductItem.vue b/src/views/base/products/components/ProductItem.vue index d40a28a..14ab016 100644 --- a/src/views/base/products/components/ProductItem.vue +++ b/src/views/base/products/components/ProductItem.vue @@ -65,7 +65,7 @@