export const getOffset = (height: number, percentage: number) => { if (percentage < 0) return height; if (percentage > 100) return 0; return height * ((100 - percentage) / 100); }; export type SnapPointsData = { list: number[]; minHeightOffset: number; maxHeightOffset: number; }; export const calculateSnapPointsData = ( minimumHeight: number, height: number, snapPoints: number[] ): SnapPointsData => { const filteredSnapPoints = snapPoints.filter( (value) => value >= minimumHeight ); const snapPointsOffsetValues = [minimumHeight, ...filteredSnapPoints].map( (value) => getOffset(height, value) ); const uniqSnapPointOffsetValues = Array.from( new Set([...snapPointsOffsetValues, 0]) ); return { list: uniqSnapPointOffsetValues, minHeightOffset: Math.max(...uniqSnapPointOffsetValues), // Furthest from max height maxHeightOffset: 0, // Max height }; }; export const calculateAnimatedToValue = ( position: number, heightSnapPoints: number[] ) => { const distances = heightSnapPoints.map((height) => Math.abs(position - height) ); const minIndex = distances.indexOf(Math.min(...distances)); return heightSnapPoints[minIndex]; };