with useEffect (#609)
This commit is contained in:
parent
cb8f873729
commit
261e357bd5
@ -1,7 +1,7 @@
|
|||||||
// Copyright 2019-2021 @polkadot/extension-ui authors & contributors
|
// Copyright 2019-2021 @polkadot/extension-ui authors & contributors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
import React, { useContext, useState } from 'react';
|
import React, { useCallback, useContext, useState } from 'react';
|
||||||
|
|
||||||
import { QrScanAddress } from '@polkadot/react-qr';
|
import { QrScanAddress } from '@polkadot/react-qr';
|
||||||
|
|
||||||
@ -10,13 +10,23 @@ import useTranslation from '../hooks/useTranslation';
|
|||||||
import { createAccountExternal } from '../messaging';
|
import { createAccountExternal } from '../messaging';
|
||||||
import { Header, Name } from '../partials';
|
import { Header, Name } from '../partials';
|
||||||
|
|
||||||
|
interface QrAccount {
|
||||||
|
content: string;
|
||||||
|
genesisHash: string;
|
||||||
|
name?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export default function ImportQr (): React.ReactElement {
|
export default function ImportQr (): React.ReactElement {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const onAction = useContext(ActionContext);
|
const onAction = useContext(ActionContext);
|
||||||
const [account, setAccount] = useState<null | { content: string; genesisHash: string }>(null);
|
const [account, setAccount] = useState<QrAccount | null>(null);
|
||||||
const [name, setName] = useState<string | null>(null);
|
const [name, setName] = useState<string | null>(null);
|
||||||
|
|
||||||
// FIXME Duplicated between here and Create.tsx
|
const _setAccount = useCallback((qrAccount: QrAccount) => {
|
||||||
|
setAccount(qrAccount);
|
||||||
|
setName(qrAccount?.name || null);
|
||||||
|
}, []);
|
||||||
|
|
||||||
const _onCreate = (): void => {
|
const _onCreate = (): void => {
|
||||||
if (account && name) {
|
if (account && name) {
|
||||||
createAccountExternal(name, account.content, account.genesisHash)
|
createAccountExternal(name, account.content, account.genesisHash)
|
||||||
@ -33,7 +43,7 @@ export default function ImportQr (): React.ReactElement {
|
|||||||
/>
|
/>
|
||||||
{!account && (
|
{!account && (
|
||||||
<div>
|
<div>
|
||||||
<QrScanAddress onScan={setAccount} />
|
<QrScanAddress onScan={_setAccount} />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{account && (
|
{account && (
|
||||||
@ -41,6 +51,7 @@ export default function ImportQr (): React.ReactElement {
|
|||||||
<div>
|
<div>
|
||||||
<Address
|
<Address
|
||||||
{...account}
|
{...account}
|
||||||
|
address={account.content}
|
||||||
isExternal={true}
|
isExternal={true}
|
||||||
name={name}
|
name={name}
|
||||||
/>
|
/>
|
||||||
@ -48,6 +59,7 @@ export default function ImportQr (): React.ReactElement {
|
|||||||
<Name
|
<Name
|
||||||
isFocused
|
isFocused
|
||||||
onChange={setName}
|
onChange={setName}
|
||||||
|
value={name || ''}
|
||||||
/>
|
/>
|
||||||
<VerticalSpace />
|
<VerticalSpace />
|
||||||
{name && (
|
{name && (
|
||||||
|
|||||||
@ -26,6 +26,12 @@ function ValidatedInput<T extends Record<string, unknown>> ({ className, compone
|
|||||||
const [validationResult, setValidationResult] = useState<Result<string>>(Result.ok(''));
|
const [validationResult, setValidationResult] = useState<Result<string>>(Result.ok(''));
|
||||||
const isMounted = useIsMounted();
|
const isMounted = useIsMounted();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (defaultValue) {
|
||||||
|
setValue(defaultValue);
|
||||||
|
}
|
||||||
|
}, [defaultValue]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// Do not show any error on first mount
|
// Do not show any error on first mount
|
||||||
if (!isMounted) {
|
if (!isMounted) {
|
||||||
|
|||||||
@ -14,15 +14,16 @@ interface Props {
|
|||||||
label?: string;
|
label?: string;
|
||||||
onBlur?: () => void;
|
onBlur?: () => void;
|
||||||
onChange: (name: string | null) => void;
|
onChange: (name: string | null) => void;
|
||||||
|
value?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function Name ({ address, className, isFocused, label, onBlur, onChange }: Props): React.ReactElement<Props> {
|
export default function Name ({ address, className, isFocused, label, onBlur, onChange, value }: Props): React.ReactElement<Props> {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { accounts } = useContext(AccountContext);
|
const { accounts } = useContext(AccountContext);
|
||||||
const isNameValid = useMemo(() => isNotShorterThan(3, t<string>('Account name is too short')), [t]);
|
const isNameValid = useMemo(() => isNotShorterThan(3, t<string>('Account name is too short')), [t]);
|
||||||
|
|
||||||
const account = accounts.find((account) => account.address === address);
|
const account = accounts.find((account) => account.address === address);
|
||||||
const startValue = account && account.name;
|
const startValue = value || account?.name;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ValidatedInput
|
<ValidatedInput
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user