import { PolySymbol } from '@dcloudio/uni-core'
import { defineComponent, provide, SetupContext } from 'vue'
export const uniFormKey = PolySymbol(__DEV__ ? 'uniForm' : 'uf')
export interface UniFormCtx {
addField: (field: UniFormFieldCtx) => void
removeField: (field: UniFormFieldCtx) => void
submit: () => void
reset: () => void
}
interface UniFormFieldCtx {
submit: () => [string, any]
reset: () => void
}
export default defineComponent({
name: 'Form',
setup(_props, { slots, emit }) {
provideForm(emit)
return () => (
{slots.default && slots.default()}
)
},
})
function provideForm(emit: SetupContext['emit']) {
const fields: UniFormFieldCtx[] = []
provide(uniFormKey, {
addField(field: UniFormFieldCtx) {
fields.push(field)
},
removeField(field: UniFormFieldCtx) {
fields.splice(fields.indexOf(field), 1)
},
submit() {
emit('submit', {
detail: {
value: fields.reduce((res, field) => {
const [name, value] = field.submit()
name && (res[name] = value)
return res
}, Object.create(null)),
},
})
},
reset() {
fields.forEach((field) => field.reset())
emit('reset')
},
})
return fields
}