alinea
Version:
Headless git-based CMS
79 lines (78 loc) • 2.52 kB
TypeScript
import { type Atom, type PrimitiveAtom } from 'jotai';
import { type FunctionComponent, type PropsWithChildren, type ReactNode } from 'react';
export interface RouteData<T> {
path: string;
loader?: (params: Record<string, string>) => Atom<Promise<T>>;
component: FunctionComponent<T>;
}
export declare class Route<T = any> {
data: RouteData<T>;
constructor(data: RouteData<T>);
get component(): FunctionComponent<T>;
}
export interface RouterData {
routes: Array<Route>;
}
export declare class Router {
data: RouterData;
matchers: Array<{
route: Route;
matcher: Atom<Record<string, string> | undefined>;
}>;
constructor(data: RouterData);
matchingRoute: Atom<{
route: Route<any>;
params: Record<string, string>;
} | undefined>;
matchingRouteWithData: Atom<Promise<Match>>;
currentRoute: PrimitiveAtom<Match> & {
init: Match;
};
prevLocation: PrimitiveAtom<URL | undefined> & {
init: URL | undefined;
};
blockers: PrimitiveAtom<Set<PrimitiveAtom<BlockingResponse>>> & {
init: Set<PrimitiveAtom<BlockingResponse>>;
};
expected: Promise<Match> | undefined;
cancelled: PrimitiveAtom<boolean> & {
init: boolean;
};
match: import("jotai").WritableAtom<Match | Promise<Match>, [Promise<Match>, Match], void>;
}
export interface RouterProviderProps {
router: Router;
}
export declare function RouterProvider({ children, router }: PropsWithChildren<RouterProviderProps>): import("react/jsx-runtime").JSX.Element;
export declare function useRouter(): Router;
export interface RouteMatch<T = any> {
route: Route<T>;
data: T;
params: Record<string, string>;
}
type Match = RouteMatch | undefined;
type BlockingResponse = {
nextRoute: Match;
confirm(): void;
cancel(): void;
} | undefined;
export type UseBlockerData = {
isBlocking: true;
nextRoute?: Match;
confirm(): void;
cancel(): void;
} | {
isBlocking: false;
nextRoute: undefined;
confirm: undefined;
cancel: undefined;
};
export declare function useRouteBlocker(message: string, when: boolean): UseBlockerData;
export declare function useRouteMatch(): Match;
export declare function useRouteParams(): Record<string, string>;
export declare function useRouteRender(): ReactNode;
export interface RouteViewProps {
fallback?: ReactNode;
}
export declare function RouteView({ fallback }: RouteViewProps): import("react/jsx-runtime").JSX.Element;
export {};