@giancosta86/captain-hook v2.0.0
captain-hook
TypeScript hooks for React
captain-hook is a TypeScript library for React dedicated to functional programming via hooks - as described in this article.
Installation
The package on NPM is:
@giancosta86/captain-hook
The public API is partitioned into the following modules:
defineContext: for the
defineContextmulti-factory function.useAsyncFetcher: for the
useAsyncFetcherhook.
Usage
defineContext()
Factory function removing boilerplate code from the creation of a React context; you simply need to know:
the interface of the context
the hook function for obtaining the (probably memoized via
useMemo()) context value that will be passed to theProvidercomponent upon each rendering
and it will return (in this order):
the hook internally calling
useContext()to obtain the current context value within theProvidercomponent treethe
Providercomponent itself, ready to use - and with no additional properties
For example:
// Defining the context interface.
interface CounterContext {
numericValue: number;
increase(): void;
}
// This creates both the context-access hook
// and the context provider component.
const [useCounterContext, CounterContextProvider] =
defineContext<CounterContext>(
// This is actually a hook, so it must
// obey all the hook rules.
//
// Its result must be the context value passed
// by the context provider to its component tree.
() => {
const [numericValue, setNumericValue] = useState(0);
const contextValue = useMemo(
() => ({
numericValue,
increase() {
setNumericValue(current => current + 1);
}
}),
[numericValue]
);
return contextValue;
});
const ContextClient: FC = () => {
const { numericValue, increase } = useCounterContext();
// Use the context data here, and return the JSX...
};
// Somewhere in the React component tree...
<CounterContextProvider>
<ContextClient />
</CounterContextProvider>useAsyncFetcher()
Multi-stage approach to data fetching, alternative to SWR.
It creates a sort of fetching pipeline having the following parameters - to be packed into an object:
fetcher: the() => Promise<T | undefined>function used to fetch data - for example, from some API. If the function returnsPromise<undefined>, the process will be stopped andonCancel(if passed) will be called instead ofonDataonData: basically a(data: T) => void | Promise<void>function manipulating the fetched data; for example, you might want to call React state settersonError: precisely an(err: unknown) => void | Promise<void>function only called if an error is thrown byfetcheror any other handler (includingonCancelandonStale)onCancel: optional() => void | Promise<void>function called in lieu ofonDatawhenfetcherreturnsundefinedonStale: optional() => void | Promise<void>function called whenfetcherreturns but in the meantime another fetcher has been started because of a change independenciesdependencies: the array of dependencies referenced by the internaluseEffect(); the hook by itself does not automatically set any implicit dependency.