import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_advanced_switch/flutter_advanced_switch.dart'; import 'package:local_auth_darwin/local_auth_darwin.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import '../common_widgets/default_app_bar.dart'; class SettingsPage extends StatefulWidget { static const id = "/settings_page"; const SettingsPage({Key? key}) : super(key: key); @override State createState() => _SettingsPageState(); } class _SettingsPageState extends State { ValueNotifier? langController, themeController; SettingProvider? _settingProvider; bool localAuth = false; @override void initState() { // TODO: implement initState super.initState(); } @override void dispose() { super.dispose(); langController?.dispose(); themeController?.dispose(); // authController.dispose(); } void checkForLocalAuth(bool buttonState) async { bool authStatus = await _settingProvider!.auth.authenticate( localizedReason: Platform.isAndroid ? "Scan your fingerprint to authenticate" : "Scan with face id to authenticate", options: const AuthenticationOptions(), authMessages: [const IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please enable Touch ID.', lockOut: 'Please reenable your Touch ID')]); if (authStatus) { localAuth = !localAuth; await _settingProvider!.setAuth(localAuth); // authController.value = _settingProvider.localAuth == buttonState.toString(); setState(() {}); } else { // authController.value = !buttonState; } } @override Widget build(BuildContext context) { if (_settingProvider == null) { _settingProvider = Provider.of(context, listen: false); localAuth = _settingProvider!.localAuth; } langController ??= ValueNotifier(_settingProvider!.language == "ar") ..addListener(() async { /// TODO : uncomment the below lines to support the another language await _settingProvider!.setLanguage(_settingProvider!.language == "ar" ? "en" : "ar"); langController!.value = _settingProvider!.language == "ar"; }); themeController ??= ValueNotifier(_settingProvider!.theme == "light") ..addListener(() async { await _settingProvider!.setDarkTheme(_settingProvider!.theme == "light"); themeController!.value = _settingProvider!.theme == "light"; }); // authController ??= ValueNotifier(_settingProvider.localAuth == "false") // ..addListener(() async { // print("authController.value:${authController.value}"); // // // if (authController.value) { // // checkForLocalAuth(); // // } else { // // await _settingProvider.setAuth(_settingProvider.localAuth == "false"); // // authController.value = _settingProvider.localAuth == "false"; // // } // }); return Scaffold( appBar: DefaultAppBar(title: context.translation.settings), body: Column( mainAxisSize: MainAxisSize.min, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ context.translation.arabic.heading5(context), AdvancedSwitch( controller: langController, activeColor: AppColor.green50.withOpacity(0.5), inactiveColor: AppColor.neutral10, thumb: CircleAvatar(backgroundColor: _settingProvider!.language == "ar" ? AppColor.green50 : AppColor.neutral20), borderRadius: const BorderRadius.all(Radius.circular(30)), width: 42.toScreenWidth, height: 24.toScreenHeight, /// TODO : remove the below attribute to enable the switch //enabled: false, disabledOpacity: 1, ), ], ), 16.height, const Divider().defaultStyle(context), 16.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ context.translation.lightTheme.heading5(context), AdvancedSwitch( controller: themeController, activeColor: AppColor.green50.withOpacity(0.5), inactiveColor: AppColor.neutral10, thumb: CircleAvatar(backgroundColor: _settingProvider!.theme == "light" ? AppColor.green50 : AppColor.neutral20), borderRadius: const BorderRadius.all(Radius.circular(30)), width: 42.toScreenWidth, height: 24.toScreenHeight, disabledOpacity: 1, ), ], ), 16.height, const Divider().defaultStyle(context), 16.height, FutureBuilder( future: _settingProvider!.auth.isDeviceSupported(), builder: (cxt, snapshot) { bool isDeviceSupported = false; if (snapshot.hasData) { isDeviceSupported = snapshot.data as bool; } if (!isDeviceSupported) { return Text("Your device did not support Fingerprint/Face ID.", style: AppTextStyles.tinyFont.copyWith(fontSize: 11, color: Colors.red)); } return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "Fingerprint/Face ID".heading5(context), customSwitch(localAuth).onPress(() { checkForLocalAuth(localAuth); }), ], ); }), ], ).toShadowContainer(context).paddingAll(16), ); } Widget customSwitch(bool enable) { return Container( width: 42.toScreenWidth, height: 24.toScreenHeight, alignment: enable ? Alignment.centerRight : Alignment.centerLeft, decoration: BoxDecoration( color: enable ? AppColor.green50.withOpacity(0.5) : AppColor.neutral10, borderRadius: const BorderRadius.all(Radius.circular(30)), ), padding: const EdgeInsets.all(2), child: Container( height: 20.toScreenHeight, width: 20.toScreenWidth, decoration: BoxDecoration(shape: BoxShape.circle, color: enable ? AppColor.green50 : AppColor.neutral20), )); } }