export interface ThreadFeedScrollMetrics { readonly contentHeight: number; readonly viewportHeight: number; readonly offsetY: number; readonly bottomInset: number;} export function threadFeedDistanceFromEnd(metrics: ThreadFeedScrollMetrics): number { return metrics.contentHeight + metrics.bottomInset - metrics.viewportHeight - metrics.offsetY;} export function isThreadFeedNearEnd(metrics: ThreadFeedScrollMetrics, threshold: number): boolean { return threadFeedDistanceFromEnd(metrics) <= threshold;} export function resolveThreadFeedBottomInset(input: { readonly estimatedOverlayHeight: number; readonly measuredOverlayHeight: number; readonly gap: number;}): number { return Math.max(input.estimatedOverlayHeight, input.measuredOverlayHeight) + input.gap;}
export interface ThreadFeedScrollMetrics {
readonly contentHeight: number;
readonly viewportHeight: number;
readonly offsetY: number;
readonly bottomInset: number;
}
export function threadFeedDistanceFromEnd(metrics: ThreadFeedScrollMetrics): number {
return metrics.contentHeight + metrics.bottomInset - metrics.viewportHeight - metrics.offsetY;
}
export function isThreadFeedNearEnd(metrics: ThreadFeedScrollMetrics, threshold: number): boolean {
return threadFeedDistanceFromEnd(metrics) <= threshold;
}
export function resolveThreadFeedBottomInset(input: {
readonly estimatedOverlayHeight: number;
readonly measuredOverlayHeight: number;
readonly gap: number;
}): number {
return Math.max(input.estimatedOverlayHeight, input.measuredOverlayHeight) + input.gap;
}