From a5b3a72e769a12c3347f06d3ea6c4f25dba4ab5e Mon Sep 17 00:00:00 2001 From: Davide Di Pumpo Date: Wed, 3 Dec 2025 21:20:39 +0100 Subject: [PATCH 1/3] fix: ensure nextTick is used for state change handling in OmegaTaggedUnionInternal --- .changeset/stale-showers-wave.md | 5 ++++ .../OmegaForm/OmegaTaggedUnionInternal.vue | 30 +++++++++---------- 2 files changed, 20 insertions(+), 15 deletions(-) create mode 100644 .changeset/stale-showers-wave.md diff --git a/.changeset/stale-showers-wave.md b/.changeset/stale-showers-wave.md new file mode 100644 index 000000000..18c56703e --- /dev/null +++ b/.changeset/stale-showers-wave.md @@ -0,0 +1,5 @@ +--- +"@effect-app/vue-components": patch +--- + +fix: ensure nextTick is used for state change handling in OmegaTaggedUnionInternal diff --git a/packages/vue-components/src/components/OmegaForm/OmegaTaggedUnionInternal.vue b/packages/vue-components/src/components/OmegaForm/OmegaTaggedUnionInternal.vue index bd6465135..30a2c8553 100644 --- a/packages/vue-components/src/components/OmegaForm/OmegaTaggedUnionInternal.vue +++ b/packages/vue-components/src/components/OmegaForm/OmegaTaggedUnionInternal.vue @@ -12,7 +12,7 @@ generic="From extends Record, To extends Record, Name extends DeepKeys" > import { type DeepKeys, type DeepValue } from "@tanstack/vue-form" -import { watch } from "vue" +import { nextTick, watch } from "vue" import { type OmegaFieldInternalApi } from "./InputProps" import { type useOmegaForm } from "./useOmegaForm" @@ -23,8 +23,6 @@ const props = defineProps<{ form: ReturnType> }>() -const values = props.form.useStore(({ values }) => values) - // Watch for _tag changes watch(() => props.state, (newTag, oldTag) => { if (newTag === null) { @@ -32,18 +30,20 @@ watch(() => props.state, (newTag, oldTag) => { } if (newTag !== oldTag && newTag) { - // Get default values for the new tag to ensure correct types - const tagDefaults = (props.form as any).unionDefaultValues?.[newTag as string] ?? {} - // Merge: keep _tag from current values, but use tag defaults for other fields - const resetValues = { - ...tagDefaults, - _tag: newTag - } - props.form.reset(resetValues as any) - setTimeout(() => { - props.field.validate("change") - }, 0) + // Use nextTick to avoid cleanup conflicts during reactive updates + nextTick(() => { + // Get default values for the new tag to ensure correct types + const tagDefaults = (props.form as any).unionDefaultValues?.[newTag as string] ?? {} + // Merge: keep _tag from current values, but use tag defaults for other fields + const resetValues = { + ...tagDefaults, + _tag: newTag + } + props.form.reset(resetValues as any) + setTimeout(() => { + props.field.validate("change") + }, 0) + }) } - return undefined }, { immediate: true }) From 0dcc0994bc20bbe95b12571f087912e166ff5cf6 Mon Sep 17 00:00:00 2001 From: Davide Di Pumpo Date: Wed, 3 Dec 2025 21:31:22 +0100 Subject: [PATCH 2/3] refactor: remove unused fieldKey computed property from OmegaInput component --- .../src/components/OmegaForm/OmegaInput.vue | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/packages/vue-components/src/components/OmegaForm/OmegaInput.vue b/packages/vue-components/src/components/OmegaForm/OmegaInput.vue index 856451c1a..c7b5fabb1 100644 --- a/packages/vue-components/src/components/OmegaForm/OmegaInput.vue +++ b/packages/vue-components/src/components/OmegaForm/OmegaInput.vue @@ -1,7 +1,6 @@