diff --git a/.gitignore b/.gitignore index 45d25bc..9d153c8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ minibits-upload-key.keystore GoogleService-Info.plist minibits-prod-firebase-adminsdk.json dist/ -zapstore +zsp # OSX # diff --git a/ios/minibits_wallet.xcodeproj/xcshareddata/xcschemes/minibits_wallet.xcscheme b/ios/minibits_wallet.xcodeproj/xcshareddata/xcschemes/minibits_wallet.xcscheme index 9a1b755..72677cb 100644 --- a/ios/minibits_wallet.xcodeproj/xcshareddata/xcschemes/minibits_wallet.xcscheme +++ b/ios/minibits_wallet.xcodeproj/xcshareddata/xcschemes/minibits_wallet.xcscheme @@ -31,7 +31,7 @@ shouldAutocreateTestPlan = "YES"> ( const [hasBottomAmountFocusedOnce, setHasBottomAmountFocusedOnce] = useState(false) const [hasBeenFirstTimeConverted, setHasBeenFirstTimeConverted] = useState(false) - const amountInputColor = useThemeColor("amountInput") + const focusedInputColor = useThemeColor("amountInput") const convertedAmountColor = useThemeColor("headerSubTitle") const symbolColor = useThemeColor("headerSubTitle") @@ -220,7 +220,7 @@ export const AmountInput = forwardRef( fontFamily: typography.primary?.bold, fontWeight: 'bold', // android textAlign: "center", - color: amountInputColor, + color: focusedInputColor, } const animatedTopStyle = useAnimatedStyle(() => ({ @@ -273,7 +273,12 @@ export const AmountInput = forwardRef( onEndEditing={onAmountEndEditing} onFocus={handleTopFocus} onBlur={handleTopBlur} - style={[defaultTopStyle, style, animatedTopStyle]} + style={[ + defaultTopStyle, + style, + animatedTopStyle, + { color: focused === 'top' ? focusedInputColor : convertedAmountColor } + ]} maxLength={9} keyboardType="decimal-pad" returnKeyType="done" @@ -307,6 +312,7 @@ export const AmountInput = forwardRef( style, { color: convertedAmountColor }, animatedBottomStyle, + { color: focused === 'bottom' ? focusedInputColor : convertedAmountColor } ]} maxLength={9} keyboardType="decimal-pad" diff --git a/src/components/BottomModal.tsx b/src/components/BottomModal.tsx index 4bb92f6..45baaa9 100644 --- a/src/components/BottomModal.tsx +++ b/src/components/BottomModal.tsx @@ -23,7 +23,8 @@ interface ModalProps extends ViewProps { top?: number onBackdropPress?: any onBackButtonPress?: any - backdropOpacity?: number + onModalHide?: () => void + backdropOpacity?: number /** * The heading text to display if not using `headingTx`. */ @@ -109,11 +110,12 @@ interface ModalProps extends ViewProps { */ export function BottomModal(props: ModalProps) { const { - isVisible = true, + isVisible = true, onBackdropPress, onBackButtonPress, + onModalHide, //backdropOpacity = Platform.OS === 'ios' ? 0.25 : 0, - backdropOpacity = 0.25, + backdropOpacity = 0.25, content, contentTx, contentTxOptions, @@ -175,6 +177,7 @@ export function BottomModal(props: ModalProps) { avoidKeyboard={Platform.OS === 'ios'} onBackdropPress={onBackdropPress} onBackButtonPress={onBackButtonPress} + onModalHide={onModalHide} backdropOpacity={backdropOpacity} useNativeDriverForBackdrop={true} hideModalContentWhileAnimating={true} diff --git a/src/components/ErrorModal.tsx b/src/components/ErrorModal.tsx index 96c42cb..e5cda20 100644 --- a/src/components/ErrorModal.tsx +++ b/src/components/ErrorModal.tsx @@ -8,6 +8,7 @@ import JSONTree from 'react-native-json-tree' import Clipboard from '@react-native-clipboard/clipboard' import { useStores } from '../models' import useIsInternetReachable from '../utils/useIsInternetReachable' +import { useSafeAreaInsets } from 'react-native-safe-area-context' type ErrorModalProps = { error: AppError @@ -58,22 +59,23 @@ export const ErrorModal: FC = function ({ error }) { } const bg = useThemeColor('error') + const insets = useSafeAreaInsets() return ( + {error.name} {error.message} @@ -147,7 +149,7 @@ export const ErrorModal: FC = function ({ error }) { )} - + } /> ) diff --git a/src/components/InfoModal.tsx b/src/components/InfoModal.tsx index 6719974..c49c010 100644 --- a/src/components/InfoModal.tsx +++ b/src/components/InfoModal.tsx @@ -1,7 +1,8 @@ import React, { FC, useState, useEffect } from 'react' -import { View } from 'react-native' +import { Platform, View } from 'react-native' import { BottomModal, Icon, Text } from '../components' import { spacing, useThemeColor } from '../theme' +import { useSafeAreaInsets } from 'react-native-safe-area-context' type InfoModalProps = { @@ -25,12 +26,14 @@ export const InfoModal: FC = function ({ message }) { const backgroundColor = useThemeColor('info') const iconColor = useThemeColor('textDim') + const insets = useSafeAreaInsets() return ( onClose()} onBackButtonPress={() => onClose()} + style={{ marginBottom: Platform.OS === 'android' ? -(insets.top + insets.bottom) : 0 }} ContentComponent={ diff --git a/src/screens/Contacts/PrivateContacts.tsx b/src/screens/Contacts/PrivateContacts.tsx index e8d6ccf..1849649 100644 --- a/src/screens/Contacts/PrivateContacts.tsx +++ b/src/screens/Contacts/PrivateContacts.tsx @@ -1,23 +1,21 @@ import {observer} from 'mobx-react-lite' import React, {useEffect, useRef, useState} from 'react' -import {FlatList, TextInput, TextStyle, View, ViewStyle} from 'react-native' +import {FlatList, Platform, TextInput, TextStyle, View, ViewStyle} from 'react-native' import {verticalScale} from '@gocodingnow/rn-size-matters' import {colors, spacing, useThemeColor} from '../../theme' import {BottomModal, Button, Card, ErrorModal, Icon, InfoModal, ListItem, Loading, Screen, Text} from '../../components' import {useStores} from '../../models' -import { MinibitsClient, NostrClient, NostrProfile } from '../../services' +import { NostrClient, NostrProfile } from '../../services' import AppError, { Err } from '../../utils/AppError' import {MINIBITS_NIP05_DOMAIN} from '@env' import { log } from '../../services/logService' import { ContactListItem } from './ContactListItem' import { Contact, ContactType } from '../../models/Contact' -import { StackNavigationProp } from '@react-navigation/stack' import { ReceiveOption } from '../ReceiveScreen' import { SendOption } from '../SendScreen' -import { infoMessage, warningMessage } from '../../utils/utils' import { IncomingDataType, IncomingParser } from '../../services/incomingParser' import { translate } from '../../i18n' -import { RouteProp, useNavigation } from '@react-navigation/native' +import { useNavigation } from '@react-navigation/native' import { toJS } from 'mobx' import { TransferOption } from '../TransferScreen' @@ -32,11 +30,12 @@ export const PrivateContacts = observer(function (props: { const contactNameInputRef = useRef(null) const [info, setInfo] = useState('') - const [newContactName, setNewContactName] = useState('') - const [isLoading, setIsLoading] = useState(false) - const [isExternalDomain, setIsExternalDomain] = useState(false) - const [isNewContactModalVisible, setIsNewContactModalVisible] = useState(false) + const [newContactName, setNewContactName] = useState('') + const [isLoading, setIsLoading] = useState(false) + const [isExternalDomain, setIsExternalDomain] = useState(false) + const [isNewContactModalVisible, setIsNewContactModalVisible] = useState(false) const [error, setError] = useState() + const [pendingError, setPendingError] = useState() useEffect(() => { const { paymentOption } = props @@ -127,7 +126,11 @@ export const PrivateContacts = observer(function (props: { } catch(e: any) { setNewContactName('') setIsExternalDomain(false) - handleError(e) + if (Platform.OS === 'ios') { + setPendingError(e) + } else { + handleError(e) + } } } @@ -308,6 +311,12 @@ export const PrivateContacts = observer(function (props: { { + if (pendingError) { + handleError(pendingError) + setPendingError(undefined) + } + }} ContentComponent={ diff --git a/src/screens/Contacts/PublicContactsNew.tsx b/src/screens/Contacts/PublicContactsNew.tsx index 7dbc753..6f964e2 100644 --- a/src/screens/Contacts/PublicContactsNew.tsx +++ b/src/screens/Contacts/PublicContactsNew.tsx @@ -219,11 +219,8 @@ export const PublicContactsNew = observer(function (props: { setFollowingProfiles(following) setIsLoading(false) } - - InteractionManager.runAfterInteractions(async () => { - loadProfiles() - }) - + + loadProfiles() }, [followingPubkeys]) diff --git a/src/screens/MintsScreen.tsx b/src/screens/MintsScreen.tsx index 4eb6794..382d8d0 100644 --- a/src/screens/MintsScreen.tsx +++ b/src/screens/MintsScreen.tsx @@ -49,6 +49,7 @@ export const MintsScreen = observer(function MintsScreen({ route }: Props) { const [selectedMint, setSelectedMint] = useState() const [info, setInfo] = useState('') const [error, setError] = useState() + const [pendingError, setPendingError] = useState() const [isLoading, setIsLoading] = useState(false) const [isAddMintVisible, setIsAddMintVisible] = useState(false) const [isMintMenuVisible, setIsMintMenuVisible] = useState(false) @@ -119,7 +120,11 @@ export const MintsScreen = observer(function MintsScreen({ route }: Props) { setInfo(translate('mintsScreen_mintAdded')) } catch (e: any) { setMintUrl('') - handleError(e) + if (Platform.OS === 'ios') { + setPendingError(e) + } else { + handleError(e) + } } finally { setMintUrl('') setIsLoading(false) @@ -425,6 +430,12 @@ export const MintsScreen = observer(function MintsScreen({ route }: Props) { /> { + if (pendingError) { + handleError(pendingError) + setPendingError(undefined) + } + }} ContentComponent={