From b47fe6bc90692bb38d193e7bba365514472c9e76 Mon Sep 17 00:00:00 2001 From: kyranjamie Date: Tue, 26 Apr 2022 09:38:56 +0200 Subject: [PATCH] chore: persist domains --- .../choose-account-request/account-request.tsx | 14 ++++++++++---- .../use-account-request-search-params.ts | 1 + .../components/submit-action.tsx | 1 + src/app/store/apps/apps.actions.ts | 17 +++++++++++++++++ src/app/store/index.ts | 2 +- src/app/store/wallet/wallet.hooks.ts | 5 ++++- src/inpage/inpage.ts | 16 ++++++++++------ src/shared/message-types.ts | 6 +++--- 8 files changed, 47 insertions(+), 15 deletions(-) diff --git a/src/app/pages/choose-account-request/account-request.tsx b/src/app/pages/choose-account-request/account-request.tsx index b370fcc8a06..1d53508bd98 100644 --- a/src/app/pages/choose-account-request/account-request.tsx +++ b/src/app/pages/choose-account-request/account-request.tsx @@ -1,3 +1,4 @@ +import { useEffect } from 'react'; import { logger } from '@shared/logger'; import { useRouteHeader } from '@app/common/hooks/use-route-header'; @@ -10,26 +11,30 @@ import { sendRequestAccountResponseToTab, sendUserDeniesAccountRequest, } from '@app/common/actions/send-request-account-response'; +import { useUserGrantsPermissionToAppDomain } from '@app/store/apps/apps.actions'; import { useAccountRequestSearchParams } from './use-account-request-search-params'; -import { useEffect } from 'react'; export function AccountRequest() { const accounts = useAccounts(); const { name: appName } = useAppDetails(); + const grantDomainPermission = useUserGrantsPermissionToAppDomain(); - const { tabId, id } = useAccountRequestSearchParams(); + const { tabId, id, origin } = useAccountRequestSearchParams(); useRouteHeader(
); const returnAccountDetailsToApp = (index: number) => { if (!accounts) throw new Error('Cannot request account details with no account'); - if (!tabId || !id) { - logger.error('Missing either tabId or uuid. Both values are necessary to respond to app'); + if (!tabId || !id || !origin) { + logger.error( + 'Missing necessary search param values. All values are necessary to respond to app' + ); return; } + grantDomainPermission(origin); sendRequestAccountResponseToTab({ tabId, id, account: accounts[index] }); window.close(); }; @@ -45,6 +50,7 @@ export function AccountRequest() { useEffect(() => { window.addEventListener('beforeunload', handleUnmount); return () => window.removeEventListener('beforeunload', handleUnmount); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/src/app/pages/choose-account-request/use-account-request-search-params.ts b/src/app/pages/choose-account-request/use-account-request-search-params.ts index 82ae533d80c..47c648c9d3c 100644 --- a/src/app/pages/choose-account-request/use-account-request-search-params.ts +++ b/src/app/pages/choose-account-request/use-account-request-search-params.ts @@ -8,6 +8,7 @@ export function useAccountRequestSearchParams() { () => ({ tabId: searchParams.get('tabId'), id: searchParams.get('id'), + origin: searchParams.get('origin'), }), [searchParams] ); diff --git a/src/app/pages/transaction-request/components/submit-action.tsx b/src/app/pages/transaction-request/components/submit-action.tsx index 583029ff291..f29a3901973 100644 --- a/src/app/pages/transaction-request/components/submit-action.tsx +++ b/src/app/pages/transaction-request/components/submit-action.tsx @@ -11,6 +11,7 @@ import { ShowEditNonceAction, ShowEditNoncePlaceholder } from '@app/components/s import { useTransactionError } from '@app/pages/transaction-request/hooks/use-transaction-error'; import { useFeeEstimationsState } from '@app/store/transactions/fees.hooks'; import { TransactionSigningSelectors } from '@tests/page-objects/transaction-signing.selectors'; +import { TransactionErrorReason } from './transaction-error/transaction-error'; function BaseConfirmButton(props: ButtonProps): JSX.Element { return ( diff --git a/src/app/store/apps/apps.actions.ts b/src/app/store/apps/apps.actions.ts index e69de29bb2d..d2856b31b5c 100644 --- a/src/app/store/apps/apps.actions.ts +++ b/src/app/store/apps/apps.actions.ts @@ -0,0 +1,17 @@ +import { useCallback } from 'react'; +import { useDispatch } from 'react-redux'; + +import { appsSlice } from './apps.slice'; + +export const appActions = appsSlice.actions; + +export function useUserGrantsPermissionToAppDomain() { + const dispatch = useDispatch(); + return useCallback( + (domain: string) => { + const host = new URL(domain).host; + dispatch(appActions.appConnected({ domain: host })); + }, + [dispatch] + ); +} diff --git a/src/app/store/index.ts b/src/app/store/index.ts index eb47923f143..dc48e34370d 100644 --- a/src/app/store/index.ts +++ b/src/app/store/index.ts @@ -40,7 +40,7 @@ const persistConfig = { version: 1, storage, serialize: true, - whitelist: ['keys', 'chains', 'onboarding', 'analytics'], + whitelist: ['apps', 'keys', 'chains', 'onboarding', 'analytics'], }; const persistedReducer = persistReducer(persistConfig, rootReducer); diff --git a/src/app/store/wallet/wallet.hooks.ts b/src/app/store/wallet/wallet.hooks.ts index 5c1e3029a46..2b8d45bbd22 100644 --- a/src/app/store/wallet/wallet.hooks.ts +++ b/src/app/store/wallet/wallet.hooks.ts @@ -17,6 +17,7 @@ import { finalizeAuthResponse } from '@app/common/actions/finalize-auth-response import { logger } from '@shared/logger'; import { encryptedSecretKeyState, secretKeyState, walletState } from './wallet'; import { useKeyActions } from '@app/common/hooks/use-key-actions'; +import { useUserGrantsPermissionToAppDomain } from '../apps/apps.actions'; export function useWalletState() { return useAtom(walletState); @@ -47,6 +48,7 @@ export function useSetLatestNonceCallback() { export function useFinishSignInCallback() { const { decodedAuthRequest, authRequest, appName, appIcon } = useOnboardingState(); const keyActions = useKeyActions(); + const grantPermissionToDomain = useUserGrantsPermissionToAppDomain(); return useAtomCallback( useCallback( async (get, _set, accountIndex) => { @@ -84,9 +86,10 @@ export function useFinishSignInCallback() { account, }); keyActions.switchAccount(accountIndex); + grantPermissionToDomain(appURL.origin); finalizeAuthResponse({ decodedAuthRequest, authRequest, authResponse }); }, - [decodedAuthRequest, authRequest, appIcon, appName, keyActions] + [decodedAuthRequest, authRequest, appIcon, appName, keyActions, grantPermissionToDomain] ) ); } diff --git a/src/inpage/inpage.ts b/src/inpage/inpage.ts index 0c1275ee992..3b626624d4d 100644 --- a/src/inpage/inpage.ts +++ b/src/inpage/inpage.ts @@ -118,16 +118,20 @@ const provider: StacksProvider = { }, async request(method: RpcMethodNames, params?: any[]): Promise { - return new Promise((resolve, _reject) => { + return new Promise((resolve, reject) => { const id = crypto.randomUUID(); - const event = new CustomEvent(DomEventName.rpcRequest, { - detail: { jsonrpc: '2.0', id, method, params }, - }); - document.dispatchEvent(event); + console.log('request'); + document.dispatchEvent( + new CustomEvent(DomEventName.rpcRequest, { + detail: { jsonrpc: '2.0', id, method, params }, + }) + ); + // @TODO: add RPC response type const handleMessage = (event: MessageEvent) => { if (event.data.id !== id) return; window.removeEventListener('message', handleMessage); - resolve(event.data); + if (event.data.error) reject(event.data.error); + resolve(event.data.result); }; window.addEventListener('message', handleMessage); }); diff --git a/src/shared/message-types.ts b/src/shared/message-types.ts index a81f65d87ef..ae408a6e335 100644 --- a/src/shared/message-types.ts +++ b/src/shared/message-types.ts @@ -61,7 +61,7 @@ export type RpcResponseArgs = RpcSuccessResponseArgs | RpcErrorResponseArgs; export enum RpcMethods { stx_requestAccounts, - stx_testAnotherMethod, + stx_signTransactionRequest, } export type RpcMethodNames = keyof typeof RpcMethods; @@ -73,9 +73,9 @@ interface RpcMessage { } type RequestAccounts = RpcMessage<'stx_requestAccounts'>; -type TestAction = RpcMessage<'stx_testAnotherMethod'>; +type SignTransactionRequest = RpcMessage<'stx_signTransactionRequest'>; -export type SupportedRpcMessages = RequestAccounts | TestAction; +export type SupportedRpcMessages = RequestAccounts | SignTransactionRequest; // // Deprecated methods