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)