收口移动触觉反馈边界
将 Expo 触觉反馈调用收口到 haptics 模块 让 HostBridge dispatch 只负责触觉反馈 payload 分发 同步原生壳结构门禁和架构文档清单
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
import * as Haptics from 'expo-haptics';
|
||||
import * as Linking from 'expo-linking';
|
||||
import {
|
||||
Appearance,
|
||||
@@ -17,7 +16,6 @@ import {
|
||||
normalizeHostBridgeBadgeCount,
|
||||
normalizeHostBridgeColorScheme,
|
||||
normalizeHostBridgeExternalUrlPayload,
|
||||
normalizeHostBridgeHapticsImpactStyle,
|
||||
normalizeHostBridgeLocalNotification,
|
||||
type OpenExternalUrlPayload,
|
||||
type SetBadgeCountPayload,
|
||||
@@ -54,6 +52,7 @@ import {
|
||||
readMobileClipboardText,
|
||||
writeMobileClipboardText,
|
||||
} from './clipboard';
|
||||
import { runMobileHapticsImpact } from './haptics';
|
||||
|
||||
let currentShareTarget: unknown = null;
|
||||
let navigation: MobileHostBridgeNavigation | null = null;
|
||||
@@ -95,21 +94,14 @@ async function writeClipboard(payload: unknown) {
|
||||
}
|
||||
|
||||
async function runHaptics(payload: unknown) {
|
||||
const style = normalizeHostBridgeHapticsImpactStyle(
|
||||
(payload as HapticsImpactPayload | undefined)?.style,
|
||||
);
|
||||
if (!style) {
|
||||
if (
|
||||
!(await runMobileHapticsImpact(
|
||||
(payload as HapticsImpactPayload | undefined)?.style,
|
||||
))
|
||||
) {
|
||||
throw invalidRequest('haptics impact style must be light, medium, or heavy');
|
||||
}
|
||||
|
||||
const impactStyle =
|
||||
style === 'heavy'
|
||||
? Haptics.ImpactFeedbackStyle.Heavy
|
||||
: style === 'medium'
|
||||
? Haptics.ImpactFeedbackStyle.Medium
|
||||
: Haptics.ImpactFeedbackStyle.Light;
|
||||
|
||||
await Haptics.impactAsync(impactStyle);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
import * as Haptics from 'expo-haptics';
|
||||
|
||||
import {
|
||||
normalizeHostBridgeHapticsImpactStyle,
|
||||
type HostBridgeHapticsImpactStyle,
|
||||
} from '../../../../packages/shared/src/contracts/hostBridge';
|
||||
|
||||
function toExpoImpactStyle(style: HostBridgeHapticsImpactStyle) {
|
||||
return style === 'heavy'
|
||||
? Haptics.ImpactFeedbackStyle.Heavy
|
||||
: style === 'medium'
|
||||
? Haptics.ImpactFeedbackStyle.Medium
|
||||
: Haptics.ImpactFeedbackStyle.Light;
|
||||
}
|
||||
|
||||
export async function runMobileHapticsImpact(rawStyle: unknown) {
|
||||
const style = normalizeHostBridgeHapticsImpactStyle(rawStyle);
|
||||
if (!style) {
|
||||
return false;
|
||||
}
|
||||
|
||||
await Haptics.impactAsync(toExpoImpactStyle(style));
|
||||
return true;
|
||||
}
|
||||
Reference in New Issue
Block a user