@happysanta/router
Version:
Router for VKUI
195 lines (194 loc) • 9 kB
TypeScript
import { Page } from './Page';
import { History } from './History';
import { Route as MyRoute } from './Route';
import { State } from './State';
import { EventEmitter } from 'tsee';
import { RouterConfig } from './RouterConfig';
import { Location } from './Location';
import { HistoryUpdateType, PageParams } from './Types';
import { Fixer } from './HotFixers';
export declare type RouteList = {
[key: string]: Page;
};
export declare type ReplaceUnknownRouteFn = (newRoute: MyRoute, oldRoute?: MyRoute) => MyRoute;
/**
* @ignore
*/
export declare type UpdateEventFn = (newRoute: MyRoute, oldRoute: MyRoute | undefined, isNewRoute: boolean, type: HistoryUpdateType) => void;
/**
* @ignore
*/
export declare type EnterEventFn = (newRoute: MyRoute, oldRoute?: MyRoute) => void;
/**
* @ignore
*/
export declare type LeaveEventFn = (newRoute: MyRoute, oldRoute: MyRoute, isNewRoute: boolean, type: HistoryUpdateType) => void;
export declare type RouterMiddleware = (route: MyRoute, hash: string) => MyRoute;
export declare class Router extends EventEmitter<{
update: UpdateEventFn;
enter: EnterEventFn;
}> {
routes: RouteList;
history: History;
enableLogging: boolean;
defaultPage: string;
defaultView: string;
defaultRoot: string;
defaultPanel: string;
alwaysStartWithSlash: boolean;
blankMiddleware: RouterMiddleware[];
preventSameLocationChange: boolean;
hotFixes: Set<Fixer>;
/**
* Значение window.location.hash которое было на момент старта роутера
*/
startHash: string;
private deferOnGoBack;
private startHistoryOffset;
private started;
private readonly infinityPanelCacheInstance;
private readonly performBlankMiddleware;
/**
*
* ```javascript
* export const PAGE_MAIN = '/';
* export const PAGE_PERSIK = '/persik';
* export const PANEL_MAIN = 'panel_main';
* export const PANEL_PERSIK = 'panel_persik';
* export const VIEW_MAIN = 'view_main';
* const routes = {
* [PAGE_MAIN]: new Page(PANEL_MAIN, VIEW_MAIN),
* [PAGE_PERSIK]: new Page(PANEL_PERSIK, VIEW_MAIN),
* };
* export const router = new Router(routes);
* router.start();
* ```
* @param routes
* @param routerConfig
*/
constructor(routes: RouteList, routerConfig?: RouterConfig | null);
private static back;
private static backTo;
replacerUnknownRoute: ReplaceUnknownRouteFn;
start(): void;
stop(): void;
getCurrentRouteOrDef(): MyRoute;
getCurrentStateOrDef(): State;
log(...args: any): void;
/**
* Добавляет новую страницу в историю
* @param pageId страница указанная в конструкторе {@link Router.constructor}
* @param params можно получить из {@link Location.getParams}
*/
pushPage(pageId: string, params?: PageParams): void;
/**
* Заменяет текущую страницу на переданную
* @param pageId страница указанная в конструкторе {@link Router.constructor}
* @param params можно получить из {@link Location.getParams}
*/
replacePage(pageId: string, params?: PageParams): void;
pushPageAfterPreviews(prevPageId: string, pageId: string, params?: PageParams): void;
/**
* Переход по истории назад
*/
popPage(): void;
/**
* Если x - число, то осуществляется переход на указанное количество шагов
* Если x - строка, то в истории будет найдена страница с указанным pageId и осуществлен переход до нее
* @param {string|number} x
*/
popPageTo(x: number | string): void;
popPageToAndPush(x: number, pageId: string, params?: PageParams): void;
popPageToAndReplace(x: number, pageId: string, params?: PageParams): void;
/**
* История ломается когда открывается VKPay или пост из колокольчика
*/
isHistoryBroken(): boolean;
/**
* Способ починить историю браузера когда ее сломали снаружи из фрейма
* например перейдя по колокольчику или открыв вкпей
* проблема: миниап запущен фо фрейме и у него обшая исторя страниц с родительской страницей
* все происходит хорошо когда только миниап пушит в историю страницы
* [X1, X2, X3]
* когда приходит родительская страница и пуши что-то в историю
* [X1, X2, X3, Y1, Y1]
* то случается беда, в истории перремешаны страницы, следующий popPage приведет в неожиданное место
* в даннмо слусе ожидалось что popPage перейдет с X3 на X2, но фактически придут на Y1
* идея решения -- запушить снова все "нужные страницы поверх истории"
* [X1, X2, X3, Y1, Y1, X1, X2, X3]
*/
fixBrokenHistory(): void;
/**
* @param modalId
* @param params Будьте аккуратны с параметрами, не допускайте чтобы ваши параметры пересекались с параметрами страницы
*/
pushModal(modalId: string, params?: PageParams): void;
/**
* @param popupId
* @param params Будьте аккуратны с параметрами, не допускайте чтобы ваши параметры пересекались с параметрами страницы
*/
pushPopup(popupId: string, params?: PageParams): void;
/**
* @param modalId
* @param params Будьте аккуратны с параметрами, не допускайте чтобы ваши параметры пересекались с параметрами страницы
*/
replaceModal(modalId: string, params?: PageParams): void;
/**
* @param popupId
* @param params Будьте аккуратны с параметрами, не допускайте чтобы ваши параметры пересекались с параметрами страницы
*/
replacePopup(popupId: string, params?: PageParams): void;
popPageIfModal(): void;
popPageIfPopup(): void;
/**
* @deprecated use popPageIfHasOverlay
*/
popPageIfModalOrPopup(): void;
popPageIfHasOverlay(): void;
/**
* @param pageId
* @param fn
* @return unsubscribe function
*/
onEnterPage(pageId: string, fn: UpdateEventFn): () => void;
/**
* @param pageId
* @param fn
* @return unsubscribe function
*/
onLeavePage(pageId: string, fn: LeaveEventFn): () => void;
getCurrentLocation(): Location;
getPreviousLocation(): Location | undefined;
/**
* @param safety - true будет ждать события не дольше 700мс, если вы уверены что надо ждать дольше передайте false
*/
afterUpdate(safety?: boolean): Promise<void>;
private static checkParams;
private getDefaultRoute;
private readonly onPopState;
private replace;
private push;
/**
* @param location значение window.location.hash
* @private
*/
createRouteFromLocationWithReplace(location: string): MyRoute;
private createRouteFromLocation;
private static isErrorThrowingEnabled;
/**
* Чтобы отрендерить бесконечне панели надо знать их id
* этот метод возвращает все id панелей которые хоть раз были отрендерены
* это не эффективно, однако сейчас точно нельзя сказать когда панель нужна а когда нет
* это обусловленно тем что панели надо убирать из дерева только после того как пройдет анимация vkui
* кроме того панели могут убираться из середины, благодоря useThrottlingLocation.ts
*
* текущее решение -- рендерить все панели всегда
*
* @param viewId
*/
getInfinityPanelList(viewId: string): string[];
private static isSameLocation;
private needPreventSameLocationChange;
onVKWebAppChangeFragment(location: string): void;
private hasFixer;
}