Skip to content
Snippets Groups Projects
fifth_screen.dart 7.9 KiB
Newer Older
import 'package:easy_localization/easy_localization.dart';
vjrj's avatar
vjrj committed
import 'package:flutter/material.dart';
vjrj's avatar
vjrj committed
import 'package:flutter_bloc/flutter_bloc.dart';
vjrj's avatar
vjrj committed
import 'package:pwa_install/pwa_install.dart';
vjrj's avatar
vjrj committed
import 'package:share_plus/share_plus.dart';
vjrj's avatar
vjrj committed

vjrj's avatar
vjrj committed
import '../../data/models/app_cubit.dart';
import '../../data/models/app_state.dart';
vjrj's avatar
vjrj committed
import '../../data/models/node_type.dart';
vjrj's avatar
vjrj committed
import '../../shared_prefs.dart';
vjrj's avatar
vjrj committed
import '../notification_controller.dart';
vjrj's avatar
vjrj committed
import '../ui_helpers.dart';
vjrj's avatar
vjrj committed
import '../widgets/bottom_widget.dart';
vjrj's avatar
vjrj committed
import '../widgets/card_drawer.dart';
vjrj's avatar
vjrj committed
import '../widgets/faq.dart';
vjrj's avatar
vjrj committed
import '../widgets/fifth_screen/export_dialog.dart';
vjrj's avatar
vjrj committed
import '../widgets/fifth_screen/grid_item.dart';
vjrj's avatar
vjrj committed
import '../widgets/fifth_screen/import_dialog.dart';
vjrj's avatar
vjrj committed
import '../widgets/fifth_screen/link_card.dart';
vjrj's avatar
vjrj committed
import '../widgets/fifth_screen/node_info.dart';
vjrj's avatar
vjrj committed
import '../widgets/fifth_screen/text_divider.dart';

class FifthScreen extends StatelessWidget {
  const FifthScreen({super.key});

  @override
  Widget build(BuildContext context) {
vjrj's avatar
vjrj committed
    return BlocBuilder<AppCubit, AppState>(
vjrj's avatar
vjrj committed
        builder: (BuildContext context, AppState state) => Scaffold(
vjrj's avatar
vjrj committed
              appBar: AppBar(title: Text(tr('bottom_nav_fifth'))),
              drawer: const CardDrawer(),
              body: ListView(
vjrj's avatar
vjrj committed
                  padding: const EdgeInsets.symmetric(horizontal: 16),
                  physics: const BouncingScrollPhysics(),
                  children: <Widget>[
vjrj's avatar
vjrj committed
                    const SizedBox(height: 10),
                    DropdownButtonFormField<Locale>(
                      value: context.locale,
                      decoration: InputDecoration(
                        labelText: tr('language_switch_title'),
                        icon: const Icon(Icons.language),
                        border: const OutlineInputBorder(),
                      ),
                      onChanged: (Locale? newLocale) {
                        context.setLocale(newLocale!);
vjrj's avatar
vjrj committed
                        NotificationController.locale = newLocale;
vjrj's avatar
vjrj committed
                      },
                      items: const <DropdownMenuItem<Locale>>[
                        DropdownMenuItem<Locale>(
                          value: Locale('ca'),
                          child: Text('Català'),
                        ),
vjrj's avatar
vjrj committed
                        DropdownMenuItem<Locale>(
                          value: Locale('de'),
                          child: Text('Deutsch'),
                        ),
vjrj's avatar
vjrj committed
                        DropdownMenuItem<Locale>(
                          value: Locale('en'),
                          child: Text('English'),
                        ),
                        DropdownMenuItem<Locale>(
                          value: Locale('es'),
                          child: Text('Español'),
                        ),
                        DropdownMenuItem<Locale>(
                          value: Locale('fr'),
                          child: Text('Français'),
                        ),
vjrj's avatar
vjrj committed
                        DropdownMenuItem<Locale>(
                          value: Locale('gl'),
                          child: Text('Galego'),
                        ),
vjrj's avatar
vjrj committed
                        DropdownMenuItem<Locale>(
                          value: Locale('nl'),
                          child: Text('Nederlands'),
                        ),
vjrj's avatar
vjrj committed
                        DropdownMenuItem<Locale>(
                          value: Locale('pt'),
                          child: Text('Português'),
                        ),
vjrj's avatar
vjrj committed
                        // Add more DropdownMenuItem for more languages
                      ],
                    ),
vjrj's avatar
vjrj committed
                    const TextDivider(text: 'faq_title'),
                    const FAQ(),
vjrj's avatar
vjrj committed
                    const TextDivider(text: 'key_tools_title'),
vjrj's avatar
vjrj committed
                    const SizedBox(height: 20),
vjrj's avatar
vjrj committed
                    GridView.count(
                        physics: const NeverScrollableScrollPhysics(),
                        crossAxisCount: 2,
                        childAspectRatio: 2 / 1.15,
                        crossAxisSpacing: 8,
                        mainAxisSpacing: 8,
                        shrinkWrap: true,
                        padding: EdgeInsets.zero,
                        children: <GridItem>[
vjrj's avatar
vjrj committed
                          if (showShare())
                            GridItem(
                                title: 'share_your_key',
                                icon: Icons.share,
vjrj's avatar
vjrj committed
                                onTap: () => Share.share(
                                    SharedPreferencesHelper().getPubKey())),
vjrj's avatar
vjrj committed
                          GridItem(
                            title: 'copy_your_key',
                            icon: Icons.copy,
                            onTap: () => copyPublicKeyToClipboard(context),
vjrj's avatar
vjrj committed
                          ),
vjrj's avatar
vjrj committed
                          if (PWAInstall().installPromptEnabled)
                            GridItem(
                              title: 'install_desktop',
                              icon: Icons.install_desktop,
                              onTap: () {
                                try {
                                  PWAInstall().promptInstall_();
                                } catch (e) {
                                  final String error = e.toString();
                                  ScaffoldMessenger.of(context).showSnackBar(
                                    SnackBar(
                                      content: Text(tr(
                                          'error_installing_desktop',
                                          namedArgs: <String, String>{
                                            'error': error
                                          })),
                                    ),
                                  );
                                }
                              },
                            ),
vjrj's avatar
vjrj committed
                          GridItem(
                              title: 'export_key',
                              icon: Icons.download,
                              onTap: () {
                                showDialog(
                                  context: context,
                                  builder: (BuildContext context) {
                                    return const ExportDialog();
                                  },
                                );
                              }),
                          GridItem(
                              title: 'import_key',
                              icon: Icons.upload,
                              onTap: () {
                                showDialog(
                                  context: context,
                                  builder: (BuildContext context) {
                                    return const ImportDialog();
                                  },
                                );
                              }),
vjrj's avatar
vjrj committed
                        ]),
                    if (state.expertMode)
                      const TextDivider(text: 'technical_info_title'),
                    if (state.expertMode)
                      const NodeInfoCard(type: NodeType.duniter),
                    if (state.expertMode)
                      const NodeInfoCard(type: NodeType.cesiumPlus),
vjrj's avatar
vjrj committed
                    if (state.expertMode)
                      const NodeInfoCard(type: NodeType.gva),
vjrj's avatar
vjrj committed
                    if (state.expertMode)
                      LinkCard(
                          title: 'code_card_title',
                          icon: Icons.code_rounded,
                          url:
vjrj's avatar
vjrj committed
                              Uri.parse('https://git.duniter.org/vjrj/ginkgo')),
vjrj's avatar
vjrj committed
                    const BottomWidget(),
                    SwitchListTile(
                      title: Text(tr('expert_mode')),
vjrj's avatar
vjrj committed
                      value: state.expertMode,
                      onChanged: (bool value) =>
                          context.read<AppCubit>().setExpertMode(value),
                    ),
                    const BottomWidget()
                  ]),
            ));
vjrj's avatar
vjrj committed
}