// Copyright 2019-2026 @polkadot/extension-ui authors & contributors // SPDX-License-Identifier: Apache-2.0 import type { AccountJson } from '@polkadot/extension-base/background/types'; import type { HexString } from '@polkadot/util/types'; import React, { useCallback, useContext, useEffect, useMemo, useState } from 'react'; import { canDerive } from '@polkadot/extension-base/utils'; import { AccountContext, Address, Checkbox, Dropdown, Link, MenuDivider } from '../../components/index.js'; import { useGenesisHashOptions, useTranslation } from '../../hooks/index.js'; import { editAccount, tieAccount } from '../../messaging.js'; import { Name } from '../../partials/index.js'; import { styled } from '../../styled.js'; interface Props extends AccountJson { className?: string; parentName?: string; showVisibilityAction?: boolean; withCheckbox?: boolean; withMenu?: boolean } interface EditState { isEditing: boolean; toggleActions: number; } function Account ({ address, className, genesisHash, isExternal, isHardware, isHidden, name, parentName, showVisibilityAction, suri, type, withCheckbox = false, withMenu = true }: Props): React.ReactElement { const { t } = useTranslation(); const [{ isEditing, toggleActions }, setEditing] = useState({ isEditing: false, toggleActions: 0 }); const [editedName, setName] = useState(name); const [checked, setChecked] = useState(false); const genesisOptions = useGenesisHashOptions(); const { selectedAccounts = [], setSelectedAccounts } = useContext(AccountContext); const isSelected = useMemo(() => selectedAccounts?.includes(address) || false, [address, selectedAccounts]); useEffect(() => { setChecked(isSelected); }, [isSelected]); const _onCheckboxChange = useCallback(() => { const newList = selectedAccounts?.includes(address) ? selectedAccounts.filter((account) => account !== address) : [...selectedAccounts, address]; setSelectedAccounts && setSelectedAccounts(newList); }, [address, selectedAccounts, setSelectedAccounts]); const _onChangeGenesis = useCallback( (genesisHash?: HexString | null): void => { tieAccount(address, genesisHash ?? null) .catch(console.error); }, [address] ); const _toggleEdit = useCallback( (): void => setEditing(({ toggleActions }) => ({ isEditing: !isEditing, toggleActions: ++toggleActions })), [isEditing] ); const _saveChanges = useCallback( (): void => { editedName && editAccount(address, editedName) .catch(console.error); _toggleEdit(); }, [editedName, address, _toggleEdit] ); const _actions = useMemo(() => ( <> {t('Rename')} {!isExternal && canDerive(type) && ( {t('Derive New Account')} )} {!isExternal && ( {t('Export Account')} )} {t('Forget Account')} {!isHardware && ( <>
)} ), [_onChangeGenesis, _toggleEdit, address, genesisHash, genesisOptions, isExternal, isHardware, t, type]); return (
{withCheckbox && ( )}
{isEditing && ( )}
); } export default styled(Account)` .address { margin-bottom: 8px; } .editName { position: absolute; flex: 1; left: 70px; top: 10px; width: 350px; .danger { background-color: var(--bodyColor); margin-top: -13px; width: 330px; } input { height : 30px; width: 350px; } &.withParent { top: 16px } } .menuItem { border-radius: 8px; display: block; font-size: 15px; line-height: 20px; margin: 0; min-width: 13rem; padding: 4px 16px; .genesisSelection { margin: 0; } } `;