packages/react-settings-form/src/effects/useLocales.tsx (27 lines of code) (raw):
import React from 'react'
import { isVoidField, onFieldReact } from '@formily/core'
import { TreeNode, GlobalRegistry } from '@designable/core'
import { isStr } from '@designable/shared'
import { IconWidget } from '@designable/react'
const takeIcon = (message: string) => {
if (!isStr(message)) return
const matched = message.match(/@([^:\s]+)(?:\s*\:\s*([\s\S]+))?/)
if (matched) return [matched[1], matched[2]]
return
}
const mapEnum = (dataSource: any[]) => (item: any, index: number) => {
const label = dataSource[index] || dataSource[item.value] || item.label
const icon = takeIcon(label)
return {
...item,
value: item?.value ?? null,
label: icon ? (
<IconWidget infer={icon[0]} tooltip={icon[1]} />
) : (
label?.label ?? label ?? 'Unknow'
),
}
}
export const useLocales = (node: TreeNode) => {
onFieldReact('*', (field) => {
const path = field.path.toString().replace(/\.[\d+]/g, '')
const takeMessage = (prop?: string) => {
const token = `settings.${path}${prop ? `.${prop}` : ''}`
return node.getMessage(token) || GlobalRegistry.getDesignerMessage(token)
}
const title = takeMessage('title') || takeMessage()
const description = takeMessage('description')
const tooltip = takeMessage('tooltip')
const dataSource = takeMessage('dataSource')
const placeholder = takeMessage('placeholder')
if (title) {
field.title = title
}
if (description) {
field.description = description
}
if (tooltip) {
field.decorator[1] = field.decorator[1] || []
field.decorator[1].tooltip = tooltip
}
if (placeholder) {
field.component[1] = field.component[1] || []
field.component[1].placeholder = placeholder
}
if (!isVoidField(field)) {
if (dataSource?.length) {
if (field.dataSource?.length) {
field.dataSource = field.dataSource.map(mapEnum(dataSource))
} else {
field.dataSource = dataSource.slice()
}
} else {
field.dataSource = field.dataSource?.filter(Boolean)
}
}
})
}