Files
Genarrative/apps/mobile-shell/src/host-bridge/dispatch.ts
T
kdletters 40603e0163 收口移动文件导出响应边界
将 Expo 文本、图片和音频导出成功响应包装收口到 files 模块

让移动 dispatch 只委托文件导出请求

同步移动壳配置门禁和共享记忆
2026-06-20 02:23:45 +08:00

108 lines
3.8 KiB
TypeScript

import { type HostBridgeRequest } from '../../../../packages/shared/src/contracts/hostBridge';
import {
captureMobileHostBridgeImageFile,
exportMobileHostBridgeAudioFile,
exportMobileHostBridgeImageFile,
exportMobileHostBridgeTextFile,
importMobileHostBridgeAudioFile,
importMobileHostBridgeDocumentFile,
importMobileHostBridgeImageFile,
importMobileHostBridgeTextFile,
} from './files';
import {
failure,
type MobileHostBridgeNavigation,
unsupported,
} from './protocol';
import { resetQrScannerForTest, scanMobileHostBridgeQrCode } from './scanner';
import {
openShare,
resetMobileHostBridgeShareTargetForTest,
setMobileHostBridgeShareTarget,
} from './share';
import { showMobileHostBridgeLocalNotification } from './notifications';
import {
readMobileHostBridgeClipboardText,
writeMobileHostBridgeClipboardText,
} from './clipboard';
import { runMobileHostBridgeHapticsImpact } from './haptics';
import { setMobileAppBadgeCount } from './badge';
import { getMobileHostBridgeAppearanceColorScheme } from './appearance';
import {
openMobileHostBridgeExternalUrl,
openMobileHostBridgeNativePage,
reloadMobileHostBridgeWebView,
} from './navigation';
import { getMobileHostBridgeNetworkStatus } from './network';
import { getMobileHostBridgeRuntimeResponse } from './runtime';
let navigation: MobileHostBridgeNavigation | null = null;
export function configureMobileHostBridgeNavigation(
nextNavigation: MobileHostBridgeNavigation | null,
) {
navigation = nextNavigation;
}
export async function dispatchMobileHostBridgeRequest(
request: HostBridgeRequest,
) {
switch (request.method) {
case 'host.getRuntime':
return getMobileHostBridgeRuntimeResponse(request);
case 'appearance.getColorScheme':
return getMobileHostBridgeAppearanceColorScheme(request);
case 'app.openExternalUrl':
return openMobileHostBridgeExternalUrl(request);
case 'app.reloadWebView':
return reloadMobileHostBridgeWebView(request, navigation);
case 'network.status':
return getMobileHostBridgeNetworkStatus(request);
case 'clipboard.writeText':
return writeMobileHostBridgeClipboardText(request);
case 'clipboard.readText':
return readMobileHostBridgeClipboardText(request);
case 'file.exportText':
return exportMobileHostBridgeTextFile(request);
case 'file.importText':
return importMobileHostBridgeTextFile(request);
case 'file.importDocument':
return importMobileHostBridgeDocumentFile(request);
case 'file.exportImage':
return exportMobileHostBridgeImageFile(request);
case 'file.importImage':
return importMobileHostBridgeImageFile(request);
case 'file.captureImage':
return captureMobileHostBridgeImageFile(request);
case 'scanner.scanQrCode':
return scanMobileHostBridgeQrCode(request);
case 'file.importAudio':
return importMobileHostBridgeAudioFile(request);
case 'file.exportAudio':
return exportMobileHostBridgeAudioFile(request);
case 'haptics.impact':
return runMobileHostBridgeHapticsImpact(request);
case 'notification.showLocal':
return showMobileHostBridgeLocalNotification(request);
case 'app.setBadgeCount':
return setMobileAppBadgeCount(request);
case 'share.open':
return openShare(request);
case 'share.setTarget':
return setMobileHostBridgeShareTarget(request);
case 'navigation.openNativePage':
return openMobileHostBridgeNativePage(request, navigation);
case 'auth.requestLogin':
case 'payment.request':
return failure(request, unsupported(request.method));
default:
return failure(request, unsupported(request.method));
}
}
export function resetMobileHostBridgeDispatchForTest() {
navigation = null;
resetMobileHostBridgeShareTargetForTest();
resetQrScannerForTest();
}