Skip to content

Commit

Permalink
organize vest state hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
ealush committed Nov 10, 2021
1 parent df84261 commit cc9b4b0
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 40 deletions.
84 changes: 45 additions & 39 deletions packages/vest/src/core/state/stateHooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ import type { TStateRef } from 'createStateRef';
import ctx from 'ctx';
import type { TDraftResult } from 'produceDraft';

// STATE REF
export function useStateRef(): Exclude<TStateRef, void> {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
return ctx.useX().stateRef!; // I should revisit this
}

// STATE KEYS
export function useSuiteId(): TStateHandlerReturn<string> {
return useStateRef().suiteId();
}
Expand All @@ -22,30 +29,6 @@ export function useOptionalFields(): TStateHandlerReturn<
return useStateRef().optionalFields();
}

const omittedFieldsCache = createCache();
export function useOmittedFields(): Record<string, true> {
const [testObjects] = useTestObjects();

return omittedFieldsCache([testObjects], () =>
testObjects.reduce((omittedFields, testObject) => {
if (omittedFields[testObject.fieldName]) {
return omittedFields;
}

if (testObject.isOmitted()) {
omittedFields[testObject.fieldName] = true;
}

return omittedFields;
}, {} as Record<string, true>)
);
}

export function useStateRef(): Exclude<TStateRef, void> {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
return ctx.useX().stateRef!; // I should revisit this
}

export function useTestObjects(): TStateHandlerReturn<VestTest[]> {
return useStateRef().testObjects();
}
Expand All @@ -54,14 +37,22 @@ export function usePrevTestObjects(): TStateHandlerReturn<VestTest[]> {
return useStateRef().prevTestObjects();
}

export function useTestAtCursor(initialValue: VestTest): VestTest {
const [cursorAt] = useCursorAt();
const [prevTestObjects] = usePrevTestObjects();
export function useCursorAt(): TStateHandlerReturn<number> {
return useStateRef().testObjectsCursor();
}

const nextTest = defaultTo(prevTestObjects[cursorAt], initialValue);
useSetTestAtCursor(nextTest);
export function useSetNextCursorAt(): void {
const [, setCursorAt] = useCursorAt();

return nextTest;
setCursorAt((cursorAt: number) => cursorAt + 1);
}

// STATE ACTIONS

export function useRefreshTestObjects(): void {
const [, setTestObjects] = useTestObjects();

setTestObjects(testObjects => testObjects.slice(0));
}

export function useSetTestAtCursor(testObject: VestTest): void {
Expand All @@ -79,20 +70,35 @@ export function useSetTestAtCursor(testObject: VestTest): void {
});
}

export function useSetNextCursorAt(): void {
const [, setCursorAt] = useCursorAt();
// DERIVED VALUES

setCursorAt((cursorAt: number) => cursorAt + 1);
}
const omittedFieldsCache = createCache();
export function useOmittedFields(): Record<string, true> {
const [testObjects] = useTestObjects();

export function useRefreshTestObjects(): void {
const [, setTestObjects] = useTestObjects();
return omittedFieldsCache([testObjects], () =>
testObjects.reduce((omittedFields, testObject) => {
if (omittedFields[testObject.fieldName]) {
return omittedFields;
}

setTestObjects(testObjects => testObjects.slice(0));
if (testObject.isOmitted()) {
omittedFields[testObject.fieldName] = true;
}

return omittedFields;
}, {} as Record<string, true>)
);
}

export function useCursorAt(): TStateHandlerReturn<number> {
return useStateRef().testObjectsCursor();
export function useTestAtCursor(initialValue: VestTest): VestTest {
const [cursorAt] = useCursorAt();
const [prevTestObjects] = usePrevTestObjects();

const nextTest = defaultTo(prevTestObjects[cursorAt], initialValue);
useSetTestAtCursor(nextTest);

return nextTest;
}

const incompleteCache = createCache();
Expand Down
2 changes: 1 addition & 1 deletion packages/vest/src/hooks/optionalTests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,4 @@ export default function optional(optionals: TOptionalsInput): void {

type TOptionalsInput = string | string[] | TOptionalsObject;

export type TOptionalsObject = Record<string, () => boolean>;
type TOptionalsObject = Record<string, () => boolean>;

0 comments on commit cc9b4b0

Please sign in to comment.