adguard-home-manager/lib/screens/servers/servers.dart

108 lines
3.1 KiB
Dart
Raw Normal View History

2023-03-16 23:29:18 +01:00
import 'dart:io';
2022-09-27 17:54:00 +02:00
import 'package:flutter/material.dart';
import 'package:expandable/expandable.dart';
2022-10-29 19:25:58 +02:00
import 'package:flutter/rendering.dart';
2022-09-27 17:54:00 +02:00
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:provider/provider.dart';
2023-10-07 18:37:16 +02:00
import 'package:adguard_home_manager/widgets/add_server/add_server_functions.dart';
2022-09-27 17:54:00 +02:00
import 'package:adguard_home_manager/widgets/servers_list/servers_list.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart';
2022-10-29 19:25:58 +02:00
import 'package:adguard_home_manager/providers/app_config_provider.dart';
2022-09-27 17:54:00 +02:00
class Servers extends StatefulWidget {
final double? breakingWidth;
const Servers({
2023-12-09 04:04:14 +01:00
super.key,
this.breakingWidth
2023-12-09 04:04:14 +01:00
});
2022-09-27 17:54:00 +02:00
@override
State<Servers> createState() => _ServersState();
}
class _ServersState extends State<Servers> {
List<ExpandableController> expandableControllerList = [];
2022-10-29 19:25:58 +02:00
late bool isVisible;
final ScrollController scrollController = ScrollController();
2022-09-27 17:54:00 +02:00
void expandOrContract(int index) async {
expandableControllerList[index].expanded = !expandableControllerList[index].expanded;
}
2022-10-29 19:25:58 +02:00
@override
void initState() {
super.initState();
isVisible = true;
scrollController.addListener(() {
if (scrollController.position.userScrollDirection == ScrollDirection.reverse) {
if (mounted && isVisible == true) {
setState(() => isVisible = false);
}
}
else {
if (scrollController.position.userScrollDirection == ScrollDirection.forward) {
if (mounted && isVisible == false) {
setState(() => isVisible = true);
}
}
}
});
}
2022-09-27 17:54:00 +02:00
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
2022-10-29 19:25:58 +02:00
final appConfigProvider = Provider.of<AppConfigProvider>(context);
2022-09-27 17:54:00 +02:00
final width = MediaQuery.of(context).size.width;
2022-09-27 17:54:00 +02:00
for (var i = 0; i < serversProvider.serversList.length; i++) {
expandableControllerList.add(ExpandableController());
}
void openAddServerModal() async {
await Future.delayed(const Duration(seconds: 0), (() => {
2023-10-07 18:37:16 +02:00
openServerFormModal(context: context, width: width)
2022-09-27 17:54:00 +02:00
}));
}
return Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context)!.servers),
2023-03-16 23:29:18 +01:00
centerTitle: false,
2022-09-27 17:54:00 +02:00
),
2023-12-09 04:04:14 +01:00
body: SafeArea(
child: Stack(
children: [
ServersList(
context: context,
controllers: expandableControllerList,
onChange: expandOrContract,
scrollController: scrollController,
breakingWidth: widget.breakingWidth ?? 700,
2022-10-29 19:25:58 +02:00
),
2023-12-09 04:04:14 +01:00
AnimatedPositioned(
duration: const Duration(milliseconds: 100),
curve: Curves.easeInOut,
bottom: isVisible ?
appConfigProvider.showingSnackbar
? 70 : (Platform.isIOS ? 40 : 20)
: -70,
right: 20,
child: FloatingActionButton(
onPressed: openAddServerModal,
child: const Icon(Icons.add),
),
),
],
),
2022-09-27 17:54:00 +02:00
),
);
}
}