import 'dart:io'; import 'package:flutter/material.dart'; import 'package:expandable/expandable.dart'; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/functions/format_time.dart'; import 'package:adguard_home_manager/providers/status_provider.dart'; class MainSwitch extends StatelessWidget { final ExpandableController expandableController; final void Function({ required bool value, required String filter }) updateBlocking; final void Function(int) disableWithCountdown; final Animation animation; const MainSwitch({ super.key, required this.expandableController, required this.updateBlocking, required this.disableWithCountdown, required this.animation, }); @override Widget build(BuildContext context) { final statusProvider = Provider.of(context); return Padding( padding: const EdgeInsets.symmetric(horizontal: 24), child: ExpandableNotifier( controller: expandableController, child: Material( color: Colors.transparent, borderRadius: BorderRadius.circular(28), child: InkWell( onTap: statusProvider.serverStatus!.generalEnabled == true && !statusProvider.protectionsManagementProcess.contains('general') ? () => expandableController.toggle() : null, borderRadius: BorderRadius.circular(28), child: Container( padding: const EdgeInsets.symmetric( horizontal: 20, vertical: 12 ), decoration: BoxDecoration( borderRadius: BorderRadius.circular(28), color: Theme.of(context).colorScheme.primary.withOpacity(0.1) ), child: Expandable( theme: const ExpandableThemeData( animationDuration: Duration(milliseconds: 200), fadeCurve: Curves.ease ), collapsed: _TopRow( legacyMode: false, expandableController: expandableController, updateBlocking: updateBlocking, animation: animation, ), expanded: Column( children: [ _TopRow( legacyMode: false, expandableController: expandableController, updateBlocking: updateBlocking, animation: animation, ), _BottomRow( disableWithCountdown: disableWithCountdown, ), const SizedBox(height: 8) ], ) ), ), ), ) ) ); } } class _TopRow extends StatelessWidget { final bool legacyMode; final ExpandableController expandableController; final void Function({ required bool value, required String filter }) updateBlocking; final Animation animation; const _TopRow({ required this.legacyMode, required this.expandableController, required this.updateBlocking, required this.animation, }); @override Widget build(BuildContext context) { final statusProvider = Provider.of(context); return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Row( children: [ RotationTransition( turns: animation, child: Icon( Icons.keyboard_arrow_down_rounded, size: 26, color: statusProvider.serverStatus!.generalEnabled == true ? Theme.of(context).colorScheme.onSurfaceVariant : Colors.grey, ), ), const SizedBox(width: 8), Flexible( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( AppLocalizations.of(context)!.allProtections, overflow: TextOverflow.ellipsis, style: const TextStyle( fontSize: 18, ), ), if (statusProvider.serverStatus!.timeGeneralDisabled > 0) ...[ const SizedBox(height: 2), if (statusProvider.currentDeadline != null) Text( "${AppLocalizations.of(context)!.remainingTime}: ${formatRemainingSeconds(statusProvider.remainingTime)}" ) ] ], ), ), ], ), ), const SizedBox(width: 8), Switch( value: statusProvider.serverStatus!.generalEnabled, onChanged: statusProvider.protectionsManagementProcess.contains('general') == false ? (value) { if (value == false && expandableController.expanded == true && legacyMode == false) { expandableController.toggle(); } updateBlocking( value: value, filter: 'general' ); } : null, ) ] ); } } class _BottomRow extends StatefulWidget { final void Function(int) disableWithCountdown; const _BottomRow({ required this.disableWithCountdown, }); @override State<_BottomRow> createState() => _BottomRowState(); } class _BottomRowState extends State<_BottomRow> { final _chipsScrollController = ScrollController(); @override Widget build(BuildContext context) { final statusProvider = Provider.of(context); final textScale = MediaQuery.of(context).textScaler.scale(1); return Container( height: Platform.isMacOS || Platform.isLinux || Platform.isWindows ? 50 * textScale : 40 * textScale, margin: const EdgeInsets.only(top: 8), child: Scrollbar( controller: _chipsScrollController, thumbVisibility: Platform.isMacOS || Platform.isLinux || Platform.isWindows, interactive: Platform.isMacOS || Platform.isLinux || Platform.isWindows, thickness: Platform.isMacOS || Platform.isLinux || Platform.isWindows ? 8 : 0, child: Padding( padding: EdgeInsets.only( bottom: Platform.isMacOS || Platform.isLinux || Platform.isWindows ? 16 : 0 ), child: ListView( controller: _chipsScrollController, scrollDirection: Axis.horizontal, children: [ ActionChip( label: Text(AppLocalizations.of(context)!.seconds(30)), onPressed: statusProvider.protectionsManagementProcess.contains('general') == false && statusProvider.serverStatus!.generalEnabled == true ? () => widget.disableWithCountdown(29000) : null, ), const SizedBox(width: 8), ActionChip( label: Text(AppLocalizations.of(context)!.minute(1)), onPressed: statusProvider.protectionsManagementProcess.contains('general') == false && statusProvider.serverStatus!.generalEnabled == true ? () => widget.disableWithCountdown(59000) : null, ), const SizedBox(width: 8), ActionChip( label: Text(AppLocalizations.of(context)!.minutes(10)), onPressed: statusProvider.protectionsManagementProcess.contains('general') == false && statusProvider.serverStatus!.generalEnabled == true ? () => widget.disableWithCountdown(599000) : null, ), const SizedBox(width: 8), ActionChip( label: Text(AppLocalizations.of(context)!.hour(1)), onPressed: statusProvider.protectionsManagementProcess.contains('general') == false && statusProvider.serverStatus!.generalEnabled == true ? () => widget.disableWithCountdown(3599000) : null, ), const SizedBox(width: 8), ActionChip( label: Text(AppLocalizations.of(context)!.hours(24)), onPressed: statusProvider.protectionsManagementProcess.contains('general') == false && statusProvider.serverStatus!.generalEnabled == true ? () => widget.disableWithCountdown(86399000) : null, ), ], ), ), ), ); } }