Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Redesign #203

Merged
merged 50 commits into from Dec 20, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
5602593
Inject theme using styled-components' ThemeProvider (#3)
vanruch Nov 6, 2019
e4ed058
Apply colors from design, styles refactoring (#5)
vanruch Nov 7, 2019
234a2df
Add new tip and accounts screen without accounts (#7)
Nov 7, 2019
af63cc1
Sync with upstream (#10)
vanruch Nov 7, 2019
c53848a
Use Nunito font (#11)
vanruch Nov 8, 2019
faf2fc0
Create account first page (#14)
vanruch Nov 12, 2019
aae4c0a
Customizable identicon (#13)
vanruch Nov 14, 2019
ca69343
Inline buttons (#16)
vanruch Nov 14, 2019
8c35730
Welcome screen styling (#17)
vanruch Nov 14, 2019
78eaf61
Account creation second step (#15)
vanruch Nov 14, 2019
93feed9
Add new header (#20)
Nov 18, 2019
de45181
change welcome screen (#19)
Nov 18, 2019
d09385f
Account screen (#18)
vanruch Nov 18, 2019
ffe7a8b
Update from upstream (#21)
vanruch Nov 18, 2019
6991bb0
Merge branch 'master' of github.com:polkadot-js/extension
vanruch Nov 18, 2019
8867730
Window title (#25)
vanruch Nov 19, 2019
7cff693
New authorize (#24)
Nov 19, 2019
84ed50d
Refactor and remove unnecessary stuff from theme (#22)
vanruch Nov 19, 2019
5a88ceb
refactor add accounts screen (#29)
Nov 21, 2019
e3f8758
Export and forget screens, change general padding to 24px (#27)
vanruch Nov 21, 2019
d9d84fe
Signing screen (#26)
vanruch Nov 22, 2019
b440f9a
Import account screens (#31)
vanruch Nov 22, 2019
1a3b630
Change header with settings (#28)
Nov 25, 2019
a1f7c32
Refactor button and mnemonic (#30)
Nov 25, 2019
bf806e8
Restyle checkbox (#33)
vanruch Nov 25, 2019
23044a6
Remove opacity from background; add borders (#32)
vanruch Nov 25, 2019
6e1eaac
Code style polishing (#34)
vanruch Nov 25, 2019
cfe5c54
Move fileMock to __mocks__ (#35)
vanruch Nov 25, 2019
01d3acf
Add light theme (#36)
vanruch Nov 28, 2019
9cf64a5
Small design changes (#38)
vanruch Nov 28, 2019
60913ba
Change background color (#39)
vanruch Nov 29, 2019
790fe88
Sync with upstream (#41)
vanruch Nov 29, 2019
03b1623
Update screenshots in readme
vanruch Nov 29, 2019
f8053b9
Merge branch 'master' of github.com:polkadot-js/extension
vanruch Nov 29, 2019
000aee0
[CI Skip] 0.14.0-beta.7
actions-user Nov 29, 2019
937a253
fix error for display menu (#42)
Dec 4, 2019
5fb4744
fix display of authorization (#43)
Dec 4, 2019
950a554
firefox scrol (#45)
Dec 6, 2019
6aac0fb
small change for rename account (#44)
Dec 6, 2019
0f28eef
Merge remote-tracking branch 'upstream/master'
vanruch Dec 9, 2019
853d7b1
Sync with upstream
vanruch Dec 9, 2019
3c2345f
Print and back button (#48)
Dec 11, 2019
4ae316b
Set body color (#49)
Dec 11, 2019
67eff12
Fix the fix of account rename (#52)
vanruch Dec 12, 2019
bcb4076
Update generic sign screen (#47)
vanruch Dec 12, 2019
9236015
Improve UI/UX design (#53)
Dec 18, 2019
dc1ad62
[CI Skip] 0.14.0-beta.10
actions-user Dec 18, 2019
a065fc8
Merge remote-tracking branch 'upstream/master'
vanruch Dec 18, 2019
5488103
Improve QR code recognition on dark theme (#54)
vanruch Dec 18, 2019
b06f289
Add proper tx/sign texts and headers (#55)
Dec 19, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -15,7 +15,7 @@ As it stands, it does one thing: it _only_ manages accounts and allows the signi
- On Chrome, install via [Chrome web store](https://chrome.google.com/webstore/detail/polkadot%7Bjs%7D-extension/mopnmbcafieddcagagdcbnhejhlodfdd)
- On Firefox, install via [Firefox add-ons](https://addons.mozilla.org/en-US/firefox/addon/polkadot-js-extension/)

![interface screenshots](docs/concat-overview.jpg)
![interface screenshots](docs/concat-overview.png)

## FAQ

Expand Down
2 changes: 2 additions & 0 deletions __mocks__/fileMock.js
@@ -0,0 +1,2 @@
// eslint-disable-line
module.exports = '';
Binary file removed docs/concat-overview.jpg
Binary file not shown.
Binary file added docs/concat-overview.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion jest.config.js
Expand Up @@ -6,7 +6,7 @@ module.exports = Object.assign({}, config, {
moduleNameMapper: {
'@polkadot/extension-(chains|dapp|inject|ui)(.*)$': '<rootDir>/packages/extension-$1/src/$2',
'@polkadot/extension(.*)$': '<rootDir>/packages/extension/src/$1',
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': 'empty/object',
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/__mocks__/fileMock.js',
'\\.(css|less)$': 'empty/object'
},
modulePathIgnorePatterns: [
Expand Down
30 changes: 18 additions & 12 deletions packages/extension-ui/src/Popup/Accounts/Account.test.tsx
Expand Up @@ -4,39 +4,45 @@

import Adapter from 'enzyme-adapter-react-16';
import { configure, mount, ReactWrapper } from 'enzyme';
import { Link } from '@polkadot/extension-ui/components';
import { themes, Theme } from '@polkadot/extension-ui/components';
import { MemoryRouter } from 'react-router';
import React from 'react';

import Account from './Account';
import { ThemeProvider } from 'styled-components';

configure({ adapter: new Adapter() });

describe('Account component', () => {
let wrapper: ReactWrapper;
const VALID_ADDRESS = 'HjoBp62cvsWDA3vtNMWxz6c9q13ReEHi9UGHK7JbZweH5g5';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const mountAccountComponent = (additionalAccountProperties: any): ReactWrapper => mount(
const mountAccountComponent = (additionalAccountProperties: any, theme: Theme = themes.dark): ReactWrapper => mount(
<MemoryRouter>
<Account
{...{ address: VALID_ADDRESS, ...additionalAccountProperties }}>
</Account>
<ThemeProvider theme={theme}>
<Account
{...{ address: VALID_ADDRESS, ...additionalAccountProperties }}
>
</Account>
</ThemeProvider>
</MemoryRouter>);

it('shows Export option if account is not external', () => {
wrapper = mountAccountComponent({ isExternal: false });
wrapper.find('Details').simulate('click');

expect(wrapper.find(Link).length).toBe(3);
expect(wrapper.find(Link).at(0).text()).toContain('Forget');
expect(wrapper.find(Link).at(1).text()).toContain('Export');
expect(wrapper.find(Link).at(2).text()).toContain('Edit');
expect(wrapper.find('MenuItem').length).toBe(3);
expect(wrapper.find('MenuItem').at(0).text()).toBe('Rename');
expect(wrapper.find('MenuItem').at(1).text()).toBe('Export Account');
expect(wrapper.find('MenuItem').at(2).text()).toBe('Forget Account');
});

it('does not show Export option if account is external', () => {
wrapper = mountAccountComponent({ isExternal: true });
wrapper.find('Details').simulate('click');

expect(wrapper.find(Link).length).toBe(2);
expect(wrapper.find(Link).at(0).text()).toContain('Forget');
expect(wrapper.find(Link).at(1).text()).toContain('Edit');
expect(wrapper.find('MenuItem').length).toBe(2);
expect(wrapper.find('MenuItem').at(0).text()).toBe('Rename');
expect(wrapper.find('MenuItem').at(1).text()).toBe('Forget Account');
});
});
79 changes: 52 additions & 27 deletions packages/extension-ui/src/Popup/Accounts/Account.tsx
Expand Up @@ -7,7 +7,7 @@ import { AccountJson } from '@polkadot/extension/background/types';
import React, { useContext, useState } from 'react';
import styled from 'styled-components';

import { ActionBar, ActionContext, Address, Link } from '../../components';
import { ActionContext, Address, Link } from '../../components';
import { editAccount } from '../../messaging';
import { Name } from '../../partials';

Expand All @@ -33,37 +33,62 @@ function Account ({ address, className, isExternal }: Props): React.ReactElement
};

return (
<Address
address={address}
className={className}
name={editedName}
>
{isEditing && (
<Name
address={address}
className='edit-name'
isFocussed
label={null}
onBlur={_saveChanges}
onChange={setName}
/>
)}
<ActionBar>
<div>
<Link isDanger to={`/account/forget/${address}`}>Forget</Link>
{!isExternal && <Link to={`/account/export/${address}`}>Export</Link>}
</div>
<Link onClick={_toggleEdit}>Edit</Link>
</ActionBar>
</Address>
<div className={className}>
<Address
address={address}
name={editedName}
actions={(
<>
<MenuGroup>
<MenuItem onClick={_toggleEdit}>Rename</MenuItem>
</MenuGroup>
{!isExternal && <MenuItem isDanger to={`/account/export/${address}`}>Export Account</MenuItem>}
<MenuItem isDanger to={`/account/forget/${address}`}>Forget Account</MenuItem>
</>
)}
>
{isEditing && (
<Name
address={address}
className='edit-name'
isFocussed
label={' '}
onBlur={_saveChanges}
onChange={setName}
/>
)}
</Address>
</div>
);
}

const MenuGroup = styled.div`
padding-bottom: 16px;
margin-bottom: 16px;
border-bottom: 1px solid ${({ theme }): string => theme.boxBorderColor};
`;

const MenuItem = styled(Link)`
padding: 4px 16px;
display: block;
border-radius: 8px;
font-weight: 600;
font-size: 15px;
line-height: 20px;
`;

MenuItem.displayName = 'MenuItem';

export default styled(Account)`
${Address} {
margin-bottom: 8px;
}

.edit-name {
left: 3rem;
position: absolute;
right: 0.75rem;
top: -0.5rem;
flex: 1;
left: 80px;
top: 6px;
width: 315px;
}
`;
98 changes: 70 additions & 28 deletions packages/extension-ui/src/Popup/Accounts/index.tsx
Expand Up @@ -3,46 +3,88 @@
// of the Apache-2.0 license. See the LICENSE file for details.

import React, { useContext } from 'react';
import QrImage from '../../assets/qr.svg';

import { AccountContext, Button, Header, Link, MediaContext, Tip } from '../../components';
import {
AccountContext,
Button,
Header,
MediaContext,
AddAccount,
ButtonArea,
Svg,
ButtonWithSubtitle
} from '../../components';
import Account from './Account';
import styled from 'styled-components';

type Props = {};

export default function Accounts (): React.ReactElement<Props> {
const accounts = useContext(AccountContext);
const mediaAllowed = useContext(MediaContext);

return (
<div>
<Header
label='accounts'
labelExtra={<Link to='/settings'>Options</Link>}
/>
<>
{
(accounts.length === 0)
? <Tip header='add accounts' type='warn'>You currently don&apos;t have any accounts. Either create a new account or if you have an existing account you wish to use, import it with the seed phrase</Tip>
: accounts.map((json, index): React.ReactNode => (
<Account
{...json}
key={`${index}:${json.address}`}
/>
))
? <AddAccount />
: (
<>
<Header showSettings text={'Accounts'} />
<AccountsArea>
<>
{
accounts.map((json, index): React.ReactNode => (
<Account
{...json}
key={`${index}:${json.address}`}
/>
))
}
</>
</AccountsArea>
</>
)
}
<Button
label='I want to create a new account with a new seed'
to='/account/create'
/>
<Button
label='I have a pre-existing seed, import the account'
to='/account/import-seed'
/>
{mediaAllowed && (
<Button
label='I have an external account, add it via QR'
to='/account/import-qr'
<ButtonArea>
<ButtonWithSubtitle
to='/account/create'
title='Create New Account'
subTitle='With new seed'
/>
<ButtonWithSubtitle
to='/account/import-seed'
title='Import an Account'
subTitle='I have a pre-existing seed'
/>
)}
</div>
{mediaAllowed && (
<QrButton to='/account/import-qr'>
<Svg src={QrImage} />
</QrButton>
)}
</ButtonArea>
</>
);
}

const QrButton = styled(Button)`
width: 60px;

${Svg} {
width: 20px;
height: 20px;
background: ${({ theme }): string => theme.buttonTextColor};
}
`;

const AccountsArea = styled.div`
height: 100%;
overflow-y: scroll;
margin-top: -25px;
padding-top: 25px;
scrollbar-width: none;

&::-webkit-scrollbar {
display: none;
}
`;
49 changes: 49 additions & 0 deletions packages/extension-ui/src/Popup/Authorize/Authorize.test.tsx
@@ -0,0 +1,49 @@
// Copyright 2019 @polkadot/extension-ui authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.

import React from 'react';
import Adapter from 'enzyme-adapter-react-16';

import { ThemeProvider } from 'styled-components';
import { AuthorizeContext, themes, Header, Icon } from '@polkadot/extension-ui/components';
import Authorize from '.';
import { configure, mount, ReactWrapper } from 'enzyme';
import { AuthorizeRequest } from '@polkadot/extension/background/types';
import Request from './Request';

configure({ adapter: new Adapter() });

describe('Authorize', () => {
const mountAuthorize = (authorizeRequests: AuthorizeRequest[] = []): ReactWrapper => mount(
<AuthorizeContext.Provider value={authorizeRequests}>
<ThemeProvider theme={themes.dark}>
<Authorize />
</ThemeProvider>
</AuthorizeContext.Provider>);

it('render component', () => {
const wrapper = mountAuthorize();

expect(wrapper.find(Header).text()).toBe('Authorize');
expect(wrapper.find(Request).length).toBe(0);
});

it('render requests', () => {
const wrapper = mountAuthorize([{ id: '1', request: { origin: '???' }, url: 'http://polkadot.org' }]);

expect(wrapper.find(Request).length).toBe(1);
expect(wrapper.find(Request).find('.tab-info').text()).toBe('An application, self-identifying as ??? is requesting access from http://polkadot.org.');
});

it('render more request but just one accept button', () => {
const wrapper = mountAuthorize([
{ id: '1', request: { origin: '???' }, url: 'http://polkadot.org' },
{ id: '2', request: { origin: 'abc' }, url: 'http://polkadot.pl' }
]);

expect(wrapper.find('AcceptButton').length).toBe(1);
expect(wrapper.find(Icon).length).toBe(2);
expect(wrapper.find(Request).at(1).find('.tab-info').text()).toBe('An application, self-identifying as abc is requesting access from http://polkadot.pl.');
});
});