Skip to content

Commit

Permalink
Merge pull request #9 from lovrozagar/use-merged-ref
Browse files Browse the repository at this point in the history
useMergedRef
  • Loading branch information
lovrozagar authored Oct 26, 2024
2 parents 1bbc048 + 7ad9668 commit ca9470d
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/packages/hooks/shared/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,5 +42,5 @@
"sideEffects": false,
"type": "module",
"types": "./dist/index.d.ts",
"version": "1.0.0"
"version": "1.0.1"
}
1 change: 1 addition & 0 deletions src/packages/hooks/shared/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export { useFreshRef, type UseFreshRefReturn } from "./use-fresh-ref/use-fresh-ref"
export { useMergedRef } from "./use-merged-ref/use-merged-ref"
export {
useMutationObserver,
type UseMutationObserverProps,
Expand Down
16 changes: 16 additions & 0 deletions src/packages/hooks/shared/src/use-merged-ref/handle-ref.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import type { Ref } from "react"

function handleRef<T extends Element>(element: T | null, ref: Ref<T> | undefined | null) {
if (!element || !ref) return

if (typeof ref === "function") {
ref(element)

return
}
/* @TODO change when React 19 released */
/* @ts-ignore */
;(ref as RefObject<T>).current = element
}

export { handleRef }
12 changes: 12 additions & 0 deletions src/packages/hooks/shared/src/use-merged-ref/merge-refs.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import type { Ref } from "react"
import { handleRef } from "./handle-ref"

function mergeRefs<T extends Element>(element: T | null, refs: Array<Ref<T> | undefined | null>) {
if (!refs) return

refs.filter(Boolean).forEach((ref) => {
handleRef(element, ref)
})
}

export { mergeRefs }
15 changes: 15 additions & 0 deletions src/packages/hooks/shared/src/use-merged-ref/use-merged-ref.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
"use client"

import { type Ref, useCallback } from "react"
import { mergeRefs } from "./merge-refs"

function useMergedRef<T extends Element>(refs: Array<Ref<T> | undefined | null>) {
return useCallback(
(element: T) => {
mergeRefs(element, refs)
},
[refs],
)
}

export { useMergedRef }

0 comments on commit ca9470d

Please sign in to comment.