clean-architecture
Version:
Utilities for implementing clean architecture using Redux
26 lines (25 loc) • 1.18 kB
TypeScript
import { type ReactNode } from "react";
type StatesToHook<States extends Record<string, Record<string, any>>> = <UsecaseName extends keyof States, SelectorName extends keyof States[UsecaseName] extends `get${infer N}` ? Uncapitalize<N> : never>(usecaseName: UsecaseName, selectorName: SelectorName) => States[UsecaseName][`get${Capitalize<SelectorName>}`] extends (...args: any[]) => infer ReturnType ? ReturnType : never;
type CoreLike = {
states: Record<string, Record<string, any>>;
subscribe: (callback: () => void) => {
unsubscribe: () => void;
};
};
type ReactApi<Core extends CoreLike, ParamsOfBootstrapCore> = {
useCore: () => Core;
useCoreState: StatesToHook<Core["states"]>;
createCoreProvider: (params: ParamsOfBootstrapCore) => {
CoreProvider: (props: {
fallback?: ReactNode;
children: ReactNode;
}) => JSX.Element;
prCore: Promise<Core>;
};
};
export declare function createReactApi<Core extends CoreLike, ParamsOfBootstrapCore>(params: {
bootstrapCore: (params: ParamsOfBootstrapCore) => Promise<{
core: Core;
}>;
}): ReactApi<Core, ParamsOfBootstrapCore>;
export {};