Refactor geo assets

This commit is contained in:
problematicconsumer
2023-11-25 22:00:40 +03:30
parent 6040eae6ce
commit e2d9d5e53e
29 changed files with 594 additions and 507 deletions

View File

@@ -0,0 +1,43 @@
import 'package:hiddify/features/geo_asset/data/geo_asset_data_providers.dart';
import 'package:hiddify/features/geo_asset/data/geo_asset_repository.dart';
import 'package:hiddify/features/geo_asset/model/geo_asset_entity.dart';
import 'package:hiddify/utils/custom_loggers.dart';
import 'package:hiddify/utils/riverpod_utils.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'geo_assets_overview_notifier.g.dart';
@riverpod
class GeoAssetsOverviewNotifier extends _$GeoAssetsOverviewNotifier
with AppLogger {
@override
Stream<List<GeoAssetWithFileSize>> build() {
ref.disposeDelay(const Duration(seconds: 5));
return ref
.watch(geoAssetRepositoryProvider)
.requireValue
.watchAll()
.map((event) => event.getOrElse((l) => throw l));
}
GeoAssetRepository get _geoAssetRepo =>
ref.read(geoAssetRepositoryProvider).requireValue;
Future<void> markAsActive(GeoAssetEntity geoAsset) async {
await _geoAssetRepo.markAsActive(geoAsset).getOrElse(
(f) {
loggy.warning("error marking geo asset as active", f);
throw f;
},
).run();
}
Future<void> addRecommended() async {
await _geoAssetRepo.addRecommended().getOrElse(
(f) {
loggy.warning("error adding recommended geo assets", f);
throw f;
},
).run();
}
}

View File

@@ -0,0 +1,56 @@
import 'package:flutter/material.dart';
import 'package:hiddify/core/core_providers.dart';
import 'package:hiddify/features/geo_asset/overview/geo_assets_overview_notifier.dart';
import 'package:hiddify/features/geo_asset/widget/geo_asset_tile.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
class GeoAssetsOverviewPage extends HookConsumerWidget {
const GeoAssetsOverviewPage({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final t = ref.watch(translationsProvider);
final state = ref.watch(geoAssetsOverviewNotifierProvider);
return Scaffold(
body: CustomScrollView(
slivers: [
SliverAppBar(
title: Text(t.settings.geoAssets.pageTitle),
actions: [
PopupMenuButton(
itemBuilder: (context) {
return [
PopupMenuItem(
child: Text(t.settings.geoAssets.addRecommended),
onTap: () {
ref
.read(geoAssetsOverviewNotifierProvider.notifier)
.addRecommended();
},
),
];
},
),
],
),
switch (state) {
AsyncData(value: final geoAssets) => SliverList.builder(
itemBuilder: (context, index) {
final geoAsset = geoAssets[index];
return GeoAssetTile(
geoAsset,
onMarkAsActive: () => ref
.read(geoAssetsOverviewNotifierProvider.notifier)
.markAsActive(geoAsset.$1),
);
},
itemCount: geoAssets.length,
),
_ => const SliverToBoxAdapter(),
},
],
),
);
}
}