import { requireNativeModule } from "expo"; import { useEffect, useEffectEvent, useId } from "react"; import { Alert } from "react-native"; import type { ResolvedFilePreviewSource } from "./FilePreviewModal"; const NativeControls = requireNativeModule<{ presentFile( uri: string, name: string, sourceIdentifier: string, identifier: string, ): Promise; dismissFile(identifier: string): Promise; }>("T3NativeControls"); function NativeFilePreview(props: { readonly source: ResolvedFilePreviewSource; readonly onRequestClose: () => void; }) { const { uri, name, sourceIdentifier } = props.source; const identifier = useId(); const onRequestClose = useEffectEvent(props.onRequestClose); useEffect(() => { let canceled = false; void NativeControls.presentFile(uri, name ?? "Preview", sourceIdentifier ?? "", identifier) .catch(() => { if (!canceled) { Alert.alert("Could not open preview", "The file could not be loaded. Please try again."); } }) .finally(() => { if (!canceled) onRequestClose(); }); return () => { canceled = true; void NativeControls.dismissFile(identifier).catch(() => undefined); }; }, [uri, name, sourceIdentifier, identifier]); return null; } export function FilePreview(props: { readonly source: ResolvedFilePreviewSource; readonly onRequestClose: () => void; }) { return ; }