346 lines
9.4 KiB
JavaScript
346 lines
9.4 KiB
JavaScript
// @flow
|
|
import * as React from 'react';
|
|
import Page from 'component/page';
|
|
import Card from 'component/common/card';
|
|
import Button from 'component/button';
|
|
import { Form, FormField } from 'component/common/form';
|
|
import I18nMessage from 'component/i18nMessage';
|
|
import * as ICONS from 'constants/icons';
|
|
|
|
type Props = {
|
|
walletEncrypted: boolean,
|
|
encryptWallet: (string) => void,
|
|
decryptWallet: (string) => void,
|
|
registering: boolean,
|
|
registerError: string,
|
|
token: string,
|
|
authenticating: boolean,
|
|
authError: string,
|
|
derivingKeys: boolean,
|
|
encHmacKey: string, // ?
|
|
encRootPass: string,
|
|
encProviderPass: string,
|
|
getSalt: (string) => void,
|
|
deriveSecrets: (string, string, string) => void, // something
|
|
|
|
// begin
|
|
// email
|
|
handleEmail: (string, string) => void, // return something?
|
|
checkingEmail: boolean,
|
|
candidateEmail?: string,
|
|
registeredEmail?: string,
|
|
saltSeed: string,
|
|
emailError: string,
|
|
// password/register
|
|
register: (string) => void,
|
|
waitForVerify: () => void,
|
|
};
|
|
|
|
export default function SettingsSyncPage(props: Props) {
|
|
// const { } = props;
|
|
const {
|
|
registering,
|
|
registerError,
|
|
token,
|
|
authenticating,
|
|
authError,
|
|
authenticate,
|
|
encRootPass,
|
|
register,
|
|
// begin
|
|
// .. email
|
|
registeredEmail,
|
|
handleEmail,
|
|
checkingEmail,
|
|
candidateEmail,
|
|
saltSeed,
|
|
emailError,
|
|
// password
|
|
// verify
|
|
waitForVerify,
|
|
} = props;
|
|
|
|
/*
|
|
Register / auth
|
|
*/
|
|
|
|
// modes
|
|
const SIGN_IN_MODE = 'sign_in_mode';
|
|
const SIGN_UP_MODE = 'sign_up_mode';
|
|
const [mode, setMode] = React.useState(SIGN_IN_MODE);
|
|
// steps
|
|
const EMAIL_SCREEN = 'sign_in'; // show email input
|
|
// checking email
|
|
const PASSWORD_SCREEN = 'password'; // show password input
|
|
// registering
|
|
const REGISTERING_SCREEN = 'register'; // show working page for deriving passwords, registering
|
|
const VERIFY_SCREEN = 'verify'; // show waiting for email verification
|
|
// waiting for email verification
|
|
const SYNC_SCREEN = 'sync';
|
|
// syncing wallet with server
|
|
const DONE_SCREEN = 'done';
|
|
|
|
const [email, setEmail] = React.useState();
|
|
const [pass, setPass] = React.useState();
|
|
const [showPass, setShowPass] = React.useState(false);
|
|
|
|
let STEP;
|
|
if (!candidateEmail) {
|
|
STEP = EMAIL_SCREEN; // present email form, on submit check email salt
|
|
} else if (!encRootPass && !registering) {
|
|
// make this "hasPasswords"
|
|
STEP = PASSWORD_SCREEN; // present password form, on submit derive keys and register
|
|
} else if (registering) {
|
|
STEP = REGISTERING_SCREEN;
|
|
} else if (encRootPass && !token) {
|
|
STEP = VERIFY_SCREEN; // until token
|
|
} else if (token) {
|
|
STEP = SYNC_SCREEN;
|
|
}
|
|
|
|
// error comes from store
|
|
// const [error, setError] = React.useState('');
|
|
|
|
React.useEffect(() => {
|
|
if (registeredEmail && !token) {
|
|
waitForVerify();
|
|
}
|
|
|
|
return () => {
|
|
waitForVerify(true);
|
|
};
|
|
}, [registeredEmail, token]);
|
|
|
|
React.useEffect(() => {
|
|
if (token) {
|
|
// sign up
|
|
// what
|
|
// pushAndStart();
|
|
// what
|
|
//
|
|
}
|
|
}, [token]);
|
|
|
|
const handleRegister = (e) => {
|
|
register(pass);
|
|
};
|
|
|
|
const handleSignUpEmail = async () => {
|
|
// get salt for email to make sure email doesn't exist
|
|
handleEmail(email, true);
|
|
};
|
|
|
|
const handleSignInEmail = () => {
|
|
handleEmail(email, false);
|
|
};
|
|
|
|
const doneCard = (
|
|
<Card
|
|
title={__('Done!')}
|
|
subtitle={
|
|
<I18nMessage
|
|
tokens={{
|
|
email: email,
|
|
}}
|
|
>
|
|
You are signed in as %email%.
|
|
</I18nMessage>
|
|
}
|
|
actions={<div>Like, done and stuff...</div>}
|
|
/>
|
|
);
|
|
|
|
const verifyCard = (
|
|
<Card
|
|
title={__('Verifying')}
|
|
subtitle={__('We have sent you an email to verify your account.')}
|
|
actions={<div>Waiting for verification...</div>}
|
|
/>
|
|
);
|
|
|
|
const registerCard = (
|
|
<Card title={__('Registering')} subtitle={__('Hold on a moment, signing you up.')} actions={<div>Math...</div>} />
|
|
);
|
|
|
|
const syncCard = (
|
|
<Card
|
|
title={__('Syncing With Server')}
|
|
subtitle={__(`Great. Now we're syncing your wallet.`)}
|
|
actions={<div>Math...</div>}
|
|
/>
|
|
);
|
|
|
|
const signInEmailCard = (
|
|
<Card
|
|
title={__('Sign In')}
|
|
subtitle={
|
|
<>
|
|
<p>
|
|
<I18nMessage
|
|
tokens={{
|
|
sign_up: <Button button="link" onClick={() => setMode(SIGN_UP_MODE)} label={__('Sign up')} />,
|
|
}}
|
|
>
|
|
Sign in to your sync account. Or %sign_up%.
|
|
</I18nMessage>
|
|
</p>
|
|
</>
|
|
}
|
|
actions={
|
|
<div>
|
|
<Form onSubmit={handleSignInEmail} className="section">
|
|
<FormField
|
|
autoFocus
|
|
placeholder={__('yourstruly@example.com')}
|
|
type="email"
|
|
name="sign_in_email"
|
|
label={__('Email')}
|
|
value={email}
|
|
onChange={(e) => setEmail(e.target.value)}
|
|
helper={emailError && emailError}
|
|
/>
|
|
<FormField
|
|
type={'text'}
|
|
name="sync_provider"
|
|
disabled
|
|
label={__('Sync Provider Url')}
|
|
value={'https://dev.lbry.id'}
|
|
onChange={(e) => setPass(e.target.value)}
|
|
/>
|
|
<div className="section__actions">
|
|
<Button button="primary" type="submit" label={__('Submit')} disabled={checkingEmail} />
|
|
</div>
|
|
<p className="help--card-actions">
|
|
<I18nMessage
|
|
tokens={{
|
|
terms: <Button button="link" href="https://www.lbry.com/termsofservice" label={__('terms')} />,
|
|
}}
|
|
>
|
|
Some sign-in relevant message.
|
|
</I18nMessage>
|
|
</p>
|
|
</Form>
|
|
</div>
|
|
}
|
|
/>
|
|
);
|
|
|
|
const signUpEmailCard = (
|
|
<Card
|
|
title={__('Sign Up')}
|
|
subtitle={
|
|
<>
|
|
<p>
|
|
<I18nMessage
|
|
tokens={{
|
|
sign_in: <Button button="link" onClick={() => setMode(SIGN_IN_MODE)} label={__('Sign in')} />,
|
|
}}
|
|
>
|
|
Sign up for a sync account. Or %sign_in%.
|
|
</I18nMessage>
|
|
</p>
|
|
</>
|
|
}
|
|
actions={
|
|
<div>
|
|
<Form onSubmit={handleSignUpEmail} className="section">
|
|
<FormField
|
|
autoFocus
|
|
placeholder={__('yourstruly@example.com')}
|
|
type="email"
|
|
name="sign_up_email"
|
|
label={__('Email')}
|
|
value={email}
|
|
onChange={(e) => setEmail(e.target.value)}
|
|
helper={emailError && emailError}
|
|
/>
|
|
<FormField
|
|
type={'text'}
|
|
name="sync_provider"
|
|
disabled
|
|
label={__('Sync Provider Url')}
|
|
value={'https://dev.lbry.id'}
|
|
onChange={(e) => setPass(e.target.value)}
|
|
/>
|
|
<div className="section__actions">
|
|
<Button button="primary" type="submit" label={__('Submit')} disabled={checkingEmail} />
|
|
</div>
|
|
</Form>
|
|
</div>
|
|
}
|
|
/>
|
|
);
|
|
|
|
const passwordCard = (
|
|
<Card
|
|
title={__('Enter Password')}
|
|
subtitle={
|
|
<>
|
|
<p>
|
|
<I18nMessage
|
|
tokens={{
|
|
sign_in: <Button button="link" onClick={() => setMode(EMAIL_SCREEN)} label={__('Sign in')} />,
|
|
}}
|
|
>
|
|
Enter a password.
|
|
</I18nMessage>
|
|
</p>
|
|
</>
|
|
}
|
|
actions={
|
|
<div>
|
|
<fieldset-section className="section">
|
|
<FormField
|
|
type={showPass ? 'text' : 'password'}
|
|
name="root_password"
|
|
inputButton={
|
|
<>
|
|
<Button
|
|
icon={showPass ? ICONS.EYE : ICONS.EYE_OFF}
|
|
onClick={() => setShowPass(!showPass)}
|
|
className={'editable-text__input-button'}
|
|
/>
|
|
</>
|
|
}
|
|
label={__('Password')}
|
|
value={pass}
|
|
onChange={(e) => setPass(e.target.value)}
|
|
/>
|
|
<div className="section__actions">
|
|
<Button button="primary" label={__('Submit')} onClick={handleRegister} />{' '}
|
|
{/* password input validation */}
|
|
</div>
|
|
<p className="help--card-actions">
|
|
<I18nMessage
|
|
tokens={{
|
|
terms: <Button button="link" href="https://www.lbry.com/termsofservice" label={__('terms')} />,
|
|
}}
|
|
>
|
|
By creating an account, you agree to our %terms% and confirm you're over the age of 13.
|
|
</I18nMessage>
|
|
</p>
|
|
</fieldset-section>
|
|
</div>
|
|
}
|
|
/>
|
|
);
|
|
|
|
return (
|
|
<Page
|
|
noFooter
|
|
noSideNavigation
|
|
// settingsPage
|
|
className="card-stack"
|
|
backout={{ title: __('Wallet Sync'), backLabel: __('Back') }}
|
|
>
|
|
<div className="card-stack">
|
|
{STEP === EMAIL_SCREEN && mode === SIGN_IN_MODE && <>{signInEmailCard}</>}
|
|
{STEP === EMAIL_SCREEN && mode === SIGN_UP_MODE && <>{signUpEmailCard}</>}
|
|
{STEP === PASSWORD_SCREEN && <>{passwordCard}</>}
|
|
{STEP === REGISTERING_SCREEN && <>{registerCard}</>}
|
|
{STEP === VERIFY_SCREEN && <>{verifyCard}</>}
|
|
{STEP === SYNC_SCREEN && <>{syncCard}</>}
|
|
</div>
|
|
</Page>
|
|
);
|
|
}
|