diff --git a/src/pages/menuPages/configuration/SettingCard.vue b/src/pages/menuPages/configuration/SettingCard.vue index d98dc15..382ac14 100644 --- a/src/pages/menuPages/configuration/SettingCard.vue +++ b/src/pages/menuPages/configuration/SettingCard.vue @@ -24,8 +24,9 @@ :setting-type="settingType" :description="description" :disabled="readonly" - :rows="fieldType === 'longtext' ? 6 : 6" + :rows="fieldType === 'longtext' ? 10 : 6" @update:value="emit('update:value', $event)" + @blur="emit('blur')" />
@@ -51,6 +52,7 @@ const props = defineProps<{ const emit = defineEmits<{ 'update:value': [value: string] + blur: [] }>() const settingKey = computed(() => props.row.key ?? '') diff --git a/src/pages/menuPages/configuration/SettingValueField.vue b/src/pages/menuPages/configuration/SettingValueField.vue index 1d652be..05fded4 100644 --- a/src/pages/menuPages/configuration/SettingValueField.vue +++ b/src/pages/menuPages/configuration/SettingValueField.vue @@ -48,6 +48,7 @@ :rows="rows" class="w-full font-mono text-sm" @update:value="emit('update:value', $event)" + @blur="emit('blur')" />
@@ -83,7 +85,10 @@ const props = withDefaults( { disabled: false, rows: 10 } ) -const emit = defineEmits<{ 'update:value': [value: string] }>() +const emit = defineEmits<{ + 'update:value': [value: string] + blur: [] +}>() const fieldType = computed(() => resolveSettingFieldType({ diff --git a/src/pages/menuPages/configuration/index.vue b/src/pages/menuPages/configuration/index.vue index a893f5c..d957288 100644 --- a/src/pages/menuPages/configuration/index.vue +++ b/src/pages/menuPages/configuration/index.vue @@ -70,6 +70,7 @@ :saving="isSaving(row.id)" :saved-flash="isSavedFlash(row.id)" @update:value="onValueChange(row, $event)" + @blur="onFieldBlur(row)" /> @@ -305,7 +306,7 @@ const SETTING_GROUPS: Array<{ title: 'معرف، پاداش و ثبت‌نام', icon: 'vuesax-linear:people', match: (k) => - /^(referral_|gift_for|register_referral|register_jibit|has_page_earn_money|jibit_verification|referral_bonus)/.test( + /^(referral_|gift_for|register_referral|register_jibit|has_page_earn_money|jibit_verification|referral_bonus|invite_link_text)/.test( k ) }, @@ -460,21 +461,43 @@ async function initConfig() { } } +function saveDebounceMs(row: Const): number { + const type = resolveSettingFieldType(row) + if (type === 'switch') return 200 + if (type === 'longtext') return 3000 + if (type === 'text') return 1200 + return 800 +} + function onValueChange(row: Const, value: string) { if (row.id == null || isReadonly(row)) return drafts.value[row.id] = value + if (resolveSettingFieldType(row) === 'longtext') { + return + } scheduleSave(row) } -function scheduleSave(row: Const) { +function onFieldBlur(row: Const) { + if (row.id == null || isReadonly(row)) return + scheduleSave(row, { flush: true }) +} + +function scheduleSave(row: Const, options?: { flush?: boolean }) { const id = row.id! + const delay = saveDebounceMs(row) if (!debouncedSave.has(id)) { debouncedSave.set( id, - debounce(() => persistRowValue(id), resolveSettingFieldType(row) === 'switch' ? 200 : 600) + debounce(() => persistRowValue(id), delay) ) } - debouncedSave.get(id)!() + const saveFn = debouncedSave.get(id)! + if (options?.flush) { + saveFn.flush() + } else { + saveFn() + } } async function persistRowValue(id: number) { @@ -496,6 +519,8 @@ async function saveSettingRow(row: Const) { const value = formatValueForSave(raw, type, row.key) if (value === (row.value ?? '')) return + const draftSnapshot = raw + savingIds.value.add(id) savedFlashIds.value.delete(id) @@ -511,7 +536,12 @@ async function saveSettingRow(row: Const) { }) row.value = value row.is_active = true - drafts.value[id] = value + const currentDraft = drafts.value[id] ?? '' + if (currentDraft === draftSnapshot) { + drafts.value[id] = value + } else { + scheduleSave(row) + } if (row.key === 'is_store') { setStoreModeFromSettings(isSwitchOn(value)) refreshAppModeMenu() @@ -527,7 +557,9 @@ async function saveSettingRow(row: Const) { ) } catch (e) { console.error(e) - drafts.value[id] = row.value ?? '' + if ((drafts.value[id] ?? '') === draftSnapshot) { + drafts.value[id] = row.value ?? '' + } message.error(`ذخیره «${row.title_fa || row.key}» ناموفق بود`) } finally { savingIds.value.delete(id)