-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
chalabi/fix mobile #157
chalabi/fix mobile #157
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,7 +6,7 @@ | |
import { Connected, Connecting, Error, NotExist, QRCode, WalletList, Contacts } from './views'; | ||
import { useRouter } from 'next/router'; | ||
import { ToastProvider } from '@/contexts/toastContext'; | ||
|
||
import { useDeviceDetect } from '@/hooks'; | ||
export enum ModalView { | ||
WalletList, | ||
QRCode, | ||
|
@@ -46,6 +46,7 @@ | |
|
||
const walletStatus = current?.walletStatus || WalletStatus.Disconnected; | ||
const currentWalletName = current?.walletName; | ||
const { isMobile } = useDeviceDetect(); | ||
|
||
useEffect(() => { | ||
if (isOpen) { | ||
|
@@ -89,7 +90,7 @@ | |
setSelectedWallet(wallet); | ||
} | ||
if (wallet?.walletInfo.mode === 'wallet-connect') { | ||
setCurrentView(ModalView.QRCode); | ||
setCurrentView(isMobile ? ModalView.Connecting : ModalView.QRCode); | ||
setQRWallet(wallet); | ||
} | ||
}, 1); | ||
Comment on lines
92
to
96
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Consider adding error recovery path The wallet connection logic should handle cases where the mobile connection fails and allow users to fall back to QR code if needed. if (wallet?.walletInfo.mode === 'wallet-connect') {
setCurrentView(isMobile ? ModalView.Connecting : ModalView.QRCode);
setQRWallet(wallet);
+ // Add timeout and error handling
+ const timeout = setTimeout(() => {
+ if (walletStatus === WalletStatus.Connecting) {
+ setCurrentView(ModalView.QRCode);
+ }
+ }, 30000); // 30 seconds timeout
+ return () => clearTimeout(timeout);
}
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,6 +2,7 @@ | |
import { XMarkIcon } from '@heroicons/react/24/outline'; | ||
import { ChainWalletBase } from 'cosmos-kit'; | ||
import { getRealLogo } from '@/utils'; | ||
import { useDeviceDetect } from '@/hooks'; | ||
|
||
export const WalletList = ({ | ||
onClose, | ||
|
@@ -29,6 +30,7 @@ | |
wallet.walletInfo.prettyName | ||
) | ||
); | ||
const { isMobile } = useDeviceDetect(); | ||
return ( | ||
<div className="p-1 relative max-w-sm mx-auto"> | ||
<h1 className="text-sm font-semibold text-center mb-6">Connect Wallet</h1> | ||
|
@@ -41,7 +43,7 @@ | |
</button> | ||
|
||
{/* Browser and Social sections - browaer hidden on mobile/tablet */} | ||
<div className="hidden md:block"> | ||
<div className={`${isMobile ? 'hidden' : 'block'}`}> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification Mobile detection needs enhancement for landscape mode The
🔗 Analysis chainVerify browser/social section behavior in landscape mode The conditional rendering Also applies to: 46-46 Let me gather more context about the mobile-specific visibility handling in the codebase. Let me check the implementation of the useIsMobile hook to understand how it handles landscape mode. 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Description: Search for other breakpoint-based visibility classes that might need similar updates
rg -g '*.{tsx,jsx,ts,js}' '\b(hidden|block)\s+\w+:(hidden|block)\b'
Length of output: 1541 Script: #!/bin/bash
# Search for isMobile usage patterns in the codebase
rg -g '*.{tsx,jsx,ts,js}' 'isMobile.*?\?' -A 2
# Also check for any mobile-related hooks or utilities
rg -g '*.{tsx,jsx,ts,js}' 'useIsMobile|useMobile|isMobileDevice'
Length of output: 3855 Script: #!/bin/bash
# Check the implementation of useIsMobile hook
cat hooks/useIsMobile.ts
# Look for any orientation-related code
rg -g '*.{tsx,jsx,ts,js}' 'orientation|landscape|screen\.orientation'
Length of output: 737 |
||
<div className="space-y-2 mb-4"> | ||
{browser.map(({ walletInfo: { name, prettyName, logo } }) => ( | ||
<button | ||
|
@@ -81,7 +83,7 @@ | |
</div> | ||
|
||
{/* Mobile Wallets Section - shown on mobile/tablet, hidden on desktop */} | ||
<div className="md:hidden"> | ||
<div className={`${isMobile ? 'block' : 'hidden'}`}> | ||
<div className="space-y-2"> | ||
{mobile.map(({ walletInfo: { name, prettyName, logo } }) => ( | ||
<button | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,27 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { useState, useEffect } from 'react'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
declare global { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interface Navigator { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
userAgentData?: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mobile: boolean; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export const useDeviceDetect = () => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const [isMobile, setIsMobile] = useState(false); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
useEffect(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const checkDevice = () => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (navigator.userAgentData) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setIsMobile(navigator.userAgentData.mobile); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setIsMobile( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
checkDevice(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, []); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+12
to
+24
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add SSR compatibility and cleanup The useEffect implementation needs improvements for production reliability:
Apply this diff to improve the implementation: useEffect(() => {
const checkDevice = () => {
+ if (typeof window === 'undefined') return;
if (navigator.userAgentData) {
setIsMobile(navigator.userAgentData.mobile);
} else {
setIsMobile(
/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
);
}
};
checkDevice();
+ window.addEventListener('resize', checkDevice);
+
+ return () => {
+ window.removeEventListener('resize', checkDevice);
+ };
}, []); 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return { isMobile }; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+9
to
+27
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add SSR safety checks and optimize hook implementation The current implementation has several potential improvements:
Consider this improved implementation: export const useDeviceDetect = () => {
const [isMobile, setIsMobile] = useState(false);
+ const checkDevice = useCallback(() => {
+ if (typeof window === 'undefined' || !window.navigator) return;
+
if (navigator.userAgentData) {
setIsMobile(navigator.userAgentData.mobile);
} else {
setIsMobile(
/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
);
}
- };
+ }, []);
useEffect(() => {
- const checkDevice = () => {
- if (navigator.userAgentData) {
- setIsMobile(navigator.userAgentData.mobile);
- } else {
- setIsMobile(
- /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
- );
- }
- };
+ // Handle window resize for devices that can change orientation
+ window?.addEventListener('resize', checkDevice);
checkDevice();
+
+ return () => {
+ window?.removeEventListener('resize', checkDevice);
+ };
- }, []);
+ }, [checkDevice]);
return { isMobile };
}; 📝 Committable suggestion
Suggested change
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,7 @@ | |
"private": false, | ||
"description": "An application to interact with the Manifest Chain", | ||
"scripts": { | ||
"dev": "next dev", | ||
"dev": "next dev -H 0.0.0.0", | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Document security implications of exposed dev server While exposing the dev server to all interfaces (0.0.0.0) is useful for mobile testing, it has security implications. Consider these improvements:
Apply this diff: "scripts": {
- "dev": "next dev -H 0.0.0.0",
+ "dev": "next dev",
+ "dev:mobile": "next dev -H 0.0.0.0", Add a comment in README.md: ## Mobile Development
To test on mobile devices:
1. Run `npm run dev:mobile`
2. Access using your machine's local IP address
⚠️ Security Warning: The dev:mobile script exposes the development server to all network interfaces. Use only on trusted networks and never in production. |
||
"build": "next build", | ||
"start": "next start", | ||
"lint": "next lint", | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Consider adding error handling for QR code generation
The QR code view might fail to generate if the wallet doesn't provide a valid QR URI. Consider adding error handling:
📝 Committable suggestion