55 lines
1.9 KiB
TypeScript
55 lines
1.9 KiB
TypeScript
import { Capacitor } from '@capacitor/core';
|
|
|
|
/**
|
|
* Download a text file to the user's device.
|
|
*
|
|
* On the web this uses the classic `<a download>` 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<void> {
|
|
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 `<a target="_blank">` 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<void> {
|
|
if (Capacitor.isNativePlatform()) {
|
|
const { Share } = await import('@capacitor/share');
|
|
await Share.share({ url });
|
|
} else {
|
|
window.open(url, '_blank', 'noopener,noreferrer');
|
|
}
|
|
}
|