mirror of
https://github.com/AeThex-Corporation/AeThex-OS.git
synced 2026-04-18 06:17:21 +00:00
87 lines
1.9 KiB
TypeScript
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,
|
|
};
|
|
}
|