1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-11-25 22:39:22 +00:00

Start to update tour route

This commit is contained in:
Pierre HUBERT 2021-04-23 13:43:24 +02:00
parent a022e8bfd1
commit 46f9c917b5
7 changed files with 189 additions and 154 deletions

View File

@ -1,4 +1,5 @@
import 'package:comunic/models/api_request.dart'; import 'package:comunic/models/api_request.dart';
import 'package:comunic/models/config.dart';
import 'package:comunic/ui/dialogs/record_audio_dialog.dart'; import 'package:comunic/ui/dialogs/record_audio_dialog.dart';
import 'package:comunic/ui/routes/image_editor_route.dart'; import 'package:comunic/ui/routes/image_editor_route.dart';
import 'package:comunic/utils/files_utils.dart'; import 'package:comunic/utils/files_utils.dart';
@ -202,6 +203,7 @@ class _BottomSheetPickOption extends StatelessWidget {
@override @override
Widget build(BuildContext context) => Container( Widget build(BuildContext context) => Container(
color: config().splashBackgroundColor,
height: 255, height: 255,
child: Center( child: Center(
child: ConstrainedBox( child: ConstrainedBox(
@ -209,8 +211,9 @@ class _BottomSheetPickOption extends StatelessWidget {
child: ListView.builder( child: ListView.builder(
itemCount: options.length, itemCount: options.length,
itemBuilder: (c, i) => ListTile( itemBuilder: (c, i) => ListTile(
leading: Icon(options[i].icon), leading: Icon(options[i].icon, color: Colors.white),
title: Text(options[i].label), title: Text(options[i].label,
style: TextStyle(color: Colors.white)),
onTap: () => onOptionSelected(options[i].value), onTap: () => onOptionSelected(options[i].value),
), ),
), ),

View File

@ -2,10 +2,12 @@ import 'package:comunic/helpers/preferences_helper.dart';
import 'package:comunic/helpers/users_helper.dart'; import 'package:comunic/helpers/users_helper.dart';
import 'package:comunic/models/user.dart'; import 'package:comunic/models/user.dart';
import 'package:comunic/ui/routes/push_notifications_route.dart'; import 'package:comunic/ui/routes/push_notifications_route.dart';
import 'package:comunic/ui/routes/settings/account_image_settings.dart';
import 'package:comunic/ui/widgets/account_image_widget.dart';
import 'package:comunic/ui/widgets/async_screen_widget.dart'; import 'package:comunic/ui/widgets/async_screen_widget.dart';
import 'package:comunic/ui/widgets/login_routes_theme.dart'; import 'package:comunic/ui/widgets/login_routes_theme.dart';
import 'package:comunic/ui/widgets/tour/account_image_tour_pane.dart';
import 'package:comunic/ui/widgets/tour/first_pane.dart';
import 'package:comunic/ui/widgets/tour/last_pane.dart';
import 'package:comunic/ui/widgets/tour/presentation_pane.dart';
import 'package:comunic/utils/account_utils.dart'; import 'package:comunic/utils/account_utils.dart';
import 'package:comunic/utils/intl_utils.dart'; import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -39,24 +41,13 @@ class _TourRouteState extends State<TourRoute> {
} }
List<Widget> get _list => [ List<Widget> get _list => [
_FirstPane(), FirstTourPane(),
// Account image // Account image
_PresentationPane( AccountImageTourPane(user: currUser),
iconWidget: AccountImageWidget(user: currUser, width: 50),
title: tr("Account image"),
text: tr(
"Account image allow to quickly recognize people.\n\nYou can decide to define one now!"),
actionTitle: tr("Upload an account image"),
onActionTap: (ctx) async {
await uploadNewAccountImage(context);
_defaultIndex = DefaultTabController.of(ctx).index;
await key.currentState.refresh();
},
),
// Notifications // Notifications
_PresentationPane( PresentationPane(
icon: Icons.notifications, icon: Icons.notifications,
title: tr("Push notifications"), title: tr("Push notifications"),
child: (c) => PushNotificationsConfigurationWidget( child: (c) => PushNotificationsConfigurationWidget(
@ -68,31 +59,31 @@ class _TourRouteState extends State<TourRoute> {
onTapNext: (c) => _pushNotificationsKey.currentState.submit(), onTapNext: (c) => _pushNotificationsKey.currentState.submit(),
), ),
_PresentationPane( PresentationPane(
icon: Icons.group_add, icon: Icons.group_add,
title: tr("Friends"), title: tr("Friends"),
text: tr( text: tr(
"You can search the people you know and ask them to become your friends!\n\nThis will help you to reach them to exchange information!"), "You can search the people you know and ask them to become your friends!\n\nThis will help you to reach them to exchange information!"),
), ),
_PresentationPane( PresentationPane(
icon: Icons.question_answer, icon: Icons.question_answer,
title: tr("Conversations"), title: tr("Conversations"),
text: tr( text: tr(
"With Comunic, you can have conversations with all your friends.\n\nIt is also possible to make video calls!"), "With Comunic, you can have conversations with all your friends.\n\nIt is also possible to make video calls!"),
), ),
_PresentationPane( PresentationPane(
icon: Icons.group, icon: Icons.group,
title: tr("Groups"), title: tr("Groups"),
text: tr( text: tr(
"You can join groups where people share the same interests as you!\n\nIt is also easy to create your own groups!"), "You can join groups where people share the same interests as you!\n\nIt is also easy to create your own groups!"),
), ),
_PresentationPane( PresentationPane(
icon: Icons.lock, icon: Icons.lock,
title: tr("Privacy"), title: tr("Privacy"),
text: tr( text: tr(
"Your data is YOUR DATA. We will never use it or sell it.\n\nIf you do not trust us, you can always check out our source code to verify it!"), "Your data is YOUR DATA. We will never use it or sell it.\n\nIf you do not trust us, you can always check out our source code to verify it!"),
), ),
_LastPane(), LastTourPane(),
]; ];
@override @override
@ -130,8 +121,8 @@ class __RouteBodyState extends State<_RouteBody> {
bool get _isLastPane => _controller.index >= widget.panes.length - 1; bool get _isLastPane => _controller.index >= widget.panes.length - 1;
_PresentationPane get _currPane => PresentationPane get _currPane =>
widget.panes[_controller.index] is _PresentationPane widget.panes[_controller.index] is PresentationPane
? widget.panes[_controller.index] ? widget.panes[_controller.index]
: null; : null;
@ -195,132 +186,3 @@ class __RouteBodyState extends State<_RouteBody> {
} }
} }
} }
class _PresentationPane extends StatelessWidget {
final IconData icon;
final Widget iconWidget;
final String title;
final String text;
final Function(BuildContext) child;
final String actionTitle;
final Function(BuildContext) onActionTap;
final bool canGoNext;
final Future<bool> Function(BuildContext) onTapNext;
const _PresentationPane({
Key key,
this.icon,
this.iconWidget,
@required this.title,
this.text,
this.child,
this.actionTitle,
this.onActionTap,
this.canGoNext = true,
this.onTapNext,
}) : assert(icon != null || iconWidget != null),
assert(title != null),
assert(text != null || child != null),
super(key: key);
bool get _hasAction => actionTitle != null && onActionTap != null;
@override
Widget build(BuildContext context) {
if (text != null)
return Column(
children: <Widget>[
Spacer(flex: 3),
icon != null ? Icon(icon, color: Colors.white, size: 50) : iconWidget,
Spacer(flex: 1),
Text(
title,
style: TextStyle(fontSize: 20),
),
Spacer(flex: 1),
_FixedSizeTextArea(text),
Spacer(flex: 1),
_hasAction
? OutlinedButton(
onPressed: () => onActionTap(context),
child: Text(
actionTitle,
style: TextStyle(color: Colors.white),
),
)
: Opacity(
opacity: 0,
child: OutlinedButton(
onPressed: null,
child: Text(""),
),
),
Spacer(flex: 3),
],
);
return Column(
children: <Widget>[
Spacer(flex: 1),
icon != null ? Icon(icon, color: Colors.white, size: 50) : iconWidget,
Spacer(flex: 1),
Text(
title,
style: TextStyle(fontSize: 20),
),
Spacer(flex: 1),
ConstrainedBox(
constraints: BoxConstraints(maxHeight: 300),
child: SingleChildScrollView(child: child(context))),
Spacer(flex: 1),
],
);
}
}
class _FirstPane extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Spacer(flex: 3),
Text(
"Comunic",
style: TextStyle(fontSize: 25),
),
Spacer(flex: 2),
_FixedSizeTextArea(tr(
"Welcome to Comunic, the social network that respect your privacy !")),
Spacer(flex: 1),
_FixedSizeTextArea(tr(
"Let's configure a few things and present you some features of the network...")),
Spacer(flex: 3),
],
);
}
}
class _LastPane extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Text(
tr("The application is yours"),
style: TextStyle(fontSize: 25),
),
);
}
}
class _FixedSizeTextArea extends StatelessWidget {
final String text;
const _FixedSizeTextArea(this.text);
@override
Widget build(BuildContext context) => ConstrainedBox(
constraints: BoxConstraints(maxWidth: 300),
child: Text(text, textAlign: TextAlign.justify),
);
}

View File

@ -0,0 +1,19 @@
import 'package:comunic/models/user.dart';
import 'package:comunic/ui/routes/settings/account_image_settings.dart';
import 'package:comunic/ui/widgets/account_image_widget.dart';
import 'package:comunic/ui/widgets/tour/presentation_pane.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/material.dart';
class AccountImageTourPane extends PresentationPane {
AccountImageTourPane({@required User user})
: super(
iconWidget: AccountImageWidget(user: user, width: 50),
title: tr("Account image"),
text: tr(
"Account image allow to quickly recognize people.\n\nYou can decide to define one now!"),
actionTitle: tr("Upload an account image"),
onActionTap: (ctx) async {
await uploadNewAccountImage(ctx);
});
}

View File

@ -0,0 +1,30 @@
import 'package:comunic/ui/widgets/tour/fixed_tour_size_text_area.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/material.dart';
/// First tour pane
///
/// @author Pierre Hubert
class FirstTourPane extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Spacer(flex: 3),
Text(
"Comunic",
style: TextStyle(fontSize: 25),
),
Spacer(flex: 2),
FixedTourSizeTextArea(tr(
"Welcome to Comunic, the social network that respect your privacy!")),
Spacer(flex: 1),
FixedTourSizeTextArea(tr(
"Let's configure a few things and present you some features of the network...")),
Spacer(flex: 3),
],
);
}
}

View File

@ -0,0 +1,16 @@
/// Fixed tour size text area
///
/// @author Pierre Hubert
import 'package:flutter/material.dart';
class FixedTourSizeTextArea extends StatelessWidget {
final String text;
const FixedTourSizeTextArea(this.text);
@override
Widget build(BuildContext context) => ConstrainedBox(
constraints: BoxConstraints(maxWidth: 300),
child: Text(text, textAlign: TextAlign.justify),
);
}

View File

@ -0,0 +1,18 @@
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/material.dart';
/// Last tour pane
///
/// @author Pierre Hubert
class LastTourPane extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Text(
tr("The application is yours"),
style: TextStyle(fontSize: 25),
),
);
}
}

View File

@ -0,0 +1,87 @@
/// Application presentation tour pane
///
/// @author Pierre Hubert
import 'package:comunic/ui/widgets/tour/fixed_tour_size_text_area.dart';
import 'package:flutter/material.dart';
class PresentationPane extends StatelessWidget {
final IconData icon;
final Widget iconWidget;
final String title;
final String text;
final Function(BuildContext) child;
final String actionTitle;
final Function(BuildContext) onActionTap;
final bool canGoNext;
final Future<bool> Function(BuildContext) onTapNext;
const PresentationPane({
Key key,
this.icon,
this.iconWidget,
@required this.title,
this.text,
this.child,
this.actionTitle,
this.onActionTap,
this.canGoNext = true,
this.onTapNext,
}) : assert(icon != null || iconWidget != null),
assert(title != null),
assert(text != null || child != null),
super(key: key);
bool get _hasAction => actionTitle != null && onActionTap != null;
@override
Widget build(BuildContext context) {
if (text != null)
return Column(
children: <Widget>[
Spacer(flex: 3),
icon != null ? Icon(icon, color: Colors.white, size: 50) : iconWidget,
Spacer(flex: 1),
Text(
title,
style: TextStyle(fontSize: 20),
),
Spacer(flex: 1),
FixedTourSizeTextArea(text),
Spacer(flex: 1),
_hasAction
? OutlinedButton(
onPressed: () => onActionTap(context),
child: Text(
actionTitle,
style: TextStyle(color: Colors.white),
),
)
: Opacity(
opacity: 0,
child: OutlinedButton(
onPressed: null,
child: Text(""),
),
),
Spacer(flex: 3),
],
);
return Column(
children: <Widget>[
Spacer(flex: 1),
icon != null ? Icon(icon, color: Colors.white, size: 50) : iconWidget,
Spacer(flex: 1),
Text(
title,
style: TextStyle(fontSize: 20),
),
Spacer(flex: 1),
ConstrainedBox(
constraints: BoxConstraints(maxHeight: 300),
child: SingleChildScrollView(child: child(context))),
Spacer(flex: 1),
],
);
}
}