1
0
mirror of https://github.com/trezor/trezor-wallet synced 2025-07-16 11:38:19 +00:00

Show loader after 'Acquire Device' button is clicked and is waiting for acquire

This commit is contained in:
Vasek Mlejnsky 2018-08-02 15:19:26 +02:00
parent 250141236b
commit cd4d7ed6b1
5 changed files with 72 additions and 25 deletions

View File

@ -3,14 +3,22 @@
import React from 'react'; import React from 'react';
export default (props: { size: string, label?: string }): React$Element<string> => { type Props = {
size: string,
label?: string,
className?: string,
};
export default (props: Props): React$Element<string> => {
const className = props.className ? `loader-circle ${props.className}` : 'loader-circle';
const style = { const style = {
width: `${props.size}px`, width: `${props.size}px`,
height: `${props.size}px`, height: `${props.size}px`,
}; }
return ( return (
<div className="loader-circle" style={style}> <div className={ className } style={ style }>
<p>{ props.label }</p> <p>{ props.label }</p>
<svg className="circular" viewBox="25 25 50 50"> <svg className="circular" viewBox="25 25 50 50">
<circle className="route" cx="50" cy="50" r="20" fill="none" stroke="" strokeWidth="1" strokeMiterlimit="10" /> <circle className="route" cx="50" cy="50" r="20" fill="none" stroke="" strokeWidth="1" strokeMiterlimit="10" />
@ -18,4 +26,4 @@ export default (props: { size: string, label?: string }): React$Element<string>
</svg> </svg>
</div> </div>
); );
}; };

View File

@ -5,6 +5,8 @@ import React from 'react';
import { bindActionCreators } from 'redux'; import { bindActionCreators } from 'redux';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import Loader from '../common/LoaderCircle';
import * as NOTIFICATION from '~/js/actions/constants/notification'; import * as NOTIFICATION from '~/js/actions/constants/notification';
import * as NotificationActions from '~/js/actions/NotificationActions'; import * as NotificationActions from '~/js/actions/NotificationActions';
import type { Action, State, Dispatch } from '~/flowtype'; import type { Action, State, Dispatch } from '~/flowtype';
@ -21,7 +23,8 @@ type NProps = {
title: string; title: string;
message?: string; message?: string;
actions?: Array<any>; actions?: Array<any>;
close?: typeof NotificationActions.close close?: typeof NotificationActions.close,
loading?: boolean;
} }
export const Notification = (props: NProps): React$Element<string> => { export const Notification = (props: NProps): React$Element<string> => {
@ -48,6 +51,11 @@ export const Notification = (props: NProps): React$Element<string> => {
{ actionButtons } { actionButtons }
</div> </div>
) : null } ) : null }
{ props.loading ? (
<Loader
className="info"
size="50" />
) : null }
</div> </div>
); );

View File

@ -23,16 +23,32 @@ const Acquire = (props: Props) => {
}, },
}, },
]; ];
const acquireDeviceAction = {
label: 'Acquire device',
callback: () => {
props.acquireDevice()
}
};
return ( return (
<section className="acquire"> <section className="acquire">
<Notification {props.acquiring ? (
title="Device is used in other window" <Notification
message="Do you want to use your device in this window?" title="Device is being acquired"
className="info" message="Please wait"
cancelable={false} className="loading"
actions={actions} cancelable={false}
/> loading={true}
/>
) : (
<Notification
title="Device is used in other window"
message="Do you want to use your device in this window?"
className="info"
cancelable={ false }
actions={ [acquireDeviceAction] }
/>
)}
</section> </section>
); );
}; };

View File

@ -15,18 +15,18 @@
} }
.circular { .circular {
width: 100%; width: 100%;
height: 100%; height: 100%;
animation: rotate 2s linear infinite; animation: rotate 2s linear infinite;
transform-origin: center center; transform-origin: center center;
position: absolute; position: absolute;
.route { .route {
stroke: @color_gray_light; stroke: @color_gray_light;
} }
.path { .path {
stroke-dasharray: 1, 200; stroke-dasharray: 1, 200;
stroke-dashoffset: 0; stroke-dashoffset: 0;
@ -34,15 +34,15 @@
stroke-linecap: round; stroke-linecap: round;
} }
} }
}
@keyframes rotate { &.info {
100% { .path {
transform: rotate(360deg); animation: dash 1.5s ease-in-out infinite, colorInfo 6s ease-in-out infinite;
}
} }
} }
@keyframes dash { @keyframes dash {
0% { 0% {
stroke-dasharray: 1, 200; stroke-dasharray: 1, 200;
stroke-dashoffset: 0; stroke-dashoffset: 0;
@ -57,7 +57,7 @@
} }
} }
@keyframes color { @keyframes color {
100%, 0% { 100%, 0% {
stroke: @color_green_primary; stroke: @color_green_primary;
} }
@ -70,4 +70,19 @@
80%, 90% { 80%, 90% {
stroke: @color_green_tertiary; stroke: @color_green_tertiary;
} }
} }
@keyframes colorInfo {
100%, 0% {
stroke: @color_info_primary;
}
40% {
stroke: @color_info_primary;
}
66% {
stroke: @color_info_primary;
}
80%, 90% {
stroke: @color_info_primary;
}
}

View File

@ -40,7 +40,7 @@
h2 { h2 {
font-size: 14px; font-size: 14px;
font-weight: bold; font-weight: bold;
padding: 0px; padding: 0px;
&:before { &:before {
.icomoon-info; .icomoon-info;
@ -68,7 +68,7 @@
} }
} }
&.success { &.success {
color: @color_success_primary; color: @color_success_primary;