refactor(payment): use string[] for supported_types throughout frontend+backend API

- Backend API returns/accepts supported_types as string[] (converts to/from DB comma string)
- Frontend ProviderInstance.supported_types is string[], no more parseTypes
- Remove all split/join conversions for supported_types
- payment_enabled_types also uses string[] consistently
This commit is contained in:
erio
2026-04-07 02:54:03 +08:00
parent 18107819da
commit 57cb01cd49
6 changed files with 46 additions and 31 deletions
@@ -209,7 +209,6 @@ import {
PROVIDER_SUPPORTED_TYPES,
PROVIDER_CALLBACK_PATHS,
WEBHOOK_PATHS,
parseTypes,
getAvailableTypes,
extractBaseUrl,
} from './providerConfig'
@@ -243,7 +242,7 @@ const { t } = useI18n()
const form = reactive({
name: '',
provider_key: 'easypay',
supported_types: '',
supported_types: [] as string[],
enabled: true,
refund_enabled: false,
})
@@ -282,7 +281,7 @@ const resolvedFields = computed(() => {
})
const limitableTypes = computed(() => {
const selected = parseTypes(form.supported_types).filter(t => t !== 'easypay')
const selected = form.supported_types.filter(t => t !== 'easypay')
return selected.map(v => {
const found = props.allPaymentTypes.find(pt => pt.value === v)
return found || { value: v, label: v }
@@ -291,18 +290,19 @@ const limitableTypes = computed(() => {
// --- Methods ---
function isTypeSelected(type: string): boolean {
return parseTypes(form.supported_types).includes(type)
return form.supported_types.includes(type)
}
function toggleType(type: string) {
const current = parseTypes(form.supported_types)
form.supported_types = current.includes(type)
? current.filter(t => t !== type).join(',')
: [...current, type].join(',')
if (form.supported_types.includes(type)) {
form.supported_types = form.supported_types.filter(t => t !== type)
} else {
form.supported_types = [...form.supported_types, type]
}
}
function onKeyChange() {
form.supported_types = (PROVIDER_SUPPORTED_TYPES[form.provider_key] || []).join(',')
form.supported_types = [...(PROVIDER_SUPPORTED_TYPES[form.provider_key] || [])]
clearConfig()
applyDefaults()
}
@@ -357,7 +357,7 @@ function handleSave() {
emitValidationError(t('admin.settings.payment.validationNameRequired'))
return
}
if (!form.supported_types.trim()) {
if (form.supported_types.length === 0) {
emitValidationError(t('admin.settings.payment.validationTypesRequired'))
return
}
@@ -408,7 +408,7 @@ function emitValidationError(msg: string) {
function reset(defaultKey: string) {
form.name = ''
form.provider_key = defaultKey
form.supported_types = (PROVIDER_SUPPORTED_TYPES[defaultKey] || []).join(',')
form.supported_types = [...(PROVIDER_SUPPORTED_TYPES[defaultKey] || [])]
form.enabled = true
form.refund_enabled = false
clearConfig()
@@ -66,7 +66,6 @@ import Icon from '@/components/icons/Icon.vue'
import ToggleSwitch from './ToggleSwitch.vue'
import type { ProviderInstance } from '@/types/payment'
import type { TypeOption } from './providerConfig'
import { parseTypes } from './providerConfig'
const PROVIDER_KEY_LABELS: Record<string, string> = {
easypay: 'admin.settings.payment.providerEasypay',
@@ -93,6 +92,6 @@ const { t } = useI18n()
const keyLabel = computed(() => t(PROVIDER_KEY_LABELS[props.provider.provider_key] || props.provider.provider_key))
function isSelected(type: string): boolean {
return parseTypes(props.provider.supported_types).includes(type)
return props.provider.supported_types.includes(type)
}
</script>
+1 -1
View File
@@ -104,7 +104,7 @@ export interface ProviderInstance {
provider_key: string
name: string
config: Record<string, string>
supported_types: string
supported_types: string[]
enabled: boolean
refund_enabled: boolean
limits: string
+5 -9
View File
@@ -2800,8 +2800,6 @@ async function saveBetaPolicySettings() {
// ==================== Provider Management ====================
import { parseTypes } from '@/components/payment/providerConfig'
const allPaymentTypes = computed(() => [
{ value: 'easypay', label: t('payment.methods.easypay') },
{ value: 'alipay', label: t('payment.methods.alipay') },
@@ -2901,18 +2899,16 @@ async function handleToggleField(provider: ProviderInstance, field: 'enabled' |
}
async function handleToggleType(provider: ProviderInstance, type: string) {
const current = parseTypes(provider.supported_types)
const updated = current.includes(type)
? current.filter(t => t !== type)
: [...current, type]
const updated = provider.supported_types.includes(type)
? provider.supported_types.filter(t => t !== type)
: [...provider.supported_types, type]
if (updated.length === 0) {
appStore.showError(t('admin.settings.payment.validationTypesRequired'))
return
}
const newVal = updated.join(',')
try {
await adminAPI.payment.updateProvider(provider.id, { supportedTypes: newVal } as any)
provider.supported_types = newVal
await adminAPI.payment.updateProvider(provider.id, { supportedTypes: updated } as any)
provider.supported_types = updated
} catch (err: unknown) { appStore.showError(extractApiErrorMessage(err, t('common.error'))) }
}