@@ -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,29 @@ 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 {
88+ resolvedId : resolvedExternalUserId , warningType,
89+ } = useMemo ( ( ) => resolveUserId ( externalUserId , userId ) , [
90+ externalUserId ,
91+ userId ,
92+ ] ) ;
93+
94+ // Show deprecation warnings in useEffect to avoid render side effects
95+ useEffect ( ( ) => {
96+ if ( process . env . NODE_ENV !== "production" ) {
97+ if ( warningType === "both" ) {
98+ console . warn ( "[connect-react] Both externalUserId and userId provided. Using externalUserId. Please remove userId to avoid this warning." ) ;
99+ } else if ( warningType === "deprecated" ) {
100+ console . warn ( "[connect-react] userId is deprecated. Please use externalUserId instead." ) ;
101+ }
102+ }
103+ } , [
104+ warningType ,
105+ ] ) ;
82106 const componentId = component . key ;
83107
84108 const [
@@ -134,7 +158,7 @@ export const FormContextProvider = <T extends ConfigurableProps>({
134158 setReloadPropIdx ,
135159 ] = useState < number > ( ) ;
136160 const componentReloadPropsInput : ReloadComponentPropsOpts = {
137- userId ,
161+ externalUserId : resolvedExternalUserId ,
138162 componentId,
139163 configuredProps,
140164 dynamicPropsId : dynamicProps ?. id ,
@@ -349,14 +373,14 @@ export const FormContextProvider = <T extends ConfigurableProps>({
349373 const [
350374 prevUserId ,
351375 setPrevUserId ,
352- ] = useState ( userId )
376+ ] = useState ( resolvedExternalUserId )
353377 useEffect ( ( ) => {
354- if ( prevUserId !== userId ) {
378+ if ( prevUserId !== resolvedExternalUserId ) {
355379 updateConfiguredProps ( { } ) ;
356- setPrevUserId ( userId )
380+ setPrevUserId ( resolvedExternalUserId )
357381 }
358382 } , [
359- userId ,
383+ resolvedExternalUserId ,
360384 ] ) ;
361385
362386 // maybe should take prop as first arg but for text inputs didn't want to compute index each time
@@ -550,7 +574,8 @@ export const FormContextProvider = <T extends ConfigurableProps>({
550574 id,
551575 isValid : ! Object . keys ( errors ) . length , // XXX want to expose more from errors
552576 props : formProps ,
553- userId,
577+ externalUserId : resolvedExternalUserId ,
578+ userId : resolvedExternalUserId , // Keep for backward compatibility
554579 component,
555580 configurableProps,
556581 configuredProps,
0 commit comments