react-native-sortables
Version:
Powerful Sortable Components for Flexible Content Reordering in React Native
52 lines (43 loc) • 1.24 kB
text/typescript
import { useCallback, useMemo } from 'react';
import { useDerivedValue } from 'react-native-reanimated';
import { IS_WEB } from '../constants';
import { ReactNativeHapticFeedback } from '../lib';
import { WARNINGS } from '../lib/react-native-haptic-feedback';
import { ensureExists } from '../utils';
type HapticImpact = {
light(): void;
medium(): void;
};
let hapticFeedback: ReturnType<typeof ReactNativeHapticFeedback.load> = null;
export default function useHaptics(enabled: boolean): HapticImpact {
const isEnabled = !IS_WEB && enabled;
const enabledValue = useDerivedValue(() => isEnabled);
if (isEnabled && !hapticFeedback) {
hapticFeedback = ReactNativeHapticFeedback.load();
}
const light = useCallback(() => {
'worklet';
if (
enabledValue.value &&
ensureExists(hapticFeedback, WARNINGS.notAvailable)
) {
hapticFeedback('impactLight');
}
}, [enabledValue]);
const medium = useCallback(() => {
'worklet';
if (
enabledValue.value &&
ensureExists(hapticFeedback, WARNINGS.notAvailable)
) {
hapticFeedback('impactMedium');
}
}, [enabledValue]);
return useMemo(
() => ({
light,
medium
}),
[light, medium]
);
}