diff options
| author | Oliver <oliver@mohlin.dev> | 2025-05-06 17:05:34 +0200 |
|---|---|---|
| committer | Sebastian Holmin <sebastian.holmin@mullvad.net> | 2025-05-28 13:25:33 +0200 |
| commit | c46f7c3ccbba7bf26baa259fa045560105ccb6f0 (patch) | |
| tree | f46821a57367b64d5be7a27ab543c3cf62534f53 | |
| parent | 960f35a723c3a789f4a563c454ac73eb9ac5139b (diff) | |
| download | mullvadvpn-c46f7c3ccbba7bf26baa259fa045560105ccb6f0.tar.xz mullvadvpn-c46f7c3ccbba7bf26baa259fa045560105ccb6f0.zip | |
Add useMeasure hook
| -rw-r--r-- | desktop/packages/mullvad-vpn/src/renderer/hooks/index.ts | 1 | ||||
| -rw-r--r-- | desktop/packages/mullvad-vpn/src/renderer/hooks/useMeasure.ts | 37 |
2 files changed, 38 insertions, 0 deletions
diff --git a/desktop/packages/mullvad-vpn/src/renderer/hooks/index.ts b/desktop/packages/mullvad-vpn/src/renderer/hooks/index.ts index 9c07952615..ce0436ddc3 100644 --- a/desktop/packages/mullvad-vpn/src/renderer/hooks/index.ts +++ b/desktop/packages/mullvad-vpn/src/renderer/hooks/index.ts @@ -6,3 +6,4 @@ export * from './useHasAppUpgradeInitiated'; export * from './useHasAppUpgradeVerifiedInstallerPath'; export * from './useIsPlatformLinux'; export * from './useShouldAppUpgradeInstallManually'; +export * from './useMeasure'; diff --git a/desktop/packages/mullvad-vpn/src/renderer/hooks/useMeasure.ts b/desktop/packages/mullvad-vpn/src/renderer/hooks/useMeasure.ts new file mode 100644 index 0000000000..5f5ed589bc --- /dev/null +++ b/desktop/packages/mullvad-vpn/src/renderer/hooks/useMeasure.ts @@ -0,0 +1,37 @@ +import { useState, useCallback, useLayoutEffect, RefCallback } from 'react'; + +export interface MeasureSize { + width: number; + height: number; +} + +export function useMeasure<T extends Element = HTMLElement>(): [RefCallback<T>, MeasureSize] { + const [size, setSize] = useState<MeasureSize>({ width: 0, height: 0 }); + const [node, setNode] = useState<T | null>(null); + + const ref: RefCallback<T> = useCallback((instance: T | null) => { + setNode(instance); + }, []); + + useLayoutEffect(() => { + if (!node) return; + + const measure = () => { + window.requestAnimationFrame(() => { + const rect = node.getBoundingClientRect(); + setSize({ width: rect.width, height: rect.height }); + }); + }; + + measure(); + + const resizeObserver = new ResizeObserver(measure); + resizeObserver.observe(node); + + return () => { + resizeObserver.disconnect(); + }; + }, [node]); + + return [ref, size]; +} |
