AeThex-OS/shell/aethex-shell/src-webos/hooks/use-haptics.ts

87 lines
1.9 KiB
TypeScript

import React from 'react';
import { Haptics, ImpactStyle, NotificationType } from '@capacitor/haptics';
import { isMobile } from '@/lib/platform';
/**
* Haptic feedback hook for mobile interactions
*/
export function useHaptics() {
const isAvailable = isMobile();
const impact = async (style: 'light' | 'medium' | 'heavy' = 'medium') => {
if (!isAvailable) return;
try {
const styleMap = {
light: ImpactStyle.Light,
medium: ImpactStyle.Medium,
heavy: ImpactStyle.Heavy,
};
await Haptics.impact({ style: styleMap[style] });
} catch (e) {
// Haptics not supported on this device
}
};
const notification = async (type: 'success' | 'warning' | 'error' = 'success') => {
if (!isAvailable) return;
try {
const typeMap = {
success: NotificationType.Success,
warning: NotificationType.Warning,
error: NotificationType.Error,
};
await Haptics.notification({ type: typeMap[type] });
} catch (e) {
// Haptics not supported
}
};
const vibrate = async (duration: number = 50) => {
if (!isAvailable) return;
try {
await Haptics.vibrate({ duration });
} catch (e) {
// Fallback to web vibration API
if (navigator.vibrate) {
navigator.vibrate(duration);
}
}
};
const selectionStart = async () => {
if (!isAvailable) return;
try {
await Haptics.selectionStart();
} catch (e) {
// Not supported
}
};
const selectionChanged = async () => {
if (!isAvailable) return;
try {
await Haptics.selectionChanged();
} catch (e) {
// Not supported
}
};
const selectionEnd = async () => {
if (!isAvailable) return;
try {
await Haptics.selectionEnd();
} catch (e) {
// Not supported
}
};
return {
impact,
notification,
vibrate,
selectionStart,
selectionChanged,
selectionEnd,
isAvailable,
};
}