Change language dialog

mail@pastecode.io avatar
unknown
dart
a year ago
11 kB
2
Indexable
import 'dart:developer';

import 'package:base_architecture/core/constants/theme.dart';
import 'package:base_architecture/core/extensions/widget_extensions.dart';
import 'package:base_architecture/core/shared_widgets/ACScaffold.dart';
import 'package:base_architecture/core/shared_widgets/block_button_widget.dart';
import 'package:base_architecture/core/shared_widgets/custom_radio_button.dart';
import 'package:base_architecture/data_layer/models/radio_model.dart';
import 'package:base_architecture/presentation/notifiers/auth_notifier/auth_notifier.dart';
import 'package:base_architecture/presentation/notifiers/locale_notifier/locale_notifier.dart';
import 'package:base_architecture/presentation/notifiers/theme_notifier.dart';
import 'package:base_architecture/presentation/pages/main/main_page.dart';
import 'package:base_architecture/presentation/resources/color_manager.dart';
import 'package:base_architecture/presentation/setting_notifier.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_uxcam/flutter_uxcam.dart';
import 'package:provider/provider.dart';
import 'package:universal_file/universal_file.dart';

class ChangeLanguageDialog extends StatelessWidget {
  const ChangeLanguageDialog({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    Size mediaQuery = MediaQuery.of(context).size;
    ThemeNotifier themeNotifier = Provider.of<ThemeNotifier>(
      context,
      listen: true,
    );
    LocaleNotifier localeNotifier = Provider.of<LocaleNotifier>(
      context,
      listen: true,
    );
    AuthNotifier authNotifier = Provider.of<AuthNotifier>(
      context,
      listen: false,
    );
    SettingsNotifier settingsNotifier = Provider.of<SettingsNotifier>(
      context,
      listen: false,
    );

    return ACScaffold(
      backgroundColor: Colors.transparent,
      body: Align(
        alignment: Alignment.center,
        child: Container(
          margin: const EdgeInsets.only(bottom: 50, top: 300),
          width: mediaQuery.width * 0.85,
          decoration: BoxDecoration(
            color: themeNotifier.getTheme().primaryColor,
            borderRadius: const BorderRadius.all(
              Radius.circular(10),
            ),
          ),
          child: Padding(
            padding: EdgeInsets.symmetric(
              horizontal: mediaQuery.width * 0.04,
              vertical: mediaQuery.height * 0.024,
            ),
            child: Column(
              mainAxisSize: MainAxisSize.min,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                _closeDialogButton(
                  themeNotifier,
                  authNotifier,
                  localeNotifier,
                  context,
                  mediaQuery,
                ),
                _dialogTitle(themeNotifier, mediaQuery),
                _allLanguagesRadios(authNotifier, themeNotifier),
                _confirmCancelButtons(
                  localeNotifier,
                  authNotifier,
                  themeNotifier,
                  mediaQuery,
                  settingsNotifier,
                )
              ],
            ),
          ),
        ),
      ),
    );
  }

  Widget _confirmCancelButtons(
    LocaleNotifier localeNotifier,
    AuthNotifier authNotifier,
    ThemeNotifier themeNotifier,
    Size mediaQuery,
    SettingsNotifier settingsNotifier,
  ) =>
      Padding(
        padding: EdgeInsets.symmetric(
          vertical: mediaQuery.height * 0.015,
        ),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: <Widget>[
            _confirmButton(
                localeNotifier, authNotifier, themeNotifier, settingsNotifier),
            const Spacer(
              flex: 1,
            ),
            _cancelButton(localeNotifier, authNotifier, themeNotifier),
          ],
        ),
      );

  Widget _cancelButton(
    LocaleNotifier localeNotifier,
    AuthNotifier authNotifier,
    ThemeNotifier themeNotifier,
  ) =>
      Expanded(
        flex: 8,
        child: BlockButtonWidget(
          buttonHeight: 55,
          text: Text(
            'Cancel'.tr(),
            style: themeNotifier.getTheme().textTheme.headline2!.copyWith(
                  fontSize: 20,
                  fontWeight: FontWeight.bold,
                  color: themeNotifier.getTheme().canvasColor,
                ),
          ),
          color: Colors.transparent,
          borderColor: themeNotifier.getTheme().canvasColor,
          borderWidth: 1.3,
          onPressed: () {
            localeNotifier.cancelAllSelectedLanguage();

            Navigator.pop(navigatorKey.currentContext!);
            mixpanel?.track('Pressed back ');
            FlutterUxcam.logEvent('Pressed back ');
          },
        ),
      );

  Widget _confirmButton(
    LocaleNotifier localeNotifier,
    AuthNotifier authNotifer,
    ThemeNotifier themeNotifier,
    SettingsNotifier settingsNotifier,
  ) =>
      Expanded(
        flex: 8,
        child: BlockButtonWidget(
            buttonHeight: 55,
            text: Text(
              'Save'.tr(),
              style: themeNotifier.getTheme().textTheme.headline2!.copyWith(
                    fontSize: 20,
                    fontWeight: FontWeight.bold,
                    color: ColorManager.white,
                  ),
            ),
            color: HexColor.fromHex('#003260'),
            onPressed: () {
              localeNotifier.saveAllLanguage();
              if (authNotifer.appUser != null) {
                settingsNotifier.changeAppLang();
              }

              log(navigatorKey.currentContext!.locale.toString());
              Navigator.pop(navigatorKey.currentContext!);
              mixpanel?.track('Pressed back ');
              FlutterUxcam.logEvent('Pressed back ');
            }),
      );

  Widget _allLanguagesRadios(
    AuthNotifier authNotifier,
    ThemeNotifier themeNotifier,
  ) =>
      Consumer<LocaleNotifier>(
        builder:
            (BuildContext context, LocaleNotifier notifier, Widget? child) =>
                ListView(
          shrinkWrap: true,
          children: [
            Column(
              children: <Widget>[
                Semantics(
                  button: true,
                  child: InkWell(
                    onTap: () {
                      notifier.setToArabic();
                    },
                    child: CustomRadioButton(
                      key,
                      RadioModel(
                        isSelected: notifier.isArabic,
                        text: 'العربية',
                        value: 'ar',
                      ),
                    ),
                  ),
                ),
                Divider(
                  color: HexColor.fromHex('#E9EBEF'),
                  thickness: 1,
                  indent: 25,
                  endIndent: 20,
                  height: 8,
                ),
                Semantics(
                  button: true,
                  child: InkWell(
                    onTap: () {
                      notifier.setToEnglish();
                    },
                    child: CustomRadioButton(
                      key,
                      RadioModel(
                        isSelected: notifier.isEnglish,
                        text: 'English',
                        value: 'en',
                      ),
                    ),
                  ),
                ),
                Visibility(
                  visible:
                      authNotifier.arabSettings?.tokenData?.isHebrew ?? false,
                  child: Divider(
                    color: HexColor.fromHex('#E9EBEF'),
                    thickness: 1,
                    indent: 25,
                    endIndent: 20,
                    height: 8,
                  ),
                ),
                Visibility(
                  visible:
                      authNotifier.arabSettings?.tokenData?.isHebrew ?? false,
                  child: Semantics(
                    button: true,
                    child: InkWell(
                      onTap: () {
                        notifier.setToHebrew();
                      },
                      child: CustomRadioButton(
                        key,
                        RadioModel(
                          isSelected: notifier.isHebrew,
                          text: 'Hebrew',
                          value: 'he',
                        ),
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ],
        ),
      );

  Widget _dialogTitle(
    ThemeNotifier themeNotifier,
    Size mediaQuery,
  ) =>
      Text(
        'Change the language'.tr(),
        style: themeNotifier.getTheme().textTheme.headline5!.copyWith(
              color: themeNotifier.getTheme().hoverColor,
              fontSize: 25,
              fontWeight: FontWeight.bold,
            ),
      ).padding(
        padding: EdgeInsetsDirectional.only(
          start: 7,
          top: mediaQuery.height * 0.035,
          bottom: mediaQuery.height * 0.015,
        ),
      );

  Widget _closeDialogButton(
    ThemeNotifier themeNotifier,
    AuthNotifier authNotifier,
    LocaleNotifier localeNotifier,
    BuildContext context,
    Size mediaQuery,
  ) =>
      Align(
        alignment: AlignmentDirectional.topStart,
        child: Semantics(
          label: 'Close'.tr(),
          button: true,
          excludeSemantics: true,
          child: Container(
            height: 44,
            width: 44,
            decoration: BoxDecoration(
              color: themeNotifier.getTheme().focusColor,
              border: Border.all(
                color: themeNotifier.getTheme() == AppThemes().darkTheme
                    ? Colors.transparent
                    : HexColor.fromHex('#E9EBEF'),
                width: 1.5,
              ),
              borderRadius: const BorderRadius.all(
                Radius.circular(10),
              ),
            ),
            child: IconButton(
              iconSize: mediaQuery.height * 0.023,
              icon: Icon(
                Icons.close,
                color: themeNotifier.getTheme().hoverColor,
              ),
              onPressed: () {
                localeNotifier.cancelAllSelectedLanguage();
                Navigator.of(context).pop();
                mixpanel?.track('Pressed back ');
                FlutterUxcam.logEvent('Pressed back ');
              },
            ),
          ),
        ),
      );
}