From 1381647a3dd843f337516e74f0316bd2c9346002 Mon Sep 17 00:00:00 2001 From: Eric Ampire Date: Mon, 22 Mar 2021 16:49:24 +0200 Subject: [PATCH] Profile View --- lib/main.dart | 14 ++- lib/model/magazine.dart | 6 +- lib/ui/custom/dialog.dart | 35 +++++++ lib/ui/custom/item_mag_large.dart | 43 +++++--- lib/ui/custom/item_mag_row.dart | 46 ++++++++- lib/ui/custom/item_mag_row_newest.dart | 30 +++++- lib/ui/custom/item_mag_small.dart | 8 +- lib/ui/home.dart | 26 ----- lib/ui/setting.dart | 49 --------- lib/ui/subscription.dart | 8 -- lib/ui/{ => view}/about.dart | 0 lib/ui/{ => view}/auth.dart | 16 +-- lib/ui/view/detailmag/detail_mag.dart | 88 ++++++++++++++++ lib/ui/{ => view}/edit_profil.dart | 0 lib/ui/view/home.dart | 33 ++++++ lib/ui/{ => view}/landing.dart | 12 +-- lib/ui/{ => view}/main.dart | 16 +-- lib/ui/{ => view}/news.dart | 0 lib/ui/{ => view}/pdf_reader.dart | 2 +- lib/ui/{ => view}/profile.dart | 73 +++++++++---- lib/ui/{ => view}/search.dart | 0 lib/ui/view/setting/item_logout.dart | 29 ++++++ lib/ui/view/setting/item_title_group.dart | 28 +++++ lib/ui/view/setting/item_title_setting.dart | 33 ++++++ lib/ui/view/setting/setting.dart | 107 ++++++++++++++++++++ lib/ui/view/subscription/subscription.dart | 46 +++++++++ pubspec.lock | 49 +++++++++ pubspec.yaml | 2 + 28 files changed, 645 insertions(+), 154 deletions(-) create mode 100644 lib/ui/custom/dialog.dart delete mode 100644 lib/ui/home.dart delete mode 100644 lib/ui/setting.dart delete mode 100644 lib/ui/subscription.dart rename lib/ui/{ => view}/about.dart (100%) rename lib/ui/{ => view}/auth.dart (87%) create mode 100644 lib/ui/view/detailmag/detail_mag.dart rename lib/ui/{ => view}/edit_profil.dart (100%) create mode 100644 lib/ui/view/home.dart rename lib/ui/{ => view}/landing.dart (75%) rename lib/ui/{ => view}/main.dart (88%) rename lib/ui/{ => view}/news.dart (100%) rename lib/ui/{ => view}/pdf_reader.dart (96%) rename lib/ui/{ => view}/profile.dart (53%) rename lib/ui/{ => view}/search.dart (100%) create mode 100644 lib/ui/view/setting/item_logout.dart create mode 100644 lib/ui/view/setting/item_title_group.dart create mode 100644 lib/ui/view/setting/item_title_setting.dart create mode 100644 lib/ui/view/setting/setting.dart create mode 100644 lib/ui/view/subscription/subscription.dart diff --git a/lib/main.dart b/lib/main.dart index 09753a4..736aa82 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,7 +2,10 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:flutter_settings_screens/flutter_settings_screens.dart'; import 'package:le_kiosque_by_gcs/services/auth/main_auth.dart'; -import 'package:le_kiosque_by_gcs/ui/landing.dart'; +import 'package:le_kiosque_by_gcs/ui/view/landing.dart'; +import 'package:provider/provider.dart'; + +import 'services/auth/auth.dart'; void main() async { await Settings.init(cacheProvider: SharePreferenceCache()); @@ -20,9 +23,14 @@ class MyApp extends StatelessWidget { theme: ThemeData( primarySwatch: Colors.blue, ), - home: LandingPageView( - auth: MainAuth(), + home: MultiProvider( + providers: [ + Provider(create: (_) => MainAuth()) + ], + child: LandingPageView(), ), ); } } + + diff --git a/lib/model/magazine.dart b/lib/model/magazine.dart index bbc4fc9..1501181 100644 --- a/lib/model/magazine.dart +++ b/lib/model/magazine.dart @@ -1,3 +1,5 @@ +import 'package:flutter/cupertino.dart'; + class Magazine { final String uid; final String title; @@ -19,9 +21,9 @@ class Magazine { this.publishedAt, this.createdAt, this.updatedAt, - this.summaryText, + @required this.summaryText, this.summaryUrl, - this.magazineUrl, + @required this.magazineUrl, this.uidCategory, }); } diff --git a/lib/ui/custom/dialog.dart b/lib/ui/custom/dialog.dart new file mode 100644 index 0000000..8b9d1c3 --- /dev/null +++ b/lib/ui/custom/dialog.dart @@ -0,0 +1,35 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +Future showAlertDialog({ + BuildContext context, + @required String title, + @required String contentMessage, + String confirmText, + String cancelText, +}) { + return showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(title), + content: Text(contentMessage), + actions: [ + if (cancelText != null) + TextButton( + onPressed: () { + Navigator.of(context).pop(false); + }, + child: Text(cancelText), + ), + TextButton( + onPressed: () { + Navigator.of(context).pop(true); + }, + child: Text(confirmText), + ), + ], + ); + }, + ); +} diff --git a/lib/ui/custom/item_mag_large.dart b/lib/ui/custom/item_mag_large.dart index 637212b..1d94287 100644 --- a/lib/ui/custom/item_mag_large.dart +++ b/lib/ui/custom/item_mag_large.dart @@ -1,28 +1,45 @@ import 'package:flutter/material.dart'; import 'package:le_kiosque_by_gcs/model/magazine.dart'; +import 'package:le_kiosque_by_gcs/ui/view/pdf_reader.dart'; class ItemMagLarge extends StatelessWidget { const ItemMagLarge({ Key key, - this.magazine, + @required this.magazine, }) : super(key: key); final Magazine magazine; + void showPdfReader(BuildContext context, String magazineUrl) { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) { + return PdfReader( + pdfUrl: magazine.magazineUrl, + ); + }, + ), + ); + } + @override Widget build(BuildContext context) { - return Container( - height: 235, - width: 168, - decoration: BoxDecoration( - shape: BoxShape.rectangle, - borderRadius: BorderRadius.all( - Radius.circular(5) - ), - image: DecorationImage( - image: NetworkImage( - "https://miningandbusiness.com/wp-content/uploads/2021/02/03f19c3a-1d92-4be7-ac54-f52b37e626ad-561x771.jpg"), - fit: BoxFit.cover, + return InkWell( + onTap: () { + showPdfReader(context, magazine.magazineUrl); + }, + child: Container( + height: 235, + width: 168, + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.all( + Radius.circular(5), + ), + image: DecorationImage( + image: NetworkImage(magazine.urlCover), + fit: BoxFit.cover, + ), ), ), ); diff --git a/lib/ui/custom/item_mag_row.dart b/lib/ui/custom/item_mag_row.dart index aea70a5..3a7d699 100644 --- a/lib/ui/custom/item_mag_row.dart +++ b/lib/ui/custom/item_mag_row.dart @@ -1,8 +1,28 @@ import 'package:flutter/material.dart'; import 'package:le_kiosque_by_gcs/model/magazine.dart'; +import 'package:le_kiosque_by_gcs/ui/view/detailmag/detail_mag.dart'; import 'item_mag_small.dart'; +showDetailCategoryMagazine({ + BuildContext context, + List magazines, + String rowTitle, +}) { + showBottomSheet( + //barrierColor: Colors.black87, + backgroundColor: Colors.black87, + context: context, + clipBehavior: Clip.hardEdge, + builder: (builder) { + return DetailMagazine( + magazines: magazines, + toolbarTitle: rowTitle, + ); + }, + ); +} + class ItemMagRow extends StatelessWidget { const ItemMagRow({ Key key, @@ -22,11 +42,27 @@ class ItemMagRow extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(bottom: 16, top: 26), - child: Text( - rowTitle, - style: TextStyle( - fontSize: 22, - ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + rowTitle, + style: TextStyle( + fontSize: 22, + ), + ), + InkWell( + onTap: () => showDetailCategoryMagazine( + context: context, + magazines: magazines, + rowTitle: rowTitle, + ), + child: Text( + 'Détails', + style: TextStyle(fontSize: 16, color: Color(0xFF25ADF3)), + ), + ) + ], ), ), Container( diff --git a/lib/ui/custom/item_mag_row_newest.dart b/lib/ui/custom/item_mag_row_newest.dart index 4799ad1..de30431 100644 --- a/lib/ui/custom/item_mag_row_newest.dart +++ b/lib/ui/custom/item_mag_row_newest.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; import 'package:le_kiosque_by_gcs/model/magazine.dart'; import 'package:le_kiosque_by_gcs/ui/custom/item_mag_large.dart'; +import 'package:le_kiosque_by_gcs/ui/view/detailmag/detail_mag.dart'; +import 'item_mag_row.dart'; import 'item_mag_small.dart'; class ItemMagRowNewest extends StatelessWidget { @@ -11,6 +13,8 @@ class ItemMagRowNewest extends StatelessWidget { }) : super(key: key); final List magazines; + final title = "Nouveautés"; + @override Widget build(BuildContext context) { @@ -21,11 +25,27 @@ class ItemMagRowNewest extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(bottom: 16, top: 26), - child: Text( - "Nouveautés", - style: TextStyle( - fontSize: 22, - ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: TextStyle( + fontSize: 22, + ), + ), + InkWell( + onTap: () => showDetailCategoryMagazine( + context: context, + magazines: magazines, + rowTitle: title, + ), + child: Text( + 'Détails', + style: TextStyle(fontSize: 16, color: Color(0xFF25ADF3)), + ), + ) + ], ), ), Container( diff --git a/lib/ui/custom/item_mag_small.dart b/lib/ui/custom/item_mag_small.dart index 589e4a7..a007460 100644 --- a/lib/ui/custom/item_mag_small.dart +++ b/lib/ui/custom/item_mag_small.dart @@ -1,6 +1,7 @@ + import 'package:flutter/material.dart'; import 'package:le_kiosque_by_gcs/model/magazine.dart'; -import 'package:le_kiosque_by_gcs/ui/pdf_reader.dart'; +import 'package:le_kiosque_by_gcs/ui/view/pdf_reader.dart'; class ItemMagSmall extends StatelessWidget { const ItemMagSmall({Key key, this.magazine}) : super(key: key); @@ -20,8 +21,7 @@ class ItemMagSmall extends StatelessWidget { shape: BoxShape.rectangle, borderRadius: BorderRadius.all(Radius.circular(5)), image: DecorationImage( - image: NetworkImage( - "https://miningandbusiness.com/wp-content/uploads/2021/02/03f19c3a-1d92-4be7-ac54-f52b37e626ad-561x771.jpg"), + image: NetworkImage(magazine.urlCover), fit: BoxFit.cover, ), ), @@ -34,7 +34,7 @@ class ItemMagSmall extends StatelessWidget { MaterialPageRoute( builder: (context) { return PdfReader( - pdfUrl: "http://www.africau.edu/images/default/sample.pdf", + pdfUrl: magazine.magazineUrl, ); }, ), diff --git a/lib/ui/home.dart b/lib/ui/home.dart deleted file mode 100644 index 9c5b00d..0000000 --- a/lib/ui/home.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:le_kiosque_by_gcs/model/magazine.dart'; -import 'package:le_kiosque_by_gcs/ui/custom/item_mag_row.dart'; -import 'package:le_kiosque_by_gcs/ui/custom/item_mag_row_newest.dart'; - -class HomeView extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Scaffold( - body: Padding( - padding: const EdgeInsets.all(16.0), - child: CustomScrollView( - slivers: [ - ItemMagRowNewest(magazines: [Magazine(), Magazine(), Magazine(), Magazine(), Magazine(), Magazine()]), - ItemMagRow(rowTitle: "Buzzz Magazine", magazines: [Magazine(), Magazine(), Magazine(), Magazine(), Magazine(), Magazine()]), - ItemMagRow(rowTitle: "Hamaji Magazine", magazines: [Magazine(), Magazine(), Magazine(), Magazine(), Magazine(), Magazine()]), - ItemMagRow(rowTitle: "Mining and buziness", magazines: [Magazine(), Magazine(), Magazine(), Magazine(), Magazine(), Magazine()]), - ItemMagRow(rowTitle: "Declic Car Magazine", magazines: [Magazine(), Magazine(), Magazine(), Magazine(), Magazine(), Magazine()]), - ItemMagRow(rowTitle: "Congo Airways", magazines: [Magazine(), Magazine(), Magazine(), Magazine(), Magazine(), Magazine()]), - ], - ), - ), - ); - } -} diff --git a/lib/ui/setting.dart b/lib/ui/setting.dart deleted file mode 100644 index 05a4756..0000000 --- a/lib/ui/setting.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_settings_screens/flutter_settings_screens.dart'; - -class SettingView extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - centerTitle: false, - backgroundColor: Colors.white, - title: Text( - "Paramètres", - style: TextStyle( - color: Colors.black, - ), - ), - iconTheme: IconThemeData( - color: Color(0xFF545454), //change your color here - ), - ), - body: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text( - "Compte", - style: TextStyle( - fontSize: 23, - color: Color(0xFFA7A7A7), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 8.0, bottom: 8.0), - child: Text( - "Changer le mot de passe", - style: TextStyle( - fontSize: 18, - color: Colors.black, - ), - ), - ), - //Text("Changer le mot de passe") - ], - ), - ), - ); - } -} diff --git a/lib/ui/subscription.dart b/lib/ui/subscription.dart deleted file mode 100644 index a517e2a..0000000 --- a/lib/ui/subscription.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:flutter/cupertino.dart'; - -class SubscriptionView extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Container(); - } -} diff --git a/lib/ui/about.dart b/lib/ui/view/about.dart similarity index 100% rename from lib/ui/about.dart rename to lib/ui/view/about.dart diff --git a/lib/ui/auth.dart b/lib/ui/view/auth.dart similarity index 87% rename from lib/ui/auth.dart rename to lib/ui/view/auth.dart index 930a7b0..40edbe9 100644 --- a/lib/ui/auth.dart +++ b/lib/ui/view/auth.dart @@ -1,13 +1,14 @@ import 'package:flutter/material.dart'; import 'package:le_kiosque_by_gcs/services/auth/auth.dart'; +import 'package:provider/provider.dart'; -import 'custom/custom_elevated_button.dart'; +import '../custom/custom_elevated_button.dart'; class AuthView extends StatelessWidget { - const AuthView({Key key, this.auth}) : super(key: key); - final Auth auth; - Future _signWithGoogle() async { + + Future _signWithGoogle(context) async { + final auth = Provider.of(context, listen: false); try { await auth.signInWithGoogle(); } catch (e) { @@ -15,7 +16,8 @@ class AuthView extends StatelessWidget { } } - Future _signInWithFacebook() async { + Future _signInWithFacebook(context) async { + final auth = Provider.of(context, listen: false); try { await auth.signInWithFacebook(); } catch (e) { @@ -74,7 +76,7 @@ class AuthView extends StatelessWidget { imageAsset: "assets/images/google_logo.png", color: Colors.white, textColor: Colors.black, - onPressed: _signWithGoogle, + onPressed: () => _signWithGoogle(context), text: "Se connecter avec Google", ), SizedBox(height: 24), @@ -82,7 +84,7 @@ class AuthView extends StatelessWidget { imageAsset: "assets/images/facebook_logo.png", color: Color(0xFF334D92), textColor: Colors.white, - onPressed: _signInWithFacebook, + onPressed: () => _signInWithFacebook(context), text: "Se connecter avec Facebook", ), SizedBox( diff --git a/lib/ui/view/detailmag/detail_mag.dart b/lib/ui/view/detailmag/detail_mag.dart new file mode 100644 index 0000000..f31945d --- /dev/null +++ b/lib/ui/view/detailmag/detail_mag.dart @@ -0,0 +1,88 @@ +import 'package:carousel_slider/carousel_slider.dart'; +import 'package:flutter/material.dart'; +import 'package:le_kiosque_by_gcs/model/magazine.dart'; + +class DetailMagazine extends StatefulWidget { + final List magazines; + final String toolbarTitle; + + DetailMagazine({ + Key key, + @required this.magazines, + @required this.toolbarTitle, + }) : super(key: key); + + @override + _DetailMagazineState createState() => _DetailMagazineState(); +} + +class _DetailMagazineState extends State { + String _currentSummary; + + @override + void initState() { + _updateSummary(widget.magazines[0].summaryText); + super.initState(); + } + + _updateSummary(String newText) { + setState(() { + _currentSummary = newText; + }); + } + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + child: CarouselSlider.builder( + itemCount: widget.magazines.length, + itemBuilder: (context, index, realIndex) => Container( + width: MediaQuery.of(context).size.width, + margin: EdgeInsets.symmetric(horizontal: 5.0), + child: Container( + height: 235, + width: 168, + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.all( + Radius.circular(5), + ), + image: DecorationImage( + image: NetworkImage(widget.magazines[index].urlCover), + fit: BoxFit.cover, + ), + ), + ), + ), + options: CarouselOptions( + height: 400, + pageSnapping: true, + enableInfiniteScroll: false, + enlargeCenterPage: true, + onPageChanged: (index, _) { + _updateSummary(widget.magazines[index].summaryText); + } + ), + ), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + _currentSummary, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + color: Colors.white, + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/ui/edit_profil.dart b/lib/ui/view/edit_profil.dart similarity index 100% rename from lib/ui/edit_profil.dart rename to lib/ui/view/edit_profil.dart diff --git a/lib/ui/view/home.dart b/lib/ui/view/home.dart new file mode 100644 index 0000000..0f87ff1 --- /dev/null +++ b/lib/ui/view/home.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:le_kiosque_by_gcs/model/magazine.dart'; +import 'package:le_kiosque_by_gcs/ui/custom/item_mag_row.dart'; +import 'package:le_kiosque_by_gcs/ui/custom/item_mag_row_newest.dart'; + +class HomeView extends StatelessWidget { + + + @override + Widget build(BuildContext context) { + + final summary = "Voyez ce jeu exquis wallon, de graphie en kit mais bref. Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à côté de l\"alcôve ovoïde, où les bûches se consument dans l\"âtre"; + final url = "https://miningandbusiness.com/wp-content/uploads/2021/02/03f19c3a-1d92-4be7-ac54-f52b37e626ad-561x771.jpg"; + final urlPrd = "http://www.africau.edu/images/default/sample.pdf"; + + return Scaffold( + body: Padding( + padding: const EdgeInsets.all(16.0), + child: CustomScrollView( + slivers: [ + ItemMagRowNewest(magazines: [Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary)]), + ItemMagRow(rowTitle: "Buzzz Magazine", magazines: [Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary)]), + ItemMagRow(rowTitle: "Hamaji Magazine", magazines: [Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary)]), + ItemMagRow(rowTitle: "Mining and buziness", magazines: [Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary)]), + ItemMagRow(rowTitle: "Declic Car Magazine", magazines: [Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary)]), + ItemMagRow(rowTitle: "Congo Airways", magazines: [Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary)]), + ], + ), + ), + ); + } +} diff --git a/lib/ui/landing.dart b/lib/ui/view/landing.dart similarity index 75% rename from lib/ui/landing.dart rename to lib/ui/view/landing.dart index 13ee921..c0e2551 100644 --- a/lib/ui/landing.dart +++ b/lib/ui/view/landing.dart @@ -1,22 +1,22 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:le_kiosque_by_gcs/services/auth/auth.dart'; -import 'package:le_kiosque_by_gcs/ui/auth.dart'; -import 'package:le_kiosque_by_gcs/ui/main.dart'; +import 'package:le_kiosque_by_gcs/ui/view/auth.dart'; +import 'package:le_kiosque_by_gcs/ui/view/main.dart'; +import 'package:provider/provider.dart'; class LandingPageView extends StatelessWidget { - final Auth auth; - - const LandingPageView({Key key, this.auth}) : super(key: key); @override Widget build(BuildContext context) { + + final auth = Provider.of(context, listen: false); return StreamBuilder( stream: auth.authStateChanges(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.active) { if (snapshot.data == null) { - return AuthView(auth: auth); + return AuthView(); } else { return MainView(); } diff --git a/lib/ui/main.dart b/lib/ui/view/main.dart similarity index 88% rename from lib/ui/main.dart rename to lib/ui/view/main.dart index 956770c..4288a09 100644 --- a/lib/ui/main.dart +++ b/lib/ui/view/main.dart @@ -1,12 +1,12 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import 'package:le_kiosque_by_gcs/ui/home.dart'; -import 'package:le_kiosque_by_gcs/ui/news.dart'; -import 'package:le_kiosque_by_gcs/ui/profile.dart'; -import 'package:le_kiosque_by_gcs/ui/search.dart'; -import 'package:le_kiosque_by_gcs/ui/setting.dart'; -import 'package:le_kiosque_by_gcs/ui/subscription.dart'; +import 'package:le_kiosque_by_gcs/ui/view/home.dart'; +import 'package:le_kiosque_by_gcs/ui/view/news.dart'; +import 'package:le_kiosque_by_gcs/ui/view/profile.dart'; +import 'package:le_kiosque_by_gcs/ui/view/search.dart'; +import 'package:le_kiosque_by_gcs/ui/view/setting/setting.dart'; +import 'package:le_kiosque_by_gcs/ui/view/subscription/subscription.dart'; class MainView extends StatefulWidget { @override @@ -34,7 +34,7 @@ class _MainViewState extends State { _showSettingView(BuildContext context) { Navigator.of(context).push( MaterialPageRoute( - builder: (context) => SettingView(), + builder: (_) => SettingView(), ), ); } @@ -42,7 +42,7 @@ class _MainViewState extends State { void _showSearchView(BuildContext context) { Navigator.of(context).push( MaterialPageRoute( - builder: (context) => SearchView(), + builder: (_) => SearchView(), ), ); } diff --git a/lib/ui/news.dart b/lib/ui/view/news.dart similarity index 100% rename from lib/ui/news.dart rename to lib/ui/view/news.dart diff --git a/lib/ui/pdf_reader.dart b/lib/ui/view/pdf_reader.dart similarity index 96% rename from lib/ui/pdf_reader.dart rename to lib/ui/view/pdf_reader.dart index 52aba56..b79e0db 100644 --- a/lib/ui/pdf_reader.dart +++ b/lib/ui/view/pdf_reader.dart @@ -25,7 +25,7 @@ class _PdfReaderState extends State { loadDocument() async { try { - document = await PDFDocument.fromURL('https://pdftron.s3.amazonaws.coQm/downloads/pdfref.pdf'); + document = await PDFDocument.fromURL('https://pdftron.s3.amazonaws.com/downloads/pdfref.pdf'); setState(() => isLoading = false); } catch(e) { print(e); diff --git a/lib/ui/profile.dart b/lib/ui/view/profile.dart similarity index 53% rename from lib/ui/profile.dart rename to lib/ui/view/profile.dart index a7a005a..306106f 100644 --- a/lib/ui/profile.dart +++ b/lib/ui/view/profile.dart @@ -1,8 +1,9 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; +import 'package:le_kiosque_by_gcs/model/magazine.dart'; import 'package:le_kiosque_by_gcs/ui/custom/item_mag_large.dart'; import 'package:le_kiosque_by_gcs/ui/custom/profile_picture.dart'; -import 'package:le_kiosque_by_gcs/ui/edit_profil.dart'; +import 'package:le_kiosque_by_gcs/ui/view/edit_profil.dart'; class ProfileView extends StatefulWidget { @override @@ -12,14 +13,29 @@ class ProfileView extends StatefulWidget { class _ProfileViewState extends State { @override Widget build(BuildContext context) { + // TODO Removig + final summary = + "Voyez ce jeu exquis wallon, de graphie en kit mais bref. Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à côté de l\"alcôve ovoïde, où les bûches se consument dans l\"âtre"; + final url = + "https://miningandbusiness.com/wp-content/uploads/2021/02/03f19c3a-1d92-4be7-ac54-f52b37e626ad-561x771.jpg"; + final urlPrd = "http://www.africau.edu/images/default/sample.pdf"; + + final magazines = [ + Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), + Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), + Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), + Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary), + Magazine(urlCover: url, magazineUrl: urlPrd, summaryText: summary) + ]; return Scaffold( body: CustomScrollView( slivers: [ - SliverList( - delegate: SliverChildListDelegate( - [ + SliverToBoxAdapter( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ _buildProfileHeader(), - SizedBox(height: 48), + SizedBox(height: 24), Padding( padding: const EdgeInsets.only( left: 16, @@ -38,20 +54,41 @@ class _ProfileViewState extends State { ], ), ), - SliverToBoxAdapter( - child: Text("ssdsfdss") - ) + SliverPadding( + padding: EdgeInsets.all(16), + sliver: SliverGrid( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 16.0, + crossAxisSpacing: 16.0, + mainAxisExtent: 250 + ), + delegate: SliverChildBuilderDelegate( + (context, int index) => ItemMagLarge(magazine: magazines[index]), + childCount: magazines.length, + ), + ), + ), ], ), floatingActionButtonAnimator: FloatingActionButtonAnimator.scaling, floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, floatingActionButton: Visibility( - child: FloatingActionButton.extended( - onPressed: () => _showEditProfileView(context), - label: const Text('Editer', style: TextStyle(color: Color(0XFFFF567E))), - icon: const Icon(Icons.edit, color: Color(0XFFFF567E)), - backgroundColor: Colors.white, - )), + child: FloatingActionButton.extended( + onPressed: () => _showEditProfileView(context), + label: const Text( + 'Editer', + style: TextStyle( + color: Color(0XFFFF567E), + ), + ), + icon: const Icon( + Icons.edit, + color: Color(0XFFFF567E), + ), + backgroundColor: Colors.white, + ), + ), ); } @@ -107,8 +144,10 @@ class _ProfileViewState extends State { } _showEditProfileView(BuildContext context) { - Navigator.of(context).push(MaterialPageRoute( - builder: (BuildContext context) => EditProfileView(), - )); + Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) => EditProfileView(), + ), + ); } } diff --git a/lib/ui/search.dart b/lib/ui/view/search.dart similarity index 100% rename from lib/ui/search.dart rename to lib/ui/view/search.dart diff --git a/lib/ui/view/setting/item_logout.dart b/lib/ui/view/setting/item_logout.dart new file mode 100644 index 0000000..033576b --- /dev/null +++ b/lib/ui/view/setting/item_logout.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +class ItemLogout extends StatelessWidget { + final String title; + + const ItemLogout({ + Key key, + this.title, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: TextStyle( + fontSize: 18, + color: Color(0xFF56B4FC), + ), + ) + ], + ), + ); + } +} diff --git a/lib/ui/view/setting/item_title_group.dart b/lib/ui/view/setting/item_title_group.dart new file mode 100644 index 0000000..d55444e --- /dev/null +++ b/lib/ui/view/setting/item_title_group.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +class ItemTitleGroup extends StatelessWidget { + + const ItemTitleGroup({ + Key key, + this.groupTitle, + }) : super(key: key); + + final String groupTitle; + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + groupTitle, + style: TextStyle( + fontSize: 23, + color: Color(0xFFA7A7A7), + ), + ), + ), + ); + } +} diff --git a/lib/ui/view/setting/item_title_setting.dart b/lib/ui/view/setting/item_title_setting.dart new file mode 100644 index 0000000..8277349 --- /dev/null +++ b/lib/ui/view/setting/item_title_setting.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +class ItemTitleSetting extends StatelessWidget { + const ItemTitleSetting({ + Key key, + this.title, + }) : super(key: key); + + final String title; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: TextStyle( + fontSize: 18, + color: Colors.black, + ), + ), + Icon( + Icons.arrow_forward_ios_rounded, + color: Colors.black, + ) + ], + ), + ); + } +} diff --git a/lib/ui/view/setting/setting.dart b/lib/ui/view/setting/setting.dart new file mode 100644 index 0000000..124a278 --- /dev/null +++ b/lib/ui/view/setting/setting.dart @@ -0,0 +1,107 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:le_kiosque_by_gcs/services/auth/auth.dart'; +import 'package:le_kiosque_by_gcs/ui/custom/dialog.dart'; +import 'package:le_kiosque_by_gcs/ui/view/about.dart'; +import 'package:le_kiosque_by_gcs/ui/view/setting/item_logout.dart'; +import 'package:le_kiosque_by_gcs/ui/view/setting/item_title_group.dart'; +import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; + + +import 'item_title_setting.dart'; + +class SettingView extends StatelessWidget { + _navigateToAboutView(BuildContext context) { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) { + return AboutView(); + }, + ), + ); + } + + final String licenceUrl = "http://example.com"; + + _showTermAndCond(BuildContext context) async { + if (await canLaunch(licenceUrl)) { + await launch(licenceUrl); + } else { + throw 'Could not launch $licenceUrl'; + } + } + + _showLicence(BuildContext context) async { + if (await canLaunch(licenceUrl)) { + await launch(licenceUrl); + } else { + throw 'Could not launch $licenceUrl'; + } + } + + _changeLanguage(BuildContext context) async { + + } + + _showLogoutDialog(BuildContext context) async { + final auth = Provider.of(context, listen: false); + final isConfirm = await showAlertDialog( + context: context, + title: "Deconnexion", + contentMessage: "Êtes-vous sûr de vouloir continuer", + confirmText: "Oui", + cancelText: "Non", + ); + + if (isConfirm) { + await auth.signOut(); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + centerTitle: false, + backgroundColor: Colors.white, + title: Text( + "Paramètres", + style: TextStyle( + color: Colors.black, + ), + ), + iconTheme: IconThemeData( + color: Color(0xFF545454), //change your color here + ), + ), + body: ListView( + children: [ + ItemTitleGroup(groupTitle: "Compte"), + InkWell( + child: ItemTitleSetting(title: "Changer la langue"), + onTap: () => _changeLanguage(context), + ), + ItemTitleGroup(groupTitle: "Autres"), + InkWell( + child: ItemTitleSetting(title: "Termes & Conditions"), + onTap: () => _showTermAndCond(context), + ), + InkWell( + child: ItemTitleSetting(title: "Licence"), + onTap: () => _showLicence(context), + ), + InkWell( + child: ItemTitleSetting(title: "A propos"), + onTap: () => _navigateToAboutView(context), + ), + SizedBox(height: 16), + InkWell( + child: ItemLogout(title: "Deconnexion"), + onTap: () => _showLogoutDialog(context), + ) + ], + ), + ); + } +} diff --git a/lib/ui/view/subscription/subscription.dart b/lib/ui/view/subscription/subscription.dart new file mode 100644 index 0000000..7355962 --- /dev/null +++ b/lib/ui/view/subscription/subscription.dart @@ -0,0 +1,46 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class SubscriptionView extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + height: 286, + width: 317, + child: Image.asset("assets/images/mags.png"), + ), + Padding( + padding: const EdgeInsets.all(24.0), + child: Text( + "Voyez ce jeu exquis wallon, de graphie en kit mais bref. Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à côté de l\"alcôve ovoïde, où les bûches se", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 17, + ), + ), + ), + SizedBox( + width: 200, + child: FloatingActionButton.extended( + onPressed: () => _buyNow(context), + label: const Text( + 'Payer maintenant', + style: TextStyle( + color: Colors.white, + ), + ), + backgroundColor: Color(0XFF2571F3), + ), + ) + ], + ), + ); + } + + _buyNow(BuildContext context) {} +} diff --git a/pubspec.lock b/pubspec.lock index 2b6f5e9..a720f79 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -29,6 +29,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + carousel_slider: + dependency: "direct main" + description: + name: carousel_slider + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" characters: dependency: transitive description: @@ -497,6 +504,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.2" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" uuid: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 30f64d1..5493e02 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -35,6 +35,8 @@ dependencies: provider: ^4.0.0 advance_pdf_viewer: ^1.2.2 flutter_settings_screens: ^0.2.1+1 + url_launcher: ^6.0.2 + carousel_slider: ^3.0.0 dev_dependencies: flutter_test: