my-multiplayer-app / client /hooks /useGlobalAndroidIntent.ts
Jaimodiji's picture
Upload folder using huggingface_hub
a6a4a7d verified
import { useEffect } from 'react'
export function useGlobalAndroidIntent() {
useEffect(() => {
const forceRedirectToColorRM = (uri: string) => {
console.log("[Global] File intent detected. Redirecting to ColorRM immediately:", uri);
window.location.href = '/color_rm.html?importPdf=' + encodeURIComponent(uri);
}
const handleFile = async (uri: string) => {
console.log('[Global] Received shared file URI:', uri)
// FAST PATH: Redirect immediately if it's a content/file URI, assuming it's for ColorRM
if (uri.startsWith('content://') || uri.startsWith('file://')) {
forceRedirectToColorRM(uri);
return;
}
// For other file types, buffer them
console.log('[Global] Non-PDF file buffered:', uri);
window.pendingFileUri = uri;
}
const handleFiles = (uris: string[]) => {
console.log('[Global] Received multiple shared files:', uris);
// Store URIs in sessionStorage so ColorRM can retrieve them after redirect
// This prevents the data from being lost if the native buffer is cleared by the first read
sessionStorage.setItem('pending_shared_uris', JSON.stringify(uris));
// For multiple files, we always redirect to ColorRM with a special param or just the first one
// ColorRM will then check sessionStorage for the full list
if (uris.length > 0) {
forceRedirectToColorRM(uris[0]);
}
}
const handleUrl = (url: string) => {
console.log('[Global] Received shared URL:', url)
// Buffer URL for later
window.pendingUrl = url;
}
// Define global handlers override
window.handleSharedFile = (uri: string) => {
handleFile(uri)
}
window.handleSharedFiles = (uris: string[]) => {
handleFiles(uris)
}
window.handleSharedUrl = (url: string) => {
handleUrl(url)
}
// 1. Process JS-buffered items
if (window.pendingFileUri) {
handleFile(window.pendingFileUri)
}
if (window.pendingUrl) {
handleUrl(window.pendingUrl)
}
const checkNativeBuffer = () => {
if (window.AndroidNative) {
console.log("[Global] AndroidNative interface found. Checking buffer...");
try {
const pendingFile = window.AndroidNative.getPendingFileUri?.();
if (pendingFile) {
console.log('[Global] Found native pending file:', pendingFile);
handleFile(pendingFile);
}
const pendingFiles = window.AndroidNative.getPendingFileUris?.();
if (pendingFiles) {
console.log('[Global] Found native pending files:', pendingFiles);
try {
const uris = JSON.parse(pendingFiles);
if (Array.isArray(uris) && uris.length > 0) {
handleFiles(uris);
}
} catch (e) {
console.error("[Global] Error parsing pending files JSON:", e);
}
}
const pendingText = window.AndroidNative.getPendingSharedText?.();
if (pendingText) {
console.log('[Global] Found native pending text:', pendingText);
handleUrl(pendingText);
}
} catch (e) {
console.error("[Global] Error checking native pending intents:", e);
}
} else {
console.warn("[Global] AndroidNative interface NOT found. Native intent buffer unavailable.");
// alert("Debug: Native Bridge NOT detected. Please rebuild the Android app.");
}
}
// 2. Poll Native-buffered items immediately
checkNativeBuffer();
// 3. Listen for App Resume (for background intents)
if (window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.App) {
const App = window.Capacitor.Plugins.App;
App.addListener('appStateChange', (state: any) => {
if (state.isActive) {
console.log("[Global] App resumed, checking native buffer...");
checkNativeBuffer();
}
});
App.addListener('appUrlOpen', (data: any) => {
console.log('[Global] App opened with URL:', data);
if (data.url) {
if (data.url.startsWith('file://') || data.url.startsWith('content://')) {
forceRedirectToColorRM(data.url);
} else {
handleUrl(data.url);
}
}
});
const checkAppLaunchUrl = async () => {
try {
const result = await App.getLaunchUrl();
if (result && result.url) {
console.log('[Global] App launched with URL: ' + result.url);
if (result.url.startsWith('file://') || result.url.startsWith('content://')) {
forceRedirectToColorRM(result.url);
} else {
handleUrl(result.url);
}
}
} catch (e) {
console.error("[Global] Error checking launch URL:", e);
}
};
checkAppLaunchUrl();
}
}, [])
}