Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/openstatusHQ/openstatus. ๐ซ Status page with uptime monitoring & API monitoring as code ๐ซ openstatus.dev
bun drizzle-orm monitoring monitoring-as-code nextjs observability on-call open-source shadcn-ui status-page statuspage synthetic-monitoring tinybird turso uptime uptime-checker uptime-monitor
Something went wrong. Try again.
2.5 kB ยท 87 lines
TypeScript
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788import * as React from "react";
/** * A utility to compose multiple event handlers into a single event handler. * Run originalEventHandler first, then ourEventHandler unless prevented. */function composeEventHandlers<E>( originalEventHandler?: (event: E) => void, ourEventHandler?: (event: E) => void, { checkForDefaultPrevented = true } = {},) { return function handleEvent(event: E) { originalEventHandler?.(event);
if ( checkForDefaultPrevented === false || !(event as unknown as Event).defaultPrevented ) { return ourEventHandler?.(event); } };}
/** * @see https://github.com/radix-ui/primitives/blob/main/packages/react/compose-refs/src/compose-refs.tsx */
type PossibleRef<T> = React.Ref<T> | undefined;
/** * Set a given ref to a given value. * This utility takes care of different types of refs: callback refs and RefObject(s). */function setRef<T>(ref: PossibleRef<T>, value: T) { if (typeof ref === "function") { return ref(value); }
if (ref !== null && ref !== undefined) { ref.current = value; }}
/** * A utility to compose multiple refs together. * Accepts callback refs and RefObject(s). */function composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> { return (node) => { let hasCleanup = false; const cleanups = refs.map((ref) => { const cleanup = setRef(ref, node); if (!hasCleanup && typeof cleanup === "function") { hasCleanup = true; } return cleanup; });
// React <19 will log an error to the console if a callback ref returns a // value. We don't use ref cleanups internally so this will only happen if a // user's ref callback returns a value, which we only expect if they are // using the cleanup functionality added in React 19. if (hasCleanup) { return () => { for (let i = 0; i < cleanups.length; i++) { const cleanup = cleanups[i]; if (typeof cleanup === "function") { cleanup(); } else { setRef(refs[i], null); } } }; } };}
/** * A custom hook that composes multiple refs. * Accepts callback refs and RefObject(s). */function useComposedRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> { // eslint-disable-next-line react-hooks/exhaustive-deps return React.useCallback(composeRefs(...refs), refs);}
export { composeEventHandlers, composeRefs, useComposedRefs };