@umituz/react-native-haptics 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HapticService.js","sourceRoot":"","sources":["../../../src/infrastructure/services/HapticService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Haptics Domain - useHaptics Hook
3
+ *
4
+ * React hook for haptic feedback.
5
+ * Provides vibration patterns for common interactions.
6
+ *
7
+ * @domain haptics
8
+ * @layer presentation/hooks
9
+ */
10
+ import type { ImpactStyle, NotificationType, HapticPattern } from '../../domain/entities/Haptic';
11
+ /**
12
+ * useHaptics hook for haptic feedback
13
+ *
14
+ * USAGE:
15
+ * ```typescript
16
+ * const haptics = useHaptics();
17
+ *
18
+ * // Common patterns (convenience methods)
19
+ * <TouchableOpacity onPress={() => haptics.buttonPress()}>
20
+ * <Text>Click Me</Text>
21
+ * </TouchableOpacity>
22
+ *
23
+ * // Success feedback
24
+ * const handleSuccess = async () => {
25
+ * await saveData();
26
+ * haptics.success();
27
+ * };
28
+ *
29
+ * // Error feedback
30
+ * const handleError = () => {
31
+ * haptics.error();
32
+ * };
33
+ *
34
+ * // Selection change (sliders, pickers)
35
+ * <Slider onValueChange={() => haptics.selectionChange()} />
36
+ *
37
+ * // Custom patterns
38
+ * haptics.pattern('long_press');
39
+ * haptics.impact('heavy');
40
+ * haptics.notification('warning');
41
+ * ```
42
+ */
43
+ export declare const useHaptics: () => {
44
+ impact: (style?: ImpactStyle) => Promise<void>;
45
+ notification: (type: NotificationType) => Promise<void>;
46
+ selection: () => Promise<void>;
47
+ pattern: (patternType: HapticPattern) => Promise<void>;
48
+ buttonPress: () => Promise<void>;
49
+ success: () => Promise<void>;
50
+ error: () => Promise<void>;
51
+ warning: () => Promise<void>;
52
+ delete: () => Promise<void>;
53
+ refresh: () => Promise<void>;
54
+ selectionChange: () => Promise<void>;
55
+ longPress: () => Promise<void>;
56
+ };
57
+ //# sourceMappingURL=useHaptics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHaptics.d.ts","sourceRoot":"","sources":["../../../src/presentation/hooks/useHaptics.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAEjG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,UAAU;qBAIoB,WAAW;yBAON,gBAAgB;;2BAcd,aAAa;;;;;;;;;CAwD9D,CAAC"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Haptics Domain - useHaptics Hook
3
+ *
4
+ * React hook for haptic feedback.
5
+ * Provides vibration patterns for common interactions.
6
+ *
7
+ * @domain haptics
8
+ * @layer presentation/hooks
9
+ */
10
+ import { useCallback } from 'react';
11
+ import { HapticService } from '../../infrastructure/services/HapticService';
12
+ /**
13
+ * useHaptics hook for haptic feedback
14
+ *
15
+ * USAGE:
16
+ * ```typescript
17
+ * const haptics = useHaptics();
18
+ *
19
+ * // Common patterns (convenience methods)
20
+ * <TouchableOpacity onPress={() => haptics.buttonPress()}>
21
+ * <Text>Click Me</Text>
22
+ * </TouchableOpacity>
23
+ *
24
+ * // Success feedback
25
+ * const handleSuccess = async () => {
26
+ * await saveData();
27
+ * haptics.success();
28
+ * };
29
+ *
30
+ * // Error feedback
31
+ * const handleError = () => {
32
+ * haptics.error();
33
+ * };
34
+ *
35
+ * // Selection change (sliders, pickers)
36
+ * <Slider onValueChange={() => haptics.selectionChange()} />
37
+ *
38
+ * // Custom patterns
39
+ * haptics.pattern('long_press');
40
+ * haptics.impact('heavy');
41
+ * haptics.notification('warning');
42
+ * ```
43
+ */
44
+ export const useHaptics = () => {
45
+ /**
46
+ * Trigger impact feedback (light, medium, heavy)
47
+ */
48
+ const impact = useCallback(async (style = 'Light') => {
49
+ await HapticService.impact(style);
50
+ }, []);
51
+ /**
52
+ * Trigger notification feedback (success, warning, error)
53
+ */
54
+ const notification = useCallback(async (type) => {
55
+ await HapticService.notification(type);
56
+ }, []);
57
+ /**
58
+ * Trigger selection feedback (for pickers, sliders)
59
+ */
60
+ const selection = useCallback(async () => {
61
+ await HapticService.selection();
62
+ }, []);
63
+ /**
64
+ * Trigger custom haptic pattern
65
+ */
66
+ const pattern = useCallback(async (patternType) => {
67
+ await HapticService.pattern(patternType);
68
+ }, []);
69
+ /**
70
+ * Common haptic patterns (convenience methods)
71
+ */
72
+ const buttonPress = useCallback(async () => {
73
+ await HapticService.buttonPress();
74
+ }, []);
75
+ const success = useCallback(async () => {
76
+ await HapticService.success();
77
+ }, []);
78
+ const error = useCallback(async () => {
79
+ await HapticService.error();
80
+ }, []);
81
+ const warning = useCallback(async () => {
82
+ await HapticService.warning();
83
+ }, []);
84
+ const deleteItem = useCallback(async () => {
85
+ await HapticService.delete();
86
+ }, []);
87
+ const refresh = useCallback(async () => {
88
+ await HapticService.refresh();
89
+ }, []);
90
+ const selectionChange = useCallback(async () => {
91
+ await HapticService.selectionChange();
92
+ }, []);
93
+ const longPress = useCallback(async () => {
94
+ await HapticService.longPress();
95
+ }, []);
96
+ return {
97
+ // Generic methods
98
+ impact,
99
+ notification,
100
+ selection,
101
+ pattern,
102
+ // Common patterns (convenience methods)
103
+ buttonPress,
104
+ success,
105
+ error,
106
+ warning,
107
+ delete: deleteItem,
108
+ refresh,
109
+ selectionChange,
110
+ longPress,
111
+ };
112
+ };
113
+ //# sourceMappingURL=useHaptics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHaptics.js","sourceRoot":"","sources":["../../../src/presentation/hooks/useHaptics.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAG5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B;;OAEG;IACH,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,QAAqB,OAAO,EAAE,EAAE;QAChE,MAAM,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,IAAsB,EAAE,EAAE;QAChE,MAAM,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACvC,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;IAClC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,WAA0B,EAAE,EAAE;QAC/D,MAAM,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACnC,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACxC,MAAM,aAAa,CAAC,MAAM,EAAE,CAAC;IAC/B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC7C,MAAM,aAAa,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACvC,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;IAClC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,kBAAkB;QAClB,MAAM;QACN,YAAY;QACZ,SAAS;QACT,OAAO;QAEP,wCAAwC;QACxC,WAAW;QACX,OAAO;QACP,KAAK;QACL,OAAO;QACP,MAAM,EAAE,UAAU;QAClB,OAAO;QACP,eAAe;QACf,SAAS;KACV,CAAC;AACJ,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@umituz/react-native-haptics",
3
+ "version": "1.0.0",
4
+ "description": "Haptic feedback (vibration) for React Native using expo-haptics with impact, notification, and selection feedback patterns",
5
+ "main": "./lib/index.js",
6
+ "types": "./lib/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "typecheck": "tsc --noEmit",
10
+ "lint": "tsc --noEmit",
11
+ "clean": "rm -rf lib",
12
+ "prebuild": "npm run clean",
13
+ "prepublishOnly": "npm run build",
14
+ "version:patch": "npm version patch -m 'chore: release v%s'",
15
+ "version:minor": "npm version minor -m 'chore: release v%s'",
16
+ "version:major": "npm version major -m 'chore: release v%s'"
17
+ },
18
+ "keywords": [
19
+ "react-native",
20
+ "haptics",
21
+ "vibration",
22
+ "feedback",
23
+ "expo-haptics"
24
+ ],
25
+ "author": "Ümit UZ <umit@umituz.com>",
26
+ "license": "MIT",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/umituz/react-native-haptics"
30
+ },
31
+ "peerDependencies": {
32
+ "expo-haptics": "*",
33
+ "react": ">=18.2.0",
34
+ "react-native": ">=0.74.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/react": "^18.2.45",
38
+ "@types/react-native": "^0.73.0",
39
+ "expo-haptics": "*",
40
+ "react": "^18.2.0",
41
+ "react-native": "^0.74.0",
42
+ "typescript": "^5.3.3"
43
+ },
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "files": [
48
+ "lib",
49
+ "src",
50
+ "README.md",
51
+ "LICENSE"
52
+ ]
53
+ }
54
+
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Haptics Domain - Core Entities
3
+ *
4
+ * This file defines core types and interfaces for haptic feedback.
5
+ * Handles vibration patterns and feedback types using expo-haptics.
6
+ *
7
+ * @domain haptics
8
+ * @layer domain/entities
9
+ */
10
+
11
+ /**
12
+ * Impact feedback style (compatible with expo-haptics)
13
+ */
14
+ export type ImpactStyle = 'Light' | 'Medium' | 'Heavy';
15
+
16
+ /**
17
+ * Notification feedback type (compatible with expo-haptics)
18
+ */
19
+ export type NotificationType = 'Success' | 'Warning' | 'Error';
20
+
21
+ /**
22
+ * Haptic patterns for common interactions
23
+ */
24
+ export type HapticPattern =
25
+ | 'Success'
26
+ | 'Warning'
27
+ | 'Error'
28
+ | 'selection';
29
+
30
+ /**
31
+ * Haptic constants
32
+ */
33
+ export const HAPTIC_CONSTANTS = {
34
+ DEFAULT_IMPACT: 'Light' as ImpactStyle,
35
+ BUTTON_IMPACT: 'Light' as ImpactStyle,
36
+ DELETE_IMPACT: 'Medium' as ImpactStyle,
37
+ ERROR_IMPACT: 'Heavy' as ImpactStyle,
38
+ } as const;
39
+
40
+ /**
41
+ * Haptic utilities
42
+ * Simplified - pattern handling moved to HapticService
43
+ */
44
+ export class HapticUtils {
45
+ /**
46
+ * Get default impact style for common patterns
47
+ */
48
+ static getDefaultImpact(): ImpactStyle {
49
+ return 'Light';
50
+ }
51
+ }
package/src/index.ts ADDED
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Haptics Domain - Barrel Export
3
+ *
4
+ * Provides haptic feedback (vibration) using expo-haptics.
5
+ * Universal domain - enabled by default for UX improvement.
6
+ *
7
+ * @domain haptics
8
+ * @enabled true (All apps - UX improvement)
9
+ *
10
+ * ARCHITECTURE:
11
+ * - Domain Layer: Entities (haptic types, patterns, utilities)
12
+ * - Infrastructure Layer: Services (HapticService)
13
+ * - Presentation Layer: Hooks (useHaptics)
14
+ *
15
+ * DEPENDENCIES:
16
+ * - expo-haptics (vibration patterns)
17
+ *
18
+ * FEATURES:
19
+ * - Impact feedback (light, medium, heavy)
20
+ * - Notification feedback (success, warning, error)
21
+ * - Selection feedback (pickers, sliders)
22
+ * - Custom haptic patterns
23
+ * - Convenience methods for common interactions
24
+ *
25
+ * USAGE:
26
+ *
27
+ * Basic Haptics:
28
+ * ```typescript
29
+ * import { useHaptics } from '@umituz/react-native-haptics';
30
+ *
31
+ * const haptics = useHaptics();
32
+ *
33
+ * // Button press
34
+ * <TouchableOpacity onPress={() => haptics.buttonPress()}>
35
+ * <Text>Click Me</Text>
36
+ * </TouchableOpacity>
37
+ *
38
+ * // Success feedback
39
+ * const handleSave = async () => {
40
+ * await saveData();
41
+ * haptics.success();
42
+ * };
43
+ *
44
+ * // Error feedback
45
+ * haptics.error();
46
+ * ```
47
+ *
48
+ * Selection Change (Sliders, Pickers):
49
+ * ```typescript
50
+ * import { useHaptics } from '@umituz/react-native-haptics';
51
+ *
52
+ * const haptics = useHaptics();
53
+ *
54
+ * <Slider
55
+ * value={value}
56
+ * onValueChange={(val) => {
57
+ * setValue(val);
58
+ * haptics.selectionChange();
59
+ * }}
60
+ * />
61
+ * ```
62
+ *
63
+ * Custom Patterns:
64
+ * ```typescript
65
+ * import { useHaptics } from '@umituz/react-native-haptics';
66
+ *
67
+ * const haptics = useHaptics();
68
+ *
69
+ * // Impact with specific style
70
+ * haptics.impact('heavy');
71
+ *
72
+ * // Notification with specific type
73
+ * haptics.notification('warning');
74
+ *
75
+ * // Custom pattern
76
+ * haptics.pattern('long_press');
77
+ * ```
78
+ *
79
+ * Direct Service Usage (Rare):
80
+ * ```typescript
81
+ * import { HapticService } from '@umituz/react-native-haptics';
82
+ *
83
+ * // Use when you can't use hooks (outside components)
84
+ * await HapticService.buttonPress();
85
+ * await HapticService.success();
86
+ * ```
87
+ *
88
+ * Common Patterns:
89
+ * ```typescript
90
+ * import { useHaptics } from '@umituz/react-native-haptics';
91
+ *
92
+ * const haptics = useHaptics();
93
+ *
94
+ * // Button press (light impact)
95
+ * haptics.buttonPress();
96
+ *
97
+ * // Success (notification feedback)
98
+ * haptics.success();
99
+ *
100
+ * // Error (notification feedback)
101
+ * haptics.error();
102
+ *
103
+ * // Warning (notification feedback)
104
+ * haptics.warning();
105
+ *
106
+ * // Delete (medium impact)
107
+ * haptics.delete();
108
+ *
109
+ * // Refresh (medium impact)
110
+ * haptics.refresh();
111
+ *
112
+ * // Selection change (selection feedback)
113
+ * haptics.selectionChange();
114
+ *
115
+ * // Long press (heavy impact)
116
+ * haptics.longPress();
117
+ * ```
118
+ *
119
+ * Utilities:
120
+ * ```typescript
121
+ * import { HapticUtils } from '@umituz/react-native-haptics';
122
+ *
123
+ * // Get impact style for pattern
124
+ * const style = HapticUtils.getImpactForPattern('button_press'); // 'light'
125
+ *
126
+ * // Get notification type for pattern
127
+ * const type = HapticUtils.getNotificationForPattern('success'); // 'success'
128
+ *
129
+ * // Check if pattern should use notification
130
+ * const shouldUse = HapticUtils.shouldUseNotification('success'); // true
131
+ * ```
132
+ *
133
+ * BENEFITS:
134
+ * - Improved UX with tactile feedback
135
+ * - Consistent haptic patterns across app
136
+ * - Silent failure (no crashes if unsupported)
137
+ * - Platform-agnostic (iOS + Android)
138
+ * - Easy integration in any component
139
+ * - Works across all apps
140
+ *
141
+ * USE CASES:
142
+ * - Button presses
143
+ * - Success confirmations
144
+ * - Error alerts
145
+ * - Selection changes (sliders, pickers)
146
+ * - Delete actions
147
+ * - Refresh actions
148
+ * - Long press gestures
149
+ * - Form validation feedback
150
+ *
151
+ * @see https://docs.expo.dev/versions/latest/sdk/haptics/
152
+ */
153
+
154
+ // ============================================================================
155
+ // DOMAIN LAYER - ENTITIES
156
+ // ============================================================================
157
+
158
+ export type {
159
+ ImpactStyle,
160
+ NotificationType,
161
+ HapticPattern,
162
+ } from './domain/entities/Haptic';
163
+
164
+ export {
165
+ HAPTIC_CONSTANTS,
166
+ HapticUtils,
167
+ } from './domain/entities/Haptic';
168
+
169
+ // ============================================================================
170
+ // INFRASTRUCTURE LAYER - SERVICES
171
+ // ============================================================================
172
+
173
+ export { HapticService } from './infrastructure/services/HapticService';
174
+
175
+ // ============================================================================
176
+ // PRESENTATION LAYER - HOOKS
177
+ // ============================================================================
178
+
179
+ export { useHaptics } from './presentation/hooks/useHaptics';
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Haptics Domain - Haptic Service
3
+ *
4
+ * Service for haptic feedback using expo-haptics.
5
+ * Provides abstraction layer for vibration and feedback.
6
+ *
7
+ * @domain haptics
8
+ * @layer infrastructure/services
9
+ */
10
+
11
+ import * as Haptics from 'expo-haptics';
12
+ import type { ImpactStyle, NotificationType, HapticPattern } from '../../domain/entities/Haptic';
13
+ import { HapticUtils } from '../../domain/entities/Haptic';
14
+
15
+ /**
16
+ * Haptic feedback service
17
+ */
18
+ export class HapticService {
19
+ /**
20
+ * Trigger impact feedback (Light, Medium, Heavy)
21
+ */
22
+ static async impact(style: ImpactStyle = 'Light'): Promise<void> {
23
+ try {
24
+ await Haptics.impactAsync(
25
+ style === 'Light' ? Haptics.ImpactFeedbackStyle.Light :
26
+ style === 'Medium' ? Haptics.ImpactFeedbackStyle.Medium :
27
+ Haptics.ImpactFeedbackStyle.Heavy
28
+ );
29
+ } catch (error) {
30
+ // Silent fail - haptics not critical
31
+ }
32
+ }
33
+
34
+ /**
35
+ * Trigger notification feedback (Success, Warning, Error)
36
+ */
37
+ static async notification(type: NotificationType): Promise<void> {
38
+ try {
39
+ await Haptics.notificationAsync(
40
+ type === 'Success' ? Haptics.NotificationFeedbackType.Success :
41
+ type === 'Warning' ? Haptics.NotificationFeedbackType.Warning :
42
+ Haptics.NotificationFeedbackType.Error
43
+ );
44
+ } catch (error) {
45
+ // Silent fail
46
+ }
47
+ }
48
+
49
+ /**
50
+ * Trigger selection feedback (for pickers, sliders)
51
+ */
52
+ static async selection(): Promise<void> {
53
+ try {
54
+ await Haptics.selectionAsync();
55
+ } catch (error) {
56
+ // Silent fail
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Trigger haptic pattern
62
+ */
63
+ static async pattern(pattern: HapticPattern): Promise<void> {
64
+ try {
65
+ if (pattern === 'selection') {
66
+ await HapticService.selection();
67
+ return;
68
+ }
69
+
70
+ // Success, Warning, Error map to notification feedback
71
+ if (pattern === 'Success' || pattern === 'Warning' || pattern === 'Error') {
72
+ await HapticService.notification(pattern as NotificationType);
73
+ return;
74
+ }
75
+
76
+ // Default to light impact
77
+ await HapticService.impact('Light');
78
+ } catch (error) {
79
+ // Silent fail
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Common haptic patterns (convenience methods)
85
+ */
86
+ static async buttonPress(): Promise<void> {
87
+ await HapticService.impact('Light');
88
+ }
89
+
90
+ static async success(): Promise<void> {
91
+ await HapticService.pattern('Success');
92
+ }
93
+
94
+ static async error(): Promise<void> {
95
+ await HapticService.pattern('Error');
96
+ }
97
+
98
+ static async warning(): Promise<void> {
99
+ await HapticService.pattern('Warning');
100
+ }
101
+
102
+ static async delete(): Promise<void> {
103
+ await HapticService.impact('Medium');
104
+ }
105
+
106
+ static async refresh(): Promise<void> {
107
+ await HapticService.impact('Light');
108
+ }
109
+
110
+ static async selectionChange(): Promise<void> {
111
+ await HapticService.pattern('selection');
112
+ }
113
+
114
+ static async longPress(): Promise<void> {
115
+ await HapticService.impact('Medium');
116
+ }
117
+ }