mirror of
https://github.com/status-im/MyCrypto.git
synced 2025-01-31 13:25:29 +00:00
aa0f9cd455
* Frameless Electron. Separate electron template. Generecize navigation link. Move nav info to config. * Add controls for language and node, network status to sidebar. * Sticky headers * Move custom node modal into standalone component. Render modals via portal. Add custom node modal opening to electron node list. * Conditional styling based on environment. * Fix active node highlight * Add frame back in, draggable only on OSX, fix sidebar scroll. * Remove panel content after delay. * Adjust window sizes * Style desktop help nav icon * Remove unused var * Move style to param * Remove unused * Update snapshot * Fix oversized stretching, zindex fighting * Make electron work better with various screen sizes * Remove not-working https option for electron * Add beta banner * Fix web footer * Address changes
207 lines
5.2 KiB
TypeScript
207 lines
5.2 KiB
TypeScript
import React from 'react';
|
|
import { connect } from 'react-redux';
|
|
import translate from 'translations';
|
|
import Stepper from 'react-stepper-horizontal';
|
|
import { showNotification, TShowNotification } from 'actions/notifications';
|
|
import { AppState } from 'reducers';
|
|
import Modal, { IButton } from 'components/ui/Modal';
|
|
import './index.scss';
|
|
import {
|
|
startOnboardSession,
|
|
TStartOnboardSession,
|
|
decrementSlide,
|
|
TDecrementSlide,
|
|
incrementSlide,
|
|
TIncrementSlide,
|
|
resumeSlide,
|
|
TResumeSlide
|
|
} from 'actions/onboardStatus';
|
|
import {
|
|
WelcomeSlide,
|
|
NotABankSlide,
|
|
InterfaceSlide,
|
|
BlockchainSlide,
|
|
WhySlide,
|
|
WhyMyCrypto,
|
|
SecureSlideOne,
|
|
SecureSlideTwo,
|
|
SecureSlideThree,
|
|
FinalSlide
|
|
} from './components';
|
|
|
|
const ONBOARD_LOCAL_STORAGE_KEY = 'onboardStatus';
|
|
const NUMBER_OF_SLIDES = 10;
|
|
|
|
interface State {
|
|
isOpen: boolean;
|
|
}
|
|
|
|
interface Props {
|
|
sessionStarted: boolean;
|
|
slideNumber: number;
|
|
startOnboardSession: TStartOnboardSession;
|
|
resumeSlide: TResumeSlide;
|
|
decrementSlide: TDecrementSlide;
|
|
incrementSlide: TIncrementSlide;
|
|
showNotification: TShowNotification;
|
|
}
|
|
|
|
class OnboardModal extends React.Component<Props, State> {
|
|
private modal: Modal | null = null;
|
|
|
|
constructor(props: Props) {
|
|
super(props);
|
|
this.state = {
|
|
isOpen: false
|
|
};
|
|
}
|
|
|
|
public componentDidMount() {
|
|
const { sessionStarted } = this.props;
|
|
|
|
const currentSlide = Number(localStorage.getItem(ONBOARD_LOCAL_STORAGE_KEY)) || 0;
|
|
|
|
if (!sessionStarted) {
|
|
this.props.startOnboardSession();
|
|
if (currentSlide === 0) {
|
|
this.setState({
|
|
isOpen: true
|
|
});
|
|
}
|
|
if (currentSlide > 0 && currentSlide < NUMBER_OF_SLIDES) {
|
|
this.props.resumeSlide(currentSlide);
|
|
this.setState({
|
|
isOpen: true
|
|
});
|
|
|
|
const onboardResumeMessage = translate('ONBOARD_RESUME');
|
|
|
|
// Wait a sec so it doesn't get lost in the page-load
|
|
setTimeout(() => {
|
|
this.props.showNotification('info', onboardResumeMessage, 6000);
|
|
}, 1200);
|
|
}
|
|
}
|
|
}
|
|
|
|
public render() {
|
|
const { isOpen } = this.state;
|
|
const { slideNumber } = this.props;
|
|
|
|
const firstButtons: IButton[] = [
|
|
{
|
|
disabled: slideNumber === NUMBER_OF_SLIDES,
|
|
text: translate('ACTION_6'),
|
|
type: 'primary',
|
|
onClick: this.handleNextSlide
|
|
},
|
|
{
|
|
disabled: slideNumber === 1,
|
|
text: translate('ACTION_4'),
|
|
type: 'default',
|
|
onClick: this.handlePreviousSlide
|
|
}
|
|
];
|
|
const lastButtons: IButton[] = [
|
|
{
|
|
text: translate('ACTION_10'),
|
|
type: 'primary',
|
|
onClick: this.closeModal
|
|
},
|
|
{
|
|
text: translate('ACTION_4'),
|
|
type: 'default',
|
|
onClick: this.handlePreviousSlide
|
|
}
|
|
];
|
|
|
|
const buttons = slideNumber === NUMBER_OF_SLIDES ? lastButtons : firstButtons;
|
|
const steps = new Array(NUMBER_OF_SLIDES).fill({});
|
|
|
|
return (
|
|
<div className="OnboardModal">
|
|
<Modal
|
|
isOpen={isOpen}
|
|
buttons={buttons}
|
|
maxWidth={800}
|
|
handleClose={() => (slideNumber === NUMBER_OF_SLIDES ? this.closeModal : null)}
|
|
>
|
|
<div className="OnboardModal-stepper">
|
|
<Stepper
|
|
steps={steps}
|
|
activeColor="#0e97c0"
|
|
activeStep={slideNumber - 1}
|
|
completeColor="#0e97c0"
|
|
circleTop={1}
|
|
/>
|
|
</div>
|
|
<div className="OnboardModal-onboardSlide">{this.renderSlide()}</div>
|
|
</Modal>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
public closeModal = () => {
|
|
this.setState({ isOpen: false });
|
|
};
|
|
|
|
public changeOnboardStatus = (slideNumber: number) => {
|
|
localStorage.setItem(ONBOARD_LOCAL_STORAGE_KEY, String(slideNumber));
|
|
};
|
|
|
|
private renderSlide = () => {
|
|
const slides = [
|
|
<WelcomeSlide key={1} />,
|
|
<NotABankSlide key={2} />,
|
|
<InterfaceSlide key={3} />,
|
|
<BlockchainSlide key={4} />,
|
|
<WhySlide key={5} />,
|
|
<WhyMyCrypto key={6} />,
|
|
<SecureSlideOne key={7} />,
|
|
<SecureSlideTwo key={8} />,
|
|
<SecureSlideThree key={9} />,
|
|
<FinalSlide key={10} closeModal={this.closeModal} />
|
|
];
|
|
|
|
if (slides.length !== NUMBER_OF_SLIDES) {
|
|
console.log('Slides length do not match const NUMBER_OF_SLIDES');
|
|
}
|
|
const currentSlideIndex = this.props.slideNumber - 1;
|
|
|
|
return slides[currentSlideIndex];
|
|
};
|
|
|
|
private handlePreviousSlide = () => {
|
|
const prevSlideNum = this.props.slideNumber - 1;
|
|
localStorage.setItem(ONBOARD_LOCAL_STORAGE_KEY, String(prevSlideNum));
|
|
this.props.decrementSlide();
|
|
if (this.modal) {
|
|
this.modal.modalBody.scrollContentToTop();
|
|
}
|
|
};
|
|
|
|
private handleNextSlide = () => {
|
|
const nextSlideNum = this.props.slideNumber + 1;
|
|
localStorage.setItem(ONBOARD_LOCAL_STORAGE_KEY, String(nextSlideNum));
|
|
this.props.incrementSlide();
|
|
if (this.modal) {
|
|
this.modal.modalBody.scrollContentToTop();
|
|
}
|
|
};
|
|
}
|
|
|
|
function mapStateToProps(state: AppState) {
|
|
return {
|
|
sessionStarted: state.onboardStatus.sessionStarted,
|
|
slideNumber: state.onboardStatus.slideNumber
|
|
};
|
|
}
|
|
|
|
export default connect(mapStateToProps, {
|
|
startOnboardSession,
|
|
resumeSlide,
|
|
decrementSlide,
|
|
incrementSlide,
|
|
showNotification
|
|
})(OnboardModal);
|