Merge pull request #37 from ente-io/re-enable-web-signups
Re enable web signups
This commit is contained in:
commit
cdecc7f906
BIN
public/vault.png
Normal file
BIN
public/vault.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 48 KiB |
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 7.7 KiB |
|
@ -116,7 +116,7 @@ const GlobalStyles = createGlobalStyle`
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
.btn-primary {
|
.btn-primary ,.btn:focus {
|
||||||
background: #2dc262;
|
background: #2dc262;
|
||||||
border-color: #29a354;
|
border-color: #29a354;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
|
@ -135,6 +135,18 @@ const GlobalStyles = createGlobalStyle`
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
}
|
}
|
||||||
|
.jumbotron{
|
||||||
|
background-color: #191919;
|
||||||
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 50px;
|
||||||
|
}
|
||||||
|
.alert-success {
|
||||||
|
background-color: #c4ffd6;
|
||||||
|
}
|
||||||
|
.alert-primary {
|
||||||
|
background-color: #c4ffd6;
|
||||||
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const Image = styled.img`
|
const Image = styled.img`
|
||||||
|
|
|
@ -54,7 +54,9 @@ const Chip = styled.button<{ active: boolean }>`
|
||||||
export default function Collections(props: CollectionProps) {
|
export default function Collections(props: CollectionProps) {
|
||||||
const { selected, collections, selectCollection } = props;
|
const { selected, collections, selectCollection } = props;
|
||||||
const clickHandler = (id?: number) => () => selectCollection(id);
|
const clickHandler = (id?: number) => () => selectCollection(id);
|
||||||
|
if (collections.length == 0) {
|
||||||
|
return <Container />;
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container>
|
||||||
<Wrapper>
|
<Wrapper>
|
||||||
|
|
|
@ -20,7 +20,7 @@ export default function UploadProgress({
|
||||||
>
|
>
|
||||||
<Modal.Header>
|
<Modal.Header>
|
||||||
<Modal.Title id="contained-modal-title-vcenter">
|
<Modal.Title id="contained-modal-title-vcenter">
|
||||||
Uploading Files
|
{constants.UPLOADING_FILES}
|
||||||
</Modal.Title>
|
</Modal.Title>
|
||||||
</Modal.Header>
|
</Modal.Header>
|
||||||
<Modal.Body>
|
<Modal.Body>
|
||||||
|
|
|
@ -23,7 +23,7 @@ import {
|
||||||
} from 'services/collectionService';
|
} from 'services/collectionService';
|
||||||
import constants from 'utils/strings/constants';
|
import constants from 'utils/strings/constants';
|
||||||
import AlertBanner from './components/AlertBanner';
|
import AlertBanner from './components/AlertBanner';
|
||||||
import { Alert } from 'react-bootstrap';
|
import { Alert, Button, Jumbotron } from 'react-bootstrap';
|
||||||
|
|
||||||
const DATE_CONTAINER_HEIGHT = 45;
|
const DATE_CONTAINER_HEIGHT = 45;
|
||||||
const IMAGE_CONTAINER_HEIGHT = 200;
|
const IMAGE_CONTAINER_HEIGHT = 200;
|
||||||
|
@ -95,6 +95,16 @@ const ListContainer = styled.div<{ columns: number }>`
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
const Image = styled.img`
|
||||||
|
width: 200px;
|
||||||
|
max-width: 100%;
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
`;
|
||||||
|
|
||||||
const DateContainer = styled.div`
|
const DateContainer = styled.div`
|
||||||
padding-top: 15px;
|
padding-top: 15px;
|
||||||
`;
|
`;
|
||||||
|
@ -320,7 +330,7 @@ export default function Gallery(props) {
|
||||||
<LoadingBar color="#2dc262" ref={loadingBar} />
|
<LoadingBar color="#2dc262" ref={loadingBar} />
|
||||||
{isFirstLoad && (
|
{isFirstLoad && (
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<Alert variant="primary">
|
<Alert variant="success">
|
||||||
{constants.INITIAL_LOAD_DELAY_WARNING}
|
{constants.INITIAL_LOAD_DELAY_WARNING}
|
||||||
</Alert>
|
</Alert>
|
||||||
</div>
|
</div>
|
||||||
|
@ -340,7 +350,17 @@ export default function Gallery(props) {
|
||||||
refetchData={syncWithRemote}
|
refetchData={syncWithRemote}
|
||||||
setBannerErrorCode={setBannerErrorCode}
|
setBannerErrorCode={setBannerErrorCode}
|
||||||
/>
|
/>
|
||||||
{filteredData.length ? (
|
{!isFirstLoad && data.length == 0 ? (
|
||||||
|
<Jumbotron>
|
||||||
|
<Image alt="vault" src="/vault.png" />
|
||||||
|
<Button
|
||||||
|
variant="primary"
|
||||||
|
onClick={props.showUploadModal}
|
||||||
|
>
|
||||||
|
{constants.UPLOAD_FIRST_PHOTO}
|
||||||
|
</Button>
|
||||||
|
</Jumbotron>
|
||||||
|
) : filteredData.length ? (
|
||||||
<Container>
|
<Container>
|
||||||
<AutoSizer>
|
<AutoSizer>
|
||||||
{({ height, width }) => {
|
{({ height, width }) => {
|
||||||
|
@ -413,7 +433,7 @@ export default function Gallery(props) {
|
||||||
<List
|
<List
|
||||||
itemSize={(index) =>
|
itemSize={(index) =>
|
||||||
timeStampList[index].itemType ===
|
timeStampList[index].itemType ===
|
||||||
ITEM_TYPE.TIME
|
ITEM_TYPE.TIME
|
||||||
? DATE_CONTAINER_HEIGHT
|
? DATE_CONTAINER_HEIGHT
|
||||||
: IMAGE_CONTAINER_HEIGHT
|
: IMAGE_CONTAINER_HEIGHT
|
||||||
}
|
}
|
||||||
|
@ -430,14 +450,14 @@ export default function Gallery(props) {
|
||||||
columns={
|
columns={
|
||||||
timeStampList[index]
|
timeStampList[index]
|
||||||
.itemType ===
|
.itemType ===
|
||||||
ITEM_TYPE.TIME
|
ITEM_TYPE.TIME
|
||||||
? 1
|
? 1
|
||||||
: columns
|
: columns
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
{timeStampList[index]
|
{timeStampList[index]
|
||||||
.itemType ===
|
.itemType ===
|
||||||
ITEM_TYPE.TIME ? (
|
ITEM_TYPE.TIME ? (
|
||||||
<DateContainer>
|
<DateContainer>
|
||||||
{
|
{
|
||||||
timeStampList[
|
timeStampList[
|
||||||
|
@ -456,7 +476,7 @@ export default function Gallery(props) {
|
||||||
index
|
index
|
||||||
]
|
]
|
||||||
.itemStartIndex +
|
.itemStartIndex +
|
||||||
idx
|
idx
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -485,6 +505,14 @@ export default function Gallery(props) {
|
||||||
<div>{constants.NOTHING_HERE}</div>
|
<div>{constants.NOTHING_HERE}</div>
|
||||||
</DeadCenter>
|
</DeadCenter>
|
||||||
)}
|
)}
|
||||||
|
{data.length < 30 && (
|
||||||
|
<Alert
|
||||||
|
variant="success"
|
||||||
|
style={{ position: 'fixed', bottom: '1%', width: '100%', textAlign: 'center', marginBottom: '0px' }}
|
||||||
|
>
|
||||||
|
{constants.INSTALL_MOBILE_APP()}
|
||||||
|
</Alert>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,10 +109,10 @@ export default function Generate() {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container>
|
||||||
<Image alt="vault" src="/vault.svg" />
|
{/* <Image alt="vault" src="/vault.png" style={{ paddingBottom: '40px' }} /> */}
|
||||||
<Card>
|
<Card style={{ maxWidth: '540px', padding: '20px' }}>
|
||||||
<Card.Body>
|
<Card.Body>
|
||||||
<div className="text-center">
|
<div className="text-center" style={{ marginBottom: '40px' }}>
|
||||||
<p>{constants.ENTER_ENC_PASSPHRASE}</p>
|
<p>{constants.ENTER_ENC_PASSPHRASE}</p>
|
||||||
{constants.PASSPHRASE_DISCLAIMER()}
|
{constants.PASSPHRASE_DISCLAIMER()}
|
||||||
</div>
|
</div>
|
||||||
|
@ -137,15 +137,16 @@ export default function Generate() {
|
||||||
<Form noValidate onSubmit={handleSubmit}>
|
<Form noValidate onSubmit={handleSubmit}>
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
type="text"
|
type="password"
|
||||||
placeholder={constants.PASSPHRASE_HINT}
|
placeholder={constants.PASSPHRASE_HINT}
|
||||||
value={values.passphrase}
|
value={values.passphrase}
|
||||||
onChange={handleChange('passphrase')}
|
onChange={handleChange('passphrase')}
|
||||||
onBlur={handleBlur('passphrase')}
|
onBlur={handleBlur('passphrase')}
|
||||||
isInvalid={Boolean(
|
isInvalid={Boolean(
|
||||||
touched.passphrase &&
|
touched.passphrase &&
|
||||||
errors.passphrase
|
errors.passphrase
|
||||||
)}
|
)}
|
||||||
|
autoFocus={true}
|
||||||
disabled={loading}
|
disabled={loading}
|
||||||
/>
|
/>
|
||||||
<Form.Control.Feedback type="invalid">
|
<Form.Control.Feedback type="invalid">
|
||||||
|
@ -154,7 +155,7 @@ export default function Generate() {
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
type="text"
|
type="password"
|
||||||
placeholder={
|
placeholder={
|
||||||
constants.PASSPHRASE_CONFIRM
|
constants.PASSPHRASE_CONFIRM
|
||||||
}
|
}
|
||||||
|
@ -170,7 +171,7 @@ export default function Generate() {
|
||||||
{errors.confirm}
|
{errors.confirm}
|
||||||
</Form.Control.Feedback>
|
</Form.Control.Feedback>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
<Button type="submit" block disabled={loading}>
|
<Button type="submit" block disabled={loading} style={{ marginTop: '28px' }}>
|
||||||
{constants.SET_PASSPHRASE}
|
{constants.SET_PASSPHRASE}
|
||||||
</Button>
|
</Button>
|
||||||
</Form>
|
</Form>
|
||||||
|
|
|
@ -10,8 +10,6 @@ import * as Yup from 'yup';
|
||||||
import { getOtt } from 'services/userService';
|
import { getOtt } from 'services/userService';
|
||||||
import Container from 'components/Container';
|
import Container from 'components/Container';
|
||||||
import { setData, LS_KEYS, getData } from 'utils/storage/localStorage';
|
import { setData, LS_KEYS, getData } from 'utils/storage/localStorage';
|
||||||
import { Alert } from 'react-bootstrap';
|
|
||||||
|
|
||||||
interface formValues {
|
interface formValues {
|
||||||
email: string;
|
email: string;
|
||||||
}
|
}
|
||||||
|
@ -19,7 +17,6 @@ interface formValues {
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const [showMessage, setShowMessage] = useState(false);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
router.prefetch('/verify');
|
router.prefetch('/verify');
|
||||||
|
@ -40,92 +37,78 @@ export default function Home() {
|
||||||
setData(LS_KEYS.USER, { email });
|
setData(LS_KEYS.USER, { email });
|
||||||
router.push('/verify');
|
router.push('/verify');
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e.response.status == 403) {
|
setFieldError('email', `${constants.UNKNOWN_ERROR} ${e.message}`);
|
||||||
setFieldError('email', `${constants.USER_DOES_NOT_EXIST}`);
|
|
||||||
} else {
|
|
||||||
setFieldError(
|
|
||||||
'email',
|
|
||||||
`${constants.UNKNOWN_ERROR} ${e.message}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
const register = () => {
|
const register = () => {
|
||||||
setShowMessage(true);
|
router.push('/signup');
|
||||||
setTimeout(() => setShowMessage(false), 15000);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<Container>
|
||||||
<div style={{ display: showMessage ? 'block' : 'none', textAlign: 'center' }}>
|
<Card style={{ minWidth: '320px' }} className="text-center">
|
||||||
<Alert variant="warning">{constants.WEB_SIGNUPS_DISABLED()}</Alert>
|
<Card.Body style={{ padding: '40px 30px' }}>
|
||||||
</div>
|
<Card.Title style={{ marginBottom: '32px' }}>
|
||||||
|
{constants.LOGIN}
|
||||||
<Container>
|
</Card.Title>
|
||||||
<Card style={{ minWidth: '320px' }} className="text-center">
|
<Formik<formValues>
|
||||||
<Card.Body style={{ padding: '40px 30px' }}>
|
initialValues={{ email: '' }}
|
||||||
<Card.Title style={{ marginBottom: '32px' }}>
|
validationSchema={Yup.object().shape({
|
||||||
{constants.LOGIN}
|
email: Yup.string()
|
||||||
</Card.Title>
|
.email(constants.EMAIL_ERROR)
|
||||||
<Formik<formValues>
|
.required(constants.REQUIRED),
|
||||||
initialValues={{ email: '' }}
|
})}
|
||||||
validationSchema={Yup.object().shape({
|
onSubmit={loginUser}
|
||||||
email: Yup.string()
|
>
|
||||||
.email(constants.EMAIL_ERROR)
|
{({
|
||||||
.required(constants.REQUIRED),
|
values,
|
||||||
})}
|
errors,
|
||||||
onSubmit={loginUser}
|
touched,
|
||||||
>
|
handleChange,
|
||||||
{({
|
handleBlur,
|
||||||
values,
|
handleSubmit,
|
||||||
errors,
|
}) => (
|
||||||
touched,
|
<Form noValidate onSubmit={handleSubmit}>
|
||||||
handleChange,
|
<Form.Group controlId="formBasicEmail">
|
||||||
handleBlur,
|
<Form.Control
|
||||||
handleSubmit,
|
type="email"
|
||||||
}) => (
|
placeholder={constants.ENTER_EMAIL}
|
||||||
<Form noValidate onSubmit={handleSubmit}>
|
value={values.email}
|
||||||
<Form.Group controlId="formBasicEmail">
|
onChange={handleChange('email')}
|
||||||
<Form.Control
|
onBlur={handleBlur('email')}
|
||||||
type="email"
|
isInvalid={Boolean(
|
||||||
placeholder={constants.ENTER_EMAIL}
|
touched.email && errors.email
|
||||||
value={values.email}
|
)}
|
||||||
onChange={handleChange('email')}
|
autoFocus={true}
|
||||||
onBlur={handleBlur('email')}
|
|
||||||
isInvalid={Boolean(
|
|
||||||
touched.email && errors.email
|
|
||||||
)}
|
|
||||||
autoFocus={true}
|
|
||||||
disabled={loading}
|
|
||||||
/>
|
|
||||||
<FormControl.Feedback type="invalid">
|
|
||||||
{errors.email}
|
|
||||||
</FormControl.Feedback>
|
|
||||||
</Form.Group>
|
|
||||||
<Button
|
|
||||||
variant="primary"
|
|
||||||
type="submit"
|
|
||||||
block
|
|
||||||
disabled={loading}
|
disabled={loading}
|
||||||
style={{ marginBottom: '12px' }}
|
/>
|
||||||
>
|
<FormControl.Feedback type="invalid">
|
||||||
{constants.LOGIN}
|
{errors.email}
|
||||||
</Button>
|
</FormControl.Feedback>
|
||||||
</Form>
|
</Form.Group>
|
||||||
)}
|
<Button
|
||||||
</Formik>
|
variant="primary"
|
||||||
<Card.Link
|
type="submit"
|
||||||
href="#"
|
block
|
||||||
onClick={register}
|
disabled={loading}
|
||||||
style={{ fontSize: '14px' }}
|
style={{ marginBottom: '12px' }}
|
||||||
>
|
>
|
||||||
{constants.NO_ACCOUNT}
|
{constants.LOGIN}
|
||||||
</Card.Link>
|
</Button>
|
||||||
</Card.Body>
|
</Form>
|
||||||
</Card>
|
)}
|
||||||
</Container>
|
</Formik>
|
||||||
</>
|
<Card.Link
|
||||||
|
href="#"
|
||||||
|
onClick={register}
|
||||||
|
style={{ fontSize: '14px' }}
|
||||||
|
>
|
||||||
|
{constants.NO_ACCOUNT}
|
||||||
|
</Card.Link>
|
||||||
|
</Card.Body>
|
||||||
|
</Card>
|
||||||
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,21 +57,13 @@ const englishConstants = {
|
||||||
2: 'uploading your files',
|
2: 'uploading your files',
|
||||||
3: 'files uploaded successfully!',
|
3: 'files uploaded successfully!',
|
||||||
},
|
},
|
||||||
|
UPLOADING_FILES: `uploading files`,
|
||||||
OF: 'of',
|
OF: 'of',
|
||||||
SUBSCRIPTION_EXPIRED:
|
SUBSCRIPTION_EXPIRED:
|
||||||
'your subscription has expired, please renew it form the mobile app',
|
'your subscription has expired, please renew it form the mobile app',
|
||||||
STORAGE_QUOTA_EXCEEDED:
|
STORAGE_QUOTA_EXCEEDED:
|
||||||
'you have exceeded your storage quota, please upgrade your plan from the mobile app',
|
'you have exceeded your storage quota, please upgrade your plan from the mobile app',
|
||||||
INITIAL_LOAD_DELAY_WARNING: 'the first load may take some time',
|
INITIAL_LOAD_DELAY_WARNING: 'the first load may take some time',
|
||||||
|
|
||||||
WEB_SIGNUPS_DISABLED: () => (
|
|
||||||
<div>
|
|
||||||
sorry signups are possibly only on the{' '}
|
|
||||||
<a href="https://ente.io/app" target="_blank">
|
|
||||||
mobile app
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
),
|
|
||||||
USER_DOES_NOT_EXIST: 'sorry, could not find a user with that email',
|
USER_DOES_NOT_EXIST: 'sorry, could not find a user with that email',
|
||||||
UPLOAD_BUTTON_TEXT: 'upload',
|
UPLOAD_BUTTON_TEXT: 'upload',
|
||||||
NO_ACCOUNT: "don't have an account?",
|
NO_ACCOUNT: "don't have an account?",
|
||||||
|
@ -85,6 +77,20 @@ const englishConstants = {
|
||||||
NO_INTERNET_CONNECTION:
|
NO_INTERNET_CONNECTION:
|
||||||
'please check your internet connection and try again',
|
'please check your internet connection and try again',
|
||||||
TITLE: 'ente.io | encrypted photo storage',
|
TITLE: 'ente.io | encrypted photo storage',
|
||||||
|
UPLOAD_FIRST_PHOTO: 'backup your first photo',
|
||||||
|
INSTALL_MOBILE_APP: () => (
|
||||||
|
<div>
|
||||||
|
install our{' '}
|
||||||
|
<a href="https://play.google.com/store/apps/details?id=io.ente.photos" target="_blank">
|
||||||
|
android
|
||||||
|
</a>{' '}
|
||||||
|
or{' '}
|
||||||
|
<a href="https://apps.apple.com/in/app/ente-photos/id1542026904" target="_blank">
|
||||||
|
ios app{' '}
|
||||||
|
</a>
|
||||||
|
to automatically backup all your photos
|
||||||
|
</div>
|
||||||
|
),
|
||||||
LOGOUT: 'logout',
|
LOGOUT: 'logout',
|
||||||
LOGOUT_WARNING: 'sure you want to logout?',
|
LOGOUT_WARNING: 'sure you want to logout?',
|
||||||
CANCEL: 'cancel',
|
CANCEL: 'cancel',
|
||||||
|
|
Loading…
Reference in a new issue