mirror of
https://github.com/gosticks/DefinitelyTyped.git
synced 2025-10-16 12:05:41 +00:00
* [next-server] Add useRouter() hook
* Add a test for useRouter
* Add missing semicolon
* Bump version to 8.1
* RouterProps → SingletonRouter
* SingletonRouter → RouterProps 😅
* Update types/next-server/router.d.ts
As suggested by @resir014
Co-Authored-By: kachkaev <alexander@kachkaev.ru>
* Fix linting
104 lines
3.0 KiB
TypeScript
104 lines
3.0 KiB
TypeScript
import * as React from "react";
|
|
import * as url from "url";
|
|
|
|
type EventName =
|
|
| "routeChangeStart"
|
|
| "routeChangeComplete"
|
|
| "routeChangeError"
|
|
| "beforeHistoryChange"
|
|
| "hashChangeStart"
|
|
| "hashChangeComplete";
|
|
|
|
interface RouteChangeError {
|
|
cancelled: boolean;
|
|
}
|
|
|
|
type EventHandler = (url: string) => any;
|
|
type ErrorEventHandler = (err: RouteChangeError, url: string) => any;
|
|
|
|
export type UrlLike = url.UrlObject | url.Url;
|
|
|
|
export interface EventChangeOptions {
|
|
shallow?: boolean;
|
|
[key: string]: any;
|
|
}
|
|
|
|
export type PopStateCallback = (state: any) => boolean | undefined;
|
|
|
|
export type RouterCallback = () => void;
|
|
|
|
export type DefaultQuery = Record<string, string | string[] | undefined>;
|
|
|
|
export interface RouterProps<Q = DefaultQuery> {
|
|
// url property fields
|
|
readonly pathname: string;
|
|
readonly route: string;
|
|
readonly asPath?: string;
|
|
readonly query?: Q;
|
|
|
|
// property fields
|
|
readonly components: {
|
|
[key: string]: { Component: React.ComponentType<any>; err: any };
|
|
};
|
|
|
|
// core method fields
|
|
back(): void;
|
|
beforePopState(cb: PopStateCallback): boolean;
|
|
prefetch(url: string): Promise<React.ComponentType<any>>;
|
|
push(
|
|
url: string | UrlLike,
|
|
as?: string | UrlLike,
|
|
options?: EventChangeOptions
|
|
): Promise<boolean>;
|
|
reload(route: string): Promise<void>;
|
|
replace(
|
|
url: string | UrlLike,
|
|
as?: string | UrlLike,
|
|
options?: EventChangeOptions
|
|
): Promise<boolean>;
|
|
|
|
// events (deprecated soonish)
|
|
onBeforeHistoryChange?(as: string): void;
|
|
onHashChangeStart?(url: string): void;
|
|
onHashChangeComplete?(url: string): void;
|
|
onRouteChangeComplete?(url: string): void;
|
|
onRouteChangeError?(error: RouteChangeError, url: string): void;
|
|
onRouteChangeStart?(url: string): void;
|
|
|
|
// events API (6.1.1+)
|
|
readonly events: {
|
|
on: (eventName: EventName, handler: EventHandler | ErrorEventHandler) => void;
|
|
off: (eventName: EventName, handler: (url: string) => any) => void;
|
|
};
|
|
}
|
|
|
|
export interface SingletonRouter<Q = DefaultQuery> extends RouterProps<Q> {
|
|
router: RouterProps<Q> | null;
|
|
readyCallbacks: RouterCallback[];
|
|
ready(cb: RouterCallback): void;
|
|
}
|
|
|
|
export interface WithRouterProps<Q = DefaultQuery> {
|
|
router?: SingletonRouter<Q>;
|
|
}
|
|
|
|
/**
|
|
* Remove properties `K` from `T`.
|
|
*
|
|
* @internal
|
|
*/
|
|
export type Omit<T, K extends keyof any> = T extends any ? Pick<T, Exclude<keyof T, K>> : never;
|
|
|
|
// Manually disabling the no-unnecessary-generics rule so users can
|
|
// retain type inference if they wrap their component in withRouter
|
|
// without defining props explicitly
|
|
export function withRouter<T extends {}, Q = DefaultQuery>(
|
|
Component: React.ComponentType<T & WithRouterProps<Q>>
|
|
): React.ComponentType<Omit<T, keyof WithRouterProps<Q>>>;
|
|
|
|
// tslint:disable-next-line no-unnecessary-generics
|
|
export function useRouter<Q = DefaultQuery>(): RouterProps<Q>;
|
|
|
|
declare const Router: SingletonRouter;
|
|
export default Router;
|