react-native-sortables
Version:
Powerful Sortable Components for Flexible Content Reordering in React Native
96 lines (80 loc) • 2.74 kB
text/typescript
/**
* Copied from library sources and adjusted to work with reanimated
* and make it possible to use react-native-haptic-feedback as an
* optional dependency
*/
/* eslint-disable @typescript-eslint/no-unsafe-argument */
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable no-underscore-dangle */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import { NativeModules, TurboModuleRegistry } from 'react-native';
// Types can be imported even if the module is not available
import type { HapticOptions } from 'react-native-haptic-feedback';
import { runOnJS } from 'react-native-reanimated';
import { logger } from '../../../utils';
const WARNINGS = {
notAvailable: 'react-native-haptic-feedback is not available'
};
const notAvailableCallback = () => {
'worklet';
logger.warn(WARNINGS.notAvailable);
};
const loadNative = (isTurboModuleEnabled: boolean) => {
const hapticFeedback = isTurboModuleEnabled
? TurboModuleRegistry.get('RNHapticFeedback')
: NativeModules.RNHapticFeedback;
return hapticFeedback?.trigger;
};
const load = () => {
try {
const isTurboModuleEnabled = !!(global as any).__turboModuleProxy;
const nativeTrigger = loadNative(isTurboModuleEnabled);
if (!nativeTrigger) {
return notAvailableCallback;
}
// Lazy load the HapticFeedbackTypes
// eslint-disable-next-line @typescript-eslint/no-require-imports
const { HapticFeedbackTypes } = require('react-native-haptic-feedback');
const defaultOptions = {
enableVibrateFallback: false,
ignoreAndroidSystemSettings: true
};
const createTriggerOptions = (options: HapticOptions) => {
'worklet';
if (typeof options === 'boolean') {
return {
...defaultOptions,
enableVibrateFallback: options
};
}
return { ...defaultOptions, ...options };
};
const trigger = (
type: string = HapticFeedbackTypes.selection,
options: HapticOptions = {}
) => {
'worklet';
const triggerOptions = createTriggerOptions(options);
try {
if (isTurboModuleEnabled) {
nativeTrigger(type, triggerOptions);
} else {
// TODO - try to change this to run on UI if possible
runOnJS(nativeTrigger)(type, triggerOptions);
}
} catch (_) {
notAvailableCallback();
}
};
return trigger;
} catch (_) {
return notAvailableCallback;
}
};
const ReactNativeHapticFeedback = {
load
};
export default ReactNativeHapticFeedback;