Change routing assets order
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import 'package:dartx/dartx.dart';
|
||||
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';
|
||||
@@ -7,17 +8,28 @@ import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
||||
part 'geo_assets_overview_notifier.g.dart';
|
||||
|
||||
typedef GroupedRoutingAssets = ({
|
||||
List<GeoAssetWithFileSize> geoip,
|
||||
List<GeoAssetWithFileSize> geosite,
|
||||
});
|
||||
|
||||
@riverpod
|
||||
class GeoAssetsOverviewNotifier extends _$GeoAssetsOverviewNotifier
|
||||
with AppLogger {
|
||||
@override
|
||||
Stream<List<GeoAssetWithFileSize>> build() {
|
||||
Stream<GroupedRoutingAssets> build() {
|
||||
ref.disposeDelay(const Duration(seconds: 5));
|
||||
return ref
|
||||
.watch(geoAssetRepositoryProvider)
|
||||
.requireValue
|
||||
.watchAll()
|
||||
.map((event) => event.getOrElse((l) => throw l));
|
||||
return ref.watch(geoAssetRepositoryProvider).requireValue.watchAll().map(
|
||||
(event) {
|
||||
final grouped = event
|
||||
.getOrElse((l) => throw l)
|
||||
.groupBy((element) => element.$1.type);
|
||||
return (
|
||||
geoip: grouped.getOrElse(GeoAssetType.geoip, () => []),
|
||||
geosite: grouped.getOrElse(GeoAssetType.geosite, () => []),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
GeoAssetRepository get _geoAssetRepo =>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:gap/gap.dart';
|
||||
import 'package:hiddify/core/localization/translations.dart';
|
||||
import 'package:hiddify/features/geo_asset/overview/geo_assets_overview_notifier.dart';
|
||||
import 'package:hiddify/features/geo_asset/widget/geo_asset_tile.dart';
|
||||
@@ -36,11 +37,11 @@ class GeoAssetsOverviewPage extends HookConsumerWidget {
|
||||
),
|
||||
],
|
||||
),
|
||||
if (state case AsyncData(value: final geoAssets))
|
||||
if (state case AsyncData(value: (:final geoip, :final geosite)))
|
||||
SliverPinnedHeader(
|
||||
child: AnimatedSwitcher(
|
||||
duration: const Duration(milliseconds: 200),
|
||||
child: geoAssets
|
||||
child: (geoip + geosite)
|
||||
.where((e) => e.$1.active && e.$2 == null)
|
||||
.isNotEmpty
|
||||
? const MissingRoutingAssetsCard()
|
||||
@@ -48,17 +49,45 @@ class GeoAssetsOverviewPage extends HookConsumerWidget {
|
||||
),
|
||||
),
|
||||
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,
|
||||
AsyncData(value: (:final geoip, :final geosite)) => MultiSliver(
|
||||
children: [
|
||||
ListTile(
|
||||
title: Text("${t.settings.geoAssets.geoip} ›"),
|
||||
titleTextStyle: Theme.of(context).textTheme.headlineSmall,
|
||||
dense: true,
|
||||
),
|
||||
SliverList.builder(
|
||||
itemBuilder: (context, index) {
|
||||
final geoAsset = geoip[index];
|
||||
return GeoAssetTile(
|
||||
geoAsset,
|
||||
onMarkAsActive: () => ref
|
||||
.read(geoAssetsOverviewNotifierProvider.notifier)
|
||||
.markAsActive(geoAsset.$1),
|
||||
);
|
||||
},
|
||||
itemCount: geoip.length,
|
||||
),
|
||||
const Divider(indent: 16, endIndent: 16),
|
||||
ListTile(
|
||||
title: Text("${t.settings.geoAssets.geosite} ›"),
|
||||
titleTextStyle: Theme.of(context).textTheme.headlineSmall,
|
||||
dense: true,
|
||||
),
|
||||
SliverList.builder(
|
||||
itemBuilder: (context, index) {
|
||||
final geoAsset = geosite[index];
|
||||
return GeoAssetTile(
|
||||
geoAsset,
|
||||
onMarkAsActive: () => ref
|
||||
.read(geoAssetsOverviewNotifierProvider.notifier)
|
||||
.markAsActive(geoAsset.$1),
|
||||
);
|
||||
},
|
||||
itemCount: geosite.length,
|
||||
),
|
||||
const Gap(16),
|
||||
],
|
||||
),
|
||||
_ => const SliverToBoxAdapter(),
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user