From 753a89f38f2f5829bd18479bbf8236cfd422ef0c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 13 Jul 2018 13:01:26 +0200 Subject: [PATCH] Cleanup Identicon icon append (#151) * Cleanup Identicon icon append * Add SO link * Ooops, unused vars :( * Magic number --- .../src/IdentityIcon/appendIcon.spec.js | 33 ------------------- .../ui-react/src/IdentityIcon/appendIcon.ts | 21 ------------ packages/ui-react/src/IdentityIcon/index.tsx | 24 +++++++++++--- 3 files changed, 20 insertions(+), 58 deletions(-) delete mode 100644 packages/ui-react/src/IdentityIcon/appendIcon.spec.js delete mode 100644 packages/ui-react/src/IdentityIcon/appendIcon.ts diff --git a/packages/ui-react/src/IdentityIcon/appendIcon.spec.js b/packages/ui-react/src/IdentityIcon/appendIcon.spec.js deleted file mode 100644 index 25f549b502..0000000000 --- a/packages/ui-react/src/IdentityIcon/appendIcon.spec.js +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2017-2018 @polkadot/ui-react authors & contributors -// This software may be modified and distributed under the terms -// of the ISC license. See the LICENSE file for details. - -describe('autoFocus', () => { - let appendIcon; - let mockIdenticon; - let node; - - beforeEach(() => { - node = { - appendChild: jest.fn() - }; - - mockIdenticon = jest.fn(() => 'genIdentitycon'); - jest.mock('@polkadot/ui-identicon', () => mockIdenticon); - - appendIcon = require('./appendIcon').default; - }); - - it('generates & appends icon to the node', () => { - appendIcon('testAddr', 'testSize')(node); - - expect(node.appendChild).toHaveBeenCalledWith('genIdentitycon'); - expect(mockIdenticon).toHaveBeenCalledWith('testAddr', 'testSize'); - }); - - it('does not call identicon when no node', () => { - appendIcon('testAddr', 'testSize')(); - - expect(mockIdenticon).not.toHaveBeenCalled(); - }); -}); diff --git a/packages/ui-react/src/IdentityIcon/appendIcon.ts b/packages/ui-react/src/IdentityIcon/appendIcon.ts deleted file mode 100644 index 94563b9065..0000000000 --- a/packages/ui-react/src/IdentityIcon/appendIcon.ts +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017-2018 @polkadot/ui-react authors & contributors -// This software may be modified and distributed under the terms -// of the ISC license. See the LICENSE file for details. - -import identicon from '@polkadot/ui-identicon/index'; - -type NodeRefSet = (node: Element | null) => void; - -export default function appendIcon (address: string | Uint8Array, size: number): NodeRefSet { - return (node: Element | null): void => { - if (node) { - while (node.firstChild) { - node.removeChild(node.firstChild); - } - - node.appendChild( - identicon(address, size) - ); - } - }; -} diff --git a/packages/ui-react/src/IdentityIcon/index.tsx b/packages/ui-react/src/IdentityIcon/index.tsx index b47cad8d43..9a80c9c30e 100644 --- a/packages/ui-react/src/IdentityIcon/index.tsx +++ b/packages/ui-react/src/IdentityIcon/index.tsx @@ -7,24 +7,40 @@ import { BaseProps } from '../types'; import './IdentityIcon.css'; import React from 'react'; - -import appendIcon from './appendIcon'; +import identicon from '@polkadot/ui-identicon/index'; type Props = BaseProps & { size?: number, value: string | Uint8Array }; +const DEFAULT_SIZE = 64; + export default class IdentityIcon extends React.PureComponent { render () { - const { className, size = 64, style, value } = this.props; + const { className, style } = this.props; return (
); } + + appendIcon = (node: Element | null): void => { + const { size = DEFAULT_SIZE, value } = this.props; + + // https://stackoverflow.com/a/22966637 + if (node && node.parentNode) { + const cloned = node.cloneNode(false); + + cloned.appendChild( + identicon(value, size) + ); + + node.parentNode.replaceChild(cloned, node); + } + } }