Skip to content

Commit

Permalink
feat: add setting for swap recipient (#2732)
Browse files Browse the repository at this point in the history
* feat: add setting for swap recipient

* chore: fix lint

* refactor: swap observer

* chore: tweak styles

* OK-18143: fix token detail button

* feat: save allowAnotherRecipientAddress in memory
  • Loading branch information
kwoktung committed Mar 17, 2023
1 parent 7397698 commit 96adecc
Show file tree
Hide file tree
Showing 37 changed files with 503 additions and 328 deletions.
1 change: 1 addition & 0 deletions packages/components/src/locale/ar.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "معلومات المبادلة",
"form__swap_pending": "المبادلة معلقة",
"form__swap_success": "نجاح المبادلة",
"form__swap_to_another_address": "التبديل إلى عنوان آخر",
"form__swap_tokens": "رموز المبادلة",
"form__swapping_via": "مبادلة عبر",
"form__symbol": "رمز",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/bn.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "তথ্য অদলবদল করুন",
"form__swap_pending": "অদলবদল মুলতুবি",
"form__swap_success": "অদলবদল সাফল্য",
"form__swap_to_another_address": "অন্য ঠিকানায় অদলবদল করুন",
"form__swap_tokens": "অদলবদল টোকেন",
"form__swapping_via": "মাধ্যমে অদলবদল",
"form__symbol": "প্রতীক",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/de.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "SWAP-INFO",
"form__swap_pending": "Austausch ausstehend",
"form__swap_success": "Erfolg tauschen",
"form__swap_to_another_address": "Wechseln Sie zu einer anderen Adresse",
"form__swap_tokens": "Token tauschen",
"form__swapping_via": "Austausch über",
"form__symbol": "Symbol",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/en-US.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "SWAP INFO",
"form__swap_pending": "Swap Pending",
"form__swap_success": "Swap Successful",
"form__swap_to_another_address": "Swap to another address",
"form__swap_tokens": "Swap Tokens",
"form__swapping_via": "Swapping via",
"form__symbol": "Symbol",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/es.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "INFORMACIÓN DE INTERCAMBIO",
"form__swap_pending": "Intercambio pendiente",
"form__swap_success": "Cambio exitoso",
"form__swap_to_another_address": "Cambiar a otra dirección",
"form__swap_tokens": "Intercambiar fichas",
"form__swapping_via": "Intercambio a través de",
"form__symbol": "Símbolo",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/fil.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "SWAP INFO",
"form__swap_pending": "Pagpalitin Nakabinbin",
"form__swap_success": "Pagpalitin ang Tagumpay",
"form__swap_to_another_address": "Magpalit sa ibang address",
"form__swap_tokens": "Magpalit ng Token",
"form__swapping_via": "Pagpapalit sa pamamagitan ng",
"form__symbol": "Simbolo",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/fr_FR.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "INFOS D'ÉCHANGE",
"form__swap_pending": "Échange en attente",
"form__swap_success": "Réussite de l'échange",
"form__swap_to_another_address": "Passer à une autre adresse",
"form__swap_tokens": "Échanger des jetons",
"form__swapping_via": "Échange via",
"form__symbol": "Symbole",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/hi_IN.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "स्वैप जानकारी",
"form__swap_pending": "स्वैप लंबित",
"form__swap_success": "स्वैप सफलता",
"form__swap_to_another_address": "दूसरे पते पर स्वैप करें",
"form__swap_tokens": "स्वैप टोकन",
"form__swapping_via": "के माध्यम से अदला-बदली",
"form__symbol": "प्रतीक",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/id.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "INFORMASI TUKAR",
"form__swap_pending": "Tukar Tertunda",
"form__swap_success": "Tukar Berhasil",
"form__swap_to_another_address": "Tukar ke alamat lain",
"form__swap_tokens": "Tukar Token",
"form__swapping_via": "Bertukar melalui",
"form__symbol": "Simbol",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/it_IT.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "INFORMAZIONI DI SCAMBIO",
"form__swap_pending": "Scambio in attesa",
"form__swap_success": "Scambia successo",
"form__swap_to_another_address": "Passa a un altro indirizzo",
"form__swap_tokens": "Scambia i token",
"form__swapping_via": "Scambio tramite",
"form__symbol": "Simbolo",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/ja_JP.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "スワップ情報",
"form__swap_pending": "スワップ中",
"form__swap_success": "スワップ成功",
"form__swap_to_another_address": "別のアドレスに交換",
"form__swap_tokens": "トークンをスワップ",
"form__swapping_via": "スワップルート",
"form__symbol": "シンボル",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/ko_KR.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "스왑 정보",
"form__swap_pending": "스왑 보류 중",
"form__swap_success": "스왑 성공",
"form__swap_to_another_address": "다른 주소로 변경",
"form__swap_tokens": "스왑 토큰",
"form__swapping_via": "스와핑",
"form__symbol": "상징",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/mn_MN.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "СВАП МЭДЭЭ",
"form__swap_pending": "Хүлээгдэж буй солилцоо",
"form__swap_success": "Амжилтыг солих",
"form__swap_to_another_address": "Өөр хаяг руу солино уу",
"form__swap_tokens": "Токенуудыг солих",
"form__swapping_via": "дамжуулан солих",
"form__symbol": "Тэмдэг",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/pt.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "TROCAR INFORMAÇÕES",
"form__swap_pending": "Troca pendente",
"form__swap_success": "Troca de sucesso",
"form__swap_to_another_address": "Troque para outro endereço",
"form__swap_tokens": "Trocar fichas",
"form__swapping_via": "Trocando por",
"form__symbol": "Símbolo",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/ru.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "ИНФОРМАЦИЯ О ОБМЕНЕ",
"form__swap_pending": "Обмен в ожидании",
"form__swap_success": "Обмен успеха",
"form__swap_to_another_address": "Переключиться на другой адрес",
"form__swap_tokens": "Поменять токены",
"form__swapping_via": "Обмен через",
"form__symbol": "Символ",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/th_TH.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "แลกเปลี่ยนข้อมูล",
"form__swap_pending": "อยู่ระหว่างดำเนินการแลกเปลี่ยน",
"form__swap_success": "สลับสำเร็จ",
"form__swap_to_another_address": "สลับไปยังที่อยู่อื่น",
"form__swap_tokens": "สลับโทเค็น",
"form__swapping_via": "สลับผ่าน",
"form__symbol": "สัญลักษณ์",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/uk_UA.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "ІНФОРМАЦІЯ ПРО ОБМІН",
"form__swap_pending": "Обмін очікує",
"form__swap_success": "Успіх обміну",
"form__swap_to_another_address": "Перейти на іншу адресу",
"form__swap_tokens": "Обміняти токени",
"form__swapping_via": "Обмін через",
"form__symbol": "символ",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/vi.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "THÔNG TIN TRAO ĐỔI",
"form__swap_pending": "Hoán đổi đang chờ xử lý",
"form__swap_success": "Hoán đổi thành công",
"form__swap_to_another_address": "Đổi sang địa chỉ khác",
"form__swap_tokens": "Hoán đổi mã thông báo",
"form__swapping_via": "Trao đổi qua",
"form__symbol": "Biểu tượng",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/zh-CN.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "兑换信息",
"form__swap_pending": "兑换中",
"form__swap_success": "兑换成功",
"form__swap_to_another_address": "兑换到另一个地址",
"form__swap_tokens": "兑换代币",
"form__swapping_via": "闪兑通道",
"form__symbol": "符号",
Expand Down
1 change: 1 addition & 0 deletions packages/components/src/locale/zh_HK.json
Expand Up @@ -1365,6 +1365,7 @@
"form__swap_info_uppercase": "兌換信息",
"form__swap_pending": "兌換中",
"form__swap_success": "交換成功",
"form__swap_to_another_address": "兌換到另一個地址",
"form__swap_tokens": "兌換代幣",
"form__swapping_via": "交換方式",
"form__symbol": "符號",
Expand Down
33 changes: 31 additions & 2 deletions packages/kit-bg/src/services/ServiceSwap.ts
Expand Up @@ -53,6 +53,7 @@ import type {
} from '@onekeyhq/kit/src/views/Swap/typings';
import {
convertBuildParams,
getNetworkIdImpl,
stringifyTokens,
} from '@onekeyhq/kit/src/views/Swap/utils';
import {
Expand Down Expand Up @@ -471,6 +472,34 @@ export default class ServiceSwap extends ServiceBase {
dispatch(setSendingAccount(null));
}

@backgroundMethod()
async getRecipient(): Promise<Recipient | undefined> {
const { appSelector } = this.backgroundApi;
const recipient = appSelector((s) => s.swap.recipient);
const inputToken = appSelector((s) => s.swap.inputToken);
const outputToken = appSelector((s) => s.swap.outputToken);
const allowAnotherRecipientAddress = appSelector(
(s) => s.swap.allowAnotherRecipientAddress,
);
if (inputToken && outputToken) {
const implA = getNetworkIdImpl(inputToken.networkId);
const implB = getNetworkIdImpl(outputToken.networkId);
if (implA === implB && !allowAnotherRecipientAddress) {
const sendingAccount = appSelector((s) => s.swap.sendingAccount);
if (sendingAccount) {
return {
accountId: sendingAccount.id,
address: sendingAccount.address,
name: sendingAccount.name,
networkId: inputToken.networkId,
networkImpl: inputToken.impl,
};
}
}
}
return recipient;
}

@backgroundMethod()
async getAccountRelatedWallet(accountId: string) {
const { appSelector } = this.backgroundApi;
Expand Down Expand Up @@ -668,7 +697,7 @@ export default class ServiceSwap extends ServiceBase {
async buyToken(token: Token) {
const { engine } = this.backgroundApi;
const paymentToken = await this.getPaymentToken(token);
this.clearState()
this.clearState();
this.setOutputToken(token);
if (paymentToken) {
if (this.isSameToken(token, paymentToken)) {
Expand All @@ -684,7 +713,7 @@ export default class ServiceSwap extends ServiceBase {
async sellToken(token: Token) {
const { engine } = this.backgroundApi;
const paymentToken = await this.getPaymentToken(token);
this.clearState()
this.clearState();
this.setInputToken(token);
if (paymentToken) {
if (this.isSameToken(token, paymentToken)) {
Expand Down
6 changes: 6 additions & 0 deletions packages/kit/src/store/reducers/swap.ts
Expand Up @@ -32,6 +32,8 @@ type SwapState = {
showMoreQuoteDetail?: boolean;
userSelectedQuoter?: Record<string, string>;
responses?: FetchQuoteResponse[];

allowAnotherRecipientAddress?: boolean;
};

const initialState: SwapState = {
Expand Down Expand Up @@ -163,6 +165,9 @@ export const swapSlice = createSlice({
) {
state.responses = action.payload;
},
setAllowAnotherRecipientAddress(state, action: PayloadAction<boolean>) {
state.allowAnotherRecipientAddress = action.payload;
},
},
});

Expand All @@ -185,6 +190,7 @@ export const {
setUserSelectedQuoter,
clearUserSelectedQuoter,
setResponses,
setAllowAnotherRecipientAddress,
} = swapSlice.actions;

export default swapSlice.reducer;
3 changes: 1 addition & 2 deletions packages/kit/src/views/CreateWallet/AddExistingWallet.tsx
@@ -1,4 +1,4 @@
import { useCallback, useEffect, useMemo, useState } from 'react';
import { useCallback, useEffect, useMemo } from 'react';

import { useNavigation, useRoute } from '@react-navigation/core';
import { useIntl } from 'react-intl';
Expand All @@ -9,7 +9,6 @@ import {
Button,
Center,
Form,
KeyboardAvoidingView,
Modal,
ToastManager,
useForm,
Expand Down
4 changes: 3 additions & 1 deletion packages/kit/src/views/Market/MarketDetail.tsx
Expand Up @@ -19,6 +19,7 @@ import backgroundApiProxy from '../../background/instance/backgroundApiProxy';
import { useTokenSupportStakedAssets } from '../../hooks/useTokens';
import { FiatPayRoutes } from '../../routes/Modal/FiatPay';
import { ModalRoutes, RootRoutes, TabRoutes } from '../../routes/types';
import { useShowBookmark } from '../Discover/hooks';
import { StakingRoutes } from '../Staking/typing';

import MarketDetailContent from './Components/MarketDetail/MarketDetailContent';
Expand Down Expand Up @@ -153,6 +154,7 @@ const MarketDetailLayout: FC<MarketDetailLayoutProps> = ({
NavigationProps & NavigationProps['navigation']
>();
const isVertical = useIsVerticalLayout();
const showBookmark = useShowBookmark();
const marketTokenItem = useMarketTokenItem({ coingeckoId: marketTokenId });
const onBack = useCallback(() => {
navigation.goBack();
Expand Down Expand Up @@ -236,7 +238,7 @@ const MarketDetailLayout: FC<MarketDetailLayoutProps> = ({
}}
/>
) : null}
{signedUrl.length > 0 ? (
{signedUrl.length > 0 && showBookmark ? (
<PurchaseButton
onPress={() => {
navigation.navigate(RootRoutes.Modal, {
Expand Down
3 changes: 2 additions & 1 deletion packages/kit/src/views/Swap/Output/index.tsx
Expand Up @@ -6,6 +6,7 @@ import backgroundApiProxy from '../../../background/instance/backgroundApiProxy'
import { useAppSelector, useNavigation } from '../../../hooks';
import TokenSelector from '../components/TokenSelector';
import { TokenSelectorContext } from '../components/TokenSelector/context';
import { useSwapRecipient } from '../hooks/useSwap';
import { useSwapTokenList } from '../hooks/useSwapTokenUtils';

const Output = () => {
Expand All @@ -14,7 +15,7 @@ const Output = () => {
const inputToken = useAppSelector((s) => s.swap.inputToken);
const outputToken = useAppSelector((s) => s.swap.outputToken);
const tokenList = useAppSelector((s) => s.swapTransactions.tokenList);
const recipient = useAppSelector((s) => s.swap.recipient);
const recipient = useSwapRecipient();

const [networkSelectorId, onSelectNetworkId] = useState<string | undefined>(
() => {
Expand Down
8 changes: 4 additions & 4 deletions packages/kit/src/views/Swap/SelectRoutes/index.tsx
Expand Up @@ -23,7 +23,6 @@ import platformEnv from '@onekeyhq/shared/src/platformEnv';
import backgroundApiProxy from '../../../background/instance/backgroundApiProxy';
import { useAppSelector, useNavigation } from '../../../hooks';
import { ArrivalTime } from '../components/ArrivalTime';
import { useSwapQuoteRequestParams } from '../hooks/useSwap';
import { stringifyTokens } from '../utils';

import { AmountLimit } from './AmountLimit';
Expand Down Expand Up @@ -191,7 +190,8 @@ const SelectRoutes = () => {
const intl = useIntl();
const navigation = useNavigation();
const [selectedIndex, onSelectIndex] = useState(-1);
const params = useSwapQuoteRequestParams();
const tokenIn = useAppSelector((s) => s.swap.inputToken);
const tokenOut = useAppSelector((s) => s.swap.outputToken);
const quote = useAppSelector((s) => s.swap.quote);
const responses = useAppSelector((s) => s.swap.responses);
const data = useMemo(() => responses ?? [], [responses]);
Expand All @@ -211,7 +211,7 @@ const SelectRoutes = () => {
if (response) {
if (response.data) {
backgroundApiProxy.serviceSwap.setQuote(response.data);
const hash = stringifyTokens(params?.tokenIn, params?.tokenOut);
const hash = stringifyTokens(tokenIn, tokenOut);
backgroundApiProxy.serviceSwap.setUserSelectedQuoter(
hash,
response.data.type,
Expand All @@ -220,7 +220,7 @@ const SelectRoutes = () => {
backgroundApiProxy.serviceSwap.setQuoteLimited(response.limited);
}
navigation.goBack();
}, [selectedIndex, data, navigation, params]);
}, [selectedIndex, data, navigation, tokenIn, tokenOut]);

const contextValue = useMemo(
() => ({ selectedIndex, onSelect: onSelectIndex }),
Expand Down
6 changes: 3 additions & 3 deletions packages/kit/src/views/Swap/SwapAlert.tsx
Expand Up @@ -23,7 +23,7 @@ import {
} from '../../hooks';
import { showOverlay } from '../../utils/overlayUtils';

import { useInputLimitsError } from './hooks/useSwap';
import { useInputLimitsError, useSwapRecipient } from './hooks/useSwap';
import { usePriceImpact, useSwapSlippage } from './hooks/useSwapUtils';
import { SwapError } from './typings';

Expand Down Expand Up @@ -77,7 +77,7 @@ const RecipientBox = () => {
};

const RecipientAlert = () => {
const recipient = useAppSelector((s) => s.swap.recipient);
const recipient = useSwapRecipient();

if (recipient) {
return null;
Expand Down Expand Up @@ -159,7 +159,7 @@ const ExchangeAddressAlertContent = () => {

const ExchangeAddressAlert = () => {
const [recipientUnknown, setRecipientUnknown] = useState<boolean>(false);
const recipient = useAppSelector((s) => s.swap.recipient);
const recipient = useSwapRecipient();
useEffect(() => {
backgroundApiProxy.serviceSwap
.recipientIsUnknown(recipient)
Expand Down

0 comments on commit 96adecc

Please sign in to comment.