mirror of
https://github.com/streamyfin/streamyfin.git
synced 2025-08-20 18:37:18 +02:00
Signed-off-by: Lance Chant <13349722+lancechant@users.noreply.github.com> Signed-off-by: lancechant <13349722+lancechant@users.noreply.github.com> Co-authored-by: Fredrik Burmester <fredrik.burmester@gmail.com> Co-authored-by: Uruk <contact@uruk.dev> Co-authored-by: Gauvain <68083474+Gauvino@users.noreply.github.com>
74 lines
2.0 KiB
TypeScript
74 lines
2.0 KiB
TypeScript
import { useCallback, useMemo } from "react";
|
|
import { Platform } from "react-native";
|
|
import { useSettings } from "@/utils/atoms/settings";
|
|
|
|
const Haptics = !Platform.isTV ? require("expo-haptics") : null;
|
|
|
|
export type HapticFeedbackType =
|
|
| "light"
|
|
| "medium"
|
|
| "heavy"
|
|
| "selection"
|
|
| "success"
|
|
| "warning"
|
|
| "error";
|
|
|
|
export const useHaptic = (feedbackType: HapticFeedbackType = "selection") => {
|
|
const [settings] = useSettings();
|
|
const isTv = Platform.isTV;
|
|
const isDisabled =
|
|
isTv ||
|
|
!Haptics ||
|
|
settings?.disableHapticFeedback ||
|
|
Platform.OS === "web";
|
|
|
|
const createHapticHandler = useCallback(
|
|
(type: typeof Haptics.ImpactFeedbackStyle) => {
|
|
if (!Haptics || !type) return () => {};
|
|
return () => Haptics.impactAsync(type);
|
|
},
|
|
[],
|
|
);
|
|
|
|
const createNotificationFeedback = useCallback(
|
|
(type: typeof Haptics.NotificationFeedbackType) => {
|
|
if (!Haptics || !type) return () => {};
|
|
return () => Haptics.notificationAsync(type);
|
|
},
|
|
[],
|
|
);
|
|
|
|
const hapticHandlers = useMemo(() => {
|
|
if (!Haptics) {
|
|
return {
|
|
light: () => {},
|
|
medium: () => {},
|
|
heavy: () => {},
|
|
selection: () => {},
|
|
success: () => {},
|
|
warning: () => {},
|
|
error: () => {},
|
|
};
|
|
}
|
|
|
|
return {
|
|
light: createHapticHandler(Haptics.ImpactFeedbackStyle.Light),
|
|
medium: createHapticHandler(Haptics.ImpactFeedbackStyle.Medium),
|
|
heavy: createHapticHandler(Haptics.ImpactFeedbackStyle.Heavy),
|
|
selection: Haptics.selectionAsync,
|
|
success: createNotificationFeedback(
|
|
Haptics.NotificationFeedbackType.Success,
|
|
),
|
|
warning: createNotificationFeedback(
|
|
Haptics.NotificationFeedbackType.Warning,
|
|
),
|
|
error: createNotificationFeedback(Haptics.NotificationFeedbackType.Error),
|
|
};
|
|
}, [createHapticHandler, createNotificationFeedback]);
|
|
|
|
if (settings?.disableHapticFeedback) {
|
|
return () => {};
|
|
}
|
|
return isDisabled ? () => {} : hapticHandlers[feedbackType];
|
|
};
|