From f724a981a8ff2d511a13bb71b4a95bb9ee99d0c1 Mon Sep 17 00:00:00 2001 From: anthony lio Date: Fri, 2 Oct 2026 11:44:03 +0300 Subject: [PATCH] feat(common): add useMountEffect hook --- packages/common/hooks/index.ts | 1 + packages/common/hooks/useMountEffect.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 packages/common/hooks/useMountEffect.ts diff --git a/packages/common/hooks/index.ts b/packages/common/hooks/index.ts index 23bbecba6a7..93b1984adde 100644 --- a/packages/common/hooks/index.ts +++ b/packages/common/hooks/index.ts @@ -11,6 +11,7 @@ export * from './useDocsSearchV2' export * from './useDragToClose' export * from './useEffectEvent' export * from './useIsomorphicLayoutEffect' +export * from './useMountEffect' export * from './useOnChange' export * from './useParams' export * from './useSearchParamsShallow' diff --git a/packages/common/hooks/useMountEffect.ts b/packages/common/hooks/useMountEffect.ts new file mode 100644 index 00000000000..8bf47840b61 --- /dev/null +++ b/packages/common/hooks/useMountEffect.ts @@ -0,0 +1,12 @@ +'use client' + +import { useEffect, type EffectCallback } from 'react' + +/** + * runs an effect once on mount, with its cleanup on unmount, the escape hatch for one-time + * sync with an external system and derive state or use event handlers everywhere else + */ +export function useMountEffect(effect: EffectCallback): void { + // eslint-disable-next-line react-hooks/exhaustive-deps + useEffect(effect, []) +}