From 82e72b9811c39f833e7d0dec6ed26a274ce45c05 Mon Sep 17 00:00:00 2001 From: adonis Date: Mon, 3 Aug 2026 11:53:14 +0330 Subject: [PATCH] fix some bugs --- src/pages/menuPages/configuration/index.vue | 12 +++++-- .../menuPages/configuration/settingTypes.ts | 33 ++++++++++++++++--- src/utils/config.ts | 15 +++++++++ 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/pages/menuPages/configuration/index.vue b/src/pages/menuPages/configuration/index.vue index d1fa22f..1e7ccaf 100644 --- a/src/pages/menuPages/configuration/index.vue +++ b/src/pages/menuPages/configuration/index.vue @@ -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) { diff --git a/src/pages/menuPages/configuration/settingTypes.ts b/src/pages/menuPages/configuration/settingTypes.ts index 50daa98..3e47780 100644 --- a/src/pages/menuPages/configuration/settingTypes.ts +++ b/src/pages/menuPages/configuration/settingTypes.ts @@ -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 = { 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 = { 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 = { 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 = { 'تنظیم قدیمی — از «منبع قیمت» استفاده کنید. روشن نگه داشتن توصیه نمی‌شود.', price_channel_enabled: 'روشن: بعد از هر تغییر قیمت، مظنه به‌صورت خودکار به کانال‌های پیام‌رسان انتخاب‌شده ارسال می‌شود.', + price_channel_access: + 'روشن: گروه «ارسال قیمت به کانال» در تنظیمات عادی پنل دیده می‌شود. خاموش: مخفی است (فقط از تنظیمات پیشرفته).', price_channel_messengers: 'کدام پیام‌رسان‌ها قیمت را دریافت کنند؟ می‌توانید چند مورد را انتخاب کنید (بله، تلگرام، روبیکا). برای هر پیام‌رسان باید توکن بات و «مقصد ارسال» هم پر شده باشد.', price_channel_diff: @@ -933,6 +955,7 @@ export const KEY_LABEL_FALLBACK: Record = { 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 = { 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', diff --git a/src/utils/config.ts b/src/utils/config.ts index 2e7e89e..a3aa68e 100644 --- a/src/utils/config.ts +++ b/src/utils/config.ts @@ -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('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 { if (settingsBootstrapped) return @@ -295,6 +309,7 @@ async function bootstrapSettingsFromApi(): Promise { applyAppNotificationEnabledFromRows(list) applySupportChatMenuEnabledFromRows(list) applyPriceProviderFromRows(list) + applyPriceChannelAccessFromRows(list) setCachedMainMetal(mainMetalRow?.value) const { setCachedMainWalletProductIds } = await import('@/components/mobile/utils/wallet') setCachedMainWalletProductIds(parseMainWalletProductIds(mainWalletRow?.value))