|
1 | 1 | 'use client'; |
2 | | -import { useCallback, useLayoutEffect, useRef, useState } from 'react'; |
| 2 | +import { useLayoutEffect, useMemo, useRef, useState } from 'react'; |
3 | 3 | import { useResizeObserver } from 'usehooks-ts'; |
4 | 4 |
|
5 | 5 | interface ImageSize { |
@@ -86,25 +86,20 @@ export function useCoverPosition(imgs: Images, y: number) { |
86 | 86 | : 0; |
87 | 87 |
|
88 | 88 | // Parse the position between the allowed min/max |
89 | | - const clampedObjectPositionY = useCallback( |
90 | | - (offset: number): number => { |
91 | | - if (!container.height || !imageDimensions) { |
92 | | - return 50; |
93 | | - } |
94 | | - |
95 | | - const scaled = imageDimensions.height * safeRatio; |
96 | | - if (scaled <= container.height || maxOffset === 0) { |
97 | | - return 50; |
98 | | - } |
99 | | - |
100 | | - const clampedOffset = Math.max(-maxOffset, Math.min(maxOffset, offset)); |
101 | | - const relative = (maxOffset - clampedOffset) / (2 * maxOffset); |
102 | | - return relative * 100; |
103 | | - }, |
104 | | - [container.height, imageDimensions, maxOffset, safeRatio] |
105 | | - ); |
106 | | - |
107 | | - const objectPositionY = clampedObjectPositionY(y); |
| 89 | + const objectPositionY = useMemo(() => { |
| 90 | + if (!container.height || !imageDimensions) { |
| 91 | + return 50; |
| 92 | + } |
| 93 | + |
| 94 | + const scaled = imageDimensions.height * safeRatio; |
| 95 | + if (scaled <= container.height || maxOffset === 0) { |
| 96 | + return 50; |
| 97 | + } |
| 98 | + |
| 99 | + const clampedOffset = Math.max(-maxOffset, Math.min(maxOffset, y)); |
| 100 | + const relative = (maxOffset - clampedOffset) / (2 * maxOffset); |
| 101 | + return relative * 100; |
| 102 | + }, [container.height, imageDimensions, maxOffset, safeRatio, y]); |
108 | 103 |
|
109 | 104 | return { |
110 | 105 | containerRef, |
|
0 commit comments