From ba31d6556897a622acbc39491e0b352c82eb9c04 Mon Sep 17 00:00:00 2001 From: Max Litruv Boonzaayer Date: Sun, 17 May 2026 16:53:40 +1000 Subject: [PATCH] feat: Refactor Android share handling to dynamically load Capacitor core and improve plugin registration --- config.json | 19 +------------------ src/app/utils/androidShare.ts | 24 ++++++++++++++++++++---- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/config.json b/config.json index 57c577a..2272551 100644 --- a/config.json +++ b/config.json @@ -9,30 +9,13 @@ "xmr.se" ], "allowCustomHomeservers": true, - - "calling": { - "livekitServiceUrl": "https://b.ruv.wtf/matrix-rtc/livekit/jwt" - }, - "featuredCommunities": { "openAsDefault": false, "spaces": [ - "#cinny-space:matrix.org", - "#community:matrix.org", - "#space:envs.net", - "#science-space:matrix.org", - "#libregaming-games:tchncs.de", - "#mathematics-on:matrix.org" ], "rooms": [ - "#cinny:matrix.org", - "#freesoftware:matrix.org", - "#pcapdroid:matrix.org", - "#gentoo:matrix.org", - "#PrivSec.dev:arcticfoxes.net", - "#disroot:aria-net.org" ], - "servers": ["envs.net", "matrix.org", "monero.social", "mozilla.org"] + "servers": [] }, "hashRouter": { diff --git a/src/app/utils/androidShare.ts b/src/app/utils/androidShare.ts index 445cc96..441228f 100644 --- a/src/app/utils/androidShare.ts +++ b/src/app/utils/androidShare.ts @@ -1,4 +1,11 @@ -import { Capacitor, registerPlugin, type PluginListenerHandle } from '@capacitor/core'; +import type { PluginListenerHandle } from '@capacitor/core'; + +const CAPACITOR_CORE_MODULE_ID = '@capacitor/core'; + +type CapacitorCoreModule = typeof import('@capacitor/core'); + +const loadCapacitorCore = async (): Promise => + import(/* @vite-ignore */ CAPACITOR_CORE_MODULE_ID); /** Metadata for a file received from an Android share intent. */ export type AndroidSharedFile = { @@ -27,15 +34,21 @@ interface AndroidShareHandlerPlugin { ): Promise; } -const AndroidShareHandler = registerPlugin('AndroidShareHandler'); +const getAndroidShareHandler = async (): Promise => { + const { registerPlugin } = await loadCapacitorCore(); + return registerPlugin('AndroidShareHandler'); +}; /** Returns true when the Android share bridge is available. */ -export const isAndroidShareSupported = (): boolean => - Capacitor.isNativePlatform() && Capacitor.getPlatform() === 'android'; +export const isAndroidShareSupported = (): boolean => { + const capacitor = (window as typeof window & { Capacitor?: CapacitorCoreModule['Capacitor'] }).Capacitor; + return Boolean(capacitor?.isNativePlatform?.() && capacitor.getPlatform() === 'android'); +}; /** Fetches the current pending native share payload. */ export const getPendingAndroidShare = async (): Promise => { if (!isAndroidShareSupported()) return null; + const AndroidShareHandler = await getAndroidShareHandler(); const result = await AndroidShareHandler.getPendingShare(); return result.share; }; @@ -43,6 +56,7 @@ export const getPendingAndroidShare = async (): Promise => { if (!isAndroidShareSupported()) return; + const AndroidShareHandler = await getAndroidShareHandler(); await AndroidShareHandler.clearPendingShare(); }; @@ -51,6 +65,7 @@ export const listenForAndroidShares = async ( listener: (payload: AndroidSharePayload) => void ): Promise => { if (!isAndroidShareSupported()) return undefined; + const AndroidShareHandler = await getAndroidShareHandler(); return AndroidShareHandler.addListener('shareReceived', listener); }; @@ -59,6 +74,7 @@ export const materializeSharedFile = async ( sharedFile: AndroidSharedFile, receivedAt: number ): Promise => { + const { Capacitor } = await loadCapacitorCore(); const fileUrl = Capacitor.convertFileSrc(sharedFile.path); const response = await fetch(fileUrl); if (!response.ok) {