import { Capacitor } from '@capacitor/core'; /** * Download a text file to the user's device. * * On the web this uses the classic `` trick. * On native (Android & iOS) the file is saved to the app's Documents * directory, which is visible in the iOS Files app and Android's * app-scoped documents. No permissions are required. */ export async function downloadTextFile(filename: string, content: string): Promise { if (Capacitor.isNativePlatform()) { const { Filesystem, Directory, Encoding } = await import('@capacitor/filesystem'); // Write straight to Documents — visible in the iOS Files app and // Android's app-scoped documents. No storage permissions needed. // NOTE: encoding is required — without it Capacitor expects base64 data // and will throw for plain-text strings. await Filesystem.writeFile({ path: filename, data: content, directory: Directory.Documents, encoding: Encoding.UTF8, }); } else { // Web: use the anchor-click download pattern const blob = new Blob([content], { type: 'text/plain; charset=utf-8' }); const url = globalThis.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; a.style.display = 'none'; document.body.appendChild(a); a.click(); globalThis.URL.revokeObjectURL(url); document.body.removeChild(a); } } /** * Open a URL in a new browser tab, or present the native share sheet on Capacitor. * * The programmatic `` click pattern doesn't work inside * WKWebView on iOS. On native platforms this presents the share sheet instead, * letting the user open, save, or share the resource. */ export async function openUrl(url: string): Promise { if (Capacitor.isNativePlatform()) { const { Share } = await import('@capacitor/share'); await Share.share({ url }); } else { window.open(url, '_blank', 'noopener,noreferrer'); } }