BlueWallet/class/quick-actions.tsx

185 lines
6.2 KiB
TypeScript
Raw Normal View History

2023-11-11 18:17:20 +01:00
import React, { useContext, useEffect } from 'react';
import QuickActions from 'react-native-quick-actions';
import { DeviceEventEmitter, Linking, Platform } from 'react-native';
2020-07-20 15:38:46 +02:00
import { formatBalance } from '../loc';
2020-12-16 04:15:57 +01:00
import AsyncStorage from '@react-native-async-storage/async-storage';
import { BlueStorageContext } from '../blue_modules/storage-context';
import DeeplinkSchemaMatch from './deeplink-schema-match';
import OnAppLaunch from './on-app-launch';
import * as NavigationService from '../NavigationService';
import { CommonActions } from '@react-navigation/native';
2023-11-11 18:17:20 +01:00
import { AbstractWallet } from './wallets/abstract-wallet';
2023-11-11 18:17:20 +01:00
const DeviceQuickActionsStorageKey = 'DeviceQuickActionsEnabled';
function DeviceQuickActions(): JSX.Element | null {
const { wallets, walletsInitialized, isStorageEncrypted, preferredFiatCurrency, addWallet, saveToDisk, setSharedCosigner } =
useContext(BlueStorageContext);
useEffect(() => {
if (walletsInitialized) {
isStorageEncrypted()
2023-11-11 18:17:20 +01:00
.then((value: boolean | undefined | null) => {
if (value) {
removeShortcuts();
} else {
setQuickActions();
}
})
.catch(() => removeShortcuts());
}
// eslint-disable-next-line react-hooks/exhaustive-deps
2023-11-11 18:17:20 +01:00
}, [wallets, walletsInitialized, preferredFiatCurrency, isStorageEncrypted]);
useEffect(() => {
if (walletsInitialized) {
DeviceEventEmitter.addListener('quickActionShortcut', walletQuickActions);
2023-11-11 18:17:20 +01:00
popInitialShortcutAction().then(popInitialAction);
return () => DeviceEventEmitter.removeAllListeners('quickActionShortcut');
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [walletsInitialized]);
2023-11-11 18:17:20 +01:00
// @ts-ignore: Fix later
DeviceQuickActions.setEnabled = async (enabled: boolean = true): Promise<void> => {
await AsyncStorage.setItem(DeviceQuickActionsStorageKey, JSON.stringify(enabled));
if (!enabled) {
removeShortcuts();
} else {
setQuickActions();
}
};
2023-11-11 18:17:20 +01:00
const popInitialShortcutAction = async (): Promise<any> => {
const data = await QuickActions.popInitialAction();
return data;
};
2023-11-11 18:17:20 +01:00
// @ts-ignore: Fix later
DeviceQuickActions.getEnabled = async (): Promise<boolean> => {
try {
2023-11-11 18:17:20 +01:00
const isEnabled = await AsyncStorage.getItem(DeviceQuickActionsStorageKey);
if (isEnabled === null) {
2023-11-11 18:17:20 +01:00
// @ts-ignore: Fix later
await DeviceQuickActions.setEnabled(true);
return true;
}
return !!JSON.parse(isEnabled);
} catch {
return true;
}
};
2023-11-11 18:17:20 +01:00
const popInitialAction = async (data: any): Promise<void> => {
if (data) {
2023-11-11 18:17:20 +01:00
const wallet = wallets.find((w: { getID: () => any }) => w.getID() === data.userInfo.url.split('wallet/')[1]);
if (wallet) {
NavigationService.dispatch(
CommonActions.navigate({
name: 'WalletTransactions',
key: `WalletTransactions-${wallet.getID()}`,
params: {
walletID: wallet.getID(),
walletType: wallet.type,
},
}),
);
}
} else {
const url = await Linking.getInitialURL();
if (url) {
if (DeeplinkSchemaMatch.hasSchema(url)) {
handleOpenURL({ url });
}
} else {
const isViewAllWalletsEnabled = await OnAppLaunch.isViewAllWalletsEnabled();
if (!isViewAllWalletsEnabled) {
2023-11-11 18:17:20 +01:00
const selectedDefaultWallet: AbstractWallet = (await OnAppLaunch.getSelectedDefaultWallet()) as AbstractWallet;
if (selectedDefaultWallet) {
const wallet = wallets.find((w: AbstractWallet) => w.getID() === selectedDefaultWallet.getID());
if (wallet) {
NavigationService.dispatch(
CommonActions.navigate({
name: 'WalletTransactions',
key: `WalletTransactions-${wallet.getID()}`,
params: {
walletID: wallet.getID(),
walletType: wallet.type,
},
}),
);
}
}
}
}
}
};
2023-11-11 18:17:20 +01:00
const handleOpenURL = (event: { url: string }): void => {
DeeplinkSchemaMatch.navigationRouteFor(event, (value: any) => NavigationService.navigate(...value), {
wallets,
addWallet,
saveToDisk,
setSharedCosigner,
});
};
2023-11-11 18:17:20 +01:00
const walletQuickActions = (data: any): void => {
const wallet = wallets.find((w: { getID: () => any }) => w.getID() === data.userInfo.url.split('wallet/')[1]);
if (wallet) {
NavigationService.dispatch(
CommonActions.navigate({
name: 'WalletTransactions',
key: `WalletTransactions-${wallet.getID()}`,
params: {
walletID: wallet.getID(),
walletType: wallet.type,
},
}),
);
}
};
2023-11-11 18:17:20 +01:00
const removeShortcuts = async (): Promise<void> => {
if (Platform.OS === 'android') {
QuickActions.clearShortcutItems();
} else {
2023-11-11 18:17:20 +01:00
// @ts-ignore: Fix later
QuickActions.setShortcutItems([{ type: 'EmptyWallets', title: '' }]);
}
};
2023-11-11 18:17:20 +01:00
const setQuickActions = async (): Promise<void> => {
// @ts-ignore: Fix later
if (await DeviceQuickActions.getEnabled()) {
QuickActions.isSupported((error, _supported) => {
if (error === null) {
const shortcutItems = [];
for (const wallet of wallets.slice(0, 4)) {
shortcutItems.push({
type: 'Wallets', // Required
title: wallet.getLabel(), // Optional, if empty, `type` will be used instead
subtitle:
wallet.hideBalance || wallet.getBalance() <= 0
? ''
: formatBalance(Number(wallet.getBalance()), wallet.getPreferredBalanceUnit(), true),
userInfo: {
url: `bluewallet://wallet/${wallet.getID()}`, // Provide any custom data like deep linking URL
},
icon: Platform.select({ android: 'quickactions', ios: 'bookmark' }),
});
}
2023-11-11 18:17:20 +01:00
// @ts-ignore: Fix later
QuickActions.setShortcutItems(shortcutItems);
}
});
} else {
removeShortcuts();
}
};
2023-11-11 18:17:20 +01:00
return <></>;
}
export default DeviceQuickActions;