@@ -16,6 +16,7 @@ import {
1616import {
1717 Observation , SdkError ,
1818} from "../types" ;
19+ import { resolveUserId } from "../utils/resolve-user-id" ;
1920
2021export type DynamicProps < T extends ConfigurableProps > = { id : string ; configurableProps : T ; } ; // TODO
2122
@@ -39,6 +40,8 @@ export type FormContext<T extends ConfigurableProps> = {
3940 setConfiguredProp : ( idx : number , value : unknown ) => void ; // XXX type safety for value (T will rarely be static right?)
4041 setSubmitting : ( submitting : boolean ) => void ;
4142 submitting : boolean ;
43+ externalUserId : string ;
44+ /** @deprecated Use externalUserId instead */
4245 userId : string ;
4346 enableDebugging ?: boolean ;
4447} ;
@@ -77,8 +80,23 @@ export const FormContextProvider = <T extends ConfigurableProps>({
7780 const id = useId ( ) ;
7881
7982 const {
80- component, configuredProps : __configuredProps , propNames, userId, sdkResponse, enableDebugging,
83+ component, configuredProps : __configuredProps , propNames, externalUserId , userId, sdkResponse, enableDebugging,
8184 } = formProps ;
85+
86+ // Resolve user ID with deprecation warning
87+ const { resolvedId : resolvedExternalUserId , warningType } = useMemo ( ( ) =>
88+ resolveUserId ( externalUserId , userId ) ,
89+ [ externalUserId , userId ]
90+ ) ;
91+
92+ // Show deprecation warnings in useEffect to avoid render side effects
93+ useEffect ( ( ) => {
94+ if ( warningType === 'both' ) {
95+ console . warn ( '[connect-react] Both externalUserId and userId provided. Using externalUserId. Please remove userId to avoid this warning.' ) ;
96+ } else if ( warningType === 'deprecated' ) {
97+ console . warn ( '[connect-react] userId is deprecated. Please use externalUserId instead.' ) ;
98+ }
99+ } , [ warningType ] ) ;
82100 const componentId = component . key ;
83101
84102 const [
@@ -134,7 +152,7 @@ export const FormContextProvider = <T extends ConfigurableProps>({
134152 setReloadPropIdx ,
135153 ] = useState < number > ( ) ;
136154 const componentReloadPropsInput : ReloadComponentPropsOpts = {
137- userId ,
155+ externalUserId : resolvedExternalUserId ,
138156 componentId,
139157 configuredProps,
140158 dynamicPropsId : dynamicProps ?. id ,
@@ -349,14 +367,14 @@ export const FormContextProvider = <T extends ConfigurableProps>({
349367 const [
350368 prevUserId ,
351369 setPrevUserId ,
352- ] = useState ( userId )
370+ ] = useState ( resolvedExternalUserId )
353371 useEffect ( ( ) => {
354- if ( prevUserId !== userId ) {
372+ if ( prevUserId !== resolvedExternalUserId ) {
355373 updateConfiguredProps ( { } ) ;
356- setPrevUserId ( userId )
374+ setPrevUserId ( resolvedExternalUserId )
357375 }
358376 } , [
359- userId ,
377+ resolvedExternalUserId ,
360378 ] ) ;
361379
362380 // maybe should take prop as first arg but for text inputs didn't want to compute index each time
@@ -550,7 +568,8 @@ export const FormContextProvider = <T extends ConfigurableProps>({
550568 id,
551569 isValid : ! Object . keys ( errors ) . length , // XXX want to expose more from errors
552570 props : formProps ,
553- userId,
571+ externalUserId : resolvedExternalUserId ,
572+ userId : resolvedExternalUserId , // Keep for backward compatibility
554573 component,
555574 configurableProps,
556575 configuredProps,
0 commit comments