Interacting with other fields
UI extensions can interact with the other fields of the form, and with the form itself.
For these purposes, the form
property exposes the following methods:
Method | Signature | Description |
---|---|---|
change | (fieldName: string, value: any) => Promise<void> | changes the value of another field |
getState | () => Promise< FormState> | returns the current form state |
getFieldState | (fieldName: string) => Promise< FieldState> | returns the given field state |
subscribeToFieldState | (fieldName: string, callback: (state: FieldState, subscription: FieldSubscription) => void) => Promise<Unsubscribe> | opens a subscription to a field's state changes |
subscribeToFormState | (callback: (state: FormState) => void, subscription: FormSubscription) => Promise<Unsubscribe>; | opens a subscrition to the form's state changes |
setFieldsVisibility | (arg: VisibilityMap| ((currentVisibilityMap: VisibilityMap) => VisibilityMap)) => void; | Allows modifying visibility of any field |
#Types
Internally, Hygraph uses final-form to manage form and field states.
#FormState
See FormState on final-form.
The FormSubscription
param has the same shape as FormState
, but using a boolean
to describe which state changes you want to subscribe to.
subscribeToFormState((state) => console.log(state.dirty, state.errors), {// react only to form `dirty` and `invalid` state changesdirty: true,invalid: true,});
#FieldState
See FormState on final-form.
The FieldSubscription
param has the same shape as FieldState
, but using a boolean
to describe which state changes you want to subscribe to.
subscribeToFieldState('title', (state) => console.log(state.value), {// react only to field `value` changesvalue: true,});
#Unsubscribe
Both subscribeToFieldState
and subscribeToFormState
return a function to be called when needing to unsubscribe from changes.
In order to avoid perfomance issues, make sure to unsubscribe any existing subscription before subscribing again.
Example in React:
React.useEffect(() => {let unsubscribe;subscribeToFieldState('title', (state) => console.log(state.value), {value: true,}).then((fieldUnsubscribe) => (unsubscribe = fieldUnsubscribe));return () => {unsubscribe?.();};}, []);
#Set fields visibility
type VisibilityMap = {[fieldApiId: string]: 'READ_ONLY' | 'HIDDEN' | 'READ_WRITE';};
Using object form to set visibility for field with API ID fieldApiId
setFieldsVisibility({fieldApiId: 'READ_ONLY',});
Using callback to calculate next visibility value for field with API ID fieldApiId
setFieldsVisibility((currentVisibilityMap) => {const nextVisibilityValue =currentVisibilityMap[fieldApiId] === 'READ_ONLY'? 'READ_WRITE': 'READ_ONLY';return {fieldApiId: nextVisibilityValue,};});