react-native-haptic-feedback
Version:
Basic haptic feedback for iOS and android
71 lines (62 loc) • 2.14 kB
text/typescript
import { useMemo } from "react";
import RNHapticFeedback from "../hapticFeedback";
import { playHaptic as playHapticUtil } from "../utils/playHaptic";
import type { HapticOptions, HapticEvent, HapticFeedbackTypes } from "../types";
/**
* React hook that provides haptic feedback methods with optional default options.
* Returns a stable object — methods only change when the option values change.
*
* @example
* const haptics = useHaptics({ enableVibrateFallback: true });
* haptics.trigger('impactMedium');
*/
export function useHaptics(defaultOptions?: HapticOptions) {
const enableVibrateFallback = defaultOptions?.enableVibrateFallback;
const ignoreAndroidSystemSettings =
defaultOptions?.ignoreAndroidSystemSettings;
return useMemo(
() => ({
trigger(
type: keyof typeof HapticFeedbackTypes | HapticFeedbackTypes,
opts?: HapticOptions,
): void {
RNHapticFeedback.trigger(type, { ...defaultOptions, ...opts });
},
triggerPattern(events: HapticEvent[], opts?: HapticOptions): void {
RNHapticFeedback.triggerPattern(events, { ...defaultOptions, ...opts });
},
stop(): void {
RNHapticFeedback.stop();
},
isSupported(): boolean {
return RNHapticFeedback.isSupported();
},
playHaptic(
ahapFile: string,
fallback: HapticEvent[],
opts?: HapticOptions,
): Promise<void> {
return playHapticUtil(ahapFile, fallback, {
...defaultOptions,
...opts,
});
},
impact(
type?: keyof typeof HapticFeedbackTypes | HapticFeedbackTypes,
intensity?: number,
opts?: HapticOptions,
): void {
RNHapticFeedback.impact(type, intensity, {
...defaultOptions,
...opts,
});
},
setEnabled: RNHapticFeedback.setEnabled,
isEnabled: RNHapticFeedback.isEnabled,
getSystemHapticStatus: RNHapticFeedback.getSystemHapticStatus,
/** @platform ios */
playAHAP: RNHapticFeedback.playAHAP,
}),
[enableVibrateFallback, ignoreAndroidSystemSettings],
);
}