123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- import 'package:dots_indicator/dots_indicator.dart';
- import 'package:flutter/material.dart';
- import 'package:flutter/widgets.dart';
- import 'package:photos/core/configuration.dart';
- import 'package:photos/ente_theme_data.dart';
- import 'package:photos/ui/email_entry_page.dart';
- import 'package:photos/ui/login_page.dart';
- import 'package:photos/ui/password_entry_page.dart';
- import 'package:photos/ui/password_reentry_page.dart';
- import 'package:photos/ui/payment/subscription.dart';
- class LandingPageWidget extends StatefulWidget {
- const LandingPageWidget({Key key}) : super(key: key);
- @override
- _LandingPageWidgetState createState() => _LandingPageWidgetState();
- }
- class _LandingPageWidgetState extends State<LandingPageWidget> {
- double _featureIndex = 0;
- @override
- Widget build(BuildContext context) {
- return Scaffold(body: _getBody(), resizeToAvoidBottomInset: false);
- }
- Widget _getBody() {
- return Center(
- child: SingleChildScrollView(
- child: Column(
- children: [
- Padding(padding: const EdgeInsets.all(12)),
- Text.rich(
- TextSpan(
- children: const <TextSpan>[
- TextSpan(
- text: "with ",
- style: TextStyle(
- fontSize: 16,
- ),
- ),
- TextSpan(
- text: "ente",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- fontFamily: 'Montserrat',
- fontSize: 16,
- ),
- ),
- ],
- ),
- textAlign: TextAlign.center,
- ),
- Padding(
- padding: EdgeInsets.all(2),
- ),
- Text.rich(
- TextSpan(
- children: const <TextSpan>[
- TextSpan(
- text: "your ",
- style: TextStyle(
- fontSize: 16,
- ),
- ),
- TextSpan(
- text: "memories",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- fontSize: 16,
- ),
- ),
- TextSpan(
- text: " are",
- style: TextStyle(
- fontSize: 16,
- ),
- ),
- ],
- ),
- textAlign: TextAlign.center,
- ),
- Padding(
- padding: EdgeInsets.all(24),
- ),
- _getFeatureSlider(),
- DotsIndicator(
- dotsCount: 3,
- position: _featureIndex,
- decorator: DotsDecorator(
- activeColor: Theme.of(context).buttonColor,
- ),
- ),
- Padding(
- padding: EdgeInsets.all(28),
- ),
- _getSignUpButton(context),
- Container(
- width: double.infinity,
- padding: EdgeInsets.fromLTRB(24, 12, 24, 28),
- child: Hero(
- tag: "log_in",
- child: ElevatedButton(
- style:
- Theme.of(context).colorScheme.optionalActionButtonStyle,
- child: Text(
- "Existing User",
- ),
- onPressed: _navigateToSignInPage,
- ),
- ),
- ),
- Padding(
- padding: EdgeInsets.all(20),
- ),
- ],
- ),
- ),
- );
- }
- Widget _getSignUpButton(BuildContext context) {
- return Container(
- width: double.infinity,
- padding: EdgeInsets.symmetric(horizontal: 24),
- child: ElevatedButton(
- style: Theme.of(context).colorScheme.primaryActionButtonStyle,
- child: Hero(
- tag: "sign_up",
- child: Text("New to ente"),
- ),
- onPressed: _navigateToSignUpPage,
- ),
- );
- }
- Widget _getFeatureSlider() {
- return ConstrainedBox(
- constraints: BoxConstraints(maxHeight: 320),
- child: PageView(
- children: const [
- FeatureItemWidget(
- "assets/protected.png",
- "protected",
- "end-to-end encrypted with your password,",
- "visible only to you"),
- FeatureItemWidget("assets/synced.png", "synced",
- "available across all your devices,", "web, android and ios"),
- FeatureItemWidget(
- "assets/preserved.png",
- "preserved",
- "reliably replicated to a fallout shelter,",
- "designed to outlive"),
- ],
- onPageChanged: (index) {
- setState(() {
- _featureIndex = double.parse(index.toString());
- });
- },
- ),
- );
- }
- void _navigateToSignUpPage() {
- Widget page;
- if (Configuration.instance.getEncryptedToken() == null) {
- page = EmailEntryPage();
- } else {
- // No key
- if (Configuration.instance.getKeyAttributes() == null) {
- // Never had a key
- page = PasswordEntryPage();
- } else if (Configuration.instance.getKey() == null) {
- // Yet to decrypt the key
- page = PasswordReentryPage();
- } else {
- // All is well, user just has not subscribed
- page = getSubscriptionPage(isOnBoarding: true);
- }
- }
- Navigator.of(context).push(
- MaterialPageRoute(
- builder: (BuildContext context) {
- return page;
- },
- ),
- );
- }
- void _navigateToSignInPage() {
- Widget page;
- if (Configuration.instance.getEncryptedToken() == null) {
- page = LoginPage();
- } else {
- // No key
- if (Configuration.instance.getKeyAttributes() == null) {
- // Never had a key
- page = PasswordEntryPage();
- } else if (Configuration.instance.getKey() == null) {
- // Yet to decrypt the key
- page = PasswordReentryPage();
- } else {
- // All is well, user just has not subscribed
- page = getSubscriptionPage(isOnBoarding: true);
- }
- }
- Navigator.of(context).push(
- MaterialPageRoute(
- builder: (BuildContext context) {
- return page;
- },
- ),
- );
- }
- }
- class FeatureItemWidget extends StatelessWidget {
- final String assetPath, featureTitle, firstLine, secondLine;
- const FeatureItemWidget(
- this.assetPath,
- this.featureTitle,
- this.firstLine,
- this.secondLine, {
- Key key,
- }) : super(key: key);
- @override
- Widget build(BuildContext context) {
- return Column(
- crossAxisAlignment: CrossAxisAlignment.stretch,
- children: [
- Image.asset(
- assetPath,
- height: 160,
- ),
- Padding(padding: EdgeInsets.all(16)),
- Column(
- crossAxisAlignment: CrossAxisAlignment.center,
- mainAxisAlignment: MainAxisAlignment.start,
- children: [
- Text(
- featureTitle,
- style: Theme.of(context).textTheme.headline6,
- ),
- Padding(padding: EdgeInsets.all(12)),
- Text(
- firstLine,
- textAlign: TextAlign.center,
- style: TextStyle(
- color: Theme.of(context).colorScheme.onSurface.withOpacity(0.9),
- ),
- ),
- Padding(padding: EdgeInsets.all(2)),
- Text(
- secondLine,
- textAlign: TextAlign.center,
- style: TextStyle(
- color: Theme.of(context).colorScheme.onSurface.withOpacity(0.9),
- ),
- ),
- ],
- ),
- ],
- );
- }
- }
|