26 lines
967 B
TypeScript
26 lines
967 B
TypeScript
|
|
/**
|
||
|
|
* Open a URL in the device's real browser.
|
||
|
|
*
|
||
|
|
* In a normal mobile/desktop browser this is just `window.open(_blank)`. Inside
|
||
|
|
* the Android companion app the page runs in a WebView where `window.open` is
|
||
|
|
* unreliable (noopener/noreferrer can suppress onCreateWindow), so the native
|
||
|
|
* shell injects a `window.ArchipelagoNative.openExternal(url)` bridge that hands
|
||
|
|
* the URL to an ACTION_VIEW intent. We prefer the bridge when present and fall
|
||
|
|
* back to `window.open` otherwise — so the working mobile-browser path is
|
||
|
|
* untouched.
|
||
|
|
*/
|
||
|
|
interface ArchipelagoNativeBridge {
|
||
|
|
openExternal?: (url: string) => void
|
||
|
|
}
|
||
|
|
|
||
|
|
export function openExternalUrl(url: string): void {
|
||
|
|
if (!url) return
|
||
|
|
const native = (window as unknown as { ArchipelagoNative?: ArchipelagoNativeBridge })
|
||
|
|
.ArchipelagoNative
|
||
|
|
if (native && typeof native.openExternal === 'function') {
|
||
|
|
native.openExternal(url)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
window.open(url, '_blank', 'noopener,noreferrer')
|
||
|
|
}
|