1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00
metamask-extension/ui/components/app/desktop-enable-button/desktop-enable-button.component.js
João Tavares bde74756d3
Add extension desktop UI (#17748)
* feat: add desktop enable button component

This component will be added
to the experimental page. Users
will then be able to initialize
a desktop connection

* feat: add desktop pairing page

* feat: add desktop deep-linking shared lib

* test: add initial entries to render helper

Allow specifying initialEntries for
MemoryRouter. This change will allow
testing pages that use the useParam
hook.

* feat: add desktop error page

Error page for any desktop pairing
related issue

* feat: add desktop routes to route component

* feat: add enable desktop button to experimental tab

* feat: add desktop icon when paired in dev mode

* feat: disable ledger live control when desktop enabled

* feat: register desktop error actions on ui init

* fix: add missing code fencing

* chore: remove enable desktop rpc middleware

Now that we are adding the UI
there's no need for this rpc middleware
(as it was used to test desktop background
code)

* fix: display experimental tab for desktop
2023-02-23 16:39:48 +00:00

97 lines
3.1 KiB
JavaScript

import React, { useContext } from 'react';
import { useHistory } from 'react-router-dom';
import { useSelector, useDispatch } from 'react-redux';
import browser from 'webextension-polyfill';
import { PairingKeyStatus } from '@metamask/desktop/dist/types';
import { I18nContext } from '../../../contexts/i18n';
import Button from '../../ui/button';
import {
DESKTOP_ERROR_ROUTE,
DESKTOP_PAIRING_ROUTE,
} from '../../../helpers/constants/routes';
import { EXTENSION_ERROR_PAGE_TYPES } from '../../../../shared/constants/desktop';
import { getIsDesktopEnabled } from '../../../selectors';
import {
hideLoadingIndication,
showLoadingIndication,
setDesktopEnabled as setDesktopEnabledAction,
testDesktopConnection,
disableDesktop,
} from '../../../store/actions';
import { SECOND } from '../../../../shared/constants/time';
const DESKTOP_ERROR_DESKTOP_OUTDATED_ROUTE = `${DESKTOP_ERROR_ROUTE}/${EXTENSION_ERROR_PAGE_TYPES.DESKTOP_OUTDATED}`;
const DESKTOP_ERROR_EXTENSION_OUTDATED_ROUTE = `${DESKTOP_ERROR_ROUTE}/${EXTENSION_ERROR_PAGE_TYPES.EXTENSION_OUTDATED}`;
const DESKTOP_ERROR_NOT_FOUND_ROUTE = `${DESKTOP_ERROR_ROUTE}/${EXTENSION_ERROR_PAGE_TYPES.NOT_FOUND}`;
const DESKTOP_ERROR_PAIRING_KEY_NOT_MATCH_ROUTE = `${DESKTOP_ERROR_ROUTE}/${EXTENSION_ERROR_PAGE_TYPES.PAIRING_KEY_NOT_MATCH}`;
const SKIP_PAIRING_RESTART_DELAY = 2 * SECOND;
export default function DesktopEnableButton() {
const t = useContext(I18nContext);
const dispatch = useDispatch();
const history = useHistory();
const showLoader = () => dispatch(showLoadingIndication());
const hideLoader = () => dispatch(hideLoadingIndication());
const desktopEnabled = useSelector(getIsDesktopEnabled);
const setDesktopEnabled = (val) => dispatch(setDesktopEnabledAction(val));
const restart = () => dispatch(browser.runtime.reload());
const onClick = async () => {
if (desktopEnabled) {
await disableDesktop();
setDesktopEnabled(false);
return;
}
showLoader();
const testResult = await testDesktopConnection();
hideLoader();
if ([PairingKeyStatus.NO_MATCH].includes(testResult.pairingKeyCheck)) {
history.push(DESKTOP_ERROR_PAIRING_KEY_NOT_MATCH_ROUTE);
return;
}
if (!testResult.isConnected) {
history.push(DESKTOP_ERROR_NOT_FOUND_ROUTE);
return;
}
if (!testResult.versionCheck?.isExtensionVersionValid) {
history.push(DESKTOP_ERROR_EXTENSION_OUTDATED_ROUTE);
return;
}
if (!testResult.versionCheck?.isDesktopVersionValid) {
history.push(DESKTOP_ERROR_DESKTOP_OUTDATED_ROUTE);
return;
}
if (process.env.SKIP_OTP_PAIRING_FLOW) {
showLoader();
setDesktopEnabled(true);
// Wait for new state to persist before restarting
setTimeout(() => {
restart();
}, SKIP_PAIRING_RESTART_DELAY);
return;
}
history.push(DESKTOP_PAIRING_ROUTE);
};
return (
<Button
type="primary"
large
onClick={(event) => {
event.preventDefault();
onClick();
}}
>
{desktopEnabled ? t('desktopDisableButton') : t('desktopEnableButton')}
</Button>
);
}