iOS build cont...

This commit is contained in:
minibits-cash
2025-03-28 11:42:09 +01:00
parent 3a160fc885
commit c39bdb7bd3
34 changed files with 179 additions and 217 deletions
+2 -2
View File
@@ -95,8 +95,8 @@ android {
applicationId "com.minibits_wallet"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 58028
versionName "0.2.0"
versionCode 58029
versionName "0.2.1"
}
splits {
Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

+13
View File
@@ -0,0 +1,13 @@
{
"migIndex": 1,
"data": [
{
"path": "assets/fonts/Gluten-Regular.ttf",
"sha1": "96270757924e60e26763e8814aaa2000f470d352"
},
{
"path": "assets/icons/nostr.png",
"sha1": "c4558cc304ea0d6e908c7f43d8c7026041daaf3e"
}
]
}
-30
View File
@@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>API_KEY</key>
<string>AIzaSyDSKDNb5MSVhfZmGYQzBaQj49h11m-VXeI</string>
<key>GCM_SENDER_ID</key>
<string>869445547578</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>com.ios.minibits-wallet</string>
<key>PROJECT_ID</key>
<string>minibits-prod</string>
<key>STORAGE_BUCKET</key>
<string>minibits-prod.firebasestorage.app</string>
<key>IS_ADS_ENABLED</key>
<false></false>
<key>IS_ANALYTICS_ENABLED</key>
<false></false>
<key>IS_APPINVITE_ENABLED</key>
<true></true>
<key>IS_GCM_ENABLED</key>
<true></true>
<key>IS_SIGNIN_ENABLED</key>
<true></true>
<key>GOOGLE_APP_ID</key>
<string>1:869445547578:ios:63fd5c3b7fc113072ae703</string>
</dict>
</plist>
+13
View File
@@ -0,0 +1,13 @@
{
"migIndex": 1,
"data": [
{
"path": "assets/fonts/Gluten-Regular.ttf",
"sha1": "96270757924e60e26763e8814aaa2000f470d352"
},
{
"path": "assets/icons/nostr.png",
"sha1": "c4558cc304ea0d6e908c7f43d8c7026041daaf3e"
}
]
}
+28 -14
View File
@@ -11,7 +11,9 @@
761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; };
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
902F38392D92C792005DB998 /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 902F38382D92C792005DB998 /* OpenSSL.xcframework */; };
90C59D872D9195980061E3E1 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 90C59D862D9195980061E3E1 /* GoogleService-Info.plist */; };
9044DC252D95937D00F918A6 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9044DC242D95937D00F918A6 /* GoogleService-Info.plist */; };
A1B9A6F7058C4F12AB677FD4 /* nostr.png in Resources */ = {isa = PBXBuildFile; fileRef = AB8A46AD84194C2583FF9193 /* nostr.png */; };
C3AB98FDBCF446F99A4EA648 /* Gluten-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6DA8A3418B7A4B348B67B9E7 /* Gluten-Regular.ttf */; };
CD7DC745CFA9F47C2D6FFA1D /* Pods_minibits_wallet.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4ACC08249CA13DFDBBBD7A8B /* Pods_minibits_wallet.framework */; };
D610B97F2318E8AB9D0962D2 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; };
/* End PBXBuildFile section */
@@ -24,10 +26,13 @@
3B4392A12AC88292D35C810B /* Pods-minibits_wallet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-minibits_wallet.debug.xcconfig"; path = "Target Support Files/Pods-minibits_wallet/Pods-minibits_wallet.debug.xcconfig"; sourceTree = "<group>"; };
4ACC08249CA13DFDBBBD7A8B /* Pods_minibits_wallet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_minibits_wallet.framework; sourceTree = BUILT_PRODUCTS_DIR; };
5709B34CF0A7D63546082F79 /* Pods-minibits_wallet.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-minibits_wallet.release.xcconfig"; path = "Target Support Files/Pods-minibits_wallet/Pods-minibits_wallet.release.xcconfig"; sourceTree = "<group>"; };
6DA8A3418B7A4B348B67B9E7 /* Gluten-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Gluten-Regular.ttf"; path = "../assets/fonts/Gluten-Regular.ttf"; sourceTree = "<group>"; };
761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = minibits_wallet/AppDelegate.swift; sourceTree = "<group>"; };
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = minibits_wallet/LaunchScreen.storyboard; sourceTree = "<group>"; };
902F38382D92C792005DB998 /* OpenSSL.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:67RAULRX93:Marcin Krzyzanowski"; lastKnownFileType = wrapper.xcframework; name = OpenSSL.xcframework; path = "Pods/OpenSSL-Universal/OpenSSL.xcframework"; sourceTree = "<group>"; };
90C59D862D9195980061E3E1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
9044DC232D9556F600F918A6 /* minibits_wallet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = minibits_wallet.entitlements; path = minibits_wallet/minibits_wallet.entitlements; sourceTree = "<group>"; };
9044DC242D95937D00F918A6 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "minibits_wallet/GoogleService-Info.plist"; sourceTree = "<group>"; };
AB8A46AD84194C2583FF9193 /* nostr.png */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = nostr.png; path = ../assets/icons/nostr.png; sourceTree = "<group>"; };
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
/* End PBXFileReference section */
@@ -47,6 +52,7 @@
13B07FAE1A68108700A75B9A /* minibits_wallet */ = {
isa = PBXGroup;
children = (
9044DC232D9556F600F918A6 /* minibits_wallet.entitlements */,
13B07FB51A68108700A75B9A /* Images.xcassets */,
761780EC2CA45674006654EE /* AppDelegate.swift */,
13B07FB61A68108700A75B9A /* Info.plist */,
@@ -66,6 +72,15 @@
name = Frameworks;
sourceTree = "<group>";
};
4B24E47762034A51AEE63594 /* Resources */ = {
isa = PBXGroup;
children = (
6DA8A3418B7A4B348B67B9E7 /* Gluten-Regular.ttf */,
AB8A46AD84194C2583FF9193 /* nostr.png */,
);
name = Resources;
sourceTree = "<group>";
};
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
isa = PBXGroup;
children = (
@@ -76,12 +91,13 @@
83CBB9F61A601CBA00E9B192 = {
isa = PBXGroup;
children = (
90C59D862D9195980061E3E1 /* GoogleService-Info.plist */,
9044DC242D95937D00F918A6 /* GoogleService-Info.plist */,
13B07FAE1A68108700A75B9A /* minibits_wallet */,
832341AE1AAA6A7D00B99B32 /* Libraries */,
83CBBA001A601CBA00E9B192 /* Products */,
2D16E6871FA4F8E400B85C8A /* Frameworks */,
BBD78D7AC51CEA395F1C20DB /* Pods */,
4B24E47762034A51AEE63594 /* Resources */,
);
indentWidth = 2;
sourceTree = "<group>";
@@ -168,9 +184,11 @@
buildActionMask = 2147483647;
files = (
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */,
90C59D872D9195980061E3E1 /* GoogleService-Info.plist in Resources */,
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
D610B97F2318E8AB9D0962D2 /* PrivacyInfo.xcprivacy in Resources */,
C3AB98FDBCF446F99A4EA648 /* Gluten-Regular.ttf in Resources */,
A1B9A6F7058C4F12AB677FD4 /* nostr.png in Resources */,
9044DC252D95937D00F918A6 /* GoogleService-Info.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -282,6 +300,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = minibits_wallet/minibits_wallet.entitlements;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = GR2ZKMCLAM;
ENABLE_BITCODE = NO;
@@ -297,7 +316,7 @@
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = "com.ios.minibits-wallet";
PRODUCT_BUNDLE_IDENTIFIER = cash.minibits.wallet;
PRODUCT_NAME = minibits_wallet;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
@@ -311,6 +330,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = minibits_wallet/minibits_wallet.entitlements;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = GR2ZKMCLAM;
INFOPLIST_FILE = minibits_wallet/Info.plist;
@@ -325,7 +345,7 @@
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = "com.ios.minibits-wallet";
PRODUCT_BUNDLE_IDENTIFIER = cash.minibits.wallet;
PRODUCT_NAME = minibits_wallet;
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
@@ -413,10 +433,7 @@
"-DFOLLY_CFG_NO_COROUTINES=1",
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
);
OTHER_LDFLAGS = (
"$(inherited)",
" ",
);
OTHER_LDFLAGS = "$(inherited) ";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
@@ -497,10 +514,7 @@
"-DFOLLY_CFG_NO_COROUTINES=1",
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
);
OTHER_LDFLAGS = (
"$(inherited)",
" ",
);
OTHER_LDFLAGS = "$(inherited) ";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

@@ -1,48 +1,9 @@
{
"images" : [
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
},
{
"idiom" : "ios-marketing",
"scale" : "1x",
"filename" : "1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
+14 -2
View File
@@ -5,7 +5,7 @@
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>minibits_wallet</string>
<string>Minibits</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@@ -26,14 +26,26 @@
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<!-- Do not change NSAllowsArbitraryLoads to true, or you will risk app rejection! -->
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
<key>NSCameraUsageDescription</key>
<string>This app requires access to the camera to scan QR codes.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<key>NSUserNotificationUsageDescription</key>
<string>This app uses notifications to keep you updated with incoming transactions.</string>
<key>UIAppFonts</key>
<array>
<string>Gluten-Regular.ttf</string>
</array>
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>remote-notification</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
</dict>
</plist>
+22
View File
@@ -0,0 +1,22 @@
diff --git a/node_modules/react-native/ReactCommon/react/renderer/animations/utils.h b/node_modules/react-native/ReactCommon/react/renderer/animations/utils.h
index 41b9be9..7ffc2f4 100644
--- a/node_modules/react-native/ReactCommon/react/renderer/animations/utils.h
+++ b/node_modules/react-native/ReactCommon/react/renderer/animations/utils.h
@@ -105,15 +105,11 @@ static inline bool shouldFirstComeBeforeSecondMutation(
// must come first.
if (lhs.type == ShadowViewMutation::Type::Remove &&
lhs.parentShadowView.tag == rhs.parentShadowView.tag) {
- if (lhs.index > rhs.index) {
- return true;
- } else {
- return false;
- }
+ return lhs.index > rhs.index;
}
}
- return false;
+ return &lhs < &rhs;
}
std::pair<Float, Float> calculateAnimationProgress(
+6 -3
View File
@@ -4,8 +4,6 @@ import {
APP_ENV,
SENTRY_DSN,
JS_BUNDLE_VERSION,
CODEPUSH_STAGING_DEPLOYMENT_KEY,
CODEPUSH_PRODUCTION_DEPLOYMENT_KEY,
ANDROID_VERSION_NAME,
} from '@env'
// import codePush from 'react-native-code-push'
@@ -26,7 +24,7 @@ import Config from './config'
import {log} from './services'
import {Env} from './utils/envtypes'
import AppError from './utils/AppError'
import { Image, TextStyle, View } from 'react-native'
import { Image, TextStyle, View, Platform, UIManager } from 'react-native'
import { spacing, typography } from './theme'
import { displayName } from '../app.json'
import { Text } from './components/Text'
@@ -52,6 +50,11 @@ if (!__DEV__) {
})
}
if (Platform.OS === 'android' &&
UIManager.setLayoutAnimationEnabledExperimental) {
UIManager.setLayoutAnimationEnabledExperimental(true)
}
function App() {
const {userSettingsStore, relaysStore} = useStores()
+1 -1
View File
@@ -19,7 +19,7 @@ const maxLines = 50
export const CollapsibleText = (props: CollapsibleProps) => {
const [collapsed, setCollapsed] = useState(props?.collapsed ?? false)
const toggleCollapse = () => {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
setCollapsed(!collapsed)
}
const textDim = useThemeColor('textDim')
+1 -6
View File
@@ -7,11 +7,6 @@ import { isObj } from '@cashu/cashu-ts/src/utils'
import JSONTree from 'react-native-json-tree'
import Clipboard from '@react-native-clipboard/clipboard'
if (Platform.OS === 'android' &&
UIManager.setLayoutAnimationEnabledExperimental) {
UIManager.setLayoutAnimationEnabledExperimental(true)
}
type ErrorModalProps = {
error: AppError
}
@@ -28,7 +23,7 @@ export const ErrorModal: FC<ErrorModalProps> = function ({ error }) {
}, [error])
const toggleParams = () => {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
setIsParamsVisible(previousState => !previousState)
}
+10 -9
View File
@@ -292,19 +292,20 @@ const $separatorBottom: ViewStyle = {
}
const $textStyle: TextStyle = {
// alignSelf: 'flex-start',
paddingVertical: spacing.extraSmall,
// alignSelf: "center",
alignSelf: 'flex-start',
// paddingVertical: spacing.extraSmall,
textAlignVertical: 'center',
flexGrow: 1,
flexShrink: 1,
// borderColor: 'red',
// borderWidth: 1,
}
const $subTextContainer: ViewStyle = {
flex: 1,
flexDirection: 'column',
// borderColor: 'red',
flex: 1,
flexDirection: 'column',
justifyContent: 'center',
// borderColor: 'green',
// borderWidth: 1,
alignSelf: 'stretch',
}
const $subTextStyle: TextStyle = {
@@ -315,7 +316,7 @@ const $subTextStyle: TextStyle = {
const $touchableStyle: ViewStyle = {
flexDirection: "row",
alignItems: "flex-start",
alignItems: "flex-start",
}
const $componentContainer: ViewStyle = {
+4
View File
@@ -105,6 +105,10 @@ export const MintsStoreModel = types
}))
.actions(self => ({
addMint: flow(function* addMint(mintUrl: string) {
if(!mintUrl) {
throw new AppError(Err.VALIDATION_ERROR, 'Mint URL is required.')
}
if(!mintUrl.includes('.onion') && !mintUrl.startsWith('https')) {
throw new AppError(Err.VALIDATION_ERROR, 'Mint URL needs to start with https.')
}
+6 -6
View File
@@ -17,13 +17,12 @@ import {
import { debounce } from "lodash"
import * as Sentry from '@sentry/react-native'
import type {RootStore} from '../RootStore'
import {KeyChain, MinibitsClient, MMKVStorage} from '../../services'
import {KeyChain, MMKVStorage} from '../../services'
import {Database} from '../../services'
import { log } from '../../services/logService'
import { rootStoreModelVersion } from '../RootStore'
import AppError, { Err } from '../../utils/AppError'
import { LogLevel } from '../../services/log/logTypes'
import { MintStatus } from '../Mint'
import { CurrencyCode } from '../../services/wallet/currency'
import { ThemeCode } from '../../theme'
@@ -79,14 +78,15 @@ export async function setupRootStore(rootStore: RootStore) {
}
// track changes & save snapshot to the storage not more then once per second
const saveSnapshot = debounce((snapshot) => {
/* const saveSnapshot = debounce((snapshot) => {
MMKVStorage.save(ROOT_STORAGE_KEY, snapshot)
}, 1000)
}, 1000)*/
_disposer = onSnapshot(rootStore, snapshot => {
// log.trace('[setupRootStore] onSnapshot *** MMKV SHOULD SAVE ***')
saveSnapshot(snapshot)
// log.trace('[setupRootStore] saved', {walletStore: snapshot.walletStore})
// saveSnapshot(snapshot)
// log.trace('[setupRootStore] saved', {walletStore: snapshot.walletStore})
MMKVStorage.save(ROOT_STORAGE_KEY, snapshot)
})
// run migrations if needed, needs to be after onSnapshot to be persisted
+2 -7
View File
@@ -24,11 +24,6 @@ import { toJS } from 'mobx'
const defaultPublicNpub = 'npub1kvaln6tm0re4d99q9e4ma788wpvnw0jzkz595cljtfgwhldd75xsj9tkzv'
const maxContactsToLoad = 20
if (Platform.OS === 'android' &&
UIManager.setLayoutAnimationEnabledExperimental) {
UIManager.setLayoutAnimationEnabledExperimental(true)
}
export const PublicContacts = observer(function (props: {
paymentOption: ReceiveOption | SendOption | undefined}
) {
@@ -418,13 +413,13 @@ export const PublicContacts = observer(function (props: {
const collapseProfile = function () {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
setIsOwnProfileVisible(false)
}
const expandProfile = function () {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
setIsOwnProfileVisible(true)
}
+2 -7
View File
@@ -37,11 +37,6 @@ import { ContactsStoreSnapshot } from '../models/ContactsStore'
import { CashuMint, MintActiveKeys } from '@cashu/cashu-ts'
import { StaticScreenProps, useNavigation } from '@react-navigation/native'
if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental) {
UIManager.setLayoutAnimationEnabledExperimental(true)
}
type Props = StaticScreenProps<undefined>
export const ImportBackupScreen = observer(function ImportBackupScreen({ route }: Props) {
@@ -111,7 +106,7 @@ export const ImportBackupScreen = observer(function ImportBackupScreen({ route }
throw new AppError(Err.VALIDATION_ERROR, translate('backupScreen.missingMnemonicError'))
}
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
if (!validateMnemonic(mnemonic, wordlist)) {
throw new AppError(Err.VALIDATION_ERROR, translate("recoveryInvalidMnemonicError"))
@@ -203,7 +198,7 @@ export const ImportBackupScreen = observer(function ImportBackupScreen({ route }
throw new AppError(Err.VALIDATION_ERROR, 'Missing backup.')
}
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
const snapshot = getWalletSnapshot() // throws
+1 -6
View File
@@ -36,11 +36,6 @@ import { CurrencyCode, formatCurrency } from '../services/wallet/currency'
import { QRShareModal } from '../components/QRShareModal'
import { StaticScreenProps, useNavigation } from '@react-navigation/native'
if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental) {
UIManager.setLayoutAnimationEnabledExperimental(true)
}
interface DetailedNutInfo {
methods: Array<SwapMethod>;
disabled: boolean;
@@ -133,7 +128,7 @@ export const MintInfoScreen = observer(function MintInfoScreen({ route }: Props)
}, [])
const toggleLocalInfo = () => {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
setIsLocalInfoVisible(!isLocalInfoVisible)
}
+9 -5
View File
@@ -1,5 +1,5 @@
import React, { useEffect, useState } from "react"
import { FlatList, Keyboard, LayoutAnimation, View, ViewStyle } from "react-native"
import { FlatList, Keyboard, LayoutAnimation, Platform, View, ViewStyle } from "react-native"
import { observer } from "mobx-react-lite"
import { Button, Card} from "../../components"
import { spacing } from "../../theme"
@@ -32,14 +32,18 @@ export const MintBalanceSelector = observer(function (props: {
const keyboardDidShowListener = Keyboard.addListener(
'keyboardDidShow',
() => {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
if(Platform.OS === 'android') {
LayoutAnimation.easeInEaseOut()
}
setIsKeyboardVisible(true);
}
);
const keyboardDidHideListener = Keyboard.addListener(
'keyboardDidHide',
() => {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
if(Platform.OS === 'android') {
LayoutAnimation.easeInEaseOut()
}
setIsKeyboardVisible(false);
}
);
@@ -53,13 +57,13 @@ export const MintBalanceSelector = observer(function (props: {
useEffect(() => {
if(!props.selectedMintBalance) {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
setAllVisible(true)
}
}, [])
const toggleAllVisible = function () {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
setAllVisible(!allVisible)
}
+1 -6
View File
@@ -17,11 +17,6 @@ import { translate } from '../i18n'
import { StaticScreenProps, useNavigation } from '@react-navigation/native'
if (Platform.OS === 'android' &&
UIManager.setLayoutAnimationEnabledExperimental) {
UIManager.setLayoutAnimationEnabledExperimental(true)
}
type Props = StaticScreenProps<{}>
export const OwnKeysScreen = observer(function OwnKeysScreen({ route }: Props) {
@@ -141,7 +136,7 @@ export const OwnKeysScreen = observer(function OwnKeysScreen({ route }: Props) {
profile.name = nip05Name as string
}
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
log.trace('Got valid profile', profile)
setOwnProfile(profile)
+1 -5
View File
@@ -18,10 +18,6 @@ import { WalletProfileRecord } from '../models/WalletProfileStore'
import { translate } from '../i18n'
import { StackActions, StaticScreenProps, useNavigation } from '@react-navigation/native'
if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental) {
UIManager.setLayoutAnimationEnabledExperimental(true)
}
type Props = StaticScreenProps<undefined>
export const RecoverWalletAddressScreen = observer(function RecoverWalletAddressScreen({ route }: Props) {
@@ -52,7 +48,7 @@ export const RecoverWalletAddressScreen = observer(function RecoverWalletAddress
throw new AppError(Err.VALIDATION_ERROR, translate('backupScreen.missingMnemonicError'))
}
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
if (!validateMnemonic(mnemonic, wordlist)) {
throw new AppError(Err.VALIDATION_ERROR, translate("recoveryInvalidMnemonicError"))
+1 -5
View File
@@ -43,10 +43,6 @@ import { WalletProfileRecord } from '../models/WalletProfileStore'
import { MnemonicInput } from './Recovery/MnemonicInput'
import { StaticScreenProps, useNavigation } from '@react-navigation/native'
if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental) {
UIManager.setLayoutAnimationEnabledExperimental(true)
}
const RESTORE_INDEX_INTERVAL = 50
type Props = StaticScreenProps<undefined>
@@ -143,7 +139,7 @@ export const SeedRecoveryScreen = observer(function SeedRecoveryScreen({ route }
throw new AppError(Err.VALIDATION_ERROR, translate('backupScreen.missingMnemonicError'))
}
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
if (!validateMnemonic(mnemonic, wordlist)) {
throw new AppError(Err.VALIDATION_ERROR, translate("recoveryInvalidMnemonicError"))
+2 -7
View File
@@ -71,11 +71,6 @@ export enum SendOption {
// DONATION = 'DONATION',
}
if (Platform.OS === 'android' &&
UIManager.setLayoutAnimationEnabledExperimental) {
UIManager.setLayoutAnimationEnabledExperimental(true)
}
type Props = StaticScreenProps<{
unit: MintUnit,
paymentOption?: SendOption,
@@ -549,7 +544,7 @@ export const SendScreen = observer(function SendScreen({ route }: Props) {
return
}
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
setAmountToSend(`${numbro(amountToSend).format({thousandSeparated: true, mantissa: getCurrency(unitRef.current).mantissa})}`)
setAvailableMintBalances(availableBalances)
@@ -568,7 +563,7 @@ export const SendScreen = observer(function SendScreen({ route }: Props) {
const onMemoEndEditing = function () {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
// Show mint selector
if (availableMintBalances.length > 0) {
+3 -9
View File
@@ -64,13 +64,6 @@ import {TranItem} from './TranDetailScreen'
import {translate} from '../i18n'
import { TOPUP_TASK } from '../services/wallet/topupTask'
if (
Platform.OS === 'android' &&
UIManager.setLayoutAnimationEnabledExperimental
) {
UIManager.setLayoutAnimationEnabledExperimental(true)
}
type Props = StaticScreenProps<{
unit: MintUnit,
paymentOption?: ReceiveOption,
@@ -426,7 +419,7 @@ export const TopupScreen = observer(function TopupScreen({ route }: Props) {
}
setIsAmountEndEditing(true)
// We do not make memo focus mandatory
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
// Show mint selector
setIsMintSelectorVisible(true)
} catch (e: any) {
@@ -435,7 +428,7 @@ export const TopupScreen = observer(function TopupScreen({ route }: Props) {
}
const onMemoEndEditing = function () {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
// Show mint selector
if (availableMintBalances.length > 0) {
@@ -679,6 +672,7 @@ export const TopupScreen = observer(function TopupScreen({ route }: Props) {
editable={
transactionStatus === TransactionStatus.PENDING ? false : true
}
returnKeyType={'done'}
/>
<Text
size="sm"
+1 -7
View File
@@ -58,12 +58,6 @@ import { MintListItem } from './Mints/MintListItem'
import { Token, getDecodedToken } from '@cashu/cashu-ts'
import { RECEIVE_OFFLINE_COMPLETE_TASK, RECEIVE_TASK } from '../services/wallet/receiveTask'
import { REVERT_TASK } from '../services/wallet/revertTask'
import { TranHistoryScreen } from './TranHistoryScreen'
import { WalletScreen } from './WalletScreen'
if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental) {
UIManager.setLayoutAnimationEnabledExperimental(true)
}
type ProofsByStatus = {
isSpent: Proof[]
@@ -93,7 +87,7 @@ export const TranDetailScreen = observer(function TranDetailScreen({ route }: Pr
const [isAuditTrailVisible, setIsAuditTrailVisible] = useState<boolean>(false)
const toggleAuditTrail = () => {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
setIsAuditTrailVisible(!isAuditTrailVisible)
}
+2 -6
View File
@@ -34,10 +34,6 @@ import { translate } from '../i18n'
import { maxTransactionsInHistory } from '../models/TransactionsStore'
import { StaticScreenProps, useNavigation } from '@react-navigation/native'
if (Platform.OS === 'android' &&
UIManager.setLayoutAnimationEnabledExperimental) {
UIManager.setLayoutAnimationEnabledExperimental(true)
}
// Number of transactions held in TransactionsStore model
const limit = maxTransactionsInHistory
@@ -181,13 +177,13 @@ export const TranHistoryScreen = observer(function TranHistoryScreen({ route }:
const collapseHeader = function () {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
setIsHeaderVisible(false)
}
const expandHeader = function () {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut)
LayoutAnimation.easeInEaseOut()
setIsHeaderVisible(true)
}
-9
View File
@@ -50,15 +50,6 @@ import useIsInternetReachable from '../utils/useIsInternetReachable'
import { translate } from '../i18n'
import { MemoInputCard } from '../components/MemoInputCard'
import { TRANSFER_TASK } from '../services/wallet/transferTask'
import { LNURLWithdrawParams } from 'js-lnurl'
if (
Platform.OS === 'android' &&
UIManager.setLayoutAnimationEnabledExperimental
) {
UIManager.setLayoutAnimationEnabledExperimental(true)
}
type Props = StaticScreenProps<{
unit: MintUnit,
+12 -12
View File
@@ -13,7 +13,8 @@ import {
Pressable,
Linking,
LayoutAnimation,
AppStateStatus,
AppStateStatus,
Platform,
} from 'react-native'
// import codePush, { RemotePackage } from 'react-native-code-push'
import {moderateScale, verticalScale} from '@gocodingnow/rn-size-matters'
@@ -46,14 +47,9 @@ import {TransactionListItem} from './Transactions/TransactionListItem'
import {WalletTask} from '../services'
import {translate} from '../i18n'
import AppError, { Err } from '../utils/AppError'
import {
APP_ENV,
CODEPUSH_STAGING_DEPLOYMENT_KEY,
CODEPUSH_PRODUCTION_DEPLOYMENT_KEY,
MINIBITS_MINT_URL,
ANDROID_VERSION_NAME
import {
MINIBITS_MINT_URL,
} from '@env'
import { round } from '../utils/number'
import { IncomingParser } from '../services/incomingParser'
import useIsInternetReachable from '../utils/useIsInternetReachable'
import { CurrencySign } from './Wallet/CurrencySign'
@@ -62,7 +58,7 @@ import { CurrencyAmount } from './Wallet/CurrencyAmount'
import { LeftProfileHeader } from './ContactsScreen'
import { getUnixTime } from 'date-fns/getUnixTime'
const deploymentKey = APP_ENV === Env.PROD ? CODEPUSH_PRODUCTION_DEPLOYMENT_KEY : CODEPUSH_STAGING_DEPLOYMENT_KEY
const MINT_CHECK_INTERVAL = 60
type Props = StaticScreenProps<{
@@ -913,12 +909,16 @@ const MintsByUnitList = observer(function (props: {
const onSelectedMint = function (mintUrl: string) {
if (selectedMintUrl && selectedMintUrl === mintUrl) {
LayoutAnimation.easeInEaseOut()
if(Platform.OS === 'android') {
LayoutAnimation.easeInEaseOut()
}
setSelectedMintUrl(undefined)
return
}
LayoutAnimation.easeInEaseOut()
if(Platform.OS === 'android') {
LayoutAnimation.easeInEaseOut()
}
setSelectedMintUrl(mintUrl)
}
@@ -962,7 +962,7 @@ const MintsByUnitList = observer(function (props: {
//topSeparator={true}
style={$item}
onPress={() => onSelectedMint(mint.mintUrl)}
topSeparator={index !== 0 ?? true}
topSeparator={index > 0 ? true : false}
/>
{selectedMintUrl === mint.mintUrl && (
<View style={{flexDirection: 'row', marginBottom: spacing.small, justifyContent: 'flex-start'}}>
+3 -3
View File
@@ -7,7 +7,7 @@ import {
} from '@env'
import { WalletProfile, WalletProfileRecord } from "../models/WalletProfileStore"
import { CurrencyCode } from "./wallet/currency"
// refresh // refresh
type MinibitsRequestArgs = {
method: 'POST' | 'PUT' | 'DELETE' | 'GET'
@@ -292,8 +292,8 @@ const fetchApi = async (url: string, options: MinibitsRequestOptions, timeout =
if (!response) {
controller.abort()
throw new AppError(Err.NETWORK_TIMEOUT, 'Timeout: API takes too long to respond.', {caller: 'fetchApi', url})
}
}
const responseJson = await response.json()
if(responseJson && responseJson.error) {
+5 -3
View File
@@ -12,9 +12,9 @@ import { neventEncode as nostrNeventEncode, npubEncode, decode as nip19Decode }
import {SimplePool} from 'nostr-tools/pool'
import { hexToBytes } from '@noble/hashes/utils'
import { PrivateDirectMessage, Metadata } from 'nostr-tools/kinds'
import {
/*import {
MINIBITS_RELAY_URL,
} from '@env'
} from '@env'*/
import {NostrKeyPair} from './keyChain'
import {log} from './logService'
import AppError, { Err } from '../utils/AppError'
@@ -22,6 +22,7 @@ import { MinibitsClient } from './minibitsService'
import { rootStoreInstance } from '../models'
import { WalletTask } from './walletService'
// refresh
export {
NostrEvent,
@@ -49,9 +50,10 @@ export type Nip05VerificationRecord = {
}
// TODO cleanup all this shit, move to RelayStore model
// refresh
const _defaultPublicRelays: string[] = ['wss://relay.primal.net', 'wss://relay.damus.io']
const _minibitsRelays: string[] = [MINIBITS_RELAY_URL]
const _minibitsRelays: string[] = ['wss://relay.minibits.cash']
let _pool: any = undefined
+3 -5
View File
@@ -1,16 +1,14 @@
declare module '@env' {
export const APP_ENV: string
export const SENTRY_DSN: string
export const CODEPUSH_PRODUCTION_DEPLOYMENT_KEY: string
export const CODEPUSH_STAGING_DEPLOYMENT_KEY: string
export const ANDROID_VERSION_NAME: string
export const ANDROID_VERSION_CODE: string
export const SENTRY_DSN: string
export const MINIBITS_SERVER_API_KEY: string
export const MINIBITS_SERVER_API_HOST: string
export const MINIBIT_SERVER_NOSTR_PUBKEY: string
export const MINIBITS_NIP05_DOMAIN: string
export const MINIBITS_RELAY_URL: string
export const MINIBITS_MINT_URL: string
export const ANDROID_VERSION_NAME: string
export const ANDROID_VERSION_CODE: string
export const JS_BUNDLE_VERSION: string
export const COMMIT: string
}