Skip to content
Snippets Groups Projects
Commit cac8f820 authored by Remi Lazarini's avatar Remi Lazarini Committed by Loïc Correnson
Browse files

[ivette] add hook useServerField

parent dfeaf9eb
No related branches found
No related tags found
No related merge requests found
...@@ -37,6 +37,7 @@ import { GlobalState, useGlobalState } from 'dome/data/states'; ...@@ -37,6 +37,7 @@ import { GlobalState, useGlobalState } from 'dome/data/states';
import { Client, useModel } from 'dome/table/models'; import { Client, useModel } from 'dome/table/models';
import { CompactModel } from 'dome/table/arrays'; import { CompactModel } from 'dome/table/arrays';
import * as Ast from 'frama-c/kernel/api/ast'; import * as Ast from 'frama-c/kernel/api/ast';
import { FieldState, FieldError } from 'dome/layout/forms';
import * as Server from './server'; import * as Server from './server';
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -307,6 +308,34 @@ export function useSyncValue<A>(value: Value<A>): A | undefined { ...@@ -307,6 +308,34 @@ export function useSyncValue<A>(value: Value<A>): A | undefined {
return v; return v;
} }
/** Synchronize FieldState and server state only if there is no error. */
export function useServerField<A>(
state: State<A>,
defaultValue: A,
): FieldState<A> {
const [value, setState] = useSyncState(state);
const [localValue, setLocalValue] = React.useState(value);
const [localError, setLocalError] = React.useState<FieldError>(undefined);
React.useEffect(() => {
!localError && setLocalValue(value);
}, [value, localError]);
const update = React.useCallback((newValue: A, newError: FieldError) => {
setLocalValue(newValue);
setLocalError(newError);
if (!newError) {
setState(newValue);
}
}, [setState]);
return {
value: localValue ?? defaultValue,
error: localError,
onChanged: update
};
}
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// --- Synchronized Arrays // --- Synchronized Arrays
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment