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:
parent
250141236b
commit
cd4d7ed6b1
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -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>
|
||||||
);
|
);
|
||||||
|
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user