mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-04 12:14:11 +00:00 
			
		
		
		
	Start to update tour route
This commit is contained in:
		@@ -1,4 +1,5 @@
 | 
			
		||||
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/routes/image_editor_route.dart';
 | 
			
		||||
import 'package:comunic/utils/files_utils.dart';
 | 
			
		||||
@@ -202,6 +203,7 @@ class _BottomSheetPickOption extends StatelessWidget {
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) => Container(
 | 
			
		||||
        color: config().splashBackgroundColor,
 | 
			
		||||
        height: 255,
 | 
			
		||||
        child: Center(
 | 
			
		||||
          child: ConstrainedBox(
 | 
			
		||||
@@ -209,8 +211,9 @@ class _BottomSheetPickOption extends StatelessWidget {
 | 
			
		||||
            child: ListView.builder(
 | 
			
		||||
              itemCount: options.length,
 | 
			
		||||
              itemBuilder: (c, i) => ListTile(
 | 
			
		||||
                leading: Icon(options[i].icon),
 | 
			
		||||
                title: Text(options[i].label),
 | 
			
		||||
                leading: Icon(options[i].icon, color: Colors.white),
 | 
			
		||||
                title: Text(options[i].label,
 | 
			
		||||
                    style: TextStyle(color: Colors.white)),
 | 
			
		||||
                onTap: () => onOptionSelected(options[i].value),
 | 
			
		||||
              ),
 | 
			
		||||
            ),
 | 
			
		||||
 
 | 
			
		||||
@@ -2,10 +2,12 @@ import 'package:comunic/helpers/preferences_helper.dart';
 | 
			
		||||
import 'package:comunic/helpers/users_helper.dart';
 | 
			
		||||
import 'package:comunic/models/user.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/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/intl_utils.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
@@ -39,24 +41,13 @@ class _TourRouteState extends State<TourRoute> {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  List<Widget> get _list => [
 | 
			
		||||
        _FirstPane(),
 | 
			
		||||
        FirstTourPane(),
 | 
			
		||||
 | 
			
		||||
        // Account image
 | 
			
		||||
        _PresentationPane(
 | 
			
		||||
          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();
 | 
			
		||||
          },
 | 
			
		||||
        ),
 | 
			
		||||
        AccountImageTourPane(user: currUser),
 | 
			
		||||
 | 
			
		||||
        // Notifications
 | 
			
		||||
        _PresentationPane(
 | 
			
		||||
        PresentationPane(
 | 
			
		||||
          icon: Icons.notifications,
 | 
			
		||||
          title: tr("Push notifications"),
 | 
			
		||||
          child: (c) => PushNotificationsConfigurationWidget(
 | 
			
		||||
@@ -68,31 +59,31 @@ class _TourRouteState extends State<TourRoute> {
 | 
			
		||||
          onTapNext: (c) => _pushNotificationsKey.currentState.submit(),
 | 
			
		||||
        ),
 | 
			
		||||
 | 
			
		||||
        _PresentationPane(
 | 
			
		||||
        PresentationPane(
 | 
			
		||||
          icon: Icons.group_add,
 | 
			
		||||
          title: tr("Friends"),
 | 
			
		||||
          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!"),
 | 
			
		||||
        ),
 | 
			
		||||
        _PresentationPane(
 | 
			
		||||
        PresentationPane(
 | 
			
		||||
          icon: Icons.question_answer,
 | 
			
		||||
          title: tr("Conversations"),
 | 
			
		||||
          text: tr(
 | 
			
		||||
              "With Comunic, you can have conversations with all your friends.\n\nIt is also possible to make video calls!"),
 | 
			
		||||
        ),
 | 
			
		||||
        _PresentationPane(
 | 
			
		||||
        PresentationPane(
 | 
			
		||||
          icon: Icons.group,
 | 
			
		||||
          title: tr("Groups"),
 | 
			
		||||
          text: tr(
 | 
			
		||||
              "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,
 | 
			
		||||
          title: tr("Privacy"),
 | 
			
		||||
          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!"),
 | 
			
		||||
        ),
 | 
			
		||||
        _LastPane(),
 | 
			
		||||
        LastTourPane(),
 | 
			
		||||
      ];
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
@@ -130,8 +121,8 @@ class __RouteBodyState extends State<_RouteBody> {
 | 
			
		||||
 | 
			
		||||
  bool get _isLastPane => _controller.index >= widget.panes.length - 1;
 | 
			
		||||
 | 
			
		||||
  _PresentationPane get _currPane =>
 | 
			
		||||
      widget.panes[_controller.index] is _PresentationPane
 | 
			
		||||
  PresentationPane get _currPane =>
 | 
			
		||||
      widget.panes[_controller.index] is PresentationPane
 | 
			
		||||
          ? widget.panes[_controller.index]
 | 
			
		||||
          : 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),
 | 
			
		||||
      );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										19
									
								
								lib/ui/widgets/tour/account_image_tour_pane.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								lib/ui/widgets/tour/account_image_tour_pane.dart
									
									
									
									
									
										Normal 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);
 | 
			
		||||
            });
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								lib/ui/widgets/tour/first_pane.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								lib/ui/widgets/tour/first_pane.dart
									
									
									
									
									
										Normal 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),
 | 
			
		||||
      ],
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								lib/ui/widgets/tour/fixed_tour_size_text_area.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								lib/ui/widgets/tour/fixed_tour_size_text_area.dart
									
									
									
									
									
										Normal 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),
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								lib/ui/widgets/tour/last_pane.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								lib/ui/widgets/tour/last_pane.dart
									
									
									
									
									
										Normal 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),
 | 
			
		||||
      ),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										87
									
								
								lib/ui/widgets/tour/presentation_pane.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								lib/ui/widgets/tour/presentation_pane.dart
									
									
									
									
									
										Normal 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),
 | 
			
		||||
      ],
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user