feat: started initial work on onboarding step animation

pull/3056/head
William Grant 1 year ago
parent 9984846632
commit bcb926b6ed

@ -1,4 +1,5 @@
import { shell } from 'electron'; import { shell } from 'electron';
import { AnimatePresence } from 'framer-motion';
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
import { useMount } from 'react-use'; import { useMount } from 'react-use';
import styled from 'styled-components'; import styled from 'styled-components';
@ -78,46 +79,48 @@ export const RegistrationStages = () => {
}); });
return ( return (
<StyledRegistrationContainer container={true} flexDirection="column"> <AnimatePresence>
<Flex container={true} alignItems="center"> <StyledRegistrationContainer container={true} flexDirection="column">
<SessionIcon iconColor="var(--primary-color)" iconSize={'huge'} iconType="brand" />
<SpacerSM />
<div style={{ flexGrow: 1 }}>
<SessionIcon iconSize={'small'} iconType="session" />
</div>
<Flex container={true} alignItems="center"> <Flex container={true} alignItems="center">
<SessionIconButton <SessionIcon iconColor="var(--primary-color)" iconSize={'huge'} iconType="brand" />
aria-label="external link to Session FAQ web page"
iconType="question"
iconSize={'medium'}
iconPadding="4px"
iconColor="var(--text-primary-color)"
style={{ border: '2px solid var(--text-primary-color)', borderRadius: '9999px' }}
onClick={() => {
void shell.openExternal('https://getsession.org/faq');
}}
/>
<SpacerSM /> <SpacerSM />
<SessionIconButton <div style={{ flexGrow: 1 }}>
aria-label="external link to Session FAQ web page" <SessionIcon iconSize={'small'} iconType="session" />
iconType="link" </div>
iconSize="medium" <Flex container={true} alignItems="center">
iconColor="var(--text-primary-color)" <SessionIconButton
iconPadding="4px" aria-label="external link to Session FAQ web page"
style={{ border: '2px solid var(--text-primary-color)', borderRadius: '9999px' }} iconType="question"
onClick={() => { iconSize={'medium'}
void shell.openExternal('https://getsession.org'); iconPadding="4px"
}} iconColor="var(--text-primary-color)"
/> style={{ border: '2px solid var(--text-primary-color)', borderRadius: '9999px' }}
onClick={() => {
void shell.openExternal('https://getsession.org/faq');
}}
/>
<SpacerSM />
<SessionIconButton
aria-label="external link to Session FAQ web page"
iconType="link"
iconSize="medium"
iconColor="var(--text-primary-color)"
iconPadding="4px"
style={{ border: '2px solid var(--text-primary-color)', borderRadius: '9999px' }}
onClick={() => {
void shell.openExternal('https://getsession.org');
}}
/>
</Flex>
</Flex> </Flex>
</Flex>
<Flex container={true} flexDirection="column" alignItems="center"> <Flex container={true} flexDirection="column" alignItems="center">
<SpacerLG /> <SpacerLG />
{step === Onboarding.Start ? <Start /> : null} {step === Onboarding.Start ? <Start /> : null}
{step === Onboarding.CreateAccount ? <CreateAccount /> : null} {step === Onboarding.CreateAccount ? <CreateAccount /> : null}
{step === Onboarding.RestoreAccount ? <RestoreAccount /> : null} {step === Onboarding.RestoreAccount ? <RestoreAccount /> : null}
</Flex> </Flex>
</StyledRegistrationContainer> </StyledRegistrationContainer>
</AnimatePresence>
); );
}; };

@ -14,21 +14,23 @@ import { SessionIconButton } from '../../icon';
export const BackButtonWithininContainer = ({ export const BackButtonWithininContainer = ({
children, children,
margin, margin,
callback,
}: { }: {
children: ReactNode; children: ReactNode;
margin?: string; margin?: string;
callback?: () => void;
}) => { }) => {
return ( return (
<Flex container={true} width={'100%'} flexDirection="row" alignItems="flex-start"> <Flex container={true} width={'100%'} flexDirection="row" alignItems="flex-start">
<div style={{ margin }}> <div style={{ margin }}>
<BackButton /> <BackButton callback={callback} />
</div> </div>
{children} {children}
</Flex> </Flex>
); );
}; };
export const BackButton = () => { export const BackButton = ({ callback }: { callback?: () => void }) => {
const dispatch = useDispatch(); const dispatch = useDispatch();
return ( return (
@ -41,6 +43,9 @@ export const BackButton = () => {
dispatch(setOnboardingStep(Onboarding.Start)); dispatch(setOnboardingStep(Onboarding.Start));
dispatch(setAccountRestorationStep(AccountRestoration.RecoveryPassword)); dispatch(setAccountRestorationStep(AccountRestoration.RecoveryPassword));
dispatch(setAccountCreationStep(AccountCreation.DisplayName)); dispatch(setAccountCreationStep(AccountCreation.DisplayName));
if (callback) {
callback();
}
}} }}
/> />
); );

@ -0,0 +1,38 @@
import { motion } from 'framer-motion';
import { ReactNode } from 'react';
import styled from 'styled-components';
type OnboardContainerProps = {
animate?: boolean;
children: ReactNode;
key: string;
direction: 'left' | 'right';
};
export const OnboardContainer = (props: OnboardContainerProps) => {
const { animate = false, children, key, direction: _direction } = props;
const OnboardContainerInner = styled(motion.div)`
width: 100%;
`;
const direction = _direction === 'left' ? -1 : 1;
const fadeSlideVariants = {
initial: { x: 50 * direction, opacity: 0 },
animate: { x: 0, opacity: 1 },
exit: { x: -50 * direction, opacity: 0 },
};
return (
<OnboardContainerInner
key={key}
variants={animate ? fadeSlideVariants : undefined}
initial={'initial'}
animate={'animate'}
exit={'exit'}
transition={{ duration: 0.5 }}
>
{children}
</OnboardContainerInner>
);
};

@ -1,10 +1,7 @@
import styled from 'styled-components'; import styled from 'styled-components';
import { BackButton } from './BackButton'; import { BackButton } from './BackButton';
import { Hero } from './Hero'; import { Hero } from './Hero';
import { OnboardContainer } from './OnboardingContainer';
const OnboardContainer = styled.div`
width: 100%;
`;
const OnboardHeading = styled.h3` const OnboardHeading = styled.h3`
padding: 0; padding: 0;

@ -4,6 +4,7 @@ import { SettingsKey } from '../../../data/settings-key';
import { trigger } from '../../../shims/events'; import { trigger } from '../../../shims/events';
import { import {
AccountCreation, AccountCreation,
Onboarding,
setAccountCreationStep, setAccountCreationStep,
} from '../../../state/onboarding/ducks/registration'; } from '../../../state/onboarding/ducks/registration';
import { import {
@ -82,8 +83,17 @@ export const CreateAccount = () => {
}; };
return ( return (
<OnboardContainer> <OnboardContainer
<BackButtonWithininContainer margin={'2px 0 0 -36px'}> key={`onboarding-${Onboarding.CreateAccount}`}
animate={true}
direction="right"
>
<BackButtonWithininContainer
margin={'2px 0 0 -36px'}
callback={() => {
setDisplayNameError('');
}}
>
<Flex <Flex
container={true} container={true}
width="100%" width="100%"

@ -7,6 +7,7 @@ import { PromiseUtils } from '../../../session/utils';
import { NotFoundError } from '../../../session/utils/errors'; import { NotFoundError } from '../../../session/utils/errors';
import { import {
AccountRestoration, AccountRestoration,
Onboarding,
setAccountRestorationStep, setAccountRestorationStep,
} from '../../../state/onboarding/ducks/registration'; } from '../../../state/onboarding/ducks/registration';
import { useOnboardAccountRestorationStep } from '../../../state/onboarding/selectors/registration'; import { useOnboardAccountRestorationStep } from '../../../state/onboarding/selectors/registration';
@ -177,9 +178,20 @@ export const RestoreAccount = () => {
}; };
return ( return (
<OnboardContainer> <OnboardContainer
key={`onboarding-${Onboarding.RestoreAccount}`}
animate={true}
direction="right"
>
{step === AccountRestoration.RecoveryPassword || step === AccountRestoration.DisplayName ? ( {step === AccountRestoration.RecoveryPassword || step === AccountRestoration.DisplayName ? (
<BackButtonWithininContainer margin={'2px 0 0 -36px'}> <BackButtonWithininContainer
margin={'2px 0 0 -36px'}
callback={() => {
setDisplayNameError('');
setRecoveryPasswordError('');
setProgress(0);
}}
>
<Flex <Flex
container={true} container={true}
width="100%" width="100%"

@ -10,12 +10,13 @@ import {
import { SessionButton, SessionButtonColor } from '../../basic/SessionButton'; import { SessionButton, SessionButtonColor } from '../../basic/SessionButton';
import { SpacerLG } from '../../basic/Text'; import { SpacerLG } from '../../basic/Text';
import { TermsAndConditions } from '../TermsAndConditions'; import { TermsAndConditions } from '../TermsAndConditions';
import { OnboardContainer } from '../components';
export const Start = () => { export const Start = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
return ( return (
<> <OnboardContainer key={`onboarding-${Onboarding.Start}`} animate={true} direction="left">
<SessionButton <SessionButton
buttonColor={SessionButtonColor.White} buttonColor={SessionButtonColor.White}
onClick={() => { onClick={() => {
@ -36,6 +37,6 @@ export const Start = () => {
/> />
<SpacerLG /> <SpacerLG />
<TermsAndConditions /> <TermsAndConditions />
</> </OnboardContainer>
); );
}; };

Loading…
Cancel
Save