Skip to content

Commit

Permalink
Merge pull request #1039 from tonwhales/release/v2.3.13
Browse files Browse the repository at this point in the history
Release/v2.3.13
  • Loading branch information
vzhovnitsky authored Sep 11, 2024
2 parents c26cdb6 + 478e263 commit 726b20c
Show file tree
Hide file tree
Showing 63 changed files with 845 additions and 310 deletions.
2 changes: 1 addition & 1 deletion VERSION_CODE
Original file line number Diff line number Diff line change
@@ -1 +1 @@
206
207
3 changes: 3 additions & 0 deletions app/Navigation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,8 @@ import { PendingTxsWatcher } from './components/PendingTxsWatcher';
import { TonconnectWatcher } from './components/TonconnectWatcher';
import { SessionWatcher } from './components/SessionWatcher';
import { MandatoryAuthSetupFragment } from './fragments/secure/MandatoryAuthSetupFragment';
import { WebViewPreloader } from './components/WebViewPreloader';
import { holdersUrl } from './engine/api/holders/fetchUserState';

const Stack = createNativeStackNavigator();
Stack.Navigator.displayName = 'MainStack';
Expand Down Expand Up @@ -469,6 +471,7 @@ export const Navigation = memo(() => {
<PendingTxsWatcher />
<TonconnectWatcher />
<SessionWatcher navRef={navigationRef} />
<WebViewPreloader url={holdersUrl(isTestnet)} />
<Splash hide={hideSplash} />
</View>
);
Expand Down
2 changes: 2 additions & 0 deletions app/analytics/mixpanel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ export enum MixpanelEvent {
HoldersEnrollment = 'holders_entrollment',
HoldersInfo = 'holders_info',
HoldersInfoClose = 'holders_info_close',
HoldersLoadingTime = 'holders_loading_time',
holdersLongLoadingTime = 'holders_long_loading_time',
HoldersEnrollmentClose = 'holders_entrollment_close',
HoldersClose = 'holders_close',
Connect = 'connect',
Expand Down
2 changes: 1 addition & 1 deletion app/components/ScreenHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ export const ScreenHeader = memo((
<View style={{
flexDirection: 'row', alignItems: 'center',
height: 44,
marginTop: 14,
marginTop: 14
}}>
<View style={{
position: 'absolute', top: 0, bottom: 0, left: 0, right: 0,
Expand Down
19 changes: 14 additions & 5 deletions app/components/ShareButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import ShareIcon from '@assets/ic_share_address.svg';
import { t } from "../i18n/t";
import Share from 'react-native-share';
import { useTheme } from "../engine/hooks";
import { useToaster } from "./toast/ToastProvider";

const size = {
height: 56,
Expand All @@ -28,17 +29,25 @@ export const ShareButton = memo(({
onScreenCapture?: () => Promise<{ uri: string }>
}) => {
const theme = useTheme();
const toaster = useToaster();
const onShare = useCallback(async () => {
let screenShot: { uri: string } | undefined;
if (onScreenCapture) {
screenShot = await onScreenCapture();
}

Share.open({
title: t('receive.share.title'),
message: body,
url: screenShot?.uri,
});
try {
await Share.open({
title: t('receive.share.title'),
message: body,
url: screenShot?.uri,
});
} catch {
toaster.show({
type: 'error',
message: t('receive.share.error')
});
}
}, [body]);

return (
Expand Down
14 changes: 14 additions & 0 deletions app/components/WebViewPreloader.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { memo } from "react";
import { View } from "react-native";
import WebView from "react-native-webview";

export const WebViewPreloader = memo(({ url }: { url: string }) => {
return (
<View
style={{ height: 0, width: 0, opacity: 0 }}
pointerEvents={"none"}
>
<WebView source={{ uri: url }} />
</View>
);
});
2 changes: 1 addition & 1 deletion app/components/browser/BrowserExtensions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { extractDomain } from "../../engine/utils/extractDomain";
import { useBottomTabBarHeight } from "@react-navigation/bottom-tabs";
import { useDimensions } from "@react-native-community/hooks";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { holdersUrl as resolveHoldersUrl } from '../../engine/api/holders/fetchAccountState';
import { holdersUrl as resolveHoldersUrl } from '../../engine/api/holders/fetchUserState';
import { Typography } from "../styles";
import { ConnectedApp } from "../../engine/hooks/dapps/useTonConnectExtenstions";

Expand Down
10 changes: 5 additions & 5 deletions app/components/products/HoldersAccountItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { useTypedNavigation } from "../../utils/useTypedNavigation";
import Animated from "react-native-reanimated";
import { useAnimatedPressedInOut } from "../../utils/useAnimatedPressedInOut";
import { useIsConnectAppReady, useJettonContent, usePrice, useTheme } from "../../engine/hooks";
import { HoldersAccountState, holdersUrl } from "../../engine/api/holders/fetchAccountState";
import { HoldersUserState, holdersUrl } from "../../engine/api/holders/fetchUserState";
import { GeneralHoldersAccount, GeneralHoldersCard } from "../../engine/api/holders/fetchAccounts";
import { PerfText } from "../basic/PerfText";
import { Typography } from "../styles";
Expand All @@ -18,7 +18,7 @@ import { HoldersAccountStatus } from "../../engine/hooks/holders/useHoldersAccou
import { WImage } from "../WImage";
import { toBnWithDecimals } from "../../utils/withDecimals";
import { toNano } from "@ton/core";
import { HoldersAppParams } from "../../fragments/holders/HoldersAppFragment";
import { HoldersAppParams, HoldersAppParamsType } from "../../fragments/holders/HoldersAppFragment";
import { getAccountName } from "../../utils/holders/getAccountName";

import IcTonIcon from '@assets/ic-ton-acc.svg';
Expand Down Expand Up @@ -70,7 +70,7 @@ export const HoldersAccountItem = memo((props: {
return true;
}

if (holdersAccStatus.state === HoldersAccountState.NeedEnrollment) {
if (holdersAccStatus.state === HoldersUserState.NeedEnrollment) {
return true;
}

Expand All @@ -86,12 +86,12 @@ export const HoldersAccountItem = memo((props: {
props.onBeforeOpen?.();

if (needsEnrollment) {
const onEnrollType: HoldersAppParams = { type: 'account', id: props.account.id };
const onEnrollType: HoldersAppParams = { type: HoldersAppParamsType.Account, id: props.account.id };
navigation.navigateHoldersLanding({ endpoint: url, onEnrollType }, props.isTestnet);
return;
}

navigation.navigateHolders({ type: 'account', id: props.account.id }, props.isTestnet);
navigation.navigateHolders({ type: HoldersAppParamsType.Account, id: props.account.id }, props.isTestnet);
}, [props.account, needsEnrollment, props.isTestnet]);

const { onPressIn, onPressOut, animatedStyle } = useAnimatedPressedInOut();
Expand Down
10 changes: 5 additions & 5 deletions app/components/products/HoldersPrepaidCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { useTypedNavigation } from "../../utils/useTypedNavigation";
import Animated from "react-native-reanimated";
import { useAnimatedPressedInOut } from "../../utils/useAnimatedPressedInOut";
import { useIsConnectAppReady, useTheme } from "../../engine/hooks";
import { HoldersAccountState, holdersUrl } from "../../engine/api/holders/fetchAccountState";
import { HoldersUserState, holdersUrl } from "../../engine/api/holders/fetchUserState";
import { GeneralHoldersCard, PrePaidHoldersCard } from "../../engine/api/holders/fetchAccounts";
import { PerfText } from "../basic/PerfText";
import { Typography } from "../styles";
Expand All @@ -15,7 +15,7 @@ import { toNano } from "@ton/core";
import { CurrencySymbols } from "../../utils/formatCurrency";
import { HoldersAccountCard } from "./HoldersAccountCard";
import { HoldersAccountStatus } from "../../engine/hooks/holders/useHoldersAccountStatus";
import { HoldersAppParams } from "../../fragments/holders/HoldersAppFragment";
import { HoldersAppParams, HoldersAppParamsType } from "../../fragments/holders/HoldersAppFragment";
import { useLockAppWithAuthState } from "../../engine/hooks/settings";

export const HoldersPrepaidCard = memo((props: {
Expand Down Expand Up @@ -50,7 +50,7 @@ export const HoldersPrepaidCard = memo((props: {
return true;
}

if (holdersAccStatus.state === HoldersAccountState.NeedEnrollment) {
if (holdersAccStatus.state === HoldersUserState.NeedEnrollment) {
return true;
}

Expand All @@ -62,12 +62,12 @@ export const HoldersPrepaidCard = memo((props: {
props.onBeforeOpen?.();

if (needsEnrollment) {
const onEnrollType: HoldersAppParams = { type: 'prepaid', id: card.id };
const onEnrollType: HoldersAppParams = { type: HoldersAppParamsType.Prepaid, id: card.id };
navigation.navigateHoldersLanding({ endpoint: url, onEnrollType }, props.isTestnet);
return;
}

navigation.navigateHolders({ type: 'prepaid', id: card.id }, props.isTestnet);
navigation.navigateHolders({ type: HoldersAppParamsType.Prepaid, id: card.id }, props.isTestnet);
}, [card, needsEnrollment, props.onBeforeOpen, props.isTestnet]);

const { onPressIn, onPressOut, animatedStyle } = useAnimatedPressedInOut();
Expand Down
21 changes: 11 additions & 10 deletions app/components/products/ProductsComponent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { JettonsHiddenComponent } from "./JettonsHiddenComponent"
import { SelectedAccount } from "../../engine/types"
import { DappsRequests } from "../../fragments/wallet/products/DappsRequests"
import { ProductBanner } from "./ProductBanner"
import { HoldersAccountState, holdersUrl } from "../../engine/api/holders/fetchAccountState"
import { HoldersUserState, holdersUrl } from "../../engine/api/holders/fetchUserState"
import { PendingTransactions } from "../../fragments/wallet/views/PendingTransactions"
import { Typography } from "../styles"
import { useBanners } from "../../engine/hooks/banners"
Expand All @@ -22,7 +22,8 @@ import { MixpanelEvent, trackEvent } from "../../analytics/mixpanel"
import { AddressFormatUpdate } from "./AddressFormatUpdate"
import { TonProductComponent } from "./TonProductComponent"
import { SpecialJettonProduct } from "./SpecialJettonProduct"
import { useIsHoldersWhitelisted } from "../../engine/hooks/holders/useIsHoldersWhitelisted"
import { useIsHoldersInvited } from "../../engine/hooks/holders/useIsHoldersInvited"
import { HoldersAppParamsType } from "../../fragments/holders/HoldersAppFragment"

import OldWalletIcon from '@assets/ic_old_wallet.svg';

Expand All @@ -37,11 +38,11 @@ export const ProductsComponent = memo(({ selected }: { selected: SelectedAccount
const banners = useBanners();
const url = holdersUrl(isTestnet);
const isHoldersReady = useIsConnectAppReady(url);
const isHoldersWhitelisted = useIsHoldersWhitelisted(selected!.address, isTestnet);
const showHoldersBuiltInBanner = (holdersAccounts?.accounts?.length ?? 0) === 0 && isHoldersWhitelisted;
const isHoldersInvited = useIsHoldersInvited(selected!.address, isTestnet);
const showHoldersBuiltInBanner = (holdersAccounts?.accounts?.length ?? 0) === 0 && isHoldersInvited;

const needsEnrolment = useMemo(() => {
if (holdersAccStatus?.state === HoldersAccountState.NeedEnrollment) {
if (holdersAccStatus?.state === HoldersUserState.NeedEnrollment) {
return true;
}
return false;
Expand All @@ -67,10 +68,10 @@ export const ProductsComponent = memo(({ selected }: { selected: SelectedAccount

const onHoldersPress = useCallback(() => {
if (needsEnrolment || !isHoldersReady) {
navigation.navigateHoldersLanding({ endpoint: url, onEnrollType: { type: 'create' } }, isTestnet);
navigation.navigateHoldersLanding({ endpoint: url, onEnrollType: { type: HoldersAppParamsType.Create } }, isTestnet);
return;
}
navigation.navigateHolders({ type: 'create' }, isTestnet);
navigation.navigateHolders({ type: HoldersAppParamsType.Create }, isTestnet);
}, [needsEnrolment, isHoldersReady, isTestnet]);

const onProductBannerPress = useCallback((product: ProductAd) => {
Expand Down Expand Up @@ -102,7 +103,7 @@ export const ProductsComponent = memo(({ selected }: { selected: SelectedAccount
<DappsRequests />
<PendingTransactions />

{(!isHoldersWhitelisted && !!banners?.product) && (
{(!isHoldersInvited && !!banners?.product) && (
<View style={{ paddingHorizontal: 16, marginVertical: 16 }}>
<ProductBanner
title={banners.product.title}
Expand All @@ -117,7 +118,7 @@ export const ProductsComponent = memo(({ selected }: { selected: SelectedAccount
{showHoldersBuiltInBanner && (
<View style={{
paddingHorizontal: 16, marginBottom: 16,
marginTop: (!isHoldersWhitelisted && !!banners?.product) ? 0 : 16
marginTop: (!isHoldersInvited && !!banners?.product) ? 0 : 16
}}>
<ProductBanner
title={t('products.holders.card.defaultTitle')}
Expand All @@ -131,7 +132,7 @@ export const ProductsComponent = memo(({ selected }: { selected: SelectedAccount

<View style={{
marginHorizontal: 16, marginBottom: 16,
marginTop: (showHoldersBuiltInBanner || (!isHoldersWhitelisted && !!banners?.product)) ? 0 : 16
marginTop: (showHoldersBuiltInBanner || (!isHoldersInvited && !!banners?.product)) ? 0 : 16
}}>
<Text style={[{ color: theme.textPrimary, }, Typography.semiBold20_28]}>
{t('common.balances')}
Expand Down
2 changes: 1 addition & 1 deletion app/components/toast/ToastProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ export const Toast = memo(({
{Icon && (
<Icon height={24} width={24} style={{ height: 24, width: 24, marginRight: 12 }} color={theme.white} />
)}
<Text style={[{ fontSize: 15, lineHeight: 20, textAlign: !!Icon ? 'left' : 'center' }, ToastStyle[type].text]}>
<Text style={[{ fontSize: 15, lineHeight: 20, textAlign: !!Icon ? 'left' : 'center', flexShrink: 1 }, ToastStyle[type].text]}>
{message}
</Text>
</View>
Expand Down
27 changes: 18 additions & 9 deletions app/components/webview/DAppWebView.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { ForwardedRef, RefObject, forwardRef, memo, useCallback, useEffect, useMemo, useReducer, useState } from "react";
import { KeyboardAvoidingView, Platform, View, StyleSheet, ActivityIndicator, BackHandler } from "react-native";
import { KeyboardAvoidingView, Platform, View, StyleSheet, ActivityIndicator, BackHandler, Linking } from "react-native";
import WebView, { WebViewMessageEvent, WebViewNavigation, WebViewProps } from "react-native-webview";
import { useNetwork, useTheme } from "../../engine/hooks";
import { WebViewErrorComponent } from "./WebViewErrorComponent";
Expand All @@ -22,10 +22,11 @@ import DeviceInfo from 'react-native-device-info';
import { processEmitterMessage } from "./utils/processEmitterMessage";
import { getLastAuthTimestamp, useKeysAuth } from "../secure/AuthWalletKeys";
import { getLockAppWithAuthState } from "../../engine/state/lockAppWithAuthState";
import { useLockAppWithAuthState } from "../../engine/hooks/settings";
import WalletService, { addCardRequestSchema } from "../../modules/WalletService";
import { getHoldersToken } from "../../engine/hooks/holders/useHoldersAccountStatus";
import { getCurrentAddress } from "../../storage/appState";
import { WebViewSourceUri } from "react-native-webview/lib/WebViewTypes";
import { holdersUrl } from "../../engine/api/holders/fetchUserState";

export type DAppWebViewProps = WebViewProps & {
useMainButton?: boolean;
Expand Down Expand Up @@ -72,7 +73,6 @@ export const DAppWebView = memo(forwardRef((props: DAppWebViewProps, ref: Forwar
const navigation = useTypedNavigation();
const toaster = useToaster();
const markRefIdShown = useMarkBannerHidden();
const [, setLockAppWithAuth] = useLockAppWithAuthState();

const [loaded, setLoaded] = useState(false);

Expand All @@ -98,15 +98,28 @@ export const DAppWebView = memo(forwardRef((props: DAppWebViewProps, ref: Forwar
}
);



const safelyOpenUrl = useCallback((url: string) => {
try {
const scheme = new URL(url).protocol.replace(':', '');
const sourceUrl = (props.source as WebViewSourceUri)?.uri;

if (
scheme === 'tg'
&& !!sourceUrl
&& sourceUrl.startsWith(holdersUrl(isTestnet))
) {
Linking.openURL(url);
return;
}
let pageDomain = extractDomain(url);
if (isSafeDomain(pageDomain)) {
openWithInApp(url);
return;
}
} catch { }
}, []);
}, [props.source]);

const onNavigation = useCallback((url: string) => {
if (!props.useQueryAPI) {
Expand Down Expand Up @@ -331,11 +344,7 @@ export const DAppWebView = memo(forwardRef((props: DAppWebViewProps, ref: Forwar
// Basic open url
if (data.name === 'openUrl' && data.args.url) {
try {
let pageDomain = extractDomain(data.args.url);
if (isSafeDomain(pageDomain)) {
openWithInApp(data.args.url);
return;
}
safelyOpenUrl(data.args.url);
} catch {
warn('Failed to open url');
return;
Expand Down
2 changes: 1 addition & 1 deletion app/components/webview/utils/processEmitterMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export function processEmitterMessage(
case DAppEmitterEvents.APP_READY:
setTimeout(() => {
setLoaded(true);
}, 200);
}, 100);
break;
default:
break;
Expand Down
2 changes: 1 addition & 1 deletion app/engine/api/holders/fetchAccounts.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import axios from "axios";
import { Address } from "@ton/core";
import { z } from "zod";
import { holdersEndpoint } from "./fetchAccountState";
import { holdersEndpoint } from "./fetchUserState";

const networksSchema = z.union([
z.literal('ton-mainnet'),
Expand Down
Loading

0 comments on commit 726b20c

Please sign in to comment.