2024-12-03 19:07:28 +08:00
|
|
|
import React from 'react';
|
2025-01-10 14:14:31 +08:00
|
|
|
import raf from '@rc-component/util/lib/raf';
|
2024-12-03 19:07:28 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* When click on the label,
|
|
|
|
* the event will be stopped to prevent the label from being clicked twice.
|
|
|
|
* label click -> input click -> label click again
|
|
|
|
*/
|
|
|
|
export default function useBubbleLock(
|
|
|
|
onOriginInputClick?: React.MouseEventHandler<HTMLInputElement>,
|
|
|
|
) {
|
|
|
|
const labelClickLockRef = React.useRef<number | null>(null);
|
|
|
|
|
|
|
|
const clearLock = () => {
|
|
|
|
raf.cancel(labelClickLockRef.current!);
|
|
|
|
labelClickLockRef.current = null;
|
|
|
|
};
|
|
|
|
|
|
|
|
const onLabelClick: React.MouseEventHandler<HTMLLabelElement> = () => {
|
|
|
|
clearLock();
|
|
|
|
|
|
|
|
labelClickLockRef.current = raf(() => {
|
|
|
|
labelClickLockRef.current = null;
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const onInputClick: React.MouseEventHandler<HTMLInputElement> = (e) => {
|
|
|
|
if (labelClickLockRef.current) {
|
|
|
|
e.stopPropagation();
|
|
|
|
clearLock();
|
|
|
|
}
|
|
|
|
|
|
|
|
onOriginInputClick?.(e);
|
|
|
|
};
|
|
|
|
|
|
|
|
return [onLabelClick, onInputClick] as const;
|
|
|
|
}
|