found-scroll
Version:
Scroll management for found
50 lines (49 loc) • 2.41 kB
TypeScript
import type { Location, RenderArgsElements, Router } from 'found';
import HttpError from 'found/HttpError';
import React, { Component, ReactNode } from 'react';
import ScrollBehavior, { ScrollTarget } from 'scroll-behavior';
export interface LocationBase {
action: 'PUSH' | string;
hash?: string;
}
export declare type ScrollPosition = [scrollLeft: number, scrollTop: number];
export interface CreateScrollBehaviorConfig {
addNavigationListener: (listener: () => any) => () => void;
stateStorage: {
save: (location: Location, key: string | null, value: ScrollPosition) => void;
read: (location: Location, key: string | null) => ScrollPosition | null | undefined;
};
getCurrentLocation: () => Location;
shouldUpdateScroll: (this: ScrollBehavior<Location, ScrollManagerRenderArgs>, prevContext: ScrollManagerRenderArgs | null, context: ScrollManagerRenderArgs) => ScrollTarget;
}
export interface ScrollManagerRenderArgs {
location: Location;
router: Router;
elements?: RenderArgsElements[];
error?: HttpError;
}
export interface ScrollManagerProps {
shouldUpdateScroll?: (this: ScrollBehavior<Location, ScrollManagerRenderArgs>, prevContext: ScrollManagerRenderArgs | null, context: ScrollManagerRenderArgs) => ScrollTarget;
createScrollBehavior?: (config: CreateScrollBehaviorConfig) => ScrollBehavior<Location, ScrollManagerRenderArgs>;
renderArgs: ScrollManagerRenderArgs;
children?: ReactNode;
}
export interface ScrollContextValue {
scrollBehavior: ScrollBehavior<Location<any>, ScrollManagerRenderArgs>;
registerScrollElement: (key: string, element: HTMLElement) => () => void;
}
export declare const ScrollContext: React.Context<ScrollContextValue | null>;
declare class ScrollManager extends Component<ScrollManagerProps> {
prevRenderArgs: ScrollManagerRenderArgs | null;
readonly scrollBehavior: ScrollBehavior<Location, ScrollManagerRenderArgs>;
private readonly scrollContext;
constructor(props: ScrollManagerProps);
componentDidMount(): void;
componentDidUpdate(): void;
componentWillUnmount(): void;
maybeUpdateScroll(): void;
shouldUpdateScroll: (prevRenderArgs: ScrollManagerRenderArgs, renderArgs: ScrollManagerRenderArgs) => ScrollTarget;
registerScrollElement: (key: string, element: HTMLElement) => () => void;
render(): JSX.Element;
}
export default ScrollManager;