@@ -19,6 +19,7 @@ import { type DeepKeys, type DeepValue } from "@tanstack/vue-form"
1919import { S } from " effect-app"
2020import { watch } from " vue"
2121import { getTransformationFrom } from " ../../utils"
22+ import { extractSchemaDefaults } from " ./defaultAST"
2223import { type OmegaFieldInternalApi } from " ./InputProps"
2324import { type useOmegaForm } from " ./useOmegaForm"
2425
@@ -37,20 +38,51 @@ watch(() => props.state, (newTag, oldTag) => {
3738 if (newTag === null ) {
3839 props .field .setValue (null as DeepValue <From , Name >)
3940 }
41+
42+ props .form .reset (values .value )
43+
4044 if (newTag !== oldTag ) {
45+ // get default values from AST for the new tag (only for root level tagged unions)
4146 if (props .name === void 0 && S .AST .isUnion (props .form ._schema .ast )) {
42- const members = props
47+ const indexOfSelectedMember = props
4348 .form
4449 ._schema
4550 .ast
4651 .types
47- .map ((t ) => getTransformationFrom (t ))
48- .filter ((t ) => S .AST .isTypeLiteral (t ) || S .AST .isTransformation (t ))
49- .map ((t ) => t .propertySignatures )
50- console .log (" members" , members )
52+ .map ((t , i ) => ({ original: i , unwrapped: getTransformationFrom (t ) }))
53+ .flatMap ((x ) =>
54+ S .AST .isTypeLiteral (x .unwrapped ) || S .AST .isTransformation (x .unwrapped )
55+ ? x
56+ .unwrapped
57+ .propertySignatures
58+ .filter ((ps ) => S .AST .isLiteral (ps .type ) && ps .type .literal === newTag )
59+ .length > 0
60+ ? [x .original ]
61+ : []
62+ : []
63+ )[0 ]
64+
65+ // even if the type doesn't say so, indexOfSelectedMember may be undefined
66+ if (
67+ indexOfSelectedMember != void 0
68+ && " members" in props .form ._schema
69+ && Array .isArray (props .form ._schema .members )
70+ ) {
71+ const defaultsOfSelectedMember = Object .assign (
72+ extractSchemaDefaults (
73+ props
74+ .form
75+ ._schema
76+ .members [indexOfSelectedMember ],
77+ values .value
78+ ),
79+ { _tag: newTag }
80+ )
81+
82+ props .form .reset (defaultsOfSelectedMember )
83+ }
5184 }
52- console .log (" resetting form" , values .value )
53- props .form .reset (values .value )
85+
5486 setTimeout (() => {
5587 props .field .validate (" change" )
5688 }, 0 )
0 commit comments