diff --git a/assets/translations/strings_en.i18n.json b/assets/translations/strings_en.i18n.json index a4581b8b..be9e915d 100644 --- a/assets/translations/strings_en.i18n.json +++ b/assets/translations/strings_en.i18n.json @@ -233,7 +233,8 @@ "download": "Download", "failureMsg": "Failed to update asset", "successMsg": "Successfully updated asset", - "addRecommended": "Add Recommended Assets" + "addRecommended": "Add Recommended Assets", + "missingGeoAssetsMsg": "Selected routing assets' files are missing. Either download them or choose existing ones." } }, "about": { diff --git a/assets/translations/strings_fa.i18n.json b/assets/translations/strings_fa.i18n.json index bb5dbc46..ff3b1a32 100644 --- a/assets/translations/strings_fa.i18n.json +++ b/assets/translations/strings_fa.i18n.json @@ -233,7 +233,8 @@ "download": "دانلود", "failureMsg": "دارایی به روز نشد", "successMsg": "دارایی با موفقیت به روز شد", - "addRecommended": "اضافه کردن دارایی های توصیه شده" + "addRecommended": "اضافه کردن دارایی های توصیه شده", + "missingGeoAssetsMsg": "فایل‌های دارایی‌های مسیریابی انتخابی وجود ندارد. یا آنها را دانلود کنید یا موارد موجود را انتخاب کنید." } }, "about": { diff --git a/assets/translations/strings_ru.i18n.json b/assets/translations/strings_ru.i18n.json index 7cb09aff..75f4a07f 100644 --- a/assets/translations/strings_ru.i18n.json +++ b/assets/translations/strings_ru.i18n.json @@ -233,7 +233,8 @@ "download": "Скачать", "failureMsg": "Не удалось обновить объект", "successMsg": "Объект успешно обновлен", - "addRecommended": "Добавить рекомендуемые активы" + "addRecommended": "Добавить рекомендуемые активы", + "missingGeoAssetsMsg": "Файлы выбранных ресурсов маршрутизации отсутствуют. Либо скачайте их, либо выберите существующие." } }, "about": { diff --git a/assets/translations/strings_tr.i18n.json b/assets/translations/strings_tr.i18n.json index 352df026..77f99721 100644 --- a/assets/translations/strings_tr.i18n.json +++ b/assets/translations/strings_tr.i18n.json @@ -233,7 +233,8 @@ "download": "İndirmek", "failureMsg": "Öğe güncellenemedi", "successMsg": "Öğe başarıyla güncellendi", - "addRecommended": "Önerilen Varlıkları Ekle" + "addRecommended": "Önerilen Varlıkları Ekle", + "missingGeoAssetsMsg": "Seçilen yönlendirme varlıklarının dosyaları eksik. Bunları indirin veya mevcut olanları seçin." } }, "about": { diff --git a/assets/translations/strings_zh-CN.i18n.json b/assets/translations/strings_zh-CN.i18n.json index 37d100e4..92a8365d 100644 --- a/assets/translations/strings_zh-CN.i18n.json +++ b/assets/translations/strings_zh-CN.i18n.json @@ -233,7 +233,8 @@ "download": "下载", "failureMsg": "更新资源文件失败", "successMsg": "已成功更新资源文件", - "addRecommended": "添加建议的资源文件" + "addRecommended": "添加建议的资源文件", + "missingGeoAssetsMsg": "所选路由资源的文件丢失。下载它们或选择现有的。" } }, "about": { diff --git a/lib/features/geo_asset/overview/geo_assets_overview_page.dart b/lib/features/geo_asset/overview/geo_assets_overview_page.dart index 6917721c..64b5f452 100644 --- a/lib/features/geo_asset/overview/geo_assets_overview_page.dart +++ b/lib/features/geo_asset/overview/geo_assets_overview_page.dart @@ -3,6 +3,7 @@ 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'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:sliver_tools/sliver_tools.dart'; class GeoAssetsOverviewPage extends HookConsumerWidget { const GeoAssetsOverviewPage({super.key}); @@ -17,6 +18,7 @@ class GeoAssetsOverviewPage extends HookConsumerWidget { slivers: [ SliverAppBar( title: Text(t.settings.geoAssets.pageTitle), + pinned: true, actions: [ PopupMenuButton( itemBuilder: (context) { @@ -34,6 +36,17 @@ class GeoAssetsOverviewPage extends HookConsumerWidget { ), ], ), + if (state case AsyncData(value: final geoAssets)) + SliverPinnedHeader( + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 200), + child: geoAssets + .where((e) => e.$1.active && e.$2 == null) + .isNotEmpty + ? const MissingRoutingAssetsCard() + : const SizedBox(), + ), + ), switch (state) { AsyncData(value: final geoAssets) => SliverList.builder( itemBuilder: (context, index) { @@ -54,3 +67,39 @@ class GeoAssetsOverviewPage extends HookConsumerWidget { ); } } + +class MissingRoutingAssetsCard extends HookConsumerWidget { + const MissingRoutingAssetsCard({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final t = ref.watch(translationsProvider); + + return Card( + margin: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 4, + ), + child: Row( + children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Icon(Icons.lightbulb), + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 8, vertical: 8), + child: Text(t.settings.geoAssets.missingGeoAssetsMsg), + ), + ], + ), + ), + ], + ), + ); + } +}