From 05168c67717b2fdc713b95418758f7b5e3dd7b60 Mon Sep 17 00:00:00 2001 From: Andrejs Date: Wed, 3 Jul 2024 14:59:28 +0300 Subject: [PATCH] feat(tauri-app): switched signer from modal to /sign page --- src-tauri/tauri.conf.json | 2 +- src/components/appMenu/AppMenu.tsx | 8 +-- src/components/ledger/stageActionBar.tsx | 27 ++++---- src/containers/Search/ActionBarContainer.tsx | 45 +++++++------ .../Validators/ActionBarContainer.tsx | 5 -- src/containers/application/App.tsx | 24 ++++--- src/containers/application/SignerModal.tsx | 63 ------------------- src/contexts/signerClient.tsx | 10 +-- src/features/adviser/AdviserContainer.tsx | 4 +- src/features/passport/passports.redux.ts | 4 +- src/index.tsx | 32 +++++----- src/pages/Sign/Sign.tsx | 62 ++++++++++++++++++ src/pages/robot/SensePage.tsx | 2 +- src/redux/reducers/signer.ts | 23 +++++-- src/router.tsx | 3 + src/services/QueueManager/QueueManager.ts | 8 +-- .../channels/BroadcastChannelSender.ts | 2 +- src/services/ipfs/types.ts | 2 +- src/services/neuron/neuronApi.ts | 1 + src/utils/CybSignerClient.ts | 42 +++++++++++++ src/utils/offlineSigner.ts | 27 ++++---- src/utils/shareNavigation.ts | 9 +++ 22 files changed, 238 insertions(+), 167 deletions(-) delete mode 100644 src/containers/application/SignerModal.tsx create mode 100644 src/pages/Sign/Sign.tsx create mode 100644 src/utils/CybSignerClient.ts create mode 100644 src/utils/shareNavigation.ts diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 0141e405b..0d4730745 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -8,7 +8,7 @@ }, "package": { "productName": "cyb", - "version": "0.1.1" + "version": "0.1.2" }, "tauri": { "allowlist": { diff --git a/src/components/appMenu/AppMenu.tsx b/src/components/appMenu/AppMenu.tsx index 8157df1c5..ab4c781c8 100644 --- a/src/components/appMenu/AppMenu.tsx +++ b/src/components/appMenu/AppMenu.tsx @@ -1,10 +1,10 @@ -import { useEffect, useState } from 'react'; -import { v4 as uuidv4 } from 'uuid'; -import { useLocation, NavLink } from 'react-router-dom'; -import styles from './AppMenu.module.scss'; import { Pane } from '@cybercongress/gravity'; import cx from 'classnames'; +import { useEffect, useState } from 'react'; +import { NavLink, useLocation } from 'react-router-dom'; import { MenuItem, MenuItems } from 'src/containers/application/AppMenu'; +import { v4 as uuidv4 } from 'uuid'; +import styles from './AppMenu.module.scss'; interface Props { item: MenuItem | MenuItem['subItems'][0]; diff --git a/src/components/ledger/stageActionBar.tsx b/src/components/ledger/stageActionBar.tsx index 5c819b3d6..312efd53c 100644 --- a/src/components/ledger/stageActionBar.tsx +++ b/src/components/ledger/stageActionBar.tsx @@ -406,12 +406,12 @@ export function RewardsDelegators({ } interface ConnectAddressProps { - selectMethodFunc: (method: ConnectMethod) => void, - selectMethod: ConnectMethod | '', - selectNetwork: string, - connectAddress:() => void, - keplr: Option, - onClickBack: () => void, + selectMethodFunc: (method: ConnectMethod) => void; + selectMethod: ConnectMethod | ''; + selectNetwork: string; + connectAddress: () => void; + keplr: Option; + onClickBack: () => void; } export function ConnectAddress({ @@ -442,14 +442,13 @@ export function ConnectAddress({ )} {/* {(!keplr || window.__TAURI__) && ( */} - {( - selectMethodFunc('wallet')} - active={selectMethod === 'wallet'} - img={imgWallet} - text="wallet" - /> - )} + + selectMethodFunc('wallet')} + active={selectMethod === 'wallet'} + img={imgWallet} + text="wallet" + /> {/* {!keplr && !window.__TAURI__ && ( diff --git a/src/containers/Search/ActionBarContainer.tsx b/src/containers/Search/ActionBarContainer.tsx index b6a771fce..17e043817 100644 --- a/src/containers/Search/ActionBarContainer.tsx +++ b/src/containers/Search/ActionBarContainer.tsx @@ -1,27 +1,28 @@ /* eslint-disable */ +import { ActionBar, Pane } from '@cybercongress/gravity'; import React, { Component } from 'react'; -import { Pane, ActionBar } from '@cybercongress/gravity'; -import { connect } from 'react-redux'; +import { ConnectedProps, connect } from 'react-redux'; import { - TransactionSubmitted, + ActionBarContentText, + ButtonImgText, Confirmed, + Dots, StartStageSearchActionBar, TransactionError, - ActionBarContentText, - Dots, - ButtonImgText, + TransactionSubmitted, } from '../../components'; import { getTxs } from '../../utils/search/utils'; -import { LEDGER } from '../../utils/config'; import { PATTERN_IPFS_HASH } from 'src/constants/patterns'; -import { trimString } from '../../utils/utils'; +import { SenseApi } from 'src/contexts/backend/services/senseApi'; import withIpfsAndKeplr from 'src/hocs/withIpfsAndKeplr'; -import { DefaultAccount } from 'src/types/defaultAccount'; +import { setActionBarState } from 'src/redux/reducers/signer'; +import type { RootState } from 'src/redux/store'; import { BackgroundWorker } from 'src/services/backend/workers/background/worker'; -import { SenseApi } from 'src/contexts/backend/services/senseApi'; import { sendCyberlink } from 'src/services/neuron/neuronApi'; +import { LEDGER } from '../../utils/config'; +import { trimString } from '../../utils/utils'; const imgKeplr = require('../../image/keplr-icon.svg'); const imgLedger = require('../../image/ledger.svg'); @@ -40,9 +41,7 @@ const STAGE_IPFS_HASH = 3.1; const STAGE_KEPLR_APPROVE = 3.2; // generated -interface Props { - defaultAccount: DefaultAccount; - +interface Props extends ConnectedProps { textBtn?: string; placeholder?: string; rankLink?: string; @@ -59,7 +58,7 @@ class ActionBarContainer extends Component { constructor(props: Props) { super(props); this.state = { - stage: STAGE_INIT, + stage: this.props.actionBarState ?? STAGE_INIT, addressLocalStor: null, contentHash: '', txHeight: null, @@ -83,6 +82,7 @@ class ActionBarContainer extends Component { const { defaultAccount } = this.props; if (stage === STAGE_IPFS_HASH) { + debugger; if (toCid !== null && fromCid !== null) { this.generateTx(); } @@ -168,6 +168,7 @@ class ActionBarContainer extends Component { this.setState({ stage: STAGE_KEPLR_APPROVE, }); + this.props.setActionBarState(STAGE_KEPLR_APPROVE); if (signer && signingClient) { const { address } = (await signer.getAccounts())[0]; @@ -430,10 +431,14 @@ class ActionBarContainer extends Component { } } -const mapStateToProps = (store) => { - return { - defaultAccount: store.pocket.defaultAccount, - }; -}; +const connector = connect( + (state: RootState) => ({ + defaultAccount: state.pocket.defaultAccount, + actionBarState: state.signer.actionBarState, + }), + { setActionBarState } +); + +const ActionBarHOC = withIpfsAndKeplr(connector(ActionBarContainer)); -export default withIpfsAndKeplr(connect(mapStateToProps)(ActionBarContainer)); +export default ActionBarHOC; diff --git a/src/containers/Validators/ActionBarContainer.tsx b/src/containers/Validators/ActionBarContainer.tsx index 77ae03297..4ab4815a8 100644 --- a/src/containers/Validators/ActionBarContainer.tsx +++ b/src/containers/Validators/ActionBarContainer.tsx @@ -169,7 +169,6 @@ function ActionBarContainer({ const { signer, signingClient } = useSigningClient(); const { validators: validatorsAll } = useGetHeroes(); const queryClient = useQueryClient(); - const navigate = useNavigate(); const [stage, setStage] = useState(STAGE_INIT); const [txType, setTxType] = useState(null); const [errorMessage, setErrorMessage] = useState(null); @@ -361,10 +360,6 @@ function ActionBarContainer({ return false; }, [balance]); - const handleHistory = (to) => { - navigate(to); - }; - const amountChangeHandler = (values: string) => { setAmount(values); }; diff --git a/src/containers/application/App.tsx b/src/containers/application/App.tsx index a2d33f4dd..32bcd7585 100644 --- a/src/containers/application/App.tsx +++ b/src/containers/application/App.tsx @@ -1,5 +1,11 @@ import { useEffect } from 'react'; -import { Link, Outlet, matchPath, useLocation } from 'react-router-dom'; +import { + Link, + Outlet, + matchPath, + useLocation, + useNavigate, +} from 'react-router-dom'; import MainLayout from 'src/layouts/Main'; import { initPocket } from 'src/redux/features/pocket'; @@ -11,15 +17,14 @@ import { AdviserColors } from 'src/features/adviser/Adviser/Adviser'; import { useAdviser } from 'src/features/adviser/context'; import { getPassport } from 'src/features/passport/passports.redux'; import { routes } from 'src/routes'; -import AdviserContainer from '../../features/adviser/AdviserContainer'; import useSenseManager from 'src/features/sense/ui/useSenseManager'; import { useAppDispatch, useAppSelector } from 'src/redux/hooks'; -import styles from './styles.scss'; - -// eslint-disable-next-line unused-imports/no-unused-imports, @typescript-eslint/no-unused-vars import { initCyblog } from 'src/utils/logging/bootstrap'; -import SignerModal from './SignerModal'; +import { setNavigate } from 'src/utils/shareNavigation'; +import AdviserContainer from 'src/features/adviser/AdviserContainer'; + +import styles from './styles.scss'; export const PORTAL_ID = 'portal'; @@ -40,11 +45,16 @@ function App() { useSenseManager(); const { ipfsError } = useBackend(); + const navigate = useNavigate(); useEffect(() => { dispatch(initPocket()); }, []); + useEffect(() => { + setNavigate(navigate); + }, [navigate]); + useEffect(() => { if (!address || !queryClient) { return; @@ -111,8 +121,6 @@ function App() { {location.pathname !== '/' && } - - diff --git a/src/containers/application/SignerModal.tsx b/src/containers/application/SignerModal.tsx deleted file mode 100644 index dc50e6ed9..000000000 --- a/src/containers/application/SignerModal.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { ChangeEventHandler, useCallback, useState } from 'react'; -import { Button, Input } from 'src/components'; -import Modal from 'src/components/modal/Modal'; -import { useAppDispatch, useAppSelector } from 'src/redux/hooks'; -import { closeSignerModal } from 'src/redux/reducers/signer'; - -export default function SignerModal() { - const dispatch = useAppDispatch(); - const { - open: isOpen, - resolve, - reject, - } = useAppSelector((state) => state.signer); - const [memo, setMemo] = useState(''); - - const onMemoChange = useCallback>( - (event) => { - setMemo(event.target.value); - }, - [setMemo] - ); - - const onAdd = useCallback(() => { - if (!resolve) { - return; - } - - resolve({}); - }, [resolve]); - - const onDiscard = useCallback(() => { - if (!reject) { - return; - } - dispatch(closeSignerModal()); - reject(new Error('User rejected transaction')); - }, [dispatch, reject]); - - return ( - -
-

Confirm transaction

-
-

Memo (optional)

- -
-
- TxFee 0 Boot -
-
- - -
-
-
- ); -} diff --git a/src/contexts/signerClient.tsx b/src/contexts/signerClient.tsx index 45c567a1c..517d9b99a 100644 --- a/src/contexts/signerClient.tsx +++ b/src/contexts/signerClient.tsx @@ -15,6 +15,7 @@ import usePrevious from 'src/hooks/usePrevious'; import { addAddressPocket, setDefaultAccount } from 'src/redux/features/pocket'; import { useAppDispatch, useAppSelector } from 'src/redux/hooks'; import { Option } from 'src/types'; +import { CybSignerClient } from 'src/utils/CybSignerClient'; import configKeplr, { getKeplr } from 'src/utils/keplrUtils'; import { getOfflineSigner } from 'src/utils/offlineSigner'; import { accountsKeplr } from 'src/utils/utils'; @@ -24,18 +25,16 @@ import { accountsKeplr } from 'src/utils/utils'; // }; type SignerClientContextType = { - readonly signingClient: Option; + readonly signingClient: Option; readonly signer: Option; readonly signerReady: boolean; initSigner: () => void; setSigner(signer: Option): void; }; -async function createClient( - signer: OfflineSigner -): Promise { +async function createClient(signer: OfflineSigner): Promise { const options = { prefix: BECH32_PREFIX }; - const client = await SigningCyberClient.connectWithSigner( + const client = await CybSignerClient.connectWithSigner( RPC_URL, signer, options @@ -154,6 +153,7 @@ function SigningClientProvider({ children }: { children: React.ReactNode }) { setSigner(signer); setSigningClient(clientJs); + setSignerReady(true); console.log('Signing client init success'); } } catch (e) { diff --git a/src/features/adviser/AdviserContainer.tsx b/src/features/adviser/AdviserContainer.tsx index 0b1ea2abf..f60448537 100644 --- a/src/features/adviser/AdviserContainer.tsx +++ b/src/features/adviser/AdviserContainer.tsx @@ -1,8 +1,8 @@ +import { useEffect } from 'react'; import { useLocation } from 'react-router-dom'; import Adviser from './Adviser/Adviser'; -import { useAdviser } from './context'; import styles from './AdviserContainer.module.scss'; -import { useEffect } from 'react'; +import { useAdviser } from './context'; function AdviserContainer() { const { content, isOpen, setAdviser, setIsOpen, color } = useAdviser(); diff --git a/src/features/passport/passports.redux.ts b/src/features/passport/passports.redux.ts index f31c40b2b..61a3d5873 100644 --- a/src/features/passport/passports.redux.ts +++ b/src/features/passport/passports.redux.ts @@ -7,8 +7,8 @@ import { import { queryPassportContract } from 'src/services/soft.js/api/passport'; import { Citizenship } from 'src/types/citizenship'; import { CyberClient } from '@cybercongress/cyber-js'; -import { RootState } from 'src/redux/store'; -import { AppThunk } from 'src/redux/types'; +import type { RootState } from 'src/redux/store'; +import type { AppThunk } from 'src/redux/types'; import { selectCurrentAddress } from 'src/redux/features/pocket'; import { Accounts } from 'src/types/defaultAccount'; import { PASSPORT_NOT_EXISTS_ERROR } from './constants'; diff --git a/src/index.tsx b/src/index.tsx index 72d69b087..865cae666 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,48 +1,50 @@ +/* eslint-disable import/prefer-default-export */ +/* eslint-disable import/no-unused-modules */ // eslint-disable-next-line import/no-unused-modules import 'core-js/stable'; -import 'regenerator-runtime/runtime'; import { OperationDefinitionNode } from 'graphql'; +import 'regenerator-runtime/runtime'; import { createRoot } from 'react-dom/client'; import { ApolloClient, - InMemoryCache, - HttpLink, ApolloLink, - split, ApolloProvider, + HttpLink, + InMemoryCache, + split, } from '@apollo/client'; import { GraphQLWsLink } from '@apollo/client/link/subscriptions'; -import { createClient } from 'graphql-ws'; import { getMainDefinition } from '@apollo/client/utilities'; +import { createClient } from 'graphql-ws'; -import { QueryClientProvider, QueryClient } from '@tanstack/react-query'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; -import { Provider } from 'react-redux'; import { Helmet } from 'react-helmet'; -import AppRouter from './router'; +import { Provider } from 'react-redux'; import store from './redux/store'; +import AppRouter from './router'; -import './style/main.css'; -import './style/index.scss'; import './image/favicon.ico'; +import './style/index.scss'; +import './style/main.css'; // for bootloading import './image/robot.svg'; // import ErrorBoundary from './components/ErrorBoundary/ErrorBoundary'; -import SdkQueryClientProvider from './contexts/queryClient'; -import SigningClientProvider from './contexts/signerClient'; import DataProvider from './contexts/appData'; -import WebsocketsProvider from './websockets/context'; +import BackendProvider from './contexts/backend/backend'; import DeviceProvider from './contexts/device'; import IbcDenomProvider from './contexts/ibcDenom'; import NetworksProvider from './contexts/networks'; -import BackendProvider from './contexts/backend/backend'; +import SdkQueryClientProvider from './contexts/queryClient'; +import SigningClientProvider from './contexts/signerClient'; +import WebsocketsProvider from './websockets/context'; -import AdviserProvider from './features/adviser/context'; import HubProvider from './contexts/hub'; +import AdviserProvider from './features/adviser/context'; import { INDEX_HTTPS, INDEX_WEBSOCKET } from './constants/config'; diff --git a/src/pages/Sign/Sign.tsx b/src/pages/Sign/Sign.tsx new file mode 100644 index 000000000..19c5b9c50 --- /dev/null +++ b/src/pages/Sign/Sign.tsx @@ -0,0 +1,62 @@ +import { ChangeEventHandler, useCallback } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { ActionBar, Button, Input, MainContainer } from 'src/components'; +import { useAppDispatch, useAppSelector } from 'src/redux/hooks'; +import { resetSignerState, updateMemo } from 'src/redux/reducers/signer'; + +export default function Sign() { + const navigate = useNavigate(); + const dispatch = useAppDispatch(); + const { resolve, reject } = useAppSelector((state) => state.signer); + const memo = useAppSelector((state) => state.signer.memo); + + const onMemoChange = useCallback>( + (event) => { + dispatch(updateMemo(event.target.value)); + }, + [dispatch] + ); + + const onAdd = useCallback(() => { + if (!resolve) { + return; + } + + navigate(-1); + resolve({}); + }, [navigate, resolve]); + + const onDiscard = useCallback(() => { + if (!reject) { + return; + } + navigate(-1); + dispatch(resetSignerState()); + reject(new Error('User rejected transaction')); + }, [dispatch, navigate, reject]); + + return ( + <> + +
+

Confirm transaction

+
+

Memo (optional)

+ +
+
+ TxFee 0 Boot +
+
+
+ + + + + + ); +} diff --git a/src/pages/robot/SensePage.tsx b/src/pages/robot/SensePage.tsx index 8e0a404c7..7521defe0 100644 --- a/src/pages/robot/SensePage.tsx +++ b/src/pages/robot/SensePage.tsx @@ -1,7 +1,7 @@ import SenseRoutingWrapper from 'src/features/sense/ui/SenseRoutingWrapper'; -import { useRobotContext } from './robot.context'; import Taverna from 'src/containers/taverna'; import { useAppSelector } from 'src/redux/hooks'; +import { useRobotContext } from './robot.context'; function SensePage() { const { isOwner } = useRobotContext(); diff --git a/src/redux/reducers/signer.ts b/src/redux/reducers/signer.ts index 5e2bf8625..d51f9a7b7 100644 --- a/src/redux/reducers/signer.ts +++ b/src/redux/reducers/signer.ts @@ -4,30 +4,41 @@ type ResolveType = (value: any) => void; type RejectType = (reason?: any) => void; type InitialState = { - open: boolean; resolve?: ResolveType; reject?: RejectType; + actionBarState?: number; + memo: string; }; -const initialState = { open: false } as InitialState; +const initialState = { memo: '' } as InitialState; const signerSlice = createSlice({ name: 'signer', initialState, reducers: { - openSignerModal( + shareSignerPromise( state, { payload }: PayloadAction<{ resolve: ResolveType; reject: RejectType }> ) { - state.open = true; state.resolve = payload.resolve; state.reject = payload.reject; }, - closeSignerModal() { + resetSignerState() { return { ...initialState }; }, + setActionBarState(state, { payload }: PayloadAction) { + state.actionBarState = payload; + }, + updateMemo(state, { payload }: PayloadAction) { + state.memo = payload; + }, }, }); -export const { openSignerModal, closeSignerModal } = signerSlice.actions; +export const { + shareSignerPromise, + resetSignerState, + setActionBarState, + updateMemo, +} = signerSlice.actions; export default signerSlice.reducer; diff --git a/src/router.tsx b/src/router.tsx index 2f035169e..e1470414e 100644 --- a/src/router.tsx +++ b/src/router.tsx @@ -56,6 +56,7 @@ import ToOracleAsk from './pages/redirects/ToOracleAsk'; import Social from './pages/Social/Social'; import Brain from './pages/Brain/Brain'; import Settings from './pages/Settings/Settings'; +import Sign from './pages/Sign/Sign'; type WrappedRouterProps = { children: React.ReactNode; @@ -118,6 +119,8 @@ function AppRouter() { } /> } /> + } /> + } /> } /> diff --git a/src/services/QueueManager/QueueManager.ts b/src/services/QueueManager/QueueManager.ts index 916b6a127..4c964f6f3 100644 --- a/src/services/QueueManager/QueueManager.ts +++ b/src/services/QueueManager/QueueManager.ts @@ -46,9 +46,9 @@ function getQueueItemTotalPriority(item: QueueItem): number { return (item.priority || 0) + (item.viewPortPriority || 0); } -const debugCid = (cid: ParticleCid, prefix: string, ...args) => { - console.log(`>>> ${prefix}: ${cid}`, ...args); -}; +// const debugCid = (cid: ParticleCid, prefix: string, ...args) => { +// console.log(`>>> ${prefix}: ${cid}`, ...args); +// }; const strategies = { external: new QueueStrategy( @@ -178,7 +178,7 @@ class QueueManager { }); return res; } catch (e) { - // console.log('---promtoo', e); + console.log('---promtoo', e); throw e; } }).pipe( diff --git a/src/services/backend/channels/BroadcastChannelSender.ts b/src/services/backend/channels/BroadcastChannelSender.ts index eed45a0d4..9318be4b3 100644 --- a/src/services/backend/channels/BroadcastChannelSender.ts +++ b/src/services/backend/channels/BroadcastChannelSender.ts @@ -2,7 +2,7 @@ import { updateSenseList } from 'src/features/sense/redux/sense.redux'; import { setDefaultAccount } from 'src/redux/features/pocket'; import { Account } from 'src/types/defaultAccount'; import { SenseListItem } from '../types/sense'; -import { +import type { BroadcastChannelMessage, ServiceName, ServiceStatus, diff --git a/src/services/ipfs/types.ts b/src/services/ipfs/types.ts index b025f9357..bdb179e14 100644 --- a/src/services/ipfs/types.ts +++ b/src/services/ipfs/types.ts @@ -9,7 +9,7 @@ export enum IPFSNodes { HELIA = 'helia', } -type IpfsNodeType = 'embedded' | 'external' | 'helia'; +export type IpfsNodeType = 'embedded' | 'external' | 'helia'; export type IpfsFileStats = { type: 'file' | 'directory' | 'raw'; diff --git a/src/services/neuron/neuronApi.ts b/src/services/neuron/neuronApi.ts index 9d43f22ee..c02b4061a 100644 --- a/src/services/neuron/neuronApi.ts +++ b/src/services/neuron/neuronApi.ts @@ -27,6 +27,7 @@ export const sendCyberlink = async ( }, fee: StdFee = defaultFee ) => { + debugger; const response = await signingClient!.cyberlink(neuron, from, to, fee); const result = throwErrorOrResponse(response); diff --git a/src/utils/CybSignerClient.ts b/src/utils/CybSignerClient.ts new file mode 100644 index 000000000..8771166c2 --- /dev/null +++ b/src/utils/CybSignerClient.ts @@ -0,0 +1,42 @@ +import { OfflineSigner } from '@cosmjs/proto-signing'; +import { Tendermint34Client } from '@cosmjs/tendermint-rpc'; +import { + SigningCyberClient, + SigningCyberClientOptions, +} from '@cybercongress/cyber-js'; +import { + resetSignerState, + shareSignerPromise, +} from 'src/redux/reducers/signer'; +import store from 'src/redux/store'; +import { getNavigate } from './shareNavigation'; + +// eslint-disable-next-line import/no-unused-modules, import/prefer-default-export +export class CybSignerClient extends SigningCyberClient { + signAndBroadcast( + ...args: Parameters + ): Promise { + return new Promise((resolve, reject) => { + store.dispatch(shareSignerPromise({ resolve, reject })); + getNavigate()?.('/sign'); + }).then(({ memo }) => { + const [signerAddress, messages, fee] = args; + console.log('MEMO', memo, fee); + + return super + .signAndBroadcast(signerAddress, messages, fee, memo ?? '') + .finally(() => { + store.dispatch(resetSignerState()); + }); + }); + } + + public static async connectWithSigner( + endpoint: string, + signer: OfflineSigner, + options: SigningCyberClientOptions = {} + ): Promise { + const tmClient = await Tendermint34Client.connect(endpoint); + return new CybSignerClient(tmClient as any, signer, options); + } +} diff --git a/src/utils/offlineSigner.ts b/src/utils/offlineSigner.ts index e5496724e..aafe0ea2e 100644 --- a/src/utils/offlineSigner.ts +++ b/src/utils/offlineSigner.ts @@ -5,24 +5,21 @@ import { DirectSecp256k1HdWalletOptions, } from '@cosmjs/proto-signing/build/directsecp256k1hdwallet'; import { Bip39, EnglishMnemonic } from '@cosmjs/crypto'; -import { SignDoc } from '@keplr-wallet/types/build/cosmjs'; import defaultNetworks from 'src/constants/defaultNetworks'; -import { DirectSignResponse } from '@cosmjs/proto-signing/build/signer'; -import store from 'src/redux/store'; -import { closeSignerModal, openSignerModal } from 'src/redux/reducers/signer'; export class CybOfflineSigner extends DirectSecp256k1HdWallet { - public async signDirect( - signerAddress: string, - signDoc: SignDoc - ): Promise { - return new Promise((resolve, reject) => { - store.dispatch(openSignerModal({ resolve, reject })); - }).then(() => { - store.dispatch(closeSignerModal()); - return super.signDirect(signerAddress, signDoc); - }); - } + // public async signDirect( + // signerAddress: string, + // signDoc: SignDoc + // ): Promise { + // return new Promise((resolve, reject) => { + // store.dispatch(shareSignerPromise({ resolve, reject })); + // getNavigate()?.('/sign'); + // }).then(() => { + // store.dispatch(resetSignerState()); + // return super.signDirect(signerAddress, signDoc); + // }); + // } public static async fromMnemonic( mnemonic: string, diff --git a/src/utils/shareNavigation.ts b/src/utils/shareNavigation.ts new file mode 100644 index 000000000..440a2f65d --- /dev/null +++ b/src/utils/shareNavigation.ts @@ -0,0 +1,9 @@ +import type { NavigateFunction } from 'react-router-dom'; + +let navigate: NavigateFunction; + +export const setNavigate = (nav: NavigateFunction) => { + navigate = nav; +}; + +export const getNavigate = () => navigate;