fix(wallet): reduce time to check for wallet running [main] (#4876)
This commit is contained in:
parent
ef4a740b91
commit
1c6a307bcd
@ -155,8 +155,7 @@ const ConnectDialogContainer = ({
|
||||
|
||||
const isDesktopWalletRunning = useIsWalletServiceRunning(
|
||||
walletUrl,
|
||||
connectors['jsonRpc'],
|
||||
appChainId
|
||||
connectors['jsonRpc']
|
||||
);
|
||||
|
||||
const snapStatus = useSnapStatus(
|
||||
|
||||
41
libs/wallet/src/use-is-wallet-service-running.spec.ts
Normal file
41
libs/wallet/src/use-is-wallet-service-running.spec.ts
Normal file
@ -0,0 +1,41 @@
|
||||
import { renderHook, waitFor } from '@testing-library/react';
|
||||
import { JsonRpcConnector } from './connectors';
|
||||
import { useIsWalletServiceRunning } from './use-is-wallet-service-running';
|
||||
|
||||
describe('useIsWalletServiceRunning', () => {
|
||||
it('returns true if wallet is running', async () => {
|
||||
const url = 'https://foo.bar.com';
|
||||
const connector = new JsonRpcConnector();
|
||||
const spyOnCheckCompat = jest
|
||||
.spyOn(connector, 'checkCompat')
|
||||
.mockResolvedValue(true);
|
||||
const { result } = renderHook(() =>
|
||||
useIsWalletServiceRunning(url, connector)
|
||||
);
|
||||
|
||||
expect(result.current).toBe(null);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(spyOnCheckCompat).toHaveBeenCalled();
|
||||
expect(result.current).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
it('returns false if wallet is not running', async () => {
|
||||
const url = 'https://foo.bar.com';
|
||||
const connector = new JsonRpcConnector();
|
||||
const spyOnCheckCompat = jest
|
||||
.spyOn(connector, 'checkCompat')
|
||||
.mockRejectedValue(false);
|
||||
const { result } = renderHook(() =>
|
||||
useIsWalletServiceRunning(url, connector)
|
||||
);
|
||||
|
||||
expect(result.current).toBe(null);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(spyOnCheckCompat).toHaveBeenCalled();
|
||||
expect(result.current).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
39
libs/wallet/src/use-is-wallet-service-running.ts
Normal file
39
libs/wallet/src/use-is-wallet-service-running.ts
Normal file
@ -0,0 +1,39 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import type { JsonRpcConnector } from './connectors';
|
||||
|
||||
export const useIsWalletServiceRunning = (
|
||||
url: string,
|
||||
connector: JsonRpcConnector | undefined
|
||||
) => {
|
||||
const [isRunning, setIsRunning] = useState<boolean | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
if (!connector) return;
|
||||
|
||||
if (url && url !== connector.url) {
|
||||
connector.url = url;
|
||||
}
|
||||
|
||||
const check = async () => {
|
||||
try {
|
||||
// we are not checking wallet compatibility here, only that the wallet is running
|
||||
await connector.checkCompat();
|
||||
setIsRunning(true);
|
||||
} catch {
|
||||
setIsRunning(false);
|
||||
}
|
||||
};
|
||||
|
||||
// check immediately
|
||||
check();
|
||||
|
||||
// check every second for quick feedback to the user
|
||||
const interval = setInterval(check, 1000);
|
||||
|
||||
return () => {
|
||||
clearInterval(interval);
|
||||
};
|
||||
}, [connector, url]);
|
||||
|
||||
return isRunning;
|
||||
};
|
||||
@ -1,47 +0,0 @@
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
import type { JsonRpcConnector } from './connectors';
|
||||
import { ClientErrors } from './connectors';
|
||||
|
||||
export const useIsWalletServiceRunning = (
|
||||
url: string,
|
||||
connector: JsonRpcConnector | undefined,
|
||||
appChainId: string
|
||||
) => {
|
||||
const [run, setRun] = useState<boolean | null>(null);
|
||||
|
||||
const checkState = useCallback(async () => {
|
||||
if (!connector) return false;
|
||||
|
||||
if (url && url !== connector.url) {
|
||||
connector.url = url;
|
||||
}
|
||||
|
||||
try {
|
||||
await connector.checkCompat();
|
||||
const chainIdResult = await connector.getChainId();
|
||||
if (chainIdResult.chainID !== appChainId) {
|
||||
throw ClientErrors.WRONG_NETWORK;
|
||||
}
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}, [connector, url, appChainId]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!connector) return;
|
||||
|
||||
let interval: NodeJS.Timeout;
|
||||
checkState().then((value) => {
|
||||
setRun(value);
|
||||
interval = setInterval(async () => {
|
||||
setRun(await checkState());
|
||||
}, 1000 * 10);
|
||||
});
|
||||
return () => {
|
||||
clearInterval(interval);
|
||||
};
|
||||
}, [checkState, connector]);
|
||||
|
||||
return run;
|
||||
};
|
||||
Loading…
Reference in New Issue
Block a user