Skip to content

Commit

Permalink
Merge pull request #18 from jotaijs/fix/type-inference
Browse files Browse the repository at this point in the history
Fix: type inference issue from upstream
  • Loading branch information
barelyhuman committed Jun 30, 2023
2 parents cb4eacf + 2cdbc40 commit b1e4b94
Showing 1 changed file with 36 additions and 4 deletions.
40 changes: 36 additions & 4 deletions src/atomWithFormControls.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import { atom } from 'jotai/vanilla';
import type { Validator } from './validateAtoms';
import { WritableAtom, atom } from 'jotai/vanilla';
import type {
ExtractTypeOfValidatorValue,
Validator,
ValidatorState,
} from './validateAtoms';
import { AtomWithValidation, validateAtoms } from './validateAtoms';

type Options<Vkeys extends symbol | string | number, Vvals> = {
Expand All @@ -12,14 +16,32 @@ export type ActionableNext = {
value: any;
};

export type FormControls<Keys extends string, Vals> = {
isValid: boolean;
fieldErrors: {
[k: string]: any;
};
touched: Record<Keys, boolean>;
focused: Record<Keys, boolean>;
setValue(key: Keys, value: Vals): void;
setTouched(key: Keys, val: boolean): void;
setFocused(key: Keys, val: boolean): void;
handleOnChange(key: Keys): (val: any) => void;
handleOnFocus(key: Keys): () => unknown;
handleOnBlur(key: Keys): () => void;
values: Record<Keys, ExtractTypeOfValidatorValue<Vals>>;
error: unknown;
isValidating: boolean | undefined;
};

const getDefaultOptions = <K extends symbol | string | number, V>() =>
<Options<K, V>>{
validate: (v) => v,
};

export function atomWithFormControls<
AtomGroup extends Record<string, AtomWithValidation<any>>,
Keys extends keyof AtomGroup,
Keys extends Extract<keyof AtomGroup, string>,
Vals extends AtomGroup[Keys],
>(labeledAtoms: AtomGroup, options?: Options<Keys, Vals>) {
const { validate } = Object.assign(
Expand Down Expand Up @@ -155,5 +177,15 @@ export function atomWithFormControls<
);

// Return read only atom to avoid direct modifications to the atom
return atom((get) => get(formControlAtom));
const forceCastedAtom = formControlAtom as unknown as WritableAtom<
FormControls<Keys, Vals>,
[next: ActionableNext],
| void
| ({
values: Record<Keys, ExtractTypeOfValidatorValue<Vals>>;
} & ValidatorState &
FormControls<Keys, Vals>)
>;

return atom((get) => get(forceCastedAtom));
}

0 comments on commit b1e4b94

Please sign in to comment.