Refactor geo assets
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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(),
|
||||
},
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user