UNPKG

onairos

Version:

The Onairos Library is a collection of functions that enable Applications to connect and communicate data with Onairos Identities via User Authorization. Integration for developers is seamless, simple and effective for all applications. LLM SDK capabiliti

278 lines (225 loc) 9.16 kB
# Mobile Browser Compatibility Guide ## ✅ **What Works Perfectly in Mobile Browsers** ### **React Components** - ✅ All React components work identically in mobile browsers - ✅ The npm package is standard React - no mobile-specific changes needed - ✅ Same JavaScript, same React patterns, same component lifecycle ### **Responsive Design** - ✅ **Tailwind CSS responsive classes** work perfectly (`sm:`, `md:`, `lg:`) - ✅ **Touch interactions** handled automatically by CSS - ✅ **Viewport scaling** with proper meta tags - ✅ **Dynamic viewport height** for mobile browsers ```javascript // Already implemented - works on mobile const buttonClass = `px-4 py-2 sm:px-6 sm:py-3`; // Responsive padding ``` ### **API Calls & Networking** - ✅ **Fetch API** works identically on mobile - ✅ **WebSocket connections** work fine - ✅ **CORS and authentication** same as desktop ### **State Management & Storage** - ✅ **localStorage/sessionStorage** work in mobile browsers - ✅ **React state management** identical behavior - ✅ **Session persistence** works across mobile browser sessions ## ⚠️ **What Needs Mobile Optimization** ### **1. OAuth Popup Flow (Main Issue)** #### **Current Implementation (Desktop-Focused)** ```javascript // This works on desktop but is problematic on mobile const popup = window.open( oauthUrl, `${platform.connector}_oauth`, 'width=500,height=600,scrollbars=yes,resizable=yes' ); ``` #### **Mobile Browser Issues:** - 📱 **Popup blocking**: Mobile browsers aggressively block popups - 📱 **Small screens**: Popups are hard to use on mobile screens - 📱 **UX problems**: Users get confused with popup OAuth flows - 📱 **Browser differences**: iOS Safari vs Android Chrome handle popups differently #### **✅ Mobile-Optimized Solution:** ```javascript const connectToPlatform = async (platformName) => { const platform = platforms.find(p => p.name === platformName); // Detect mobile browser const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); if (isMobile) { // Mobile: Use redirect flow instead of popup console.log(`🔗 Mobile redirect OAuth for ${platformName}`); // Store current state for return localStorage.setItem('oauth_platform', platformName); localStorage.setItem('oauth_return_url', window.location.href); // Redirect to OAuth URL (instead of popup) window.location.href = oauthUrl; } else { // Desktop: Use popup flow const popup = window.open(oauthUrl, `${platform.connector}_oauth`, popupSettings); // ... existing popup logic } }; ``` ### **2. Touch Interactions** #### **Already Optimized ✅** ```javascript // Touch events already handled in overlay component document.addEventListener('touchstart', handleClickOutside); // Touch-friendly CSS already implemented style={{ touchAction: 'none' }} // Prevents unwanted scrolling style={{ touchAction: 'pan-y' }} // Allows vertical scrolling only ``` ## 🛠️ **Implementation Changes Needed** ### **1. Add Mobile Detection** ```javascript // Add to UniversalOnboarding.jsx const isMobileDevice = () => { return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || (window.innerWidth <= 768); // Also check screen size }; ``` ### **2. Implement Mobile OAuth Flow** ```javascript const connectToPlatform = async (platformName) => { const platform = platforms.find(p => p.name === platformName); try { setIsConnecting(true); setConnectingPlatform(platformName); const username = localStorage.getItem('username') || 'user@example.com'; const response = await fetch(`${sdkConfig.baseUrl}/${platform.connector}/authorize`, { method: 'POST', headers: { 'x-api-key': sdkConfig.apiKey, 'Content-Type': 'application/json' }, body: JSON.stringify({ session: { username }, mobile: isMobileDevice() // Tell backend this is mobile }) }); const result = await response.json(); const oauthUrl = result[`${platform.connector}URL`]; if (isMobileDevice()) { // Mobile: Redirect flow localStorage.setItem('onairos_oauth_platform', platformName); localStorage.setItem('onairos_oauth_return', window.location.href); window.location.href = oauthUrl; } else { // Desktop: Popup flow (existing implementation) const popup = window.open(oauthUrl, `${platform.connector}_oauth`, 'width=500,height=600,scrollbars=yes,resizable=yes'); // ... existing popup monitoring logic } } catch (error) { console.error(`❌ ${platformName} OAuth failed:`, error); setIsConnecting(false); setConnectingPlatform(null); } }; ``` ### **3. Handle OAuth Return (Mobile)** ```javascript // Add to UniversalOnboarding.jsx useEffect useEffect(() => { // Check if returning from mobile OAuth const urlParams = new URLSearchParams(window.location.search); const oauthPlatform = localStorage.getItem('onairos_oauth_platform'); const returnUrl = localStorage.getItem('onairos_oauth_return'); if (urlParams.get('oauth_success') && oauthPlatform) { // OAuth completed successfully setConnectedAccounts(prev => ({ ...prev, [oauthPlatform]: true })); // Clean up localStorage.removeItem('onairos_oauth_platform'); localStorage.removeItem('onairos_oauth_return'); // Optionally redirect back to original flow if (returnUrl && returnUrl !== window.location.href) { window.history.replaceState({}, '', returnUrl); } } }, []); ``` ## 📱 **Mobile-Specific Features Already Implemented** ### **1. Mobile Components** ✅ ```javascript // Already exists for React Native compatibility import MobileDataRequestPage from './mobile/MobileDataRequestPage.jsx'; import MobileBox from './mobile/components/MobileBox.jsx'; // Can be used in mobile browsers too const isMobile = window.innerWidth <= 768; return isMobile ? <MobileDataRequestPage /> : <DataRequestPage />; ``` ### **2. Responsive Design** ✅ ```javascript // Already implemented throughout components className="p-4 sm:p-6" // Mobile: 4, Desktop: 6 className="text-lg sm:text-xl" // Mobile: lg, Desktop: xl className="w-8 h-8 sm:w-10 sm:h-10" // Mobile: 8, Desktop: 10 ``` ### **3. Touch-Friendly UI** ✅ ```javascript // Larger touch targets for mobile className="px-6 py-3" // Bigger buttons className="min-h-[44px]" // iOS recommended minimum touch target ``` ### **4. Viewport Handling** ✅ ```javascript // Dynamic viewport height for mobile browsers useEffect(() => { const setVH = () => { const vh = window.innerHeight * 0.01; document.documentElement.style.setProperty('--vh', `${vh}px`); }; setVH(); window.addEventListener('resize', setVH); window.addEventListener('orientationchange', setVH); // Mobile-specific }, []); ``` ## 🧪 **Testing on Mobile Browsers** ### **Test Devices:** - ✅ **iPhone Safari** (iOS 13+) - ✅ **Chrome Mobile** (Android) - ✅ **Samsung Internet** (Android) - ✅ **Firefox Mobile** (Android/iOS) ### **Test Scenarios:** ```javascript // 1. Component Rendering // ✅ All React components should render identically // 2. Touch Interactions // ✅ Tap to open OAuth, tap toggles, touch scrolling // 3. API Calls // ✅ All fetch requests work the same // 4. OAuth Flow // ⚠️ Needs mobile redirect implementation // 5. Responsive Design // ✅ UI adapts to mobile screen sizes ``` ## 🚀 **Quick Mobile Implementation** ### **Minimal Change Required:** ```javascript // Add this single function to UniversalOnboarding.jsx const handleMobileOAuth = (oauthUrl, platformName) => { if (/Mobi|Android/i.test(navigator.userAgent)) { // Mobile: redirect instead of popup localStorage.setItem('oauth_platform', platformName); window.location.href = oauthUrl; } else { // Desktop: existing popup logic window.open(oauthUrl, 'oauth', 'width=500,height=600'); } }; ``` ## 📊 **Summary** | Feature | Mobile Browser Support | Changes Needed | |---------|----------------------|----------------| | **React Components** | ✅ Perfect | None | | **API Calls** | ✅ Perfect | None | | **Responsive Design** | ✅ Perfect | None | | **Touch Interactions** | ✅ Perfect | None | | **OAuth Popups** | ⚠️ Problematic | Redirect flow for mobile | | **State Management** | ✅ Perfect | None | | **Networking** | ✅ Perfect | None | ## 🎯 **Key Takeaway** **95% of the npm package works perfectly in mobile browsers!** The only change needed is **replacing OAuth popups with redirects on mobile devices**. Everything else works identically to desktop browsers. **React is React** - whether desktop browser, mobile browser, or React Native - the component logic is the same! 🚀