fix some bugs

This commit is contained in:
2026-08-03 11:53:14 +03:30
parent 57895c129e
commit 82e72b9811
3 changed files with 53 additions and 7 deletions
+9 -3
View File
@@ -174,7 +174,7 @@ import SettingValueField from './SettingValueField.vue'
import SettingCard from './SettingCard.vue'
import { refreshAppModeMenu } from '@/router'
import { useUserStore } from '@/store/userStore'
import { applyBannerEnabledFromRows, applyTrackingSystemsEnabledFromRows, applyConditionalOrderEnabledFromRows, applyProductFundsEnabledFromRows, applyPriceTriggerEnabledFromRows, applyAppNotificationEnabledFromRows, applyPriceProviderFromRows, applySupportChatMenuEnabledFromRows, setBannerEnabledFromSettings, setConditionalOrderEnabledFromSettings, setProductFundsEnabledFromSettings, setPriceTriggerEnabledFromSettings, setAppNotificationEnabledFromSettings, setPriceProviderFromSettings, setStoreModeFromSettings, setTrackingSystemsEnabledFromSettings } from '@/utils/config'
import { applyBannerEnabledFromRows, applyTrackingSystemsEnabledFromRows, applyConditionalOrderEnabledFromRows, applyProductFundsEnabledFromRows, applyPriceTriggerEnabledFromRows, applyAppNotificationEnabledFromRows, applyPriceProviderFromRows, applyPriceChannelAccessFromRows, applySupportChatMenuEnabledFromRows, setBannerEnabledFromSettings, setConditionalOrderEnabledFromSettings, setProductFundsEnabledFromSettings, setPriceTriggerEnabledFromSettings, setAppNotificationEnabledFromSettings, setPriceProviderFromSettings, setPriceChannelAccessFromSettings, setStoreModeFromSettings, setTrackingSystemsEnabledFromSettings } from '@/utils/config'
import {
EDITABLE_SETTING_GROUPS,
SYSTEM_SETTING_GROUPS,
@@ -427,11 +427,13 @@ async function initConfig() {
applyPriceTriggerEnabledFromRows(baseData.value)
applyAppNotificationEnabledFromRows(baseData.value)
applyPriceProviderFromRows(baseData.value)
applyPriceChannelAccessFromRows(baseData.value)
applySupportChatMenuEnabledFromRows(baseData.value)
// در صفحهٔ عادی price_provider و show_to_users_chat (can_edit=0) نیستند — از کل تنظیمات بخوان
// در صفحهٔ عادی price_provider و show_to_users_chat و price_channel_access (can_edit=0) نیستند — از کل تنظیمات بخوان
if (
!baseData.value.some((row) => row.key === 'price_provider') ||
!baseData.value.some((row) => row.key === 'show_to_users_chat')
!baseData.value.some((row) => row.key === 'show_to_users_chat') ||
!baseData.value.some((row) => row.key === 'price_channel_access')
) {
try {
const { getConfiguration } = await import('@/api/configuration')
@@ -439,6 +441,7 @@ async function initConfig() {
const rows = Array.isArray(all) ? all : []
applyPriceProviderFromRows(rows)
applySupportChatMenuEnabledFromRows(rows)
applyPriceChannelAccessFromRows(rows)
} catch {
/* کش قبلی می‌ماند */
}
@@ -505,6 +508,9 @@ function syncMenuFlagsFromSetting(key: string | undefined, value: string) {
if (row) row.value = value
}
}
if (key === 'price_channel_access') {
setPriceChannelAccessFromSettings(isSwitchOn(value))
}
}
function onValueChange(row: Const, value: string) {
@@ -1,5 +1,5 @@
import type { Const } from '@/model/configuration'
import { conditionalOrderEnabledSetting, isStoreApp, priceProviderSetting, showToUsersChatSetting } from '@/utils/config'
import { conditionalOrderEnabledSetting, isStoreApp, priceChannelAccessSetting, priceProviderSetting, showToUsersChatSetting } from '@/utils/config'
export type SettingFieldType =
| 'text'
@@ -215,9 +215,24 @@ export function isSettingVisible(key: string | undefined | null): boolean {
if ((k.startsWith('montzar_') || k === 'display_montzar') && priceProviderSetting.value !== 'montzar') {
return false
}
// تنظیمات قابل‌ویرایش کانال فقط وقتی دسترسی دیپلوی روشن است
if (PRICE_CHANNEL_PANEL_KEYS.has(k) && !priceChannelAccessSetting.value) return false
return true
}
/** کلیدهای گروه کانال در تنظیمات عادی (نه دسترسی دیپلوی و نه مقصد/توکن) */
const PRICE_CHANNEL_PANEL_KEYS = new Set([
'price_channel_enabled',
'price_channel_messengers',
'price_channel_diff',
'price_channel_min_seconds',
'price_channel_message_text',
'price_channel_footer_id',
'price_channel_footer_phone',
'price_channel_footer_link',
'change_mesghal',
])
export const SETTING_TYPE_OPTIONS = [
{ key: 'text', value: 'متن کوتاه' },
{ key: 'number', value: 'عدد / شماره' },
@@ -262,6 +277,8 @@ const KEY_TYPE_FALLBACK: Record<string, SettingFieldType> = {
jibit_enabled: 'switch',
register_referral_sms_to_referrer: 'switch',
register_referral_bonus_message: 'switch',
referral_gift_on_first_order: 'switch',
referral_gift_buy_from_montzar: 'switch',
open_register: 'switch',
sms_panel: 'switch',
auto_active_customer: 'switch',
@@ -351,6 +368,7 @@ const KEY_TYPE_FALLBACK: Record<string, SettingFieldType> = {
deposit_sms_support_number: 'number',
zaarbox_price_key: 'select',
price_channel_enabled: 'switch',
price_channel_access: 'switch',
price_channel_messengers: 'multiselect',
price_channel_diff: 'price',
price_channel_min_seconds: 'number',
@@ -651,15 +669,17 @@ const KEY_HELP_FALLBACK: Record<string, string> = {
referral_id:
'روشن: وارد کردن کد معرف در ثبت‌نام اجباری است. خاموش: کد معرف اختیاری است.',
gift_for_referrer:
'مقدار پاداش (معمولاً وزن فلز به گرم) که به کیف معرف واریز می‌شود. صفر = بدون پاداش. زمان واریز بسته به «پاداش معرف پس از اولین سفارش» است.',
'مقدار پاداش (گرم) به کیف معرف. صفر = بدون پاداش. خرید پوشش از همکار با کلید «خرید پاداش معرفی از همکار» کنترل می‌شود.',
gift_for_referral:
'مقدار پاداش (معمولاً وزن فلز) که به معرف‌شونده واریز می‌شود. صفر = بدون پاداش. زمان واریز بسته به «پاداش معرف پس از اولین سفارش» است.',
'مقدار پاداش (گرم) به معرف‌شونده. صفر = بدون پاداش. خرید پوشش از همکار با کلید «خرید پاداش معرفی از همکار» کنترل می‌شود.',
register_referral_sms_to_referrer:
'روشن: پس از ثبت‌نام کاربر جدید، پیامک اطلاع‌رسانی برای معرف ارسال می‌شود. خاموش: پیامکی برای معرف ارسال نمی‌شود.',
register_referral_bonus_message:
'روشن: متن پاداش معرف در پیامک خوش‌آمد ثبت‌نام گنجانده می‌شود. خاموش: متن پاداش در پیامک خوش‌آمد نمی‌آید.',
referral_gift_on_first_order:
'روشن: پاداش معرف (gift_for_referrer) و معرف‌شونده (gift_for_referral) پس از تکمیل اولین سفارش معرف‌شونده به کیف واریز می‌شود — فقط اگر مقدار هر پاداش بیشتر از صفر باشد. خاموش: پاداش بلافاصله پس از ثبت‌نام موفق یا تأیید احراز هویت واریز می‌شود (باز هم فقط برای مقادیر بیشتر از صفر).',
referral_gift_buy_from_montzar:
'روشن: اگر منبع قیمت montzar باشد، قبل از واریز پاداش معرف/معرف‌شونده همان وزن از همکار خرید می‌شود؛ شکست خرید = واریز نمی‌شود. خاموش: مثل قبل فقط به کیف واریز می‌شود بدون خرید از همکار.',
referral_limit:
'حداکثر تعداد دعوت مجاز برای هر کاربر. خالی = بدون محدودیت.',
referral_bonus_amount:
@@ -864,6 +884,8 @@ const KEY_HELP_FALLBACK: Record<string, string> = {
'تنظیم قدیمی — از «منبع قیمت» استفاده کنید. روشن نگه داشتن توصیه نمی‌شود.',
price_channel_enabled:
'روشن: بعد از هر تغییر قیمت، مظنه به‌صورت خودکار به کانال‌های پیام‌رسان انتخاب‌شده ارسال می‌شود.',
price_channel_access:
'روشن: گروه «ارسال قیمت به کانال» در تنظیمات عادی پنل دیده می‌شود. خاموش: مخفی است (فقط از تنظیمات پیشرفته).',
price_channel_messengers:
'کدام پیام‌رسان‌ها قیمت را دریافت کنند؟ می‌توانید چند مورد را انتخاب کنید (بله، تلگرام، روبیکا). برای هر پیام‌رسان باید توکن بات و «مقصد ارسال» هم پر شده باشد.',
price_channel_diff:
@@ -933,6 +955,7 @@ export const KEY_LABEL_FALLBACK: Record<string, string> = {
minimum_sell: 'حداقل مبلغ فروش (ریال)',
referral_id: 'کد معرف اجباری',
referral_gift_on_first_order: 'پاداش معرف پس از اولین سفارش',
referral_gift_buy_from_montzar: 'خرید پاداش معرفی از همکار',
open_register: 'ثبت‌نام باز',
sms_panel: 'پنل پیامک (کیف پول)',
customer_direct_sms: 'پیامک تکی به مشتری از لیست',
@@ -992,6 +1015,7 @@ export const KEY_LABEL_FALLBACK: Record<string, string> = {
deposit_sheba: 'شبا واریز',
deposit_sms_support_number: 'شماره تماس پشتیبانی',
price_channel_enabled: 'ارسال قیمت به کانال',
price_channel_access: 'دسترسی ارسال قیمت به کانال',
price_channel_messengers: 'پیام‌رسان‌های ارسال قیمت',
price_channel_diff: 'اختلاف قیمت کانال',
price_channel_min_seconds: 'حداقل فاصله ارسال (ثانیه)',
@@ -1053,6 +1077,7 @@ export const SETTING_LOCKED_KEYS = new Set([
'pargar_api_token', 'pargar_password', 'pargar_username',
'pargar_item_id_rial', 'pargar_item_id_gold',
'telegram_bot_token', 'rubika_bot_token',
'price_channel_access',
'price_channel_bale_to', 'price_channel_telegram_to', 'price_channel_rubika_to',
'unit',
'up_price', 'down_price',
@@ -1085,7 +1110,7 @@ export const SETTING_EDITABLE_KEYS = new Set([
'montzar_mobile', 'montzar_open_buy', 'montzar_open_sell',
'montzar_password', 'montzar_product_id',
'open_register',
'referral_id', 'referral_limit', 'referral_gift_on_first_order',
'referral_id', 'referral_limit', 'referral_gift_on_first_order', 'referral_gift_buy_from_montzar',
'register_jibit_verify', 'register_referral_bonus_message', 'register_referral_sms_to_referrer',
'sell_fee', 'show_last_price', 'show_home_price_when_closed', 'show_gold_ounce_price', 'show_product_details',
'show_product_trade_status', 'show_product_card_meta',
+15
View File
@@ -64,6 +64,9 @@ export const supportChatMenuEnabledSetting = ref(false)
/** reactive — سوییچ دیپلوی show_to_users_chat (برای مخفی کردن has_chat در تنظیمات عادی) */
export const showToUsersChatSetting = ref(false)
/** reactive — سوییچ دیپلوی price_channel_access (گروه کانال در تنظیمات عادی) */
export const priceChannelAccessSetting = ref(false)
export const accountingProviderSetting = ref<AccountingProvider>('none')
let tahesabEnabledFromSettings: boolean | null = null
@@ -167,6 +170,10 @@ export function setShowToUsersChatFromSettings(value: boolean): void {
showToUsersChatSetting.value = value
}
export function setPriceChannelAccessFromSettings(value: boolean): void {
priceChannelAccessSetting.value = value
}
let lastShowToUsersChat = ''
let lastHasChat = ''
let lastChatApi = ''
@@ -273,6 +280,13 @@ export function applyPriceProviderFromRows(
}
}
export function applyPriceChannelAccessFromRows(
rows: Array<{ key?: string; value?: string | null }>
) {
const row = rows.find((item) => item.key === 'price_channel_access')
if (row) setPriceChannelAccessFromSettings(isSwitchOn(row.value))
}
async function bootstrapSettingsFromApi(): Promise<void> {
if (settingsBootstrapped) return
@@ -295,6 +309,7 @@ async function bootstrapSettingsFromApi(): Promise<void> {
applyAppNotificationEnabledFromRows(list)
applySupportChatMenuEnabledFromRows(list)
applyPriceProviderFromRows(list)
applyPriceChannelAccessFromRows(list)
setCachedMainMetal(mainMetalRow?.value)
const { setCachedMainWalletProductIds } = await import('@/components/mobile/utils/wallet')
setCachedMainWalletProductIds(parseMainWalletProductIds(mainWalletRow?.value))