aves/lib/widgets/settings/privacy/access_grants.dart
Thibault Deckers d4892d692f l10n: el
2022-09-02 18:46:53 +02:00

108 lines
3.3 KiB
Dart

import 'package:aves/services/common/services.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/identity/empty.dart';
import 'package:aves/widgets/common/providers/media_query_data_provider.dart';
import 'package:flutter/material.dart';
class StorageAccessPage extends StatefulWidget {
static const routeName = '/settings/storage_access';
const StorageAccessPage({super.key});
@override
State<StorageAccessPage> createState() => _StorageAccessPageState();
}
class _StorageAccessPageState extends State<StorageAccessPage> {
late Future<List<String>> _pathLoader;
List<String>? _lastPaths;
@override
void initState() {
super.initState();
_load();
}
void _load() => _pathLoader = storageService.getGrantedDirectories();
@override
Widget build(BuildContext context) {
return MediaQueryDataProvider(
child: Scaffold(
appBar: AppBar(
title: Text(context.l10n.settingsStorageAccessPageTitle),
),
body: SafeArea(
child: FutureBuilder<List<String>>(
future: _pathLoader,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text(snapshot.error.toString());
}
if (snapshot.connectionState != ConnectionState.done && _lastPaths == null) {
return const SizedBox.shrink();
}
_lastPaths = snapshot.data!..sort();
if (_lastPaths!.isEmpty) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const _Header(),
const Divider(),
Expanded(
child: Padding(
padding: const EdgeInsets.all(8),
child: EmptyContent(
text: context.l10n.settingsStorageAccessEmpty,
),
),
),
],
);
}
return ListView(
children: [
const _Header(),
const Divider(),
..._lastPaths!.map((path) => ListTile(
title: Text(path),
dense: true,
trailing: IconButton(
icon: const Icon(AIcons.clear),
onPressed: () async {
await storageService.revokeDirectoryAccess(path);
_load();
setState(() {});
},
tooltip: context.l10n.settingsStorageAccessRevokeTooltip,
),
)),
],
);
},
),
),
),
);
}
}
class _Header extends StatelessWidget {
const _Header();
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: Row(
children: [
const Icon(AIcons.info),
const SizedBox(width: 16),
Expanded(child: Text(context.l10n.settingsStorageAccessBanner)),
],
),
);
}
}